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 código de golf , por lo que gana el código más corto en bytes.
.repeat
.Respuestas:
Retina ,
746763 bytesEl recuento de bytes asume la codificación ISO 8859-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 menos1
).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.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.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 grupo1
. 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.
fuente
JavaScript (ES6), 112 bytes
fuente
f=
necesario?f=
no es parte de la respuesta, solo es necesario para el fragmento y no se cuenta como parte del total de bytes.Python, 201 bytes
fuente
Python 2, 138 bytes
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
fuente