SNOBOL4, 437 430 байт
N = TRIM(INPUT)
D = REPLACE(N,'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+'abcdefghijklmnopqrstuvwxyz')
B = "b" D
F = "f" D
M = "m" D
&ANCHOR = 1
D SPAN('bcdfghjklmnpqrstvwxyz') . I REM . R :F(Y)
B = "b" R
F = "f" R
M = "m" R
I "b" :S(U)
I "f" :S(V)
I "m" :S(W) F(Y)
U D "b" REM . B :(Y)
V D "f" REM . F :(Y)
W D "m" REM . M
Y OUTPUT = N ", " N ", bo-" B
OUTPUT = "Banana-fana fo-" F
OUTPUT = "Fee-fi-mo-" M
OUTPUT = N "!"
END
Ungolfed (плюс я добавил приглашение; вышеприведенное просто ожидает ввода имени):
OUTPUT = "Please enter your name."
Name = TRIM(INPUT)
UC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
LC = 'abcdefghijklmnopqrstuvwxyz'
Low = REPLACE(Name, UC, LC)
BName = "b" Low
FName = "f" Low
MName = "m" Low
Consonants = SPAN('bcdfghjklmnpqrstvwxyz')
&ANCHOR = 1
Low Consonants . First REM . Rest :F(READY)
BName = "b" Rest
FName = "f" Rest
MName = "m" Rest
First "b" :S(BINIT)
First "f" :S(FINIT)
First "m" :S(MINIT) F(READY)
BINIT Low "b" REM . BName :(READY)
FINIT Low "f" REM . FName :(READY)
MINIT Low "m" REM . MName
READY OUTPUT = Name ", " Name ", bo-" BName
OUTPUT = "Banana-fana fo-" FName
OUTPUT = "Fee-fi-mo-" MName
OUTPUT = Name "!"
END
Это первая программа SNOBOL, которую я написал.
SNOBOL - это линейно-ориентированный язык, такой как FORTRAN, COBOL или BASIC. Каждая строка состоит из необязательной метки, начинающейся в столбце 1, кода для строки, которая может включать в себя назначения и сопоставление с образцом, и необязательной ветви. Да, строки заканчиваются (необязательно) GOTO. Они бывают двух видов:
:(TARGET)
Ветви для маркировки TARGET, а
:S(SUCCESS) F(FAILURE)
Ветвится, SUCCESSесли совпадение с шаблоном прошло успешно, или FAILUREиначе. Вы также можете просто перейти в случае успеха и перейти к следующей строке в случае неудачи, или наоборот.
Строки продолжения начинаются с +или .. Комментарии начинаются с *.
Как это работает?
Прочитайте имя, преобразуйте его в нижний регистр. Установите B-, F- и M-имена, предполагая, что они начинаются с гласной буквы. Тогда проверьте, начинается ли это с диапазона согласных. Если нет, мы готовы идти! Если так, удалите ведущие согласные и установите B-, F- и M-имена, предполагая, что они не начинаются ни с одной из этих букв. Наконец, проверьте, начинается ли он с каждой из этих букв по очереди, исправляя имена по мере необходимости. Тогда мы готовы играть в игру «Имя»!
Образец прогона:
# $RUN *SNOBOL4 5=GOLF.SNO+*SOURCE* 6=*DUMMY*(1,28)+*SINK*(1,4)+*DUMMY*
# Execution begins 16:57:25
Snowman
Snowman, Snowman, bo-bowman
Banana-fana fo-fowman
Fee-fi-mo-mowman
Snowman!
# Execution terminated 16:57:30 T=0.013
Я запустил это на эмуляторе мейнфрейма Hercules S / 370, работающем под управлением версии 6.0a Мичиганской терминальной системы с использованием SNOBOL4 версии 3.10 от 1 апреля 1973 года, созданной для MTS 1 мая 1975 года, но, вероятно, есть более простые способы запуска SNOBOL4 на современная система. :)
Редактировать: удалил избыточную ветвь успеха, которая была эквивалентна падению (я не понимал, что могу поставить только ветку отказа), которая удаляла ненужную метку ветви, и превратила безусловный переход в ветку ошибки на предыдущей строке, для экономии 7 байтов.
Теперь, когда у TIO есть поддержка SNOBOL4, вы можете
попробовать это онлайн! Примечание: он показывает размер как 429, а не 430, потому что когда я вставил его туда, окончательный перевод строки был удален. Я попытался изменить строку продолжения (начинающуюся с +) на одну строку, что было недопустимо в версии для мэйнфреймов, потому что строка была слишком длинной, и это сработало и уменьшило ее до 427. Очевидно, что CSNOBOL4 допускает более длинные строки. Я собираюсь оставить свой счет на 430, потому что это - то, сколько байтов был сценарий на моей машине, и кроме того, SNOBOL довольно неконкурентоспособен.
Yчто обрабатывается как вокал, такYvesже, какIvesилиArnold.