Inspirado en el mosaico de dominó de Fibonacci , este problema se trata de generar arte ASCII que represente otra famosa secuencia combinatoria.
Un diagrama de montaña de n pasos es un dibujo de una cadena montañosa, que usa exactamente caracteres n '/' y n '\', de modo que los personajes dibujan una curva continua que nunca cae por debajo de su "altitud" inicial. Por ejemplo,
/\/\
/\/ \
y
/\
/\/ \/\
son diagramas de montaña de 4 pasos, pero
/\ /\/\
\/
no es.
Entrada
El programa debe aceptar un número entero n desde stdin o como parámetro para una función.
Salida
Imprima todos los diagramas de montaña n -step en stdout. Los diagramas pueden estar en cualquier orden, pero deben estar separados por algún tipo de espacio en blanco. Puede decidir si se generarán diferentes diagramas horizontal, vertical, etc.
Como en el problema del mosaico de dominó, puede usar cualquier espacio en blanco que desee. Esto incluye nuevas líneas adicionales antes o después de la salida impresa.
Ejemplo
Algunas salidas válidas de muestra para n = 3:
Salida válida A:
/\
/\ /\ / \ /\/\
/\/\/\ / \/\ /\/ \ / \ / \
Salida válida B:
/\
/\/ \
/\/\
/ \
/\/\/\
/\
/ \
/ \
/\
/ \/\
Salida válida C:
/\
/ \ /\
/ \ /\/ \
/\/\
/\ / \
/ \/\ /\/\/\
Este es el código de golf; el programa más corto (en bytes) gana.
fuente
Respuestas:
Python 2: 151 caracteres
Wow, esto es un desastre.
La primera idea es usar los números
0 to 2**N-1
para codificar todas las secuencias deN
movimientos ascendentes y descendentes en sus bits. Leemos estos bits uno por uno por repetidos%2
e/2
iterados en unexec
bucle.Almacenamos la cordillera corriendo lateralmente en una lista transpuesta de cadenas
L
. Cada vez, generamos una nueva fila de espacios y reemplazamos un espacio en la nueva fila con/
o\
dependiendo de si ocurrió un movimiento hacia arriba o hacia abajo.El índice de ese espacio es
c
espacios desde el final, dondec
está la altura de carrera. Hacerlo desde el frente pondría las montañas al revés. Lo cambiamos aún másb
para alinear movimientos hacia arriba y hacia abajo, obteniendo[b-c]
. Comenzarc
en 1 en lugar de 0 corrige un error fuera de uno.Para eliminar los casos en los que las
c
inmersiones están por debajo del valor inicial1
, cuando esto sucede, establecemosi
en0
, lo que hace que todos los movimientos adicionales sean hacia abajo, lo que hace quec
sea más negativo. Luego, cuando verificamos sic
terminó en1
, también verificamos sic
alguna vez cayó por debajo de él. Solo tenemosprint
la cordillera sic
es así1
.Para imprimir, hacemos la
zip(*L)
transposición del rango de vertical a horizontal, e imprimimos cada cadena unida. Muchos problemas en esta respuesta provienen de que Python trata las cadenas como inmutables, por lo que trabajamos con ellas como listas de caracteres y solo las unimos en cadenas para imprimirlas.Gracias a @flornquake por su ayuda y mejoras.
fuente
' '
lugar de" "
si desea usar el bucleexec
. :) Por cierto, no necesitas escapar de la barra invertida.' '
e intenté reemplazar la cadena con comillas con una variable. Esto todavía dio un índice fuera de rango:for _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
exec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
, es decir, las citas internas deben ser diferentes de las externas.APL (88)
Salida para
n=3
:Explicación:
(N/2)⊤⍳2*N←2×⍵
: obtener un campo de bits para cada número de0
a2^⍵
.Z←↓⍉¯1+2×
: multiplica por 2 y resta 1, dando1
por arriba y-1
por abajo. Almacene un vector de vectores, cada vector que contiene la representación de un número, enZ
.{
...}¨Z
: para cada elemento deZ
:∧/0≤+\⍵
: compruebe que la suma acumulada nunca cae por debajo0
(no va por debajo del nivel del suelo),(0=+/⍵)
: y que la suma total es0
(termina a nivel del suelo).{
...}¨Z/⍨
: selecciona aquellos elementosZ
para los que eso es cierto. Para cada uno de ellos:K←(⍵≠1)++\⍵
: encuentra la altura de cada personaje y guárdaloK
. Levante cada\
una para que se alineen con la/
s correctamente. Esto hace que la altura del suelo1
.¯1+2×K=⊂⌽⍳⌈/K
: para cada columna, haga una lista[1..max(K)]
y marque la posición del personaje en esa columna con1
y el resto como-1
. (Replicar por -1 llena esa posición con un espacio).'\/'[1+⍵=1]/⍨¨
: encuentre el carácter correcto para cada columna y repítalo por la lista de esa columna.⍉↑
: convierte el resultado en una matriz y lo coloca al revésfuente
Python,
261241236 caracteresEmpieza a tardar un rato para
n=5
arriba ...fuente
JavaScript (ES6) 159
163Al igual que mi respuesta para el mosaico de dominó de Fibonacci, examino todas las secuencias de n + n bits, con 1 marcando un '/' y 0 marcando un '\' (solo para la salida, luego se agrega '2' para marcar una nueva línea) . Mientras construyo el patrón ASCII, verifico el equilibrio, los mismos números de 0 y 1, y nunca voy por debajo de la línea base inicial, y obtengo lo que obedece las reglas.
Salida realizada con 'alerta', que es estándar para el codegolf JS pero bastante molesto, y tal vez en contra de las reglas. Usando console.log, el recuento de caracteres va a 165.
Menos golf
Prueba en la consola FireFox / FireBug.
Salida
fuente
-b-b
y en-n-n
lugar de-2*b
?2*b+1
->b-~b
)CJam, 84 bytes
Tenga en cuenta que este programa imprime las montañas en un bucle infinito para que el intérprete en línea no lo ayude; invocar en la línea de comando usando
o para probar el uso en línea
y simplemente presione el botón de ejecución varias veces seguidas e imagine que la salida se concatena.
La idea básica es que sabemos que una cadena montañosa de tamaño Q tiene Q de cada transición hacia arriba y hacia abajo.
Luego, si es válido, lo imprimimos, si no, lo sacamos de la pila para que no se desborde.
La ruta de impresión básicamente construye cada columna como Q - espacios de altura, luego el símbolo, luego suficientes espacios para golpear Q + 1 caracteres en total, y luego transponemos e imprimimos las líneas con líneas nuevas entre ellos.
fuente
C, 179
excluyendo espacios en blanco innecesarios.
Una estrategia similar a edc65.
n*2
Reviso todos los valores binarios de -bit, considerando/
= 1 y\
= 0.Formateo una sola cadena que contiene
n
saltos de línea cadan*3
carácter. Tal como está escrita, la cadena contiene 1000 caracteres, por lo que generalmente se imprime mucho espacio en blanco después de la montaña. (Esto se puede solucionar agregandos[n*n*3]=0
antes delputs
.) De todos modos, esto me permite generar toda la montaña con un soloputs
después de verificar que cumple con las reglas.Intentaré convertirlo en una función y reducirlo a un solo
for
ciclo más adelante.Salida (observe la gran cantidad de espacios en blanco a la derecha)
fuente
Haskell, 140 bytes
Después de que varios intentos no pudieron ser muy golfables, terminé con esta implementación de Haskell. ¡Estoy feliz de estar dentro de un factor de 2 de la solución APL!
Solución de golf:
Ungolfed y comentó:
El programa construye el conjunto de diagramas de montaña n -step recursivamente. Cada diagrama está representado por una lista de cadenas infinitamente largas, que representan la montaña dibujada de lado seguido de espacios que se extienden hasta el infinito. Esto garantiza que todos los diagramas tengan la misma altura, lo que facilita la recursividad. La impresora de montaña acepta un parámetro que recorta la altura a un valor finito.
Uso de la muestra:
fuente
GolfScript 103 ( demo )
El programa toma un parámetro entero que intenta representar como montañas todas las representaciones binarias de los números del 0 al 2 ^ (n-1). No representa combinaciones no válidas (por ejemplo, las que van por debajo del nivel 0).
fuente