e-olymp 378. Таинственная записка

Задача e-olymp 378.

Условие

Недавно Маша и Катя узнали, что в мире существуют злые хакеры, которые могут запросто вскрыть чужую переписку. Поэтому решили они пересылать только зашифрованные сообщения. Для этой цели подруги стали использовать перестановочный код, где каждая буква заменяется другой. Например:

Закодированное сообщение: HPC PJVYMIY

Декодированное сообщение: ACM CONTEST

В этом примере выполнены следующие замены: H=A, P=C, C=M, J=O, V=N, Y=T, M=E и I=S.

Чтобы не заниматься кодированием и декодированием вручную, подруги просят Вас написать программу. Помогите девочкам!

Входные данные

В первой строке входного файла записано закодированное сообщение. Вторая строка — 26 латинских букв верхнего регистра, представляющих собой код для соответствующего символа алфавита: первый символ дает код для A, второй для B и так далее. Используются только буквы верхнего регистра. В закодированном сообщении могут появиться пробелы, которые должны быть сохранены в выходной строке.

Выходные данные

В выходной файл вывести одну строку, в которой содержится расшифрованное сообщение.

Тесты

Входные данные Выходные данные
HPC PJVYMIY

BLMRGJIASOPZEFDCKWYHUNXQTV

ACM CONTEST
FDY GAI BG UKMY
KIMHOTSQYRLCUZPAGWJNBVDXEF
THE SKY IS BLUE
LJBSLJL IJWWDEJ
KCFAGWRZMEXDNUYHVBOIJLSTPQ
DECODED MESSAGE

Код программы

Для запроса на выполнение нажать здесь.

Ссылка на засчитанное решение.

Код программы с использованнием класса «string»

Для запроса на выполнение нажать здесь.

Ссылка на засчитанное решение.

Решение

Чтоб расшифровать послание, нужно определить порядковый номер каждого символа, из введённого сообщения, в алфавите. Потом заменить их символом соответствующего порядкового номера из второй введённой строки.

Related Images:

e-olymp 494. Гласные

Условие

К гласным буквам в латинском алфавите относятся буквы A, E, I, O, U и Y. Остальные буквы считаются согласными. Напишите программу, считающую количество гласных букв в тексте.

Входные данные

Во входном файле содержатся одна строка текста, состоящая только из заглавных латинских букв и пробелов. Длина строки не превышает 100 символов.

Выходные данные

В выходной файл вывести одно целое число – количество гласных во входном тексте.

Код

Код с функцией strpbrk()

Решение

Объявляется инициализированная строка, в которой может поместиться шесть символов, а последнее, седьмое место отводится под нуль-терминатор. Далее считываются все веденные символы, включая пробелы. Сравнивается  первый элемент строки с каждым элементом считываемых символов. Если считываемый символ соответствует символу строки, то увеличиваем количество гласных на единицу и так далее для всех гласных букв. Когда первый элемент строки сравнили со всеми считываемыми символами, начинаем так же сравнивать каждый последующий элемент.

Реализация с использованием string

Алгоритм решения (string)

Строка вводится из входного потока. Разыскивается первое вхождение любой гласной буквы. Если такое вхождение имеет место,то счетчик наращивается на единицу, после чего с позиции, следующей за гласной, поиск гласной начинается снова пока не будет найдена последняя гласная. Если гласных в слове нет, то, счетчик, соответственно, не наращивается и выводится ноль.

Тестирование

Входные данные Выходные данные
1 COBBRA 2
2 REE BA 3
3 U GFD 1

Ссылки

 

Related Images:

AA26.

Задача

В строке заменить последний и предпоследний символ, соответственно, на первый и второй. Если длина строки меньше четырех, то вывести, что это сделать невозможно.

Тесты

Input Output
aabbcc ccbbaa
input data atput dani
 Kalamabanga aglamabanaK

Алгоритм

Поскольку в условии задачи, количество слов не оговорено — для  ввода строки используем функцию getline. Затем проверяем ее длину. Если количество символов ( пробел также учитывается как символ!) не меньше 4, то делаем следующее:

