Su tarea: dado un número entero n
, generar un patrón de hexágono incrustado siguiendo las reglas a continuación, hasta la enésima profundidad.
Un hexágono incrustado tiene la forma básica de esto: ( n=0
)
__
/ \
\__/
Hexágonos integrados n=1
y n=2
:
____
/ \ \
/\__/ \
\ /
\____/
________
/ \ \ \
/\__/ \ \
/\ / \
/ \____/ \
\ /
\ /
\ /
\________/
La longitud de cada lado es 2 veces la longitud del mismo lado en la profundidad anterior multiplicada por dos. Los lados superior e inferior tienen 2 caracteres de longitud n=0
y el resto comienza con 1 carácter. Las longitudes de los lados que no son de arriba a abajo deben ser 2^n
largas ( OEIS: A000079 ) y los lados superior e inferior deben seguir la regla 2^(n+1)
(el mismo OEIS).
Los hexágonos actuales están indexados en 0, puede optar por usar 1 indexado si lo desea.
Este es el código de golf , por lo que gana la respuesta más corta.
fuente
n
?Respuestas:
Carbón ,
4029 bytes11 bytes guardados gracias a @Neil cambiando el ciclo while a un ciclo for entre otros trucos
Pruébalo en línea!
Explicación (obsoleta)
Este programa comienza generando el hexágono más grande, y luego hace los más pequeños uno por uno en un ciclo while (1 indexado). Como referencia,
α
es el número de entrada,β
es la variable que contiene2^(α-1)
yι
es la variable iterativa en el bucle.fuente
×_X²ι
es lo mismo×__β
, y algunos bytes más al convertirlosW
en aF
, lo que también evita tener que almacenar el número de entrada. Pruébalo en línea! .Haskell ,
230217207 bytesEDITAR:
#
podría ser solomax
.zipWith
yp
podría fusionarse en un?
operador, y eso (¡de alguna manera!) Se volvería a implementarreplicate
.m
toma unInteger
y devuelve unString
.Pruébalo en línea!
Cómo funciona
m
Es la función principal. Se utiliza&
para generar los hexágonos con el relleno adecuado, luego los dobla junto cono
.l&t
genera un pequeño hexágono de longitud lateralt
, acolchado dentro de uno grande de longitud laterall
, como una lista deString
líneas.a
es la línea superior del hexágono, con los guiones bajos.b
es una lista de las otras líneas en la mitad superior del hexágono. Las líneas deb
se centran en el relleno, que es rectangular; Esto permite que el siguiente paso funcione.a
superpuesto en la parte superior deb
cono
, entonces invertido (tanto orden de las líneas y dentro de cada línea).c
toma dos argumentos, una lista de longitudes y una cadena, y genera una cadena que tiene tantas copias de cada carácter en el original como la longitud correspondiente, por ejemploc[1,3,2]"abc" == "abbbcc"
. Se utiliza&
para generar las líneas.o
toma dos argumentos que representan imágenes como listas de líneas y superpone el primero, más pequeño, encima del segundo.?
dos veces para rellenar la primera imagen con infinitos espacios, tanto hacia abajo como hacia la derecha, y luego comprimir los caracteres correspondientes conmax
, que selecciona el carácter que no es espacio si hay uno.(f?e)l m
rellena una listal
agregando infinitos elementos 'e', luego comprime la lista resultante y la listam
con laf
función.fuente
(#)
puede sermax
.p
al ahorro bytes:o=max?' '?"";f?e=z f.(++repeat e)
. Podría ser más corto sin punto.(\n->(<$[1..n]))
esreplicate
.replicate
? Eso sí que es vergonzoso. Estoy demasiado acostumbrado<$[1..n]
o[1..n]>>
casi siempre estoy ganando. Sin embargo, no veo cómo acortar?
más. Ya intenté hacer un puntop
libre y++
simplemente está en el lugar equivocado, explotando las cosasflip
.JavaScript (ES6), 258 bytes
Explicación: Para los hexágonos después del primero, el hexágono anterior se genera primero y se rellena en cada lado (esto se basa en que la salida es un rectángulo). (Para el primer encabezado, se crea un relleno ficticio). Se generan los lados superior y superior del hexágono, y todos los espacios se fusionan con el hexágono anterior. (Hay algunos trucos para que los hexágonos se alineen; esto sería más fácil si se permitieran márgenes adicionales). Los lados inferiores del hexágono se generan de forma análoga a los lados superiores, y luego se rellena la parte inferior del hexágono. Se debe tener cuidado para devolver la salida rectangular, incluida una nueva línea final, para que la recursión funcione.
fuente
/
son populares en el arte ASCII y elreplace
método es una forma relativamente barata de generarlas en JavaScript.1<<n>>1
: Buena simetría ;-)v
pero lamentablemente1
no es simétrica en ninguna de mis fuentes habituales.PHP, 337 bytes
0 indexación
Pruébalo en línea!
Expandido
fuente