เห็นภาพตัวเลขของคริสตจักร


9

พื้นหลัง

การแสดงเงื่อนไข calcul-แคลคูลัส

lambda-juggler ที่มีชื่อเสียง (และนักกอล์ฟโค้ด ) John Tromp คิดค้นภาพที่น่าสนใจของคำศัพท์ในλ-แคลคูลัส ในคำพูดของเขา:

abstractions (lambdas) แสดงด้วยเส้นแนวนอนตัวแปรตามเส้นแนวตั้งเล็ดลอดออกมาจาก lambda ที่มีผลผูกพันและแอปพลิเคชันโดยลิงก์แนวนอนที่เชื่อมต่อตัวแปรซ้ายสุด

ตัวอย่างเช่นคำแลมบ์ดาλf.λx.f (f (f (f (fx)))) สอดคล้องกับการสร้างภาพ:

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

อ่านจากบนลงล่าง:

  • เส้นแนวนอนแรกแสดงถึง first เส้นแรก
  • เส้นสี่เส้นที่ลงมาจากนั้นแทนค่าfในร่างกาย
  • ในทำนองเดียวกันเส้นแนวนอนที่สองแสดงถึง second ที่สองและบรรทัดใหม่เดียวที่ลงมาจากนั้นหมายถึงxในร่างกาย
  • ขวาสุดบรรทัดและxสายให้เชื่อมต่อกันด้วยเส้นแนวนอนเป็นตัวแทนของแอพลิเคชัน(ฉ x)
  • แอปพลิเคชั่นถัดไปคือ(f (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 ≥ 0 :

นี่คือ ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ตัวอย่างของคุณทำให้ฉันผิดพลาด
Leun Nun

@LeakyNun เบราว์เซอร์ใด .repeatเบราว์เซอร์บางส่วนไม่สนับสนุน
Conor O'Brien

อนุญาตให้ใช้ช่องว่างต่อท้ายได้หรือไม่
Loovjo

ไม่เพียงขึ้นบรรทัดใหม่เท่านั้น (นี่คือàลากอล์ฟอนาธิปไตยและฉันรู้สึกเหมือนมันเป็นชุดกฎที่ดีที่สุดสำหรับascii-ศิลปะความท้าทาย.)
ลินน์

คำตอบ:


4

เรติน่า , 74 67 63 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

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

การป้อนข้อมูลที่อยู่ในเอกโดยใช้ตัวอักษรใด ๆ ยกเว้น linefeeds เป็นหลัก

ลองออนไลน์!

คำอธิบาย

.
 |  

เราเริ่มต้นด้วยการเปลี่ยนตัวเลขเอกนารีแต่ละตัวเป็น | (สังเกตช่องว่างต่อท้าย) สิ่งนี้ทำให้เรามีบรรทัดที่สองของการส่งออก (บวกสองช่องว่างต่อท้ายถ้าอินพุตเป็นอย่างน้อย1)

^
$.'$*----¶

เราจับคู่จุดเริ่มต้นของสตริงเพื่อเติมบรรทัดแรก สิ่งนี้ทำได้โดยใช้คุณสมบัติการทดแทนเฉพาะ Retina $*ทำซ้ำอักขระทางด้านขวาหลาย ๆ ครั้งเท่ากับการยั่วซ้าย $.'ประเมินจำนวนตัวอักษรทางด้านขวาของการแข่งขัน เนื่องจากการแข่งขันเป็นเพียงจุดเริ่มต้นของสตริงสิ่งนี้จะให้มาก-ที่สุดเท่าที่มีตัวอักษรในสตริงและ---ผนวกสามเพิ่มเติม เป็นนามแฝงสำหรับเลื่อนบรรทัดหนึ่ง ตอนนี้เรามีสองบรรทัดแรก

\z
¶$` |

ตอนนี้เราต่อท้ายสองบรรทัดถัดไป เราทำสิ่งนี้โดยการจับคู่ส่วนท้ายของสตริงและต่อท้ายตัวป้อนบรรทัดสตริงทั้งหมดอีกครั้งจากนั้นจึง |รับบรรทัดที่สี่

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

เวลาสำหรับการใช้งาน ผู้นำ+ทำให้ Retina ทำซ้ำขั้นตอนนี้จนกว่าผลลัพธ์จะหยุดการเปลี่ยนแปลง (ในกรณีนี้เพราะ regex ไม่ตรงกับนาน) regex ตรงกับบรรทัดสุดท้ายทั้งหมดโดยมี regex |ตามเว้นวรรค เราจับทุกอย่างขึ้นไป|(ซึ่งจะเป็นครั้งที่สองไปยังหน้าล่าสุด) 1ในกลุ่ม เราเขียนกลับสอดคล้องกับ$&การเลื่อนบรรทัดแล้วกลุ่มที่ 1 (จึงลดลงสุดท้าย|) ----แล้ว

$
¶ |

|เพียงแค่นี้ก็จะเพิ่มบรรทัดสุดท้ายที่มีเพียงหนึ่งเดียว

  ¶
¶

ในที่สุดเราจำเป็นต้องกำจัดช่องว่างต่อท้ายในบรรทัดที่สอง


2

JavaScript (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

@NoOneIsHere บรรทัดใหม่เป็นส่วนหนึ่งของสตริงแม่แบบ f=ไม่เป็นส่วนหนึ่งของคำตอบก็จำเป็นสำหรับข้อมูลโค้ดและจะไม่นับเป็นส่วนหนึ่งของทั้งหมดไบต์
Neil

2

Python ขนาด 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

Python 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.