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 #.


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.


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.


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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.