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
Ungolfed (cộng với tôi đã thêm một dấu nhắc; cái ở trên chỉ chờ một tên được gõ):
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
Đây là chương trình SNOBOL đầu tiên tôi từng viết.
SNOBOL là một ngôn ngữ định hướng theo dòng, như FORTRAN, COBOL hoặc BASIC. Mỗi dòng bao gồm một nhãn tùy chọn bắt đầu trong cột 1, mã cho dòng có thể liên quan đến bài tập và khớp mẫu và một nhánh tùy chọn. Có, dòng kết thúc bằng (tùy chọn) GOTOs. Chúng có hai dạng:
:(TARGET)
Chi nhánh để dán nhãn TARGET, trong khi
:S(SUCCESS) F(FAILURE)
Các nhánh để SUCCESSnếu khớp mẫu thành công, hoặc FAILUREnếu không. Bạn cũng có thể chỉ phân nhánh thành công và rơi vào dòng tiếp theo về thất bại, hoặc ngược lại.
Các dòng tiếp tục bắt đầu bằng một +hoặc .. Nhận xét bắt đầu bằng a *.
Làm thế nào nó hoạt động?
Đọc trong một tên, chuyển đổi nó thành chữ thường. Thiết lập tên B-, F- và M giả sử nó bắt đầu bằng nguyên âm. Sau đó kiểm tra nếu nó bắt đầu với một loạt các phụ âm. Nếu không, chúng tôi đã sẵn sàng để đi! Nếu vậy, hãy loại bỏ các phụ âm hàng đầu và thiết lập các tên B-, F- và M giả sử nó không bắt đầu bằng bất kỳ chữ cái nào trong số đó. Cuối cùng, kiểm tra xem nó có bắt đầu với từng chữ cái đó không, sửa tên nếu cần. Sau đó, chúng tôi đã sẵn sàng để chơi trò chơi tên!
Chạy mẫu:
# $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
Tôi đã chạy nó trên trình giả lập máy tính lớn Hercules S / 370 chạy phiên bản 6.0a của Hệ thống đầu cuối Michigan sử dụng SNOBOL4 phiên bản 3.10 từ ngày 1 tháng 4 năm 1973 được xây dựng cho MTS vào ngày 1 tháng 5 năm 1975, nhưng có lẽ có nhiều cách dễ dàng hơn để chạy SNOBOL4 trên một hệ thống hiện đại. :)
Chỉnh sửa: Đã xóa một nhánh thành công dư thừa tương đương với một sự sụp đổ (Tôi không nhận ra rằng tôi có thể tự đặt một nhánh thất bại) để loại bỏ nhãn nhánh không cần thiết và biến một goto vô điều kiện thành một nhánh thất bại trên dòng trước đó, để tiết kiệm 7 byte.
Bây giờ TIO có hỗ trợ SNOBOL4, bạn có thể dùng
thử trực tuyến! Lưu ý: Nó hiển thị kích thước là 429 thay vì 430 vì khi tôi dán nó ở đó, nguồn cấp dữ liệu cuối cùng đã bị xóa. Tôi đã thử thay đổi dòng tiếp tục (bắt đầu bằng +) thành một dòng duy nhất, không hợp pháp trên phiên bản máy tính lớn vì dòng này quá dài, và nó đã hoạt động và đưa nó xuống mức 427. Rõ ràng CSNOBOL4 cho phép các dòng dài hơn. Mặc dù vậy, tôi sẽ để điểm số của mình ở mức 430, bởi vì đó là bao nhiêu byte tập lệnh trên máy của tôi, và bên cạnh đó, SNOBOL khá không cạnh tranh.
Yđược xử lý như một giọng hát, như vậyYveslàIveshayArnold.