Kilise rakamlarını görselleştirin


9

Arka fon

Λ-kalkülüs terimlerini görselleştirme

Ünlü lambda-hokkabaz (ve kod golfçüsü ) John Tromp cal hesabındaki terimlerin ilginç bir görselleştirmesini tasarladı . Onun sözleriyle:

soyutlamalar (lambdalar) yatay çizgilerle, değişkenler bağlayıcı lambdadan aşağıya doğru dikey çizgilerle temsil edilir ve en soldaki değişkenleri bağlayan yatay bağlantılarla uygulamalar.

Örneğin, lambda terimi λf.λx.f (f (f (fx))) görselleştirmeye karşılık gelir:

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

Yukarıdan aşağıya doğru okuyun:

  • İlk yatay çizgi ilk λ'yı temsil eder.
  • Ondan inen dört çizgi vücuttaki f'leri temsil eder .
  • Benzer şekilde, ikinci yatay çizgi ikinci λ'yı temsil eder ve ondan inen tek yeni çizgi vücuttaki x'i temsil eder .
  • En sağdaki f çizgisi ve x çizgisi, bir uygulamayı temsil eden yatay bir çizgi ile bağlanır (f x) .
  • Bir sonraki uygulama (f (fx)) , vb.

Kilise rakamları

Church rakamları aşağıdaki modele alarak, λ-Diferensiyel terimler belirli bir dizi vardır:

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

Görev

Bir giriş numarası n verildiğinde , aşağıdakileri görselleştiren bir ASCII resmi yazdırın: n . Kilise numarasını . Örneğin, yukarıdaki örnek n = 4 verildiğinde hedef çıktınızdır . For n = 0 , baskı:

---

---
 |
 |

Test senaryoları

Cevabınız , tüm tamsayı girişleri için bu yığın snippet'i ile tam olarak aynı metni (modulo takip eden yeni satırlar) vermelidir n ≥ 0 :

Bu , bayt cinsinden en kısa kod kazanır.


Snippet'iniz bana hata veriyor.
Sızdıran Rahibe

Hangi tarayıcıda? Bazı tarayıcılar desteklemez .repeat.
Conor O'Brien

Sondaki boşluklara izin veriliyor mu?
Loovjo

Hayır, sadece sondaki satırlar. (Bu la anarşi golf ve sanırım ascii-art zorlukları için belirlenmiş en iyi kural .)
Lynn

Yanıtlar:


4

Retina , 74 67 63 bayt

Bayt sayımı ISO 8859-1 kodlamasını varsayar.

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

Giriş tekli , basamak olarak satır besleme dışında herhangi bir karakter kullanılıyor.

Çevrimiçi deneyin!

açıklama

.
 |  

Her bir tekli rakamı çevirerek başlıyoruz | (arka boşluklara dikkat edin). Bu bize çıktının ikinci satırını verir (giriş en azından ise iki arka boşluk 1).

^
$.'$*----¶

İlk satırı eklemek için dizenin başlangıcıyla eşleşiriz. Bu, Retina'ya özgü bazı ikame özellikleri kullanılarak yapılır. $*sağdaki karakteri solda olduğu kadar tekrarlar. $.'maçın sağındaki karakter sayısını değerlendirir. Eşleşme dizenin sadece başlangıcı olduğundan, dizede -karakterler olduğu kadar çok verir ve ---üç tane daha ekler. Bir satır besleme için bir diğer adıdır. Şimdi ilk iki satıra sahibiz.

\z
¶$` |

Şimdi sıradaki iki satırı ekliyoruz. Bunu, dizenin sonunu eşleştirerek ve bir satır beslemesi, tüm dizeyi tekrar ekleyerek ve ardından |dördüncü satırı doğru elde etmek için yaparız .

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

Başvuru zamanı. Önde gelen +, Retina'nın çıktı değişmeyi durdurana kadar bu aşamayı tekrarlamasını sağlar (bu durumda normal ifade uzun eşleşmediği için). Normal ifade, |bir boşlukla aşağıdakileri içermesi koşuluyla, son satırın tamamı ile eşleşir . Her şeyi |grupta (sondan ikinci olacak) yakalarız 1. Satırı $&bir satır besleme ile, sonra grup 1 (böylece sonuncuyu düşürerek |) ve sonra tekrar yazıyoruz ----.

$
¶ |

Bu sadece bir tane içeren son satırı ekler |.

  ¶
¶

Sonunda ikinci satırdaki boşluklardan kurtulmamız gerekiyor.


2

JavaScript (ES6), 112 bayt

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>


Tüm yeni satırlar gerekli mi? Ayrıca f=gerekli mi?
NoOneIsHere

@NoOneIsHere Yeni satırlar şablon dizesinin bir parçasıdır. f=Sadece snippet'la ihtiyaç duyulan, cevabın bir parçası değildir ve bayt toplamın bir parçası olarak sayılmaz.
Neil

2

Python, 201 bayt

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 bayt

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)

İşlev fazladan bir parametre içerir, ancak yalnızca dahili kullanım içindir. Varsayılan bir değere sahiptir ve işlevi çağırırken atlanmalıdır. Umarım bu kuralları ihlal etmez.

İşlev ilk 5 satırı çizer, ardından kalan satırları çizmek için kendini tekrar tekrar çağırır.

Çevrimiçi deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.