tło
Wizualizacja terminów rachunku λ
Słynny żongler lambda (i golfista kodu ) John Tromp opracował interesującą wizualizację terminów w rachunku λ. Jego słowami:
abstrakcje (lambda) są reprezentowane przez linie poziome, zmienne przez linie pionowe wychodzące z ich wiążącej lambda, a aplikacje przez poziome połączenia łączące zmienne skrajnie lewe.
Na przykład termin lambda λf.λx.f (f (f (fx))) odpowiada wizualizacji:
-------------------
| | | |
-------------------
| | | | |
| | | |----
| | |----
| |----
|----
|
Przeczytaj od góry do dołu:
- Pierwsza linia pozioma reprezentuje pierwszą λ.
- Cztery linie zstępujące z niego reprezentują fs w ciele.
- Podobnie druga linia pozioma reprezentuje drugą λ, a pojedyncza nowa linia zstępująca z niej reprezentuje x w ciele.
- Najbardziej wysunięta w prawo linia f i linia x są połączone poziomą linią reprezentującą aplikację (f x) .
- Następna aplikacja to (f (f x)) i tak dalej.
Cyfry kościelne
Te cyfry Kościół to specyficzna sekwencja terminów w X-rachunku, biorąc pod następującym wzorem:
0 = λf. λx. x
1 = λf. λx. f x
2 = λf. λx. f (f x)
3 = λf. λx. f (f (f x))
...
Zadanie
Biorąc pod uwagę liczbę wejściową n , wydrukuj grafikę ASCII, która wizualizuje n- tą cyfrę Kościoła. Na przykład powyższy przykład jest wynikiem docelowym, gdy podano n = 4 . Dla n = 0 wydrukuj:
---
---
|
|
Przypadki testowe
Twoja odpowiedź musi wypisać dokładnie ten sam tekst (modulo końcowe znaki nowej linii), co ten fragment kodu stosu dla wszystkich liczb całkowitych n ≥ 0 :
To jest golf-golf, więc wygrywa najkrótszy kod w bajtach.
.repeat
.Odpowiedzi:
Retina ,
746763 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Wprowadzanie jest jednoargumentowe , przy użyciu dowolnego znaku oprócz znaków liniowych jako cyfry.
Wypróbuj online!
Wyjaśnienie
Zaczynamy od przekształcenia każdej jednoznacznej cyfry w
|
(zwróć uwagę na końcowe spacje). To daje nam drugi wiersz wyniku (plus dwie końcowe spacje, jeśli wejście jest co najmniej1
).Dopasowujemy początek ciągu, aby wstawić pierwszy wiersz. Odbywa się to za pomocą niektórych funkcji substytucji specyficznych dla siatkówki.
$*
powtarza znak po prawej tyle razy, ile razy jego lewy fragment.$.'
ocenia liczbę znaków po prawej stronie dopasowania. Ponieważ dopasowanie jest tylko początkiem ciągu, daje tyle,-
ile znaków w ciągu i---
dołącza trzy kolejne.¶
Jest aliasem dla wysuw. Mamy teraz dwie pierwsze linie.Teraz dołączamy kolejne dwie linie. Robimy to, dopasowując koniec łańcucha i dodając kanał, cały łańcuch ponownie, a następnie,
|
aby uzyskać poprawną czwartą linię.Czas na aplikacje. Czołowe
+
marki Retina powtórzyć ten etap aż wyjście przestaje zmianę (w tym przypadku, ponieważ regex długo nie pasuje). Wyrażenie regularne dopasowuje całą ostatnią linię, pod warunkiem że zawiera|
znak spacji. Przechwytujemy wszystko do grupy|
(która będzie ostatnia do ostatniej)1
. Odpisujemy linię z powrotem$&
, linefeed, następnie grupa 1 (usuwając w ten sposób ostatnią|
), a następnie----
.To tylko dodaje ostatnią linię zawierającą tylko jeden
|
.Wreszcie musimy pozbyć się końcowych spacji w drugiej linii.
źródło
JavaScript (ES6), 112 bajtów
źródło
f=
konieczne?f=
jest to część odpowiedzi, jest ona potrzebna tylko dla fragmentu i nie jest liczona jako część bajtu ogółem.Python, 201 bajtów
źródło
Python 2, 138 bajtów
Funkcja zawiera dodatkowy parametr, ale służy wyłącznie do użytku wewnętrznego. Ma wartość domyślną i należy ją pominąć podczas wywoływania funkcji. Mam nadzieję, że to nie narusza zasad.
Funkcja rysuje pierwsze 5 wierszy, a następnie rekurencyjnie wywołuje się w celu narysowania pozostałych wierszy.
Wypróbuj online
źródło