Visualizza i numeri della Chiesa


9

sfondo

Visualizzazione dei termini λ-calcolo

Il famoso giocoliere lambda (e golfista di codice ) John Tromp ha ideato un'interessante visualizzazione dei termini nel calcolo λ. Nelle sue parole:

le astrazioni (lambda) sono rappresentate da linee orizzontali, variabili da linee verticali che scendono dalla loro lambda vincolante e applicazioni da collegamenti orizzontali che collegano le variabili più a sinistra.

Ad esempio, il termine lambda λf.λx.f (f (f (fx))) corrisponde alla visualizzazione:

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

Leggi dall'alto verso il basso:

  • La prima linea orizzontale rappresenta la prima λ.
  • Le quattro linee discendenti da essa rappresentano le f nel corpo.
  • Allo stesso modo, la seconda linea orizzontale rappresenta la seconda λ e la singola nuova linea che discende da essa rappresenta la x nel corpo.
  • La linea f più a destra e la linea x sono collegate da una linea orizzontale che rappresenta un'applicazione (f x) .
  • La prossima applicazione è (f (f x)) , eccetera.

Numeri della chiesa

I numeri della Chiesa sono una sequenza specifica di termini nel calcolo λ, assumendo il seguente schema:

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

Compito

Dato un numero di ingresso n , stampare alcune ASCII art che visualizza il n ° Chiesa numerico. Ad esempio, l'esempio sopra è l'output target quando viene dato n = 4 . Per n = 0 , stampa:

---

---
 |
 |

Casi test

La tua risposta deve generare esattamente lo stesso testo (modulo trailing newline) di questo frammento di stack per tutti gli input interi n ≥ 0 :

Questo è , quindi vince il codice più breve in byte.


Il tuo frammento mi dà un errore.
Leaky Nun,

@LeakyNun quale browser? Alcuni browser non supportano .repeat.
Conor O'Brien,

Sono consentiti spazi finali?
Loovjo,

No, solo nuove righe. (Questo è à la l'anarchia di golf, e mi sento come se fosse il miglior set di regole per ascii-art sfide.)
Lynn

Risposte:


4

Retina , 74 67 63 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

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

L'input è in unario , usando qualsiasi carattere tranne gli avanzamenti di riga come cifra.

Provalo online!

Spiegazione

.
 |  

Iniziamo trasformando ogni cifra unaria in | (notare gli spazi finali). Questo ci dà la seconda riga dell'output (più due spazi finali se l'input è almeno 1).

^
$.'$*----¶

Abbiniamo l'inizio della stringa per anteporre la prima riga. Questo viene fatto usando alcune funzioni di sostituzione specifiche di Retina. $*ripete il personaggio a destra tante volte quanto il suo arugment sinistro. $.'valuta il numero di caratteri a destra della partita. Dal momento che la corrispondenza è solo l'inizio della stringa, questo dà quanti -più caratteri ci sono nella stringa e ne ---aggiunge altri tre. Il è un alias per un avanzamento riga. Quindi ora abbiamo le prime due righe.

\z
¶$` |

Ora aggiungiamo le prossime due righe. Lo facciamo abbinando la fine della stringa e aggiungendo un avanzamento riga, l'intera stringa di nuovo e quindi |per ottenere la quarta riga corretta.

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

Tempo per le applicazioni. Il leader +fa ripetere Retina in questa fase fino a quando l'uscita non smette di cambiare (in questo caso perché la regex non corrisponde più). Il regex corrisponde all'intera ultima riga, purché contenga |uno spazio seguito. Catturiamo tutto fino al |(che sarà il penultimo) del gruppo 1. Riscriviamo la riga con $&, un avanzamento riga, quindi il gruppo 1 (lasciando cadere l'ultimo |) e quindi ----.

$
¶ |

Questo aggiunge solo la riga finale contenente solo un singolo |.

  ¶
¶

Infine, dobbiamo eliminare gli spazi finali sulla seconda riga.


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>


Sono necessarie tutte le nuove linee? Inoltre, è f=necessario?
NoOneIsHere il

@NoOneIsHere Le newline fanno parte della stringa del modello. Non f=fa parte della risposta, è necessario solo per lo snippet e non viene conteggiato come parte del totale dei byte.
Neil,

2

Python, 201 byte

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 byte

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)

La funzione contiene un parametro aggiuntivo, ma è solo per uso interno. Ha un valore predefinito e deve essere omesso quando si chiama la funzione. Spero che questo non violi le regole.

La funzione disegna le prime 5 righe, quindi si chiama ricorsivamente per disegnare le restanti righe.

Provalo online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.