SNOBOL4, 437 430 byte
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
Tidak tergabung (ditambah saya menambahkan prompt; yang di atas hanya menunggu nama yang akan diketik):
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
Ini adalah program SNOBOL pertama yang pernah saya tulis.
SNOBOL adalah bahasa berorientasi garis, seperti FORTRAN, COBOL, atau BASIC. Setiap baris terdiri dari label opsional yang dimulai pada kolom 1, kode untuk baris yang dapat melibatkan penugasan dan pencocokan pola, dan cabang opsional. Ya, garis diakhiri dengan GOTO (opsional). Mereka datang dalam dua bentuk:
:(TARGET)
Cabang untuk diberi label TARGET, sementara
:S(SUCCESS) F(FAILURE)
Cabang ke SUCCESSjika pola cocok berhasil, atau FAILUREsebaliknya. Anda juga bisa hanya cabang pada kesuksesan dan jatuh ke baris berikutnya pada kegagalan, atau sebaliknya.
Garis lanjutan dimulai dengan a +atau .. Komentar dimulai dengan a *.
Bagaimana cara kerjanya?
Baca dalam nama, ubah menjadi huruf kecil. Atur B-, F-, dan M-nama dengan asumsi itu dimulai dengan vokal. Kemudian periksa apakah itu dimulai dengan rentang konsonan. Jika tidak, kami siap berangkat! Jika demikian, cabut konsonan utama dan atur nama B-, F-, dan M dengan asumsi itu tidak dimulai dengan huruf-huruf itu. Akhirnya, periksa apakah itu dimulai dengan masing-masing huruf pada gilirannya, memperbaiki nama-nama yang diperlukan. Maka kita siap untuk memainkan permainan nama!
Contoh dijalankan:
# $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
Saya menjalankan ini pada emulator mainframe Hercules S / 370 menjalankan 6.0a rilis Sistem Terminal Michigan menggunakan SNOBOL4 versi 3.10 dari 1 April 1973 dibangun untuk MTS pada 1 Mei 1975, tetapi mungkin ada cara yang lebih mudah untuk menjalankan SNOBOL4 pada sistem modern. :)
Sunting: Menghapus cabang sukses yang berlebihan yang setara dengan fallthrough (saya tidak menyadari bahwa saya dapat menempatkan hanya cabang kegagalan dengan sendirinya) yang menghilangkan label cabang yang tidak dibutuhkan, dan mengubah goto tanpa syarat menjadi cabang kegagalan pada baris sebelumnya, untuk penghematan 7 byte.
Sekarang TIO memiliki dukungan SNOBOL4 Anda dapat
mencobanya secara online! Catatan: Ini menunjukkan ukuran sebagai 429 daripada 430 karena ketika saya menempelkannya di sana, umpan baris terakhir dihapus. Saya mencoba mengubah garis kelanjutan (yang dimulai dengan +) menjadi satu baris, yang tidak sah pada versi mainframe karena garis itu terlalu panjang, dan itu bekerja dan membawanya ke 427. Jelas CSNOBOL4 memungkinkan garis yang lebih panjang. Saya akan meninggalkan skor saya di 430, karena itu berapa banyak byte skrip ada di komputer saya, dan selain itu, SNOBOL sangat tidak kompetitif.
Yditangani sebagai vokal, begituYvesjuga sepertiIvesatauArnold.