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 на a сучасна система. :)
Редагувати: Видалено надлишкову гілку успіху, яка була еквівалентною падінню (я не усвідомлював, що міг би поставити просто гілку відмови), яка усуває непотрібну мітку гілки та перетворила безумовне перехід у гілку відмови на попередньому рядку, для економії 7 байт.
Тепер, коли TIO має підтримку SNOBOL4, ви можете
спробувати його в Інтернеті! Примітка. Він показує розмір як 429, а не 430, тому що коли я вставив його, остаточне виведення рядка видалено. Я спробував змінити рядок продовження (той, що починається з +) на один рядок, що не було законним для версії для мейнфрейму, тому що лінія була занадто довгою, вона працювала і знизила її до 427. Очевидно, CSNOBOL4 дозволяє довші рядки. Я збираюся залишити свою оцінку в 430, тому що саме стільки байтів було на моїй машині, а крім того, SNOBOL є досить неконкурентним.
Yце обробляється як вокал, такYvesякIvesабоArnold.