चर्च के अंकों की कल्पना करें


9

पृष्ठभूमि

Λ-पथरी शब्दों की कल्पना करना

प्रसिद्ध लैम्ब्डा-बाजीगर (और कोड गोल्फर ) जॉन ट्रम्प ने λ- पथरी में शर्तों का एक दिलचस्प दृश्य तैयार किया । उनके शब्दों में:

अमूर्तता (लंबोदा) को क्षैतिज रेखाओं द्वारा दर्शाया जाता है, ऊर्ध्वाधर रेखाओं द्वारा चर को उनके बंधन लंबोदा से नीचे छोड़ा जाता है, और क्षैतिज लिंक द्वारा बाईं ओर के चर को जोड़ते हुए अनुप्रयोग।

उदाहरण के लिए, लंबोदर शब्द λf.λx.f (f (fx))) विज़ुअल्स से मेल खाता है:

-------------------
 |   |   |   |
-------------------
 |   |   |   |   |
 |   |   |   |----
 |   |   |----
 |   |----
 |----
 |

इसे ऊपर से नीचे तक पढ़ें:

  • पहली क्षैतिज रेखा पहले λ का प्रतिनिधित्व करती है।
  • इससे निकलने वाली चार लाइनें शरीर में f s को दर्शाती हैं ।
  • इसी प्रकार, दूसरी क्षैतिज रेखा दूसरी λ का प्रतिनिधित्व करती है, और उससे निकलने वाली एकल नई रेखा शरीर में x का प्रतिनिधित्व करती है।
  • सबसे दाहिनी f लाइन और x लाइन एक एप्लीकेशन (f x) का प्रतिनिधित्व करने वाली एक क्षैतिज रेखा से जुड़ी होती है ।
  • अगला आवेदन (एफ (एफ एक्स)) , एट सीटेरा है।

चर्च के अंक

चर्च अंकों के , λ-पथरी में पदों की एक विशिष्ट अनुक्रम हैं निम्नलिखित पैटर्न पर ले:

0 = λf. λx. x
1 = λf. λx. f x
2 = λf. λx. f (f x)
3 = λf. λx. f (f (f x))
...

कार्य

एक इनपुट नंबर n को देखते हुए , कुछ ASCII कला प्रिंट करें जो n वें चर्च के अंक की कल्पना करता है । उदाहरण के लिए, ऊपर दिया गया उदाहरण आपका लक्ष्य आउटपुट है जब n = 4 दिया गया है । के लिए n = 0 , प्रिंट:

---

---
 |
 |

परीक्षण के मामलों

आपके उत्तर को बिल्कुल उसी टेक्स्ट (मॉडुलो ट्रेलिंग न्यूलाइन्स) के रूप में आउटपुट करना होगा, क्योंकि सभी पूर्णांक इनपुट्स के लिए यह स्टैक स्निपेट n exactly 0 :

ये है , इसलिए बाइट्स में सबसे छोटा कोड जीत जाता है।


आपका स्निपेट मुझे त्रुटि देता है।
लीक नन

@LeakyNun कौन सा ब्राउज़र है? कुछ ब्राउज़र समर्थन नहीं करते हैं .repeat
कॉनर ओ'ब्रायन

अनुगामी रिक्त स्थान की अनुमति है?
लवजो

नहीं, केवल नई अनुगामी। (यह वह जगह है ला अराजकता गोल्फ, और मुझे लगता है यह के लिए सबसे अच्छा नियम सेट है जैसे ascii अत्याधुनिक चुनौतियों।)
लिन

जवाबों:


4

रेटिना , 74 67 63 बाइट्स

बाइट गिनती आईएसओ 8859-1 एन्कोडिंग मानती है।

.
 |  
^
$.'$*----¶
\z
¶$` |
+`(.+\|) .+$
$&¶$1----
$
¶ |
  ¶
¶

इनपुट में है एकल अंकों के रूप में linefeeds को छोड़कर किसी भी चरित्र का उपयोग कर,।

इसे ऑनलाइन आज़माएं!

व्याख्या

.
 |  

हम प्रत्येक यूनेरी अंक को बदलकर शुरू करते हैं | (अनुगामी रिक्त स्थान पर ध्यान दें)। यह हमें आउटपुट की दूसरी पंक्ति देता है (यदि इनपुट कम से कम दो अनुगामी रिक्त स्थान है 1)।