1) Кладем в дополнительную строку два последних символа.

2) Заменяем последние символы в исходной строке на первые

3) В первые символы кладем то, что сохранили в дополнительной строке.

Если число символов меньше 4 — выдаем сообщение об ошибке.

Ссылка на ideone.com

Related Images:

AA14

Задача. В заданной строке удалить первый символ «.», который найдется в строке.

17.05.2015 1705.2015
.РЛ. РЛ.
Удачи, мистер Горски Нет точек
Вводим строку. Ищем первое вхождение символа «.», после чего выходим из цикла и удаляем этот символ. И добавляем условие, когда точек нет.

Код программы можно посмотреть тут 

Related Images:

AA7

Задача: В заданной строке вставить перед каждым символом «-» символ «+».

Решение: В цикле просматриваем строку x, если находим символ «-», то увеличиваем счетчик. Создаем строку длинной старой строки плюс счетчик. Во втором цикле, если символ не равен «-», то записываем его в новую строку, иначе вставляем «+», а после него «-».

Код:

Тесты:

Строка Результат

ef34_ve-ev-++vev)-

ef34_ve+-ev+-++vev)+-

3-5=8-10+0

3+-5=8+-10+0

Related Images:

AA8

Задача

Заданы две одинаковые по длине строки. Построить новую строку, в которой на четных местах расположены элементы первой строки, а на нечетных – элементы второй строки.

Тесты

Ввод Вывод
abc

012

a0b1c2
0123

0123

00112233

 

Related Images:

АА18

Задача

В строке найти первое слово, которое встречается два раза подряд. Слова разделяются одним или несколькими пробелами. Напечатать его.

Пояснение к решению

Идея простая:

  1. последовательно разбиваем строку на отдельные слова с помощью функций стандартной библиотеки
  2. смотрим, не встретилось ли некоторое слово два раза подряд

Решение

Основной вариант:

Перевод на Java:

 

Старый неаккуратный и медленный вариант:

 

Related Images:

AA1

Задача:

В заданной строке заменить подряд идущие пробелы на один пробел.

Примечание:

Будем называть строку правильной, если она не содержит подряд идущих пробелов.

Тестирование:

 Исходная строка  Оптимистичное ожидание Комментарий
Gagarin               became an                     international celebrity, and was                                              awarded many                     medals and titles, including                       Hero of the                        Soviet Union. Gagarin became an international celebrity, and was awarded many medals and titles, including Hero of the Soviet Union.  Пройден.
 Leonardo                             was, and                             is,                                         renowned                               primarily                         as a                             painter. Leonardo was, and is, renowned primarily as a painter.  Пройден.

Код на С++

Код на Java

 

Пояснение:

Вариант удаления пробелов с помощью [latex]erase()[/latex] является самым очевидным. Но у него больше недостатков, чем достоинств. Данный метод имеет линейную асимптотику, в худшем случае он выполнил бы [latex]n — 1[/latex] ( в дальнейшем [latex]»n»[/latex] — это длина строки ) сдвиг в индексах строки.

Другой способ — создание новой строки и добавление туда только нужных нам символов. Единственная проблема — новая строка, т. е. в худшем случае у нас появится строка равная данной или же на один символ меньше (если была добавлена проверка на правильность строки).

Второй способ мне нравится больше (просто потому, что он работает), но выделять новую строку очень не хочется. Оказалось, что можно обойтись и без неё. В качестве новой я использовал исходную. Для этого ввел два «указателя» на позиции элементов. Первый пробегает всю строку в цикле, второй же указывает на элемент, этой строки, в который будет положено новое значение. Таким образом, полученная последовательность символов (от нулевой, до [latex]j[/latex] — той не включительно) будет правильной строкой. Осталось удалить элементы на полуинтервале от [latex]j[/latex] до [latex]n[/latex].

 

Related Images:

AA17

Задача: В заданной строке найти первый символ, который встречается два раза подряд и удалить одно из этих вхождений.

