Laberinto que genera un revestimiento

15

El famoso C64 basic one liner

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

imprime un laberinto de barras y barras invertidas.

\\/\\\//\/\////\\/\/
\/\///\\///////\//\/
/\\\//\//\////\\//\\
\////\//\//\/\\\\\\/
/\/\\///\\\\/\\\\/\\
\/\//\\\\\\//\/\////
/\//\\///\/\///\////
\/\\\//\\/\\\//\\/\/
//////\\/\\/\/\/\///
\\/\/\\////\/\/\\/\/

Lea en dicho laberinto hecho de paredes diagonales de stdin e imprima el mismo laberinto con paredes horizontales y verticales que consisten en el carácter de pared "#"

Por ejemplo el pequeño laberinto

/\\
\\/
///

se traduce en

     #####
     #   #
     # # # #
     # # # #
 ##### # # #
       #   #
   #########

     #####    

Para ser precisos, cada segmento de muro aislado tiene la longitud de cinco caracteres, los segmentos de muro adyacentes comparten una esquina. Mover un carácter hacia la derecha / izquierda / arriba / abajo en la matriz de barras y barras invertidas corresponde a una traducción diagonal de 2 caracteres en vertical y 2 caracteres en dirección horizontal en la matriz #.

mschauer
fuente
Otro ejemplo de salida probablemente sería útil. Y espero que el título sea "one liner".
Aficiones de Calvin
¿El laberinto de entrada siempre será un rectángulo? ¿Podría dar un ejemplo más amplio para que podamos ver el espacio?
xnor
2
¡Bienvenido a Programming Puzzles & Code Golf Stack Exchange! Gran primer desafío, pero algunas cosas: ¿puede la entrada / salida ser algo diferente de STDIN / STDOUT (por ejemplo, como argumento de función y valor de retorno)? ¿Se pueden separar las líneas a través de un carácter distinto de las nuevas líneas?
Pomo de la puerta
2
Usar stdin y stdout es obligatorio si es posible, de lo contrario, "el equivalente más cercano". ¿Hay razones para debilitar el supuesto de nueva línea?
mschauer

Respuestas:

5

Python 3, 226 224 bytes

Mi primer golf de Python, probablemente muy subóptimo. Produce una gran cantidad de espacios en blanco al final, pero no hay líneas nuevas anteriores, y como máximo dos espacios anteriores. La entrada debe darse a mano desde la línea de comandos (tal vez alguien conozca una forma más corta de obtener entradas multilínea en Python ...).

e,z,s=enumerate,'0',list(iter(input,""))
p=''.join(s)*5
r=[len(p)*[' ']for _ in p]
for y,l in e(s):
 for x,c in e(l):
  for i in range(-2,3):r[2*(x+y+(s>[z]))+i*(c>z)][2*(x+len(s)-y)+i*(c<z)]='#'
for l in r:print(''.join(l))

La idea es inicializar una gran variedad de espacios r, luego iterar a través de la entrada y reemplazar los espacios #según sea necesario, y finalmente imprimir toda la matriz. Un truco que utilicé es comparar caracteres en z = '0'lugar de probar la igualdad con '/'o '\', lo que ahorra un montón de bytes.

Zgarb
fuente
1

Julia, 258 bytes

Una solución funcional ...

A=split(readall(STDIN))
q(i,j)=fld(i-1,j)
n,^ =A[].(3),q
f(i,j)=try A[1+i^5][1+j^5]<'0'?(i+j)%5==1:(i-j)%5==0catch 0end
h(i,j)=f(i+i^4,j)|f(i+(i-1)^4,j)
g(i,j)=h(i,j+j^4)|h(i,j+(j-1)^4)
for i=1:6length(A),j=-n-5:2n;print(" #"[1+g(i-j,i+j)],j==2n?"\n":"")end

En orden de aparición: fcubre '/' y '\' por sus patrones de 5 * 5 bits, hpliega cada quinta línea y la siguiente en una sola línea (recuerde que "los segmentos de pared adyacentes comparten una esquina") y ghace lo mismo para las columnas. Finalmente, i-j,i+jgira la imagen.

mschauer
fuente
1

JavaScript (ES6), 258

Una función con el laberinto como parámetro, que devuelve la salida.

No estoy seguro si es válido, debido a las reglas de entrada / salida (fue divertido de todos modos)

f=m=>([...m].map(c=>{if(c<' ')x=sx-=2,y=sy+=2;else for(x+=2,y+=2,d=c>'0',i=y-3*d,j=x-3*!d,c=5;c--;)o[i+=d][j+=!d]='#';},w=m.search`
`,h=m.match(/\n/g).length,sy=y=0,sx=x=h*2,o=Array(z=(w+h+1)*2).fill(' ').map(x=>Array(z).fill(x))),o.map(r=>r.join``).join`
`)

// LESS GOLFED

U=m=>(
  w=m.search`\n`,
  h=m.match(/\n/g).length,
  o=Array(z=(w+h+1)*2).fill(' ').map(x=>Array(z).fill(x)),
  sy=y=0,
  sx=x=h*2,
  [...m].forEach(c=>{
    if(c<' ')x=sx-=2,y=sy+=2
    else for(x+=2,y+=2,d=c>'0',i=y-3*d,j=x-3*!d,c=5;c--;)o[i+=d][j+=!d]='#';
  }),
  o.map(r=>r.join``).join`\n`  
)

// TEST
out=x=>O.innerHTML+=x+'\n'

test=`\\\\/\\\\\\//\\/\\////\\\\/\\/
\\/\\///\\\\///////\\//\\/
/\\\\\\//\\//\\////\\\\//\\\\
\\////\\//\\//\\/\\\\\\\\\\\\/
/\\/\\\\///\\\\\\\\/\\\\\\\\/\\\\
\\/\\//\\\\\\\\\\\\//\\/\\////
/\\//\\\\///\\/\\///\\////
\\/\\\\\\//\\\\/\\\\\\//\\\\/\\/
//////\\\\/\\\\/\\/\\/\\///
\\\\/\\/\\\\////\\/\\/\\\\/\\/`
out(test),out(f(test))
<pre id=O></pre>

edc65
fuente