Когда дети открывают рот, они не просто изрыгают тарабарщину. Они на самом деле говорят в очень продвинутом, защищенном от взрослых шифре ...
Шифр Baby-Talk
Когда ребенок говорит, он может выглядеть примерно так: gogooa gagooook aagaaoooy
каждый разделенный пробелами раздел представляет символ (поэтому в приведенном выше примере представлены 3 символа).
Чтобы расшифровать раздел, мы должны посчитать количество As и Os, которые в нем содержатся. Тем не менее, мы считаем только те, которые соседствуют с другой гласной. Например, A в 'gag' не будет учитываться, но A и O в 'gaog' будут учитываться.
Подсчет приведенного выше примера будет выглядеть так:
Section | Num Os | Num As
gogooa | 2 | 1
gagooook | 4 | 0
aagaaoooy | 3 | 4
Затем мы используем эти значения для преобразования ввода в открытый текст на квадрате Полибия. Это представление английского алфавита в 5х5, в котором пропущен символ «J» (обратите внимание, что в режиме «baby-talk» к таблице применяются правила подсчета 0):
0 1 2 3 4
0 A B C D E
1 F G H I K
2 L M N O P
3 Q R S T U
4 V W X Y Z
Используя номер Os в качестве столбца и номер As в качестве строки, мы находим, какой символ представляет каждый раздел:
Section | Num Os | Num As | Character
gogooa | 2 | 1 | (2,1) -> H
gagooook | 4 | 0 | (4,0) -> E
aagaaoooy | 3 | 4 | (3,4) -> Y
Что говорит нам о том, что ребенок просто говорил "ЭЙ".
Примечания :
- Если раздел, представляющий символ, имеет более 4 символов «As» или «Os», игнорируйте дополнительные, потому что 4 является максимальным значением в таблице. - Для этой задачи Y не является гласным - только A, E, I, O и U.
Соревнование
Ваша задача состоит в том, чтобы создать полную программу, которая принимает один ввод, слово, говорящее по-детски, и печатает его в виде открытого текста.
- Ваша программа должна быть способна принимать ввод как в верхнем, так и в нижнем регистре, а также в обоих сочетаниях.
- Входные данные будут содержать только буквы алфавита ASCII (AZ и az) с одиночными пробелами для разделения слов ребенка.
- Выводить текст можно в любом случае.
- Вы должны принять данные
STDIN
и напечатать открытый текстSTDOUT
. Если на вашем языке их нет, используйте ближайший аналог. - Это код-гольф , поэтому выигрывает самый короткий код в байтах - но любое решение приветствуется.
Тестовые случаи
'GLOOG KAKAAOOO ARGOOO OOOOOGUGUU' -> CODE
'oaka pooopaa gaau augu' -> GOLF
'Aoao U oOOAoa oaoAoo aoAoAOa' -> NAPPY
'GUG gAGaA gOougOou' -> ALE
'OOaGOG GoGOOoGoU gAA bLAA GOUGoOUgAIGAI' -> HELLO
'GUG gAGaA gOougOou' -> 'ALE'
Младенцы пьют эль? : D.toUpperCase()
или аналогичный вызов функции, а не стимулирующий вызовgogooa
вас 2 часа? А как у негоgagooook
0 а?FAG
: PОтветы:
05AB1E , 46 байтов
Попробуйте онлайн!
Пояснение по шагам
источник
Perl, 82 байта
Включает +1 для
-a
Внесите свой вклад в STDIN:
baby.pl
:Это предполагает достаточно недавнюю версию perl, где это и
-a
подразумевается-n
. Если ваш perl слишком стар, вам нужно добавить явную-n
опцию.Предполагается также, что дети не могут произносить общие строки ASCII, начинающиеся с цифр, например
1 this will not work
источник
брейкфук, 656 байт
Это был довольно хороший способ убить пару часов.
Требуется интерпретатор brainfuck, который использует 8-битные обертывающие ячейки, позволяет перейти влево от ячейки 0 и возвращает 0, если
,
используется, когда stdin пуст. По моему опыту, это самые распространенные настройки.Эта программа не считает Y гласным, но если OP хочет этого, это легко исправить.
Кажется, что написать это было бы непростой задачей, но если вы немного знакомы с языком, в коде нет ничего удивительного или нового. Стандартная тактика мозгового перетока: прочитайте ввод, но убедитесь, что вы оставляете пару пустых ячеек между каждым байтом, используйте эти пустые ячейки для хранения данных о вводе, используйте данные, которые вы сохранили, чтобы решить, как преобразовать его и выплевывать что-либо в конце , В данном случае это был ввод данных, установка его в верхний регистр, выяснение того, какие ячейки являются гласными, выбрасывание этой информации после ее использования, чтобы определить, какие ячейки находятся рядом с гласными, установить все, что не рядом с гласной, для некоторых значение, которое никогда не будет иметь значения, поэтому они не мешают позже, и вы в основном сделали. Оттуда вы просто должны сосчитать ваши
A
иO
с, умножитьA
s на 5 и добавьте числоO
s, в особом случае больше 8, чтобы избежать J и вывода. Я решил обрабатывать это одно слово за раз, а не принимать весь ввод за раз, поэтому мне пришлось настроить часть кода, которая читает stdin, на разрыв в 0 или 32, но это не слишком большая проблема (просто оберните вычитание на 32 в условном выражении, чтобы этого не произошло, если значение уже равно 0, затем исправьте любое<
или>
инструкции, которые вы пропустили позже).Я не знаю, насколько это будет полезно, потому что я написал это в основном для того, чтобы мои мысли были ясными, а не как реальное объяснение, но вот код с моими комментариями и его первоначальным отступом:
источник
JavaScript (ES6), 145 байт
Заменяет каждое слово (и следующий пробел) соответствующей буквой.
s.split` `.map().join``
на 3 байта длиннее:источник
Perl, 159 +1 = 160 байт
+1 байт для флага -n. Пробелы не являются частью кода и предоставляются только для удобства чтения.
Код разбивает ввод по пробелам и преобразует каждое слово ребенка в нижний регистр, прежде чем продолжить. Регулярное выражение находит все гласные a или o, за которыми следует другой гласный, или перед которыми стоит гласный, и сортирует их, a в начале, o в конце, а затем находит индекс первого «o». Если оставшееся количество совпадений (иначе, число «а») больше 4, то мы заботимся о 4 «а», а если больше 4, мы заботимся о 4 «а». Затем он вытаскивает соответствующую матрицу из матрицы и печатает ее, затем переходит к следующему детскому слову.
источник
Brainfuck, 283 байта
отформатирован:
Это работает с или без завершающего перевода строки во входных данных.
Попробуйте онлайн.
Каждый символ обрабатывается модом 32 (с потоком управления таким, что код, реализующий операцию мода, встречается в программе только один раз). Это позволяет не учитывать регистр, а также объединять символ пробела и EOF в один регистр. Завершающий перевод строки обрабатывается так же, как
J
, что не влияет на вывод.Эскиз макета памяти:
0 x C c y a A b B
где
c
- вводимый символ,C
- это 32-й символ char,x
является ли он гласным,y
является ли предыдущий символ гласным,A
иB
являются ли числа действительными (рядом с гласными)a
иo
символами соответственно, иa
иb
являются ли их соответствующими буферами, которые копируется или очищается в зависимости от того, есть ли соседний гласный.Когда достигается пробел или EOF, выполняется некоторое жонглирование, чтобы уменьшить число больше 4 и пропустить букву
J
, а затем распечатанный декодированный символ.источник
PHP, 163 байта
Более читаемая версия:
тесты:
источник
Java 8,
272266251249 байт-6 байт благодаря @Joba .
-1 байтовое преобразование из Java 7 в 8 и
1416 дополнительных байтов, сохраненных путем изменения части печати.Объяснение:
Попробуй это здесь.
источник
Python 3
163162157146 байтИспользует регулярное выражение, чтобы найти всю строку гласных больше 2, считает As и Os максимум 4, а затем печатает.
источник
APL, 60
Обратите внимание, что ⎕IO ← 0 и ⎕ML ← 3
Пример:
Работает в Dyalog 15.0 , так как это версия, в которой 819⌶ был введен в нижнем регистре строки.
источник
Pyth, 64 байта
Может быть, можно играть в гольф дальше. Попробуй это здесь!
источник
R, 261 байт
Я думаю, что потратил слишком много времени, чтобы заставить это работать, и я считаю, что это излишне сложное решение, хотя оно работает. Принимает входные данные из stdin, важно, чтобы строка была заключена в кавычки.
Использование четырех вложенных
apply
семейств теоретически может быть уменьшено до двух, если использоватьmapply
вместо этого. Но поскольку входные данныеmapply
не будут иметь одинаковую длину, более короткий перерабатывается, что усложняет ситуацию, и я не мог найти рабочее решение.Если кому-то будет интересно, я добавлю объяснение без заглядывания позже.
Попробуйте все тестовые примеры на R-fiddle
Обратите внимание, что эта версия принимает ввод как аргумент функции вместо стандартного ввода, потому
scan
что не работает на R-скрипте. Кроме того, добавлена новая строка, чтобы было легче читать.источник
Python 3, 262 байта
Меньше гольфа (комментарии - это переменные в сокращенном коде):
Попробуйте онлайн!
источник
blaoaoaog
: чересстрочные гласные считаются более одного раза, давая,z
когда это должно бытьt
(хотя это работает простоaaaooo
, хотя я не могу понять, почему ....)aooa
== (2,2) ==n
,aoaoao
== (3,3) ==t
gaoaoaog
печатает Z вместо T. Я думаю, это потому, что ваше регулярное выражение набирает[ao,oa,ao,oa,ao]
, что считает5,5
, а затем ограничивает его4,4
, печатая Z.Котлин ,
221209 байтТеперь гораздо страшнее и медленнее, всего во имя 11 байтов
Сохраните его в файл (например
BabyTalk.kts
) для запуска в качестве сценария. Или, к вышеуказанному коду можно добавитьfun main(z:Array<String>)=
и скомпилировать его обычно за 26 байтов.Попробуйте онлайн!
Отступ:
источник
PHP,
124 129 121 120125 байтПринимает данные из аргументов командной строки. Запустите
-nr
или попробуйте онлайн .сломать
источник
J , 109 байт
Попробуйте онлайн!
источник