Encuentro fascinante cómo las letras "H" y "I" son muy similares. "H" es un trazo horizontal rodeado de dos trazos verticales; "I" es un trazo vertical rodeado de dos trazos horizontales (dependiendo de su fuente). Apuesto a que esto podría estar anidado ... ¿Sabes a qué me recuerda? Fractales !!!
Definamos la pirámide "IHIH" de la siguiente manera: la primera iteración es esta representación ASCII de la letra "I":
---
|
---
La siguiente iteración tiene un trazo vertical a cada lado.
| |
|---|
| | |
|---|
| |
Si ve la "I" en el medio como un solo trazo horizontal, entonces esta segunda iteración es básicamente una "H". La tercera iteración agrega un trazo horizontal en la parte superior e inferior
-------
| |
|---|
| | |
|---|
| |
-------
Nuevamente, si ve la "H" en el medio como un solo trazo vertical, entonces esta iteración es básicamente una "I". Este patrón continúa, alternando entre "H" e "I" en cada iteración. Como referencia, aquí están las primeras 6 iteraciones:
1:
---
|
---
2:
| |
|---|
| | |
|---|
| |
3:
-------
| |
|---|
| | |
|---|
| |
-------
4:
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
5:
-----------
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
-----------
6:
| |
|-----------|
| | | |
| |-------| |
| | | | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | | | | |
| |-------| |
| | | |
|-----------|
| |
El reto:
Escriba un programa o función que genere la enésima iteración de la pirámide IHIH y una nueva línea final opcional. Su entrada será un solo entero positivo en el formato razonable que desee. No es necesario que maneje entradas no válidas, por ejemplo, números enteros, números menores que 1, etc. Su programa debe, como mínimo, producir la salida correcta para entradas de hasta 20. Como se trata de código de golf , no se permiten lagunas estándar. ¡y la respuesta más corta en bytes gana!
Respuestas:
Pyth ,
50403125 bytesBanco de pruebas.
Explicación
Este es un algoritmo recursivo.
En cada iteración, realizamos tres acciones:
"-"
o"|"
dependiendo del número de iteraciones.Después de las iteraciones, se transpondrán las salidas impares. Por lo tanto, los transponemos.
fuente
Python,
165145133123 bytesUna solución recursiva:
Llamado con
print ("\n".join(i(int(sys.argv[1]))))
, donde el parámetro es el número de iteración de la pirámide IHIH.Gracias a @DJMcMayhem por guardar 20 bytes. Tomar la idea detrás de esas sugerencias ahorró aún más 12 bytes. Gracias a @Maltysen por las sugerencias que recortaron algunos bytes más.
La función establece el delimitador
d
en"|"
y los espacios intermedios en" "
(para iteraciones con números impares), se ocupa de regresar en el caso degenerado, luego restablece el delimitador en" "
y los espacios intermedios"-"
para iteraciones con números pares. La función devuelve una lista de cadenas para cada línea de la IHIH, habiendo incrustado el resultado de una llamada recursiva a la función en el lugar correcto dentro de la lista.fuente
if e<1:return'|'
(sin nueva línea entre ellas), luego elimine el "else" y elimine la sangría adicional.return
. Además, puede fusionar las líneas sinif
s con punto y coma, y guardar en la sangríaCheddar ,
186177165154148131 bytesUtiliza la recursividad. Agregará una explicación una vez hecho golf.
Pruébalo en línea!
Explicación
Este es un poco complejo también, mantén un seguimiento de todas las variables que estoy usando, pero intentaré que sea simple:
Esto fue un dolor para el golf, pero es 55 bytes más corto que el original.
fuente
Python 2, 93 bytes
Leaky Nun ahorró 7 bytes.
fuente
int(x/2.)
porque estaba tomandorange(-n,n+1)
pero ahora solo puedo usarlos. ¡Gracias!Matricks ,
8062 bytesUna solución iterativa (La recursión en Matricks es difícil ...)
Corre con
python matricks.py ihih.txt [[]] <input> --asciiprint
Explicación:
fuente
JavaScript (ES6),
9290 bytesLa solución recursiva funciona tomando la iteración anterior, agregando el
v
carácter a los lados, luego agregando elc
carácter a las esquinas y elh
carácter a lo largo de la parte superior e inferior. El conjunto de caracteres simplemente alterna cada iteración. Editar: guardado 2 bytes al regresarv
cuandon=0
.fuente
Dyalog APL ,
5243 bytesv h s←'|- '
asigna los tres caracteres a tres nombres ( v ertical, h orizontal, s pace)⊃
el primero, es decir|
⍪
convertir en tabla 1 × 1{
...}⍣⎕
obtenga información y aplique la función de refuerzo muchas vecesv=⊃⍵:
Si el carácter superior izquierdo del argumento es vertical, entonces:h⍪⍨
horizontales debajoh⍪
horizontales arribas,
espacios a la izquierda de⍵,s
el argumento con espacios a la derecha⋄
más:v,⍨
verticales a la derecha dev,
verticales a la izquierda des⍪
espacios arriba⍵⍪s
el argumento con espacios debajoTryAPL en línea!
fuente
Brachylog , 84 bytes
Pruébalo en línea!
Un puerto de mi respuesta en Pyth .
fuente
C, 110 bytes
Invocar como
f(n)
. Para 111 bytes, podría hacer:es decir,
#define
guarda exactamente un byte.fuente
Dyalog APL, 34 bytes
{
...}⍣⍵⍪'|'
Aplicar la función entre paréntesis⍵
comenzando con la matriz de caracteres 1x1|
. El resultado de cada aplicación es el argumento para la siguiente aplicación.s b←' -|'~⊃⍵
s es espacio y b es la barra que no está en la esquina superior izquierda del argumento (' -|'~'-'
elimina la barra horizontal y deja el espacio y la barra vertical)s,⍵,⊃s b
agregar espacio a izquierda y derecha (⊃
selecciona s del vector sb)b,b,⍨⍉
transponer y agregar b a izquierda y derechaPara números impares, esto deja el resultado transpuesto, por lo que se requiere una transposición final.
⍉⍣⍵
⍵
Tiempos de transposición (una vez sería suficiente, pero más corto para codificar de esta manera)TryAPL en línea
fuente
Cheddar , 107 bytes
Pruébalo en línea!
fuente
Cheddar, 85 bytes
Mi primera respuesta de Cheddar. Pruébalo en línea!
Si trato de escribir
r=(-n|>n).map(v->abs v).map
, y luegor(y->r(x->…))
, el intérprete falla. ; -;fuente
v->abs v
en(abs)
(por ejemplor.map((abs))
) que devolverá una función que tiene el comportamiento de la función abs. por ejemplo(+)(1,2)
->3
.(^)(2,6)
-> 64. También gran sorpresa en superarme en casi un 50%Runtime Error: `abs` has no behavior for types `Number` and `Number`
(porquemap
recibe tanto el elemento como su índice, presumiblemente).APL (Dyalog Classic) , 34 bytes
Pruébalo en línea!
(usos
⎕io←1
)⍳⎕
es1 2 ... N
(⌽,0,⊢)
es un tren que lo convierte en-N ... -1 0 1 ... N
∘.( )⍨
ejecuta los paréntesis para cada par de coordenadas⍺ ⍵
el tren
(≤-(1+=)×2|⌈)
o su equivalente dfn{(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}
produce una matriz como:'- |'[2+ ]
crea estos índices válidos⎕IO=1
y selecciona los caracteres correspondientesfuente
Ruby,
817877 bytesEsto se basa en la respuesta Python de Lynn . Sugerencias de golf bienvenidas.
Editar: 3 bytes gracias a Lynn. Correcciones y golf 1 byte gracias a Jordan.
No golfista:
fuente
.map(&:abs)
?*
no está haciendo nada. Puedes usar en*""
lugar de.join
. Además, el usop
rodea cada línea con comillas (recurreinspect
a sus argumentos), lo que podría descalificarlo.&:abs
(map &:abs
). Es posible que pueda hacer algo enArray#product
lugar demap
s anidados , pero hará que los saltos de línea sean difíciles.r.product(r).map
(sin embargo, eso funciona) es más largo y no parece permitir saltos de línea muy fácilmente.MATLAB,
168163 bytesProbablemente esta no sea la forma más inteligente de hacerlo: expandir una cadena por todos lados en
n
pasos:Uso: Guardar como
g.m
(¿tengo que agregar eso al conteo de bytes?) Y llamar, por ejemplog(15)
.Sin golf:
fuente
' '
por0
(Matlab trata char 0 como un espacio) y'-'
por45
. Nombre de archivo no tiene que ser incluido en el recuento de bytesEn realidad ,
484544 bytesEste es un intento de transferir mi respuesta de Ruby a En realidad. Esto es demasiado largo y las sugerencias de golf son muy apreciadas. Pruébalo en línea!
Aquí hay una versión de 46 bytes que separa las funciones anidadas para que podamos definir
"| -"
en menos bytes. Pruébalo en línea!No golfista:
Primer algoritmo
Segundo algoritmo
fuente
u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£M
es más largo de lo que tiene actualmente (en 2 bytes), pero es posible que encuentre alguna inspiración para hacerlo más corto que no veo.Lienzo ,
19181714 bytesPruébalo aquí!
Si se me permitiera emitir cualquier otra salida girada 90 °, los últimos 4 caracteres podrían eliminarse.
Explicación (algunos caracteres se han cambiado para parecer ~ monoespacio):
fuente
05AB1E ,
2928 bytesPruébalo en línea!
-1 gracias a Dzaima ...
Esta es una solución iterativa.
Básicamente, esto se realiza creando el siguiente patrón:
Luego, en parejas, transponiendo cada elemento y agregando el relleno.
Al transponer después de cada iteración, terminamos creando una sola esquina del patrón.
Entonces, podemos usar los comandos de reflexión de 05AB1E.
fuente
Mathematica,
158164 bytesCalcula matemáticamente el símbolo correcto en las coordenadas (i, j), donde ambas corren de -n a n. Humano formateado:
fuente
PHP, 166 bytes
Golfé más de 100 bytes de mi primer enfoque y sigue siendo la respuesta más larga aquí.
Descompostura
sin golf
fuente
Perl 5 , 150 bytes
Pruébalo en línea!
fuente
Haskell , 110 bytes
Pruébalo en línea!
Explicación / Ungolfed
La función de ayuda
g
toma un carácter y una lista de cadenas, luego preselecciona y agrega ese carácter a cada cadena:A continuación, el operador
(!)
toma una función (g
), un número (n
) y un carácter (c
). Luego calcula la salida paran-1
, le aplica la funcióng
y agrega una cadena del mismo ancho que consiste enc
s al principio y al final:Con estos estamos listos para generar los resultados de forma recursiva, primero tenemos que cubrir el caso base:
Y luego la recursividad:
fuente
J , 37 bytes
TIO
fuente
Stax , 22 bytes
Ejecutar y depurarlo
Desempaquetado, sin golf y comentado, se ve así.
Ejecute este
fuente