SNOBOL4, 437 430 bytes
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 เพราะเมื่อฉันวางมันที่นั่น linefeed สุดท้ายจะถูกลบออก ฉันพยายามเปลี่ยนบรรทัดต่อเนื่อง (บรรทัดแรกที่ขึ้นต้นด้วย+) เป็นบรรทัดเดียวซึ่งไม่ถูกกฎหมายในเวอร์ชันเมนเฟรมเพราะสายยาวเกินไปและใช้งานได้และนำลงมาที่ 427 ชัด CSNOBOL4 อนุญาตให้สายยาวขึ้น ฉันจะทิ้งคะแนนไว้ที่ 430 เพราะนั่นคือจำนวนสคริปต์ที่อยู่ในเครื่องของฉันและยิ่งกว่านั้น SNOBOL นั้นค่อนข้างไม่สามารถแข่งขันได้
Yมีการจัดการเป็นแกนนำเพื่อให้Yvesเป็นเหมือนหรือIvesArnold