চার্চের সংখ্যাগুলি ভিজ্যুয়ালাইজ করুন


9

পটভূমি

Λ-ক্যালকুলাস শর্তাদি ভিজ্যুয়ালাইজিং

বিখ্যাত ল্যাম্বডা-জাগলার (এবং কোড গল্ফার ) জন ট্রম্প λ-ক্যালকুলাসে পদগুলির একটি আকর্ষণীয় ভিজ্যুয়ালাইজেশন তৈরি করেছিলেন । তাঁর কথায়:

বিমূর্ততা (ল্যাম্বডাস) আনুভূমিক রেখাগুলি দ্বারা চিহ্নিত করা হয়, তাদের বাঁধাই ল্যাম্বডা থেকে নিচের দিকে উল্লম্ব রেখাগুলি দ্বারা ভেরিয়েবল এবং বামতমতম ভেরিয়েবলগুলি সংযুক্ত অনুভূমিক লিঙ্কগুলি দ্বারা অ্যাপ্লিকেশনগুলি।

উদাহরণস্বরূপ, ল্যাম্বডা শব্দ λf.λx.f (f (f (fx))) ভিজ্যুয়ালাইজেশনের সাথে মিলে যায়:

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

উপরে থেকে নীচে এটি পড়ুন:

  • প্রথম অনুভূমিক রেখাটি প্রথম represents উপস্থাপন করে λ
  • এটি থেকে নেমে আসা চারটি রেখা শরীরে f গুলিকে উপস্থাপন করে ।
  • একইভাবে, দ্বিতীয় অনুভূমিক রেখাটি দ্বিতীয় λ উপস্থাপন করে এবং এর থেকে নেমে আসা একক নতুন রেখাটি শরীরে এক্সকে উপস্থাপন করে ।
  • ডানদিকের এফ লাইন এবং এক্স লাইনটি কোনও অ্যাপ্লিকেশন (এফ এক্স) উপস্থাপনকারী একটি অনুভূমিক রেখার দ্বারা সংযুক্ত করা হয়েছে ।
  • পরবর্তী অ্যাপ্লিকেশনটি হ'ল (চ (চ x)) , এবং সেটার।

চার্চ সংখ্যা

চার্চ সংখ্যাসমূহ , λ-ক্যালকুলাস পদ একটি নির্দিষ্ট অনুক্রম নিম্নলিখিত প্যাটার্ন গ্রহণ:

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

কার্য

একটি ইনপুট নম্বর দেওয়া এন , কিছু হওয়া ASCII শিল্প প্রিন্ট করা হবে visualizes এন ম চার্চ সংখ্যা। উদাহরণস্বরূপ, উপরের উদাহরণটি আপনার টার্গেট আউটপুট যখন n = 4 দেওয়া হয় । জন্য এন = 0 , মুদ্রণ:

---

---
 |
 |

পরীক্ষার মামলা

আপনার উত্তর হবে আউটপুট ঠিক একই পাঠ্য (মডিউল চিহ্ন নতুন লাইন) সমস্ত পূর্ণসংখ্যা ইনপুট জন্য এই স্ট্যাকের স্নিপেট হিসাবে এন ≥ 0 :

এই , তাই বাইটস মধ্যে সংক্ষিপ্ত কোড।


আপনার স্নিপেট আমাকে ত্রুটি দেয়।
লিকি নুন

@ লিক্যনুন কোন ব্রাউজার? কিছু ব্রাউজার সমর্থন করে না .repeat
কনর ও'ব্রায়েন

পেছনের স্থানগুলি কি অনুমোদিত?
লুভজো

না, কেবল নতুন লাইনের পিছনে রয়েছে। (এটি লালা অরাজকতা গল্ফ, এবং আমার মনে হচ্ছে এটি অসি-আর্ট চ্যালেঞ্জগুলির জন্য সেরা নিয়ম সেট ।)
লিন

উত্তর:


4

রেটিনা , 74 67 63 বাইট

বাইট গণনাটি আইএসও 8859-1 এনকোডিং ধরেছে।

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

ইনপুট হয় ইউনারী সংখ্যা হিসাবে linefeeds ব্যতীত কোন চরিত্র ব্যবহার করে,।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

.
 |  

আমরা প্রতিটি unary ডিজিটকে রূপান্তর করে শুরু করি | (পিছনের স্থানগুলি নোট করুন)। এটি আমাদের আউটপুটটির দ্বিতীয় লাইন দেয় (আরও ইনপুট কমপক্ষে হলে দুটি ট্রেলিং স্পেস 1)।

^
$.'$*----¶

আমরা প্রথম লাইনটি পুনরায় চাপানোর জন্য স্ট্রিংয়ের শুরুটির সাথে মিলে। এটি রেটিনা-নির্দিষ্ট কিছু বিকল্প বৈশিষ্ট্য ব্যবহার করে করা হয়। $*চরিত্রটি তার বাম দিক থেকে যতবার ডানদিকে পুনরাবৃত্তি করে। $.'ম্যাচের ডানদিকে অক্ষরের সংখ্যা মূল্যায়ন করে। যেহেতু ম্যাচটি কেবল স্ট্রিংয়ের শুরু, এটি স্ট্রিংয়ের যতগুলি -অক্ষর রয়েছে ---তত বেশি দেয় এবং আরও তিনটি সংযোজন করে। একটি লাইনফীড জন্য একটি alias হয়। সুতরাং এখন আমরা প্রথম দুটি লাইন পেয়েছি।

\z
¶$` |

এখন আমরা পরবর্তী দুটি লাইন সংযোজন। আমরা স্ট্রিংয়ের শেষের সাথে মিল রেখে এবং একটি লাইনফিড যুক্ত করে পুরো স্ট্রিংটি আবার এবং তারপরে |চতুর্থ লাইনটি ডান পেতে।

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

অ্যাপ্লিকেশন জন্য সময়। শীর্ষস্থানীয় +আউটপুট পরিবর্তিত হওয়া বন্ধ না হওয়া অবধি রেটিনা এই পর্যায়ে পুনরাবৃত্তি করে (এই ক্ষেত্রে কারণ রেজেক্স দীর্ঘদিনের সাথে মেলে না)। রেজেক্স পুরো শেষ লাইনের সাথে মিলে যায় তবে শর্ত থাকে যে এটিতে |কোনও স্থান অনুসরণ করে contains আমরা |গ্রুপে (যা শেষ থেকে দ্বিতীয় হবে) সমস্ত কিছু ক্যাপচার করি 1। আমরা $&একটি লাইনফিড দিয়ে লাইনটি আবার লিখি , তারপরে গ্রুপ 1 (এর মাধ্যমে সর্বশেষটি বাদ দিচ্ছি |) এবং তারপরে ----

$
¶ |

এটি কেবলমাত্র একটি একক যুক্ত চূড়ান্ত লাইন যুক্ত করে |

  ¶
¶

শেষ অবধি আমাদের দ্বিতীয় লাইনের পিছনের স্থানগুলি থেকে মুক্তি দিতে হবে।


2

জাভাস্ক্রিপ্ট (ES6), 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 নতুন লাইনগুলি টেম্পলেট স্ট্রিংয়ের অংশ। 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 টি সারি আঁকবে, তারপরে পুনরাবৃত্তভাবে বাকী সারিগুলি আঁকতে কল করে।

এটি অনলাইনে চেষ্টা করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.