Напишите программу для игры в название игры .
вход
Ваша программа должна каким-то образом принимать одно имя в качестве ввода от пользователя (например, чтение из стандартного ввода или в качестве аргумента командной строки). Можно предположить, что имя представляет собой одно слово, состоящее из заглавной буквы, за которой следуют одна или несколько строчных букв.
Вывод
Ваша программа должна напечатать рифму для данного имени, как объяснено в песне, заполнив следующий шаблон:
(X), (X), bo-b(Y)
Banana-fana fo-f(Y)
Fee-fi-mo-m(Y)
(X)!
Здесь (X)
- оригинальное имя, и (Y)
это имя в нижнем регистре с удаленными начальными согласными.
Однако есть одно исключение. Если оригинальное имя начиналось с m
, f
или b
, оно должно быть написано без этой буквы в соответствующей строке. Например, если имя было Bob
, строка "b" должна заканчиваться bo-ob
. Обратите внимание, что в этом случае любые другие согласные сохраняются, так что для Fred
этого fo-red
нет fo-ed
.
Примеры
Ширли:
Shirley, Shirley, bo-birley
Banana-fana fo-firley
Fee-fi-mo-mirley
Shirley!
Арнольд:
Arnold, Arnold, bo-barnold
Banana-fana fo-farnold
Fee-fi-mo-marnold
Arnold!
Боб:
Bob, Bob, bo-ob
Banana-fana fo-fob
Fee-fi-mo-mob
Bob!
Фред:
Fred, Fred, bo-bed
Banana-fana fo-red
Fee-fi-mo-med
Fred!
счет
Самый короткий код выигрывает.
Y
что обрабатывается как вокал, такYves
же, какIves
илиArnold
.Y
как гласный, только если за ним следует согласный. Это должно охватывать как минимум эти случаи.Ответы:
VI,
118115Код включает в себя 5 управляющих символов, которые я поместил в скобки. Каждый учитывается только как один символ на счет персонажа.
РЕДАКТИРОВАТЬ: Перемещение первого соединения (J) на более позднее и изменение вставки перед (P) на вставку после (p) спасло мне 1 символ. Кроме того, отсутствие захвата в регулярном выражении спасло мне еще 2 символа.
источник
SNOBOL4,
437430 байтUngolfed (плюс я добавил приглашение; вышеприведенное просто ожидает ввода имени):
Это первая программа SNOBOL, которую я написал.
SNOBOL - это линейно-ориентированный язык, такой как FORTRAN, COBOL или BASIC. Каждая строка состоит из необязательной метки, начинающейся в столбце 1, кода для строки, которая может включать в себя назначения и сопоставление с образцом, и необязательной ветви. Да, строки заканчиваются (необязательно) GOTO. Они бывают двух видов:
Ветви для маркировки
TARGET
, аВетвится,
SUCCESS
если совпадение с шаблоном прошло успешно, илиFAILURE
иначе. Вы также можете просто перейти в случае успеха и перейти к следующей строке в случае неудачи, или наоборот.Строки продолжения начинаются с
+
или.
. Комментарии начинаются с*
.Как это работает?
Прочитайте имя, преобразуйте его в нижний регистр. Установите B-, F- и M-имена, предполагая, что они начинаются с гласной буквы. Тогда проверьте, начинается ли это с диапазона согласных. Если нет, мы готовы идти! Если так, удалите ведущие согласные и установите B-, F- и M-имена, предполагая, что они не начинаются ни с одной из этих букв. Наконец, проверьте, начинается ли он с каждой из этих букв по очереди, исправляя имена по мере необходимости. Тогда мы готовы играть в игру «Имя»!
Образец прогона:
Я запустил это на эмуляторе мейнфрейма Hercules S / 370, работающем под управлением версии 6.0a Мичиганской терминальной системы с использованием SNOBOL4 версии 3.10 от 1 апреля 1973 года, созданной для MTS 1 мая 1975 года, но, вероятно, есть более простые способы запуска SNOBOL4 на современная система. :)
Редактировать: удалил избыточную ветвь успеха, которая была эквивалентна падению (я не понимал, что могу поставить только ветку отказа), которая удаляла ненужную метку ветви, и превратила безусловный переход в ветку ошибки на предыдущей строке, для экономии 7 байтов.
Теперь, когда у TIO есть поддержка SNOBOL4, вы можете попробовать это онлайн! Примечание: он показывает размер как 429, а не 430, потому что когда я вставил его туда, окончательный перевод строки был удален. Я попытался изменить строку продолжения (начинающуюся с
+
) на одну строку, что было недопустимо в версии для мэйнфреймов, потому что строка была слишком длинной, и это сработало и уменьшило ее до 427. Очевидно, что CSNOBOL4 допускает более длинные строки. Я собираюсь оставить свой счет на 430, потому что это - то, сколько байтов был сценарий на моей машине, и кроме того, SNOBOL довольно неконкурентоспособен.источник
N = TRIM(INPUT)
могут быть такимиN =TRIM(INPUT)
.J , 149 знаков
источник
Javascript, 115 байт
Объяснение:
эта функция возвращает имя без начальных согласных
Тогда остальное - функция, возвращающая строку завершенную строку.
Редактировать: от 119 до 115 байт благодаря @Martin Ender
источник
/[aeiou]\w*/i
.JavaScript, <s>119</s> 115 bytes
в заголовке, чтобы дать людям подсказку, что изначально была более длинная версия, если они заинтересованы.Clojure , 292 символа после минимизации
Вот первая попытка, почти положительная, я могу продолжать дальше:
Я только изучаю clojure и подумал, что было бы весело дать этому шанс. Вот мои рассуждения:
источник
Scala 281
Я заменил (X) и (Y) в шаблоне на
#
и012
.S
это просто новое имяString
иa(b,c,d)
сокращенное определениеb.replaceAll(c,d)
Тестовый вызов:
И безглым
источник
Python 3,
148,145,142 байтаДа, я знаю, что уже немного поздно, но ...
Он использует новые f-строки для форматирования результирующей строки.
Я не думаю, что TIO пока поддерживает f-строки, к сожалению.
Старая версия
Сохранено 3 байта благодаря @officialaimm
источник
Sed, 162 байта
Я не очень хорошо знал sed, прежде чем сделал это. Теперь я знаю это намного лучше. Первый sed в конвейере дублирует имя три раза, поэтому вместо «Bob» оно становится «Bob \ nBob \ nBob \ nBob». Следующий сед делает тяжелую работу.
Ожидает ввода на STDIN, как
echo Name |sed ...
Ungolfed:
Пару заметок. Первые четыре совпадения, 1 с, 2 с, 3 с, 4 с, превращают вывод в нечто не совсем правильное. Боб стал bo-bbob, Фред стал fo-ffred, а Майк стал mo-mmike. Кей станет Мо-Мкаем, Мкаем?
Затем нам нужно заменить либо bo-bbob на bo-ob, либо bo-bkay на bo-bay. Чтобы сделать это, мы можем использовать функцию, где мы делаем одну подстановку ///, а затем выполняем ветвь, если она удалась, перепрыгивая через другую, которую мы теперь хотим пропустить. Но если он пропустил, мы хотим провалиться через ветку и сделать следующую замену.
Команда t [label] делает это, разветвляясь, только если предыдущий s /// соответствует. Но в начале скрипта я уже сделал по одному s /// для каждой строки (первые числа в 1, 2 и т. Д. Являются адресами; они означают, что команда выполняется только при совпадении адреса). Поэтому независимо от того, на какой линии мы находимся, 1, 2, 3 или 4, по крайней мере, один s /// соответствует. (Я попытался сделать это наоборот, массируя имена, а затем добавив «Банан и т. Д.» После, но застрял таким образом, и попытка сделать все это сразу вызовет некоторое повторение.) К счастью, флаг может очистить, взяв ветку, поэтому мы делаем это с помощью "tx;: x". TX ветвится до метки x, а: x это метка x.
Уф! Это очищает вкус для последних двух замен. Мы пробуем один, и если это удается, мы разветвляемся на другой, в противном случае мы делаем второй. В любом случае мы получим метку: z, а буфер шаблонов содержит одну строку текста песни, которая выводится на стандартный вывод.
Спасибо, что обманули меня и потратили достаточно времени на man-страницу sed и руководство Texinfo, чтобы, наконец, понять, как сделать больше, чем sed s / foo / bar /
источник
|
всех остальных. Может быть, я должен назвать это bash / sed или считать по-другому? Я не знаю. Я доволен этим как есть, но дайте мне знать, если он будет другим по стандартам PPCG.Питон, 161
Просто понял, что мой код не работает ...
- Не удаляет начальные константы.
- Не управляет бизнесом «Бо-Обь».
Это самое дальнее, что у меня есть, может быть, кто-нибудь может закончить
источник
Groovy, 146
источник
R 189 символов
Но с помощью еще одного символа вы можете ввести сразу несколько имен:
источник
Pyth , 111 байтов SBCS
Тестирование
В коде используются непечатаемые символы, и поэтому он не отображается должным образом в Stack Exchange. Приведенная ссылка содержит эти символы и является правильной версией программы.
источник
питон
источник