Visualiza los números de la iglesia


9

Antecedentes

Visualización de términos de cálculo λ

El famoso malabarista lambda (y golfista de códigos ) John Tromp ideó una visualización interesante de términos en el cálculo λ. En sus palabras:

las abstracciones (lambdas) están representadas por líneas horizontales, las variables por líneas verticales que emanan de su lambda de enlace y las aplicaciones por enlaces horizontales que conectan las variables más a la izquierda.

Por ejemplo, el término lambda λf.λx.f (f (f (fx))) corresponde a la visualización:

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

Léalo de arriba a abajo:

  • La primera línea horizontal representa la primera λ.
  • Las cuatro líneas que descienden representan las f s en el cuerpo.
  • Del mismo modo, la segunda línea horizontal representa la segunda λ, y la nueva línea que desciende representa la x en el cuerpo.
  • La línea f más a la derecha y la línea x están conectadas por una línea horizontal que representa una aplicación (f x) .
  • La siguiente aplicación es (f (f x)) , etc.

Números de la iglesia

Los números de la Iglesia son una secuencia específica de términos en el cálculo λ, tomando el siguiente patrón:

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

Tarea

Dado un número de entrada n , imprima un poco de arte ASCII que visualice el número de la enésima Iglesia. Por ejemplo, el ejemplo anterior es su salida objetivo cuando se le da n = 4 . Para n = 0 , imprima:

---

---
 |
 |

Casos de prueba

Su respuesta debe mostrar exactamente el mismo texto (módulo de líneas nuevas finales) que este fragmento de pila para todas las entradas enteras n ≥ 0 :

Este es el , por lo que gana el código más corto en bytes.


Tu fragmento me da un error.
Leaky Nun

@LeakyNun qué navegador? Algunos navegadores no son compatibles .repeat.
Conor O'Brien

¿Se permiten espacios finales?
Loovjo

No, solo nuevas líneas finales. (Este es el golf a la anarquía, y siento que es la mejor regla establecida para los desafíos de arte asiatico)
Lynn

Respuestas:


4

Retina , 74 67 63 bytes

El recuento de bytes asume la codificación ISO 8859-1.

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

La entrada está en unario , usando cualquier carácter, excepto los avances de línea como el dígito.

Pruébalo en línea!

Explicación

.
 |  

Comenzamos convirtiendo cada dígito unario en | (tenga en cuenta los espacios finales). Esto nos da la segunda línea de la salida (más dos espacios finales si la entrada es al menos 1).

^
$.'$*----¶

Emparejamos el comienzo de la cadena para anteponer la primera línea. Esto se hace usando algunas características de sustitución específicas de Retina. $*repite el personaje de la derecha tantas veces como su argumento izquierdo. $.'evalúa el número de caracteres a la derecha del partido. Dado que la coincidencia es solo el comienzo de la cadena, esto da tantos -como hay caracteres en la cadena y ---agrega tres más. El es un alias para un salto de línea. Así que ahora tenemos las dos primeras líneas.

\z
¶$` |

Ahora agregamos las siguientes dos líneas. Hacemos esto haciendo coincidir el final de la cadena y agregando un salto de línea, la cadena completa nuevamente y luego |para obtener la cuarta línea correcta.

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

Tiempo para las aplicaciones. El inicio +hace que Retina repita esta etapa hasta que la salida deja de cambiar (en este caso porque la expresión regular no coincide por mucho tiempo). La expresión regular coincide con toda la última línea, siempre que contenga un |seguimiento por un espacio. Capturamos todo hasta el |(que será el penúltimo) en grupo 1. Escribimos la línea de regreso con $&un salto de línea, luego el grupo 1 (dejando caer el último |) y luego ----.

$
¶ |

Esto solo agrega la línea final que contiene solo una |.

  ¶
¶

Finalmente necesitamos deshacernos de los espacios finales en la segunda línea.


2

JavaScript (ES6), 112 bytes

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>


¿Son necesarias todas las nuevas líneas? Además, ¿es f=necesario?
NoOneIsHere

@NoOneIsHere Las nuevas líneas son parte de la cadena de plantilla. El f=no es parte de la respuesta, solo es necesario para el fragmento y no se cuenta como parte del total de bytes.
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]))

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)

La función contiene un parámetro adicional, pero es solo para uso interno. Tiene un valor predeterminado y debe omitirse al llamar a la función. Espero que esto no viole las reglas.

La función dibuja las primeras 5 filas, luego se llama recursivamente para dibujar las filas restantes.

Pruébalo en línea

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.