p
\Ai
\&
>(&]&|0
<*&d
&~bN
10
( )/+
/*
इसे ऑनलाइन आज़माएं!
व्याख्या
यह अब तक का सबसे विस्तृत (और सबसे लंबा भी) कार्यक्रम है जो मैंने अब तक जेलिफ़िश में लिखा है। मुझे नहीं पता कि क्या मैं इसे समझने योग्य तरीके से तोड़ पाऊंगा या नहीं, लेकिन मुझे लगता है कि मुझे कोशिश करनी होगी।
जेलिफ़िश एक काफी सामान्य पुनरावृत्ति ऑपरेटर प्रदान करता है \
, जो "नथ कुछ खोजने" के साथ बहुत मदद करता है । इसके शब्दार्थों में से एक "एक फ़ंक्शन को एक मान पर आधारित करना है जब तक कि एक अलग परीक्षण फ़ंक्शन कुछ सत्य देता है" (वास्तव में, परीक्षण फ़ंक्शन वर्तमान और अंतिम तत्व दोनों को प्राप्त करता है, लेकिन हम केवल इसे वर्तमान तत्व को देखेंगे) । हम इसका उपयोग "अगले वैध संख्या" फ़ंक्शन को लागू करने के लिए कर सकते हैं। का एक और अधिभार \
है "एक फ़ंक्शन को प्रारंभिक मूल्य एन बार पर पुनरावृत्त करना"। हम अपने पिछले फ़ंक्शन का उपयोग कर सकते हैं और इसे 0
N समय पर प्रसारित कर सकते हैं , जहां N इनपुट है। यह सब कोड के इस भाग के साथ काफी संक्षिप्त रूप से सेट किया गया है:
p
\Ai
\&
> 0
(कारण क्यों 0
, परिणामी फ़ंक्शन के लिए वास्तविक इनपुट, खत्म हो गया है और थोड़ा जटिल है और मैं यहां नहीं जाऊंगा।)
इस सब के साथ मुद्दा यह है, कि हम परीक्षण फ़ंक्शन के लिए वर्तमान मान को मैन्युअल रूप से पारित नहीं करेंगे। \
ऑपरेटर हमारे लिए यह कर देगा। इसलिए अब हमारे पास एक एकल कार्य (रचनाओं, हुक, कांटे और करी के माध्यम से) का निर्माण होता है जो एक संख्या लेता है और हमें बताता है कि क्या यह एक वैध संख्या है (यानी जो इसके अंक योग और अंक उत्पाद से विभाजित है)। यह काफी गैर-तुच्छ है जब आप तर्क का संदर्भ नहीं दे सकते। कभी। यह सौंदर्य है:
(&]&|
<*&d
&~bN
10
( )/+
/*
(
एक एकल है हुक , जिसका अर्थ है कि यह नीचे समारोह (कॉल f
अपने इनपुट (वर्तमान मूल्य पर)x
), और फिर सही (करने के लिए परीक्षण कार्य करने के लिए उन दोनों से गुजरता है g
), वह यह है कि यह गणना करता है g(f(x), x)
।
हमारे मामले में, f(x)
एक और समग्र कार्य है जो अंक उत्पाद और अंकों के योग के साथ एक जोड़ी प्राप्त करता है x
। इसका मतg
कि एक ऐसा फंक्शन होगा जिसमें x
वैध होने के लिए जाँच करने के लिए सभी तीन मान हैं ।
हम यह देखकर शुरुआत करेंगे f
कि अंक योग और अंक उत्पाद की गणना कैसे की जाती है । यह है f
:
&~b
10
( )/*
/+
&
भी रचना है (लेकिन दूसरा तरीका गोल)। ~
ऐसा करने से ऐसा 10~b
फ़ंक्शन होता है जो किसी संख्या के दशमलव अंकों की गणना करता है, और जब से हम उसे पास कर रहे हैं&
दाईं ओर से , यह पहली बात है जो इनपुट के साथ होगी x
। शेष राशि और उत्पाद की गणना के लिए अंकों की इस सूची का उपयोग करता है।
राशि की गणना के लिए, हम कर सकते हैं गुना इस पर इसके अलावा, जो /+
। इसी तरह, उस उत्पाद की गणना करने के लिए जिस पर हम गुणा करते हैं /*
। इन दोनों परिणामों को एक जोड़ी में संयोजित करने के लिए, हम हुक की एक जोड़ी का उपयोग करते हैं, (
और )
। इस की संरचना है:
()g
f
(कहाँ f
और g
उत्पाद और राशि क्रमश: कर रहे हैं।) आइए कोशिश यह पता लगाने की क्यों इस हम में से एक जोड़ी देता है f(x)
और g(x)
। ध्यान दें कि दाएं हुक में )
केवल एक तर्क है। इस मामले में, दूसरा तर्क निहित है ;
जो एक जोड़ी में अपने तर्कों को लपेटता है। इसके अलावा, हुक को बाइनरी फ़ंक्शन के रूप में भी उपयोग किया जा सकता है (जो कि यहां मामला होगा) जिस स्थिति में वे केवल एक तर्क के लिए आंतरिक फ़ंक्शन को लागू करते हैं। तो वास्तव )
में एक एकल फ़ंक्शन पर एक फ़ंक्शन g
देता है जो गणना करता है [x, g(y)]
। बाएं हुक में इसका उपयोग करके, एक साथ f
, हम प्राप्त करते हैं [f(x), g(y)]
। यह बदले में, एक एकात्मक संदर्भ में उपयोग किया जाता है, जिसका अर्थ है कि यह वास्तव में कहा जाता है x == y
और इसलिए हम [f(x), g(x)]
आवश्यकतानुसार समाप्त करते हैं । ओह।
वह केवल एक चीज छोड़ता है, जो कि हमारा पहले का परीक्षण कार्य था g
। स्मरण करो कि यह कहा जाएगा, g([p, s], x)
जहां x
अभी भी वर्तमान इनपुट मूल्य है, p
इसका अंक उत्पाद है और s
इसकी अंक राशि है। यह है g
:
&]&|
<*&d
N
विभाज्यता का परीक्षण करने के लिए, हम स्पष्ट रूप से मोडुलो का उपयोग करेंगे, जो |
जेलिफ़िश में है। कुछ हद तक असामान्य रूप से, यह अपने दाहिने हाथ के मॉडुलो को अपने बाएं हाथ के ऑपरेंड में ले जाता है, जिसका अर्थ है कि तर्क g
पहले से ही सही क्रम में हैं (अंकगणित इस तरह के कार्य स्वचालित रूप से सूचियों पर थ्रेड करते हैं, इसलिए यह दो अलग-अलग रूपांतरों की गणना मुफ्त में करेगा) । यदि उत्पाद शून्य है, तो हमारा नंबर उत्पाद और योग दोनों से विभाज्य है। यह जाँचने के लिए कि क्या मामला है, हम जोड़ी को आधार -2 अंकों ( d
) की सूची के रूप में मानते हैं । इसका परिणाम शून्य है, केवल जब जोड़ी के दोनों तत्व शून्य हैं, तो हम इस परिणाम ( N
) को नकार सकते हैं कि क्या दोनों मान इनपुट को विभाजित करते हैं या नहीं। ध्यान दें कि |
, d
औरN
बस सभी की जोड़ी के साथ एक साथ बना रहे हैं &
।
दुर्भाग्य से, यह पूरी कहानी नहीं है। क्या होगा यदि अंक उत्पाद शून्य है? जेलीफ़िश में शून्य से डिवीजन और मोडुलो दोनों शून्य हैं। हालांकि यह कुछ हद तक अजीब सम्मेलन की तरह लग सकता है, यह वास्तव में कुछ हद तक उपयोगी है (क्योंकि हमें मोडुलो करने से पहले शून्य की जांच करने की आवश्यकता नहीं है)। हालाँकि इसका मतलब यह भी है कि हम एक गलत पॉजिटिव पा सकते हैं, यदि अंक योग इनपुट को विभाजित करता है, लेकिन अंक उत्पाद शून्य है (उदाहरण इनपुट 10
)।
हम इसे अंकीय उत्पाद द्वारा हमारी विभाज्यता परिणाम को गुणा करके ठीक कर सकते हैं (इसलिए यदि अंक उत्पाद शून्य है तो यह हमारे सत्य मान को शून्य में भी बदल देगा)। यह उत्पाद और योग की जोड़ी के साथ विभाज्यता परिणाम को गुणा करने के लिए सरल हो जाता है, और बाद में उत्पाद से परिणाम निकालता है।
जोड़ी के साथ परिणाम को गुणा करने के लिए, हमें थोड़े पहले के मूल्य (जोड़ी) पर वापस लाने की आवश्यकता है। यह एक कांटा ( ]
) के साथ किया जाता है । कांटे स्टेरॉयड की तरह थोड़े होते हैं। यदि आप उन्हें दो कार्य देते हैं f
और g
, वे एक बाइनरी फ़ंक्शन का प्रतिनिधित्व करते हैं जो गणना करता है f(a, g(a, b))
। हमारे मामले में, a
उत्पाद / योग जोड़ी b
है, वर्तमान इनपुट मूल्य है, g
हमारी विभाज्यता परीक्षण है, और f
गुणन है। तो यह सब गणना करता है [p, s] * ([p, s] % x == [0, 0])
।
अब जो कुछ बचा है, उसका पहला मूल्य निकालना है, जो कि पुनरावृति में प्रयुक्त परीक्षण फ़ंक्शन का अंतिम मूल्य है। यह हेड फ़ंक्शन के &
साथ कांटा बनाने ( ) की तरह सरल है , जो किसी सूची का पहला मान लौटाता है।<