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
अनगुल्फेड (प्लस मैंने एक प्रॉम्प्ट जोड़ा, ऊपर वाला सिर्फ एक नाम टाइप करने के लिए इंतजार करता है):
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अन्यथा। आप बस सफलता पर शाखा और असफलता पर अगली पंक्ति के माध्यम से गिर सकते हैं, या इसके विपरीत।
निरंतरता रेखाएं +या के साथ शुरू होती हैं .। टिप्पणियाँ एक के साथ शुरू होती हैं *।
यह कैसे काम करता है?
एक नाम में पढ़ें, इसे निचले मामले में बदलें। बी-, एफ-, और एम-नाम यह मानते हुए सेट करें कि यह एक स्वर से शुरू होता है। फिर जांचें कि क्या यह व्यंजन की अवधि से शुरू होता है। यदि नहीं, तो हम जाने के लिए तैयार हैं! यदि ऐसा है, तो अग्रणी व्यंजन को पट्टी करें और यह मान लें कि यह अक्षरों में से किसी के साथ शुरू नहीं होता है। अंत में, जाँच करें कि क्या यह बदले में प्रत्येक अक्षर से शुरू होता है, आवश्यकतानुसार नामों को ठीक करना। फिर हम नाम का खेल खेलने के लिए तैयार हैं!
नमूना रन:
# $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
मैं पर इस भाग गया हरक्यूलिस एस / 370 मेनफ्रेम के 6.0a रिहाई चल एमुलेटर मिशिगन टर्मिनल प्रणाली 1 अप्रैल, 1973 1 मई 1975 पर एमटीएस के लिए बनाया से SNOBOL4 संस्करण 3.10 का उपयोग कर, लेकिन वहाँ चलाने के लिए शायद आसान तरीके हैं SNOBOL4 एक पर आधुनिक प्रणाली। :)
संपादित करें: एक निरर्थक सफलता शाखा को हटा दिया गया था जो एक गिरावट के बराबर था (मुझे नहीं पता था कि मैं केवल एक विफलता शाखा को अपने द्वारा डाल सकता हूं) जो एक अनावश्यक शाखा लेबल को समाप्त कर देती है, और बिना शर्त के गोटो को पूर्व पंक्ति में विफलता शाखा में बदल दिया। 7 बाइट की बचत के लिए।
अब जब TIO में SNOBOL4 समर्थन है तो आप इसे ऑनलाइन आज़मा सकते हैं
! नोट: यह आकार 430 के बजाय 429 के रूप में दिखाता है क्योंकि जब मैंने इसे वहां चिपकाया, तो अंतिम लाइनफीड हटा दिया गया। मैंने निरंतरता लाइन (एक शुरुआत +) को एक पंक्ति में बदलने की कोशिश की , जो मेनफ्रेम संस्करण पर कानूनी नहीं थी क्योंकि यह रेखा बहुत लंबी थी, और यह काम किया और इसे 427 तक लाया। जाहिर तौर पर CSNOBOL4 लंबी लाइनों की अनुमति देता है। मैं अपने स्कोर को 430 पर छोड़ने जा रहा हूं, हालांकि, क्योंकि मेरी मशीन पर स्क्रिप्ट कितनी बाइट्स थी, और इसके अलावा, SNOBOL बहुत गैर-प्रतिस्पर्धी है।
Yहै कि एक मुखर के रूप में संभाला जाता है, इसलिए ऐसाYvesहैIvesयाArnold।