> <> (मछली), १० 107 106 १०३ बाइट्स
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
इसे ऑनलाइन आज़माएं!
यह सुपर यादृच्छिक नहीं है, लेकिन यह यादृच्छिक है। बस स्ट्रिंग और पूर्णांक को स्टैक पर रखें (उदाहरण: "हैलो वर्ल्ड!", 5)।
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
पूर्ण व्याख्या
यह कोड का थोड़ा पुराना संस्करण है, जब तक मैं स्पष्टीकरण को अपडेट नहीं करता। यह ज्यादातर एक ही है, शायद पढ़ने में थोड़ा आसान है:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
हम दिखावा करेंगे स्ट्रिंग पैरामीटर है s
और पूर्णांक पैरामीटर है i
।
< v}:{r&" "
<
मछली तुरंत स्थानांतरित करने के लिए छोड़ दिया है, जो करने के लिए इर्द-गिर्द घूमती बताता " "
है, जो एक अंतरिक्ष ढेर करने के लिए characted कहते हैं। फिर मछली यात्रा करती है &
, जो अंतरिक्ष को रजिस्टर में जोड़ती है। r
स्टैक को उलट देता है और {:}
स्टैक को बाईं ओर रखता है (स्टैक i
के अंत पर डालते हुए), स्टैक के अंत पर मूल्य को कॉपी करता है, फिर इसे दाईं ओर शिफ्ट करता है। v
मछली को नीचे की ओर बढ़ना शुरू करने के लिए कहता है।
+1xv
+2<v
}
x
मछली को एक यादृच्छिक दिशा में ले जाने के लिए कहता है, जिसके परिणामस्वरूप मछली सही हो रही है और नीचे की ओर जा रही है, 1+
या 2+
पहले या बाद में गुजरती है । ये स्टैक के अंत में संख्या में क्रमशः 1 या 2 जोड़ते हैं। यदि मछली ऊपर की ओर जाती है, तो वह v
फिर से टकराती है और वापस नीचे की ओर यात्रा करती है। }
स्टैक को दाईं ओर शिफ्ट करता है, फिर स्टैक i
पर स्थिति 1 पर और स्थिति 0 पर नया चर (हम इसे कॉल करेंगे m
)।
:&:<~ v!?=&
यह खंड एक फ़ंक्शन है, इसे व्हाट्सएपट्रीमर कहते हैं । यह जहां से शुरू होता है<
है। यह बस स्ट्रिप्स के अंत में स्ट्रिप्स (ताकि स्ट्रिंग की शुरुआत) के अंत तक रिक्त स्थान है जब तक कि यह एक गैर-अंतरिक्ष चरित्र में नहीं चलता।
तो तुरंत मछली एक में तैरती है <
और बाईं ओर यात्रा करनी चाहिए। यह तब चलता है, :&:&
जो स्टैक के अंत में मूल्य को कॉपी करता है, स्टैक के अंत में रजिस्टर से स्थान रखता है, इसे कॉपी करता है, फिर इसे रजिस्टर पर वापस रखता है।
फिर मछली हिट करती है =?!v ~
, या अधिक विशेष रूप से =
, जो पिछले दो मूल्यों (जो हमने अभी बनाया है) को स्टैक से दूर करता है, उनकी तुलना करता है, स्टैक के अंत में 1 रखता है यदि वे बराबर हैं, और एक 0 पर यदि वे अलग हैं तो स्टैक का अंत। ?
ढेर के अंत नया मान दिखाई दे, अगर यह 0 यह अगले निर्देश, इस मामले में है जो निष्पादित नहीं करता है !
, यह बजाय कार्यान्वित v
है, जो आदेश मछली नीचे की ओर ले जाने के लिए (समारोह से बाहर निकलते समय)।
यदि यह 1 हालांकि है, तो इसे एक जगह मिल गई है, इसलिए यह !
एक ट्रम्पोलिन है, और जो मछली को अगले निर्देश को छोड़ देता है, जो कि ए है, इसलिए इसे निष्पादित करता है v
, इसलिए मछली जारी है। मछली के सामने, यह देखता है~
कि इसे स्टैक से अंतिम मान पॉप करने के लिए कहता है (एक स्थान होने की पुष्टि की गई है), फिर मछली जारी है, और फिर से फ़ंक्शन चलाता है।
?!;a6.>ol2-
मछली को तुरंत कहा जाता है कि वह दाईं ओर तैरती है >
, फिर स्टैक पर अंतिम पात्र का उत्पादन करती हैo
(जो, पहली बार यह चलाया जाता है, यह पहला चरित्र है s
)। यह स्टैक की लंबाई से प्राप्त होता है l
, स्टैक 2
के अंत में स्थित होता है, फिर -
2 को इससे घटाया जाता है l
। यह हिट ?!;
करता है, जो यह याद रखता है कि ?
मछली किस कारण से छोड़ती है!
अगर स्टैक खाली है, और जमीन पर;
, जो प्रोग्राम को समाप्त करता है।
यदि स्टैक पर अभी भी अक्षर हैं, तो हम निष्पादित करते हैं !
जिसके कारण मछलियां उछलती हैं ;
और निष्पादित होती हैं a6.
, जो स्टोर a
(AKA 10
), और 6
स्टैक के अंत में होती हैं, जिसके लिए x, y
निर्देशांक हैं.
, जो उन्हें समाप्त होने पर पॉप करता है स्टैक, फिर मछली को टेलीपोर्ट करता है10, 6
और उस पोस्ट के दाईं ओर निर्देश निष्पादित करता है (जैसा कि मछली सही तैर रही है)।
जब आप y
स्थिति 6 को महसूस करते हैं तो यह कम जटिल होता है । x
स्थिति 10 तो है v
, और उस के दाईं ओर है
, जो कि एक सेशन नहीं है। यह मछली को तैरना जारी रखने का कारण बनता है और वास्तव में लाइन की शुरुआत में निष्पादन शुरू करता है ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
तो यह फ़ंक्शन है जो वर्णों के बीच यादृच्छिक पाठ जोड़ता है। यह एक कौर है, लेकिन यह सिर्फ इसलिए है क्योंकि मैंने इसे थोड़ा अतिरिक्त बनाने की कोशिश की थी। इसको बुलाते हैं genRandomChars ।
:{{:}l1-[rv
वास्तव में समारोह के लिए सेटअप, और कम-तो वास्तविक समारोह ही एक हिस्सा है। मछली पहले तैरती है, :{{
जो स्टैक के अंत में मूल्य को कॉपी करती है, फिर इसे बाईं ओर दो बार स्थानांतरित करती है। यदि आपको याद है कि i
स्टैक पर पोस्ट 1 था, तो आपको पता होगाi
स्टैक के अंत में अब है।
मछली फिर :}
उस प्रतियां पर तैरती है i
, और स्टैक को दाईं ओर शिफ्ट करती है, स्टैक i
की शुरुआत और अंत दोनों पर। l1-[
मछली ने ढेर के अंत में लंबाई रखी है, उसमें से 1 घटाएं, फिर[
एक नया स्टैक बनाता है, नए स्टैक के l-1
लिए मान (स्टैक लंबाई माइनस 1) मान (ताकि i
पुराने स्टैक पर बस निकल जाए )। फिर मछली बस हिट करती है rv
जो स्टैक को फिर से उलट देती है (मुझे लगता है कि एक नया स्टैक बनाने से यह किसी कारण से उलट हो जाता है), और मछली को एक बार फिर नीचे की ओर तैरने का आदेश देता है, फलस्वरूप फंक्शन की शुरुआत करता है<
।
तो वर्तमान में स्टैक का अंत है m
और हमारा अस्थायी है i
, जिसे हम कॉल करेंगे ti
। तुरंत मछली तैरती है 1-}
, जो 1 से घटाती हैti
और इसे ढेर की शुरुआत में ले जाती है। फिर :}
जो बस कॉपी करता है m
और इसे स्टैक की शुरुआत में ले जाता है (डाल रहा हैti
स्टैक स्थिति 1 पर )।
यह तब होता है जब हम इस छोटी सी चीज को मारते हैं:
v2<
<1x|!
^3<
यह वास्तव में मृत सरल है। !
मछली को छोड़ने |
और निष्पादित करने का कारण बनता है x
। क्या याद कर रहे होx
करता है, हमें याद है कि यह मछली किसी भी 4 दिशाओं में चलती है। |
बस एक दर्पण है, और मछली को वापस तैरने का कारण बनता हैx
। तो मूल रूप से, मछली स्टैक के अंत में 1, 2, या 3 जगह लेगी, और बाईं ओर घूमना जारी रखेगा।
मछली तब निष्पादित होती है *+o
जो स्टैक पर अंतिम दो मानों को पॉप-अप होने का कारण बनाती है, एक साथ गुणा किया जाता है, और परिणाम फिर से आगे बढ़ता है, फिर एक ही चीज को जोड़ दिया जाता है, फिर अंतिम मूल्य स्टैक से पॉपअप किया जाता है और इसके साथ आउटपुट होता है o
। हमारे ढेर अब फिर से अपेक्षाकृत सामान्य है जिसमें सिर्फ [ m
, ti
,s
]।
:}}:
स्टैक के अंत पर मूल्य का कारण बनता है (मूल रूप से s
स्थिति 0) ओटी को कॉपी किया जाता है, फिर स्टैक को दाईं ओर दो बार स्थानांतरित किया जाता है ( ti
फिर से सामने की तरफ रखकर ), फिर ti
कॉपी किया जाता है। ?!v
अब तक समझना बहुत आसान होना चाहिए। मूल रूप से यदि ti
0 है तो हम फंक्शन से बाहर निकलते हैं v
, अन्यथा हम निष्पादित करते हैं !
और छोड़ते हैंv
(दूसरा लूप करते हुए)।
यदि ti
0 है और हम थोड़े यादृच्छिक वर्णों को आउटपुट करते हैं, तो हम निष्पादित करते हैंv
और देखते हैं:
v ~}}r]~<
.43<
यहां कुछ भी नहीं फैंसी। हम ti
स्टैक से हटाते हैं ~
। फिर ]
नया है, यह स्टैक से हमारे सभी मूल्यों को पॉप करता है और उन्हें पुराने स्टैक पर रखता है! उलट मुद्दा हम साथ रिवर्स की वजह से r
है, तो साथ सही दो बार ढेर बदलाव }}~
, सही करने के लिए ढेर shufting, हमें दे रही है [ m
, i
, s
], ~
अतिरिक्त दोहराया दूर करने के लिए है s[0]
समारोह में पहले से जैसा कि हम इसे अगर आवश्यकता होगी हम एक लूप कर रहे थे (लेकिन हम नहीं, हम बाहर निकल रहे हैं)। v
मछली को नीचे तैरने के लिए और >34.
(निष्पादन आदेश दिखाने के लिए उल्टा) बताता है, जो मछली को बस बाईं और तैरने के लिए कहता है 3, 4
(क्योंकि , जो एकदम सही है क्योंकि हम बाईं ओर यात्रा कर रहे हैं।.
यह एक कूद है!)। 3, 4
वास्तव में सिर्फ शुरुआत के अधिकार के लिए हैwhitespaceTrimmer
इस सारे तर्क के बाद हम मछली का पालन कर सकते हैं जब तक कि स्टैक अंततः खाली नहीं हो जाता है और प्रोग्राम whitespaceTrimmer
निष्पादित होने के बाद ही बाहर निकलता है।