Решение: Заводим цикл от первого символа, в цикле сравниваем каждый символ с предыдущим. Если они совпадают — удаляем один из них.

Код C++:

Код Java:

 

Тесты:

Строка Результат
aassddff asdf
1122345566 123456

Related Images:

AA4

Задача: В заданной строке удалить все латинские буквы.

Ввод Вывод
zdfgzdfg987w435kjwbsdf987w345 987435987345

Решение:

Код программы С++:

Ссылка на ideone Java: http://ideone.com/a2x238

 

Вводим строку. Перебираем все символы строки в цикле и удаляем символ, если он является латинской буквой

Related Images:

AA27

Задача: В строке вставить после предпоследнего символа первый и второй символ строки. Если длина строки меньше четырех, то вывести, что это сделать невозможно.

[latex]s1[/latex] [latex]s2[/latex] Комментарий
qwerty qwertqwy Тест пройден
_ qwert y _ qwert _ y Тест пройден
qwe Невозможно выполнить операцию.

C++:

Java:

Дана строка [latex]s1[/latex]. Переписываем из неё в строку [latex]s2[/latex] все символы, кроме последнего. Добавляем первый, второй и последний символ строки [latex]s1[/latex] в строку [latex]s2[/latex].

Задача на Ideone:
C++
Java

Related Images:

АА5

В заданной строке удалить все пробелы. Если пробелов не было, выдать сообщение об этом, иначе напечатать количество удаленных пробелов.

Ввод Вывод
Однажды во дворе стояла ясная погода. Однаждыводворестоялаяснаяпогода.
5
Единство предмета речи — это тема высказывания. Единствопредметаречи—этотемавысказывания.
6
Слово. Слово.
Пробелов не было.

Код программы:

Вводим строку из стандартного потока ввода. Используем getline. Вводим счетчик пробелов.
Проходя по элементам строки, если встречаем пробел, то увеличиваем счетчик на 1 и удаляем элемент. Потом возвращаемся обратно и в случае обнаражения пробела, удаляем его.  Печатаем строку. Если пробелов в строке не было выводим: «Пробелов не было.» Иначе выводим число пробелов, которые были удалены.

Ссылка на ideone.com.

Код на Java:

 

 

Related Images:

АА20

Условие: В заданной строке удалить последнюю пару символов «:=», которая найдется в строке.

Тесты:

Ввод Вывод
sdfsd  fdg :=sdrgs := :+:=:= sdf FUHIUh := sdfdf sdfsd  fdg :=sdrgs := :+:=:= sdf FUHIUh  sdfdf
фыпва :+вап:=аоап:=вр   := в фыпва :+вап:=аоап:=вр    в

 

Код программы:

Код программы на Java:

Ссылка на ideone.com: https://ideone.com/Z94AwR

План программы:

  1. Ввод строки из стандартного потока ввода. Здесь используется getline, чтобы можно было вводить символы-разделители
  2. Используется метод rfind класса string, позволяющий найти подстроку, начиная с конца
  3. Результат поиска — позиция символа, с которого начинается искомая построка
  4. Если позиция найдена, то используется метод replace, который заменяет все символы найденной подстроки на пустую строку

Ссылка на программу http://ideone.com/x5AtbG

Related Images:

АА24

Задача

 Ввести строку S и целое положительное число N, а также символы C1 и С2. Заменить каждое вхождение символа C1 на N символов C2.

Тесты

Данная строка C1 C2 n Получаемая строка Комментарий
a111a111 a = 3 ===111===111 пройден
omnomnom n  1 om-om-om пройден
Nina N Z 1 Zina пройден

Решение

 Мы идем по данной строке, если попадаем на символ, который не нужно заменять (не С1), то просто переписываем его в новую строку, если попадаем на символ С1, записываем в созданную новую строку n символов С2.

Код на Java:
 

Related Images:

AA1

Задача.  В заданной строке заменить подряд идущие пробелы на один пробел.

Тесты:

Ввод Вывод Комментарий
as  fg   t as fg t Пройден
   rty g  uio  rty g uio Пройден
Решение:

