ऐलिस , 23 बाइट्स
/o!
\i@/e)q&w[?'`-+k3-n
इसे ऑनलाइन आज़माएं!
इनपुट लोअर केस होना चाहिए। 1
डॉलर शब्दों के लिए प्रिंट और 0
अन्यथा।
व्याख्या
ऐलिस टेप और कुछ उन्नत नियंत्रण प्रवाह को दिखाने का समय। पूर्णांक और स्ट्रिंग्स के साथ व्यक्तिगत रूप से काम करने में काफी अच्छा होने के बावजूद, ऐलिस के पास कोई अंतर्निर्मित नहीं है) एक स्ट्रिंग की लंबाई निर्धारित करें, बी) वर्णों और उनके कोड बिंदुओं के बीच कनवर्ट करें। इसका कारण यह है कि ऐलिस के सभी आदेश या तो पूर्णांकों को पूर्णांक या तार को तारांकित करते हैं। लेकिन उन दोनों को पूर्णांक या इसके विपरीत के लिए मैपिंग स्ट्रिंग्स की आवश्यकता होगी, इसलिए वे एलिस के किसी भी मोड में फिट नहीं होते हैं।
हालांकि, इसके ढेर के अलावा, ऐलिस में एक टेप भी है और कार्डिनल और ऑर्डिनल मोड टेप पर डेटा की अलग-अलग तरीकों से व्याख्या करते हैं
- कार्डिनल मोड में, यह एक नियमित टेप है जो ब्रेनफक जैसी अन्य भाषाओं से परिचित है। आप प्रत्येक सेल में एक पूर्णांक स्टोर कर सकते हैं और आप एक टेप हेड को इधर-उधर कर सकते हैं। टेप असीम रूप से लंबा है और शुरू में प्रत्येक सेल में -1 रखता है । कोशिकाओं को भी अनुक्रमित किया जाता है और टेप सिर सूचकांक 0 से शुरू होता है ।
- ऑर्डिनल मोड का अपना स्वयं का टेप हेड होता है (इंडेक्स 0 पर शुरू ) और यह टेप को स्ट्रिंग्स की सूची के रूप में व्याख्या करता है। स्ट्रिंग्स को गैर-वर्ण कोशिकाओं (अर्थात किसी भी मान जो एक वैध यूनिकोड कोड बिंदु नहीं हैं) द्वारा समाप्त किया जाता है, विशेष रूप से -1 में । तो ऑर्डिनल मोड के लिए, टेप को शुरू में खाली तारों से भरा जाता है।
इस टेप का उपयोग उपरोक्त दोनों कार्यों के लिए किया जा सकता है: एक स्ट्रिंग की लंबाई प्राप्त करने के लिए, हम इसे ऑर्डिनल मोड में टेप पर लिखते हैं, कार्डिनल मोड में समाप्ति -1 की तलाश करते हैं और टेप हेड की स्थिति को पुनः प्राप्त करते हैं। पात्रों को उनके कोड बिंदुओं में बदलने के लिए, हम उन्हें कार्डिनल मोड में टेप से पढ़ते हैं।
इस समाधान में उपयोग की जाने वाली अन्य दो महत्वपूर्ण विशेषताएं हैं रिटर्न स्टैक और एक इटरेटर। ऐलिस में एक वापसी स्टैक होता है जो आमतौर पर जंप कमांड का उपयोग करते समय भरा जाता है j
, और जिसे आप एक पते को वापस कूदने के लिए पॉप कर सकते हैं k
। हालांकि, यह भी संभव है कि वर्तमान पते को रिटर्न स्टैक के साथ कहीं भी कूदने के बिना धक्का दिया जाए w
। यदि हम रिपीट कमांड के w
साथ संयोजन करते हैं , तो हम वर्तमान पते को रिटर्न स्टैक n बार पुश कर सकते हैं । अब जब भी हम पहुंचते हैं , तो एक प्रति रिटर्न स्टैक से पॉप अप हो जाती है और हम एक और पुनरावृत्ति करते हैं (इसके बाद सेल में शुरू करते हैं, क्योंकि आईपी किसी अन्य कमांड को निष्पादित करने से पहले चलता है)। जब वापसी स्टैक खाली हो जाता है,&
k
w
k
कुछ भी नहीं करता है और आईपी बस के माध्यम से गुजरता है। इसलिए &w...k
एक पूर्णांक n को पॉप करता है और फिर ...
n + 1 बार निष्पादित करता है , जो हमें एक सरल for
लूप व्यक्त करने के लिए बहुत संक्षिप्त तरीका देता है ।
कोड पर ही ...
/ Reflect to SE. Switch to Ordinal.
i Read the input word as a string.
Bounce off bottom boundary, move NE.
! Store the input word on the tape.
Bounce off top boundary, move SE.
/ Reflect to E. Switch to Cardinal.
e Push -1.
) Seek right on the tape for a -1, which finds the -1 terminating
the input word.
q Push the tape head's position, which gives us the string length N.
&w Repeat this loop n+1 times (see above for an explanation)...
[ Move the tape head left by one cell.
? Retrieve the code point of the character in that cell.
'` Push 96.
- Subtract it from the code point to convert the letters to 1...26.
+ Add the result to a running total. This total is initialised to
zero, because in Cardinal mode, the stack is implicitly filled with
an infinite amount of zeros at the bottom.
k End of loop.
Note that the above loop ran once more than we have characters in the
string. This is actually really convenient, because it means that we've
added a "-1 character" to the running total. After subtracting 96 to
convert it to its "letter value" this gives 97. So dollar words will
actually result in 100 - 97 = 3, which we can check against for one
byte less than for equality with 100.
3- Subtract 3 to give 0 for dollar words.
n Logical NOT. Turns 0 (dollar words) into 1 and everything else into 0.
The IP wraps around to the beginning of the first line.
\ Reflect to NE. Switch to Ordinal.
o Implicitly convert the result to a string and print it.
Bounce off top boundary, move SE.
@ Terminate the program.