हास्केल हैकर होने के नाते, मैं पॉइंटफ्री नोटिफिकेशन ऑन पॉइंटफुल पसंद करता हूं। दुर्भाग्य से कुछ लोगों को पॉइंटफ्री नोटेशन पढ़ने में मुश्किल लगता है, और जब मैं पॉइंटफुल में लिखता हूं तो मुझे सही संख्या में कोष्ठक प्राप्त करने में मुश्किल होती है। मुझे पॉइंटफ्री में लिखे कोड को पॉइंटफुल नोटेशन में बदलने में मदद करें!
के बारे में
पॉइंटफ्री नोटेशन में हम एक फंक्शन के आउटपुट को दूसरे में फीड करने के लिए पॉइंट्स (हाँ, वास्तव में) का उपयोग करते हैं। कहो, अगर आपके पास एक फ़ंक्शन था जो succ
एक संख्या लेता है और इसमें 1 जोड़ता है, और आप एक ऐसा फ़ंक्शन बनाना चाहते थे जो ऐसा करने के बजाय एक संख्या में 3 जोड़ता है:
\x -> succ(succ(succ(x)))
आप ऐसा कर सकते हैं:
succ.succ.succ
पॉइंटफ्री केवल उन फंक्शंस के साथ काम करता है जो सिंगल पैरामीटर लेते हैं (वैसे भी इस चैलेंज में), इसलिए यदि हमारा फंक्शन नहीं था succ
, बल्कि add
जो 2 नंबर लेते हैं और उन्हें एक साथ जोड़ते हैं, तो हमें इसे तब तक फीड करना होगा जब तक कि केवल एक ही बचा हो:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
अंत में, कार्य तर्कों के रूप में अन्य कार्य कर सकते हैं:
Pointfree: map (f a . f b) . id
Pointful: \x -> map (\x -> f a (f b x)) (id x)
Javascript equivalent: x => map (x => f(a,f(b,x)), id(x))
इनपुट और अपेक्षित आउटपुट
f . f . f
\x -> f (f (f x))
f a . f b . f c
\x -> f a (f b (f c x))
f (f a . f b) . f c
\x -> f (\x -> f a (f b x)) (f c x)
a b c . d e . f g h i . j k l . m
\x -> a b c (d e (f g h i (j k l (m x))))
a.b(c.d)e.f g(h)(i j.k).l(m(n.o).p)
\x->a(b(\y->c(d y))e(f g h(\z->i j(k z))(l(\q->m(\w->n(o w))(p q))x)))
नियम
- आपके आउटपुट में आवश्यकता से अधिक स्थान या कोष्ठक हो सकते हैं, जब तक कि वे संतुलित हों
- आपको यह सुनिश्चित करने की ज़रूरत नहीं है कि आपके द्वारा बनाए गए चर का नाम
\x
पहले से ही कोड में कहीं और उपयोग नहीं किया गया है - यह आपकी पसंद है कि कोई फ़ंक्शन या पूर्ण प्रोग्राम बनाना है या नहीं
- यह
codegolf
, बाइट्स जीत में सबसे छोटा कोड है!
आपको कुंद उपयोगी मिल सकता है, यह दो नोटेशनों के बीच परिवर्तित होता है (लेकिन जब संभव हो तो कोड को भी कारक करता है): https://blunt.herokokuapp.com
(+).(*3)
जैसे ही है\x y->3*x+y
(.).(.)
जो कि धर्मान्तरित होती है\i b c f -> i (b c f)
.
को एक के साथ बदलें (
, एक को प्रीपेन्ड करें \x
और एक संबंधित को जोड़ दें x
और जितने की )
आवश्यकता हो? या यह उससे अधिक जटिल है?
\ d->f(\k->f(f d k))
, लेकिन आप यह मान सकते हैं कि सभी बिंदुओं को इस चुनौती में दो तर्क दिए गए हैं