^
$.'$*----¶

हम पहली पंक्ति को प्रस्तुत करने के लिए स्ट्रिंग की शुरुआत से मेल खाते हैं। यह कुछ रेटिना-विशिष्ट प्रतिस्थापन सुविधाओं का उपयोग करके किया जाता है। $*चरित्र को दायीं ओर दोहराता है, जितनी बार उसका बायाँ हाथ। $.'मैच के दाईं ओर वर्णों की संख्या का मूल्यांकन करता है। चूंकि मैच केवल स्ट्रिंग की शुरुआत है जो इस तरह से देता है क्योंकि -स्ट्रिंग में वर्ण हैं और ---तीन और जोड़ते हैं। एक linefeed के लिए एक उपनाम है। तो अब हमें पहली दो लाइनें मिल गई हैं।

\z
¶$` |

अब हम अगली दो पंक्तियों को जोड़ते हैं। हम स्ट्रिंग के अंत से मेल खाते हैं और एक लाइनफीड को जोड़ते हैं, पूरे स्ट्रिंग को फिर से और फिर |चौथी पंक्ति को सही करने के लिए।

+`(.+\|) .+$
$&¶$1----

अनुप्रयोगों के लिए समय। प्रमुख +रेटिना को इस चरण को दोहराता है जब तक कि आउटपुट बदलना बंद नहीं होता है (इस मामले में क्योंकि रेगेक्स कोई लंबा मैच नहीं है)। रेगेक्स पूरी अंतिम पंक्ति से मेल खाता है, बशर्ते इसमें |किसी स्थान का अनुसरण हो। हम |समूह में (जो दूसरे से अंतिम तक होंगे) सब कुछ पर कब्जा कर लेते हैं 1। हम लाइन के साथ वापस लिखते हैं $&, एक लाइनफीड, फिर समूह 1 (जिससे अंतिम को छोड़ना |) और फिर ----

$
¶ |

यह केवल अंतिम लाइन को जोड़ता है जिसमें केवल एकल होता है |

  ¶
¶

अंत में हमें दूसरी पंक्ति पर अनुगामी रिक्त स्थान से छुटकारा पाने की आवश्यकता है।


2

जावास्क्रिप्ट (ईएस 6), 112 बाइट्स

f=
n=>`${d=`-`.repeat(n*4+3)}
${(b=` |  `.repeat(n)).slice(0,-2)}
${d}
${b} |
${b.replace(/ \|  /g,`$' |----
`)} |`
;
<input id=i type=number min=0 oninput=o.textContent=f(this.value)>
<pre id=o></pre>


क्या सभी नए समाचार आवश्यक हैं? इसके अलावा, f=आवश्यक है?
NoOneIsHere

@NoOneIsHere newlines टेम्पलेट स्ट्रिंग का हिस्सा हैं। यह f=उत्तर का हिस्सा नहीं है, यह केवल स्निपेट के लिए आवश्यक है, और इसे बाइट कुल के हिस्से के रूप में नहीं गिना जाता है।
नील

2

पायथन, 201 बाइट्स

from pylab import*
n=input()
p=array(list(' -|\n'))
a=zeros((n+5,n*4+4),int)
for k in range(n):l=4*k+5;a[:-k-1,l]=2;a[-k-2,l-3:l+1]=1
a[:,1]=2
a[1,-3]=0
a[0]=a[2]=1
a[:,-1]=3
print''.join(ravel(p[a]))

1

पायथन 2, 138 बाइट्स

def f(n,a=1):
 if ~n:b="---\n";c=" |";d="  "+c;print("-"*n*4+b+c*(n>0)+d*(n-1)+"\n"+"-"*n*4+b+c+d*n+"\n")*a+c+d*(n-1)+"-"*4*(n>0);f(n-1,0)

फ़ंक्शन में एक अतिरिक्त पैरामीटर होता है, लेकिन यह केवल आंतरिक उपयोग के लिए है। इसका डिफ़ॉल्ट मान है और फ़ंक्शन को कॉल करते समय छोड़ दिया जाना चाहिए। मुझे आशा है कि यह नियमों का उल्लंघन नहीं करता है।

फ़ंक्शन पहले 5 पंक्तियों को खींचता है, फिर शेष पंक्तियों को खींचने के लिए खुद को पुन: कॉल करता है।

इसे ऑनलाइन आज़माएं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.