ब्लॉकस्क्रिप्ट - 535
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
ब्लॉकस्क्रिप्ट एक तुच्छ स्पेगेटी स्टैक- आधारित भाषा है जिसे मैंने विशेष रूप से इस चुनौती के लिए बनाया है। आधार दुभाषिया blockcript.c है ।
नमूना कार्यक्रम (पहले 15 फाइबोनैचि संख्या प्रिंट करता है):
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;
दुभाषिया उस क्रम में मानक इनपुट से स्रोत कोड और प्रोग्राम इनपुट दोनों को पढ़ता है। इसका मतलब यह है कि एक दुभाषिया के भीतर दुभाषिया चलाने के लिए, दुभाषिया को कॉपी और पेस्ट करें:
# Level 1
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
# Level 2
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
# Level 3
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;
फिल्म इंसेप्शन की तरह , आप तीन स्तरों की तुलना में बहुत गहरे तक नहीं जा सकते। यह समय की बात नहीं है, लेकिन अंतरिक्ष की। ब्लॉकस्क्रिप्ट मेमोरी को गहराई से लीक करता है, और इसके साथ यह करना पड़ता है कि भाषा स्वयं कैसे डिज़ाइन की जाती है।
भाषा संदर्भ:
यहां दुभाषिया प्राप्त करें
ब्लॉकस्क्रिप्ट में, "स्टैक" एक ऐसा सरणी नहीं है जिसे बाद के संचालन द्वारा अधिलेखित किया जाता है जैसे कि आपको उपयोग किया जा सकता है। यह वास्तव में एक अपरिवर्तनीय लिंक्ड सूची के रूप में लागू किया जाता है, और एक स्टैक प्रोग्राम की अवधि के लिए बनी रहती है। इसके अलावा, कोई भी ऑपरेटर (छोड़कर @
) स्टैक से मूल्यों को नहीं हटाता है। हालांकि, स्टैक संशोधन केवल उस ब्लॉक को प्रभावित करते हैं जिसमें वे होते हैं।
मान चयन
a
के माध्यम से z
स्टैक से 0-25 वां आइटम लाएं, और इसे स्टैक पर धकेल दें। a
स्टैक के प्रमुख, या हाल ही में धकेल दिए गए आइटम को संदर्भित करता है।
A
के माध्यम से Z
वर्तमान फ्रेम के 0-25 वें आइटम को प्राप्त करें, और इसे स्टैक पर धकेल दें।
[
स्टैक के सिर पर स्टैक संदर्भ (नीचे देखें) से आइटम का चयन करने के लिए एक "फ्रेम" खोलें। [
एक मिलान की आवश्यकता नहीं है ]
, लेकिन फ्रेम को शाब्दिक रूप से स्कूप किया गया है। ब्लॉकस्क्रिप्ट में, "स्कोप" को ब्लॉक बनाने वाले ब्रेसिज़ ( {
... }
) द्वारा निर्धारित किया जाता है । इस प्रकार, ब्लॉक के अंदर एक फ्रेम खोलने से ब्लॉक के बाहर कोड पर कोई प्रभाव नहीं पड़ेगा।
]
वर्तमान फ्रेम को बंद करें, पिछले फ्रेम (यदि कोई हो) पर लौट रहा है।
ब्लाकों
{
... }
एक "ब्लॉक" बनाएं, और इसे स्टैक पर धक्का दें। एक ब्लॉक के अंदर, स्टैक उसी पर शुरू होगा, जो ब्लॉक से पहले था, सिवाय इसके कि कॉलर को ऊपर की तरफ धकेल दिया जाएगा। ब्लॉकस्क्रिप्ट में स्टैक्स लगातार और अपरिवर्तनीय होते हैं, इसलिए ब्लॉक क्लोजर होते हैं। मुहावरे का {[
अर्थ है एक ब्लॉक खोलें, फिर तर्कों का चयन शुरू करने के लिए एक फ्रेम खोलें (के A
माध्यम से Z
)। एक ब्लॉक का वापसी मूल्य स्टैक का प्रमुख होता }
है जब पहुंच जाता है।
उदाहरण:
'3 '2 '1 {[ b. d. f. B. C. D. A! } 'D 'C 'B d!;
यह प्रिंट करता है 123BCD123DCB123BCD123DCB…
। निचला अक्षर स्टैक मानों को संदर्भित करता है, जबकि अपरकेस अक्षर तर्कों को संदर्भित करता है (क्योंकि फ्रेम कॉलर के ढेर पर सेट होता है)। A!
कॉल करने वाले के सिर को ले जाता है (जिसे कॉल किए जाने वाले ब्लॉक होने की गारंटी है) और उसे कॉल करता है। यदि आप सोच रहे हैं कि यह BCD
हर दूसरे समय में उलट क्यों होता है , तो ऐसा इसलिए है क्योंकि B. C. D.
ब्लॉक में खुद को कॉल करने से ठीक पहले उन तर्कों को रिवर्स ऑर्डर में धकेल दिया जाता है।
!
एक ब्लॉक को बुलाओ। स्टैक पर वापसी मान पुश करें।
ढेर संदर्भ
&
स्टैक संदर्भ बनाएँ, और इसे स्टैक पर धकेलें। इसे "सुपर-कॉन्स" के रूप में सोचें, क्योंकि यह प्रभावी रूप से स्टैक पर प्रत्येक आइटम को लेता है और इसमें से एक "टपल" बनाता है। मुहावरा &[
अर्थ यह है कि जो कुछ भी a
, b
, c
संदर्भित किया जाता से पहले अब से पहुँचा जा सकता है के लिए A
, B
, C
(ब्लॉक के शेष के लिए या जब तक ]
का सामना करना पड़ा है)।
भाग में, क्योंकि &
आमतौर पर इसकी आवश्यकता से अधिक मूल्य कैप्चर करते हैं, ब्लॉकस्क्रिप्ट डिज़ाइन द्वारा मेमोरी को लीक करता है।
@
स्टैक संदर्भ द्वारा इंगित स्टैक पर स्विच करें a
। यह ऑपरेटर बल्कि अजीब है, लेकिन दो बार एक ही तर्कों को आगे बढ़ाने से बचने के लिए ब्लॉकस्क्रिप्ट सेल्फ-इंटरप्रेटर इसे कुछ बार उपयोग करता है। @
(या उस मामले के लिए किसी भी स्टैक ऑपरेशन) के प्रभाव को उस ब्लॉक तक सीमित किया जाता है जिसमें इसे लागू किया जाता है। इसके अलावा, फ्रेम से अप्रभावित है @
, इसलिए फ्रेम का उपयोग उन मूल्यों को हथियाने के लिए किया जा सकता है जो आपको स्टैक स्विच करने के बाद की आवश्यकता होती है।
सशर्त अभिव्यक्ति
?
सत्य पर :
<> असत्य पर>
सशर्त अभिव्यक्ति, सी। में टर्नरी ऑपरेटर की तरह, यदि a
वह "सत्य" है (जो पूर्णांक शून्य के बराबर नहीं है), तो <सत्य पर> करें , अन्यथा <झूठी पर करें ।
आई / ओ
नोट: इनपुट और आउटपुट UTF-8 में किए गए हैं। एक "वर्ण" एक यूनिकोड इंडेक्स के अनुरूप एक पूर्णांक है।
,
इनपुट का अगला वर्ण प्राप्त करें, और इसे स्टैक पर धकेलें। यदि इनपुट का अंत हो गया है, तो इसके बजाय -1 पुश करें।
.
स्टैक के सिर पर चरित्र को आउटपुट करें।
पूर्णांक / चरित्र शाब्दिक
नोट: ब्लॉगर और अक्षर ब्लॉकस्क्रिप्ट में समान हैं।
'c
चरित्र को धक्का दे।
[0-9] +
दशमलव पूर्णांक पुश करें।
अंकगणित
ये ऑपरेटर केवल पूर्णांक मानों पर काम करते हैं।
+
गणना b
+ a
(परिणाम को धकेलना, लेकिन मूल्य को त्यागना नहीं)।
-
गणना b
- a
।
*
गणना b
* a
।
/
गणना b
/ a
(पूर्णांक विभाजन; ऋणात्मक अनंत की ओर गोल)।
%
गणना b
% a
(पूर्णांक मापांक; ऋणात्मक अनंत की ओर गोल)।
संबंधपरक संकारक
ये ऑपरेटर केवल पूर्णांक मानों पर काम करते हैं।
<
अगर b
तुलना में कम है a
, धक्का 1, और धक्का 0।
>
=
कई तरह का
#
लाइन के अंत में टिप्पणी करें
- कार्यक्रम समाप्त होना चाहिए
;
- अन्य सभी पात्रों को अनदेखा किया जाता है।
/usr/bin/cat
) ट्यूरिंग-पूर्णता के बारे में क्या?