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 Code-Golf , also gewinnt der kürzeste Code in Bytes.
.repeat
.Antworten:
Retina ,
746763 BytesDie Byteanzahl setzt die ISO 8859-1-Codierung voraus.
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 ist1
).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.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.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) Gruppe1
. 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.
quelle
JavaScript (ES6), 112 Byte
quelle
f=
notwendig?f=
ist nicht Teil der Antwort, es wird nur für das Snippet benötigt und wird nicht als Teil der Bytesumme gezählt.Python, 201 Bytes
quelle
Python 2, 138 Bytes
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
quelle