Visualisieren Sie die Ziffern der Kirche

9

Hintergrund

Visualisierung von λ-Kalkülbegriffen

Der berühmte Lambda-Jongleur (und Code-Golfer ) John Tromp entwickelte eine interessante Visualisierung von Begriffen im λ-Kalkül. In seinen Worten:

Abstraktionen (Lambdas) werden durch horizontale Linien dargestellt, Variablen durch vertikale Linien, die von ihrem Bindungs-Lambda ausgehen, und Anwendungen durch horizontale Verknüpfungen, die die Variablen ganz links verbinden.

Zum Beispiel entspricht der Lambda-Term λf.λx.f (f (f (fx))) der Visualisierung:

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

Lesen Sie es von oben nach unten:

  • Die erste horizontale Linie repräsentiert das erste λ.
  • Die vier davon absteigenden Linien repräsentieren die fs im Körper.
  • In ähnlicher Weise repräsentiert die zweite horizontale Linie das zweite λ, und die einzelne neue Linie, die von ihr absteigt, repräsentiert das x im Körper.
  • Die f- Linie ganz rechts und die x- Linie sind durch eine horizontale Linie verbunden, die eine Anwendung darstellt (f x) .
  • Die nächste Anwendung ist (f (f x)) usw.

Kirchenzahlen

Die Kirchenzahlen sind eine bestimmte Folge von Begriffen im λ-Kalkül, die das folgende Muster annehmen:

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

Aufgabe

Drucken Sie bei einer eingegebenen Nummer n eine ASCII-Grafik, die die n- te Kirchennummer darstellt. Das obige Beispiel ist beispielsweise Ihre Zielausgabe, wenn n = 4 angegeben ist . Für n = 0 drucken Sie:

---

---
 |
 |

Testfälle

Ihre Antwort muss für alle ganzzahligen Eingaben n ≥ 0 genau den gleichen Text (Modulo-Trailing Newlines) wie dieses Stack-Snippet ausgeben :

Dies ist , also gewinnt der kürzeste Code in Bytes.

Lynn
quelle
Ihr Snippet gibt mir Fehler.
Undichte Nonne
@LeakyNun welcher Browser? Einige Browser unterstützen dies nicht .repeat.
Conor O'Brien
Sind nachgestellte Leerzeichen erlaubt?
Loovjo
Nein, nur nachgestellte Zeilenumbrüche. (Dies ist à la Anarchy Golf, und ich denke, es ist der beste Regelsatz für ASCII-Art- Herausforderungen.)
Lynn

Antworten:

4

Retina , 74 67 63 Bytes

Die Byteanzahl setzt die ISO 8859-1-Codierung voraus.

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

Die Eingabe ist unär und verwendet ein beliebiges Zeichen außer Zeilenvorschub als Ziffer.

Probieren Sie es online aus!

Erläuterung

.
 |  

Wir beginnen damit, jede unäre Ziffer in zu verwandeln | (beachten Sie die nachgestellten Leerzeichen). Dies gibt uns die zweite Zeile der Ausgabe (plus zwei nachgestellte Leerzeichen, wenn die Eingabe mindestens ist 1).

^
$.'$*----¶

Wir passen den Anfang der Zeichenfolge an, um die erste Zeile voranzustellen. Dies erfolgt mithilfe einiger Retina-spezifischer Substitutionsfunktionen. $*wiederholt das Zeichen auf der rechten Seite so oft wie das linke Arugment. $.'wertet die Anzahl der Zeichen rechts von der Übereinstimmung aus. Da die Übereinstimmung nur der Anfang der Zeichenfolge ist, werden so viele -Zeichen wie möglich in der Zeichenfolge angegeben und ---drei weitere angehängt. Das ist ein Alias ​​für einen Zeilenvorschub. Jetzt haben wir also die ersten beiden Zeilen.

\z
¶$` |

Jetzt fügen wir die nächsten beiden Zeilen hinzu. Dazu passen wir das Ende der Zeichenfolge an und fügen einen Zeilenvorschub hinzu, die gesamte Zeichenfolge erneut und dann |die vierte Zeile richtig.

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

Zeit für die Bewerbungen. Die Führung +lässt Retina diese Phase wiederholen, bis sich die Ausgabe nicht mehr ändert (in diesem Fall, weil der reguläre Ausdruck nicht mehr übereinstimmt). Der reguläre Ausdruck entspricht der gesamten letzten Zeile, vorausgesetzt, er enthält |ein Leerzeichen. Wir erfassen alles bis zur |(vorletzten) Gruppe 1. Wir schreiben die Zeile mit $&einem Zeilenvorschub zurück, dann Gruppe 1 (wobei die letzte gelöscht wird |) und dann ----.

$
¶ |

Dies fügt nur die letzte Zeile hinzu, die nur eine einzige enthält |.

  ¶
¶

Schließlich müssen wir die nachgestellten Leerzeichen in der zweiten Zeile entfernen.

Martin Ender
quelle
2

JavaScript (ES6), 112 Byte

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>

Neil
quelle
Sind alle Zeilenumbrüche notwendig? Auch ist f=notwendig?
NoOneIsHere
@NoOneIsHere Die Zeilenumbrüche sind Teil der Vorlagenzeichenfolge. Das f=ist nicht Teil der Antwort, es wird nur für das Snippet benötigt und wird nicht als Teil der Bytesumme gezählt.
Neil
2

Python, 201 Bytes

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]))
user2070206
quelle
1

Python 2, 138 Bytes

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)

Die Funktion enthält einen zusätzlichen Parameter, ist jedoch nur für den internen Gebrauch bestimmt. Es hat einen Standardwert und sollte beim Aufrufen der Funktion weggelassen werden. Ich hoffe das verstößt nicht gegen die Regeln.

Die Funktion zeichnet die ersten 5 Zeilen und ruft sich dann rekursiv auf, um die verbleibenden Zeilen zu zeichnen.

Probieren Sie es online aus

Chuck Morris
quelle