Будем записывать подходящие элементы в новую строку. Сразу добавим первый символ, он нам подходит вне зависимости от того, пробел он, или нет. Далее просмотрим каждый символ строки, если он нам подходит, запишем в новую строку.  Нулевой элемент уже добавлен, поэтому цикл начинается с единицы, что позволяет проверять предыдущий символ без выхода за границы.

С работой программы можно ознакомиться здесь.

Related Images:

AA21

Задача. В строке сосчитать количество всех открывающих (квадратных, круглых и фигурных) и закрывающих скобок. Если открывающих скобок на одну больше, добавить закрывающую круглую скобку в конец, а если открывающих скобок на одну меньше, то удалить последнюю закрывающую.

Тесты:

Ввод Результат Комментарий
./main «({){«  «({){« Пройдено
./main «({}){«  «({}){)» Пройдено
./main «)]}]([[«  «)]}([[« Пройдено

Код программы:

Идея решения:
Сосчитать кол-во открывающих и закрывающих скобок в одну переменную. Если текущий символ — открывающая скобка, то прибавить к переменной единицу, если закрывающая скобка, то отнять единицу. Совершать проверку переменной на равенство 1 (если на одну открывающую скобку больше) или -1 (если на одну открывающую скобку меньше).

Скриншот:
AA21

Related Images:

AA3

Задача

В заданной строке заменить каждую цифру символом «*».

Тест

Ввод Вывод
a;iejfhu789LKSKJD55ahg7 a;iejfhu***LKSKJD**ahg*
123456789 *********
Q1D2F3G4H5J6K7L8’\ Q*D*F*G*H*J*K*L*’\
Guten Abend!Ich heise Katja. Ich bin 18 Jahre alt Guten Abend!Ich heise Katja. Ich bin  **  Jahre alt
Cсылка на программу:http://ideone.com/CoqOFb

Решение:

Пробежимся по всей строке и проверим каждый символ. Если найдется цифра, то меняем ее на «*», и выводим исправленный текст.

 

Related Images:

АА22

В строке убрать все запятые, пробелы и точки. Буквы нижнего регистра привести к верхнему.

input output Описание
./Task22 «he,.llo,. wo.,.,.,.,r.l. d» HELLOWORLD На входе поступает один параметр  в кавычках, вкотором есть пробел. Он убирается программой.
./Task22 2425s,Go.oD b24.ye 2425SGOODB24YE На входе поступает два параметра, пробел между параметрами убирается автоматически (пробел служил разделением между параметрами).
neznayka

Related Images:

АА13

Задача.

В заданной строке поменять местами рядом стоящие символы между собой (1 и 2, 3 и 4 и т.д., для строки нечетной длины, последний символ не менять).

Тесты.

Ввод Вывод Комментарий
123456 214365 Пройден
abcde badce Пройден

Код.

Используя цикл, проходим по каждому второму символу строки и меняем его с предыдущим.

Данный код на ideone.

Related Images:

А810

Дано натуральное число [latex]n (n <= 1000)[/latex]. Записать это число русскими словами (семнадцать, двести пятьдесят три, тысяча и т. д. ).

Ход решения очень простой, читаем наше [latex]n[/latex] в тиме [latex]integer[/latex] и проверяем, если оно равно [latex]1000[/latex], то выводим ответ «тысяча», иначе берем число по модулю [latex]100[/latex] и присваиваем(дописываем) строке [latex]s[/latex] значение уже заранее описанного для [latex]n mod 100[/latex] ответа. Дальше проверяем так же по десяткам, здесь есть маленький нюанс, для чисел от [latex]10[/latex] до [latex]19[/latex] — эти числа имеют собственное названием, если же [latex](n mod 100)/10[/latex] от  [latex]2[/latex] до [latex]9[/latex], то дописываем в  [latex]s[/latex] соответствующее значение. И последний шаг — это запись едениц, мы берем все число по модулю  [latex]10[/latex] ([latex]n mod 10[/latex]) и дописываем то, что осталось.

 Ссылка на программу

Related Images: