Labirinto gerando um forro

15

O famoso forro básico básico C64

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

imprime um labirinto de barras e barras invertidas.

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

Leia nesse labirinto feito de paredes diagonais de stdin e imprima o mesmo labirinto com paredes horizontais e verticais que consistem no caractere "#" da parede

Por exemplo, o pequeno labirinto

/\\
\\/
///

traduz para

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

     #####    

Para ser mais preciso, cada segmento de parede isolado tem o comprimento de cinco caracteres, segmentos de parede adjacentes compartilham um canto. Mover um caractere para a direita / esquerda / cima / baixo na matriz de barras e barras invertidas corresponde a uma tradução diagonal de 2 caracteres na vertical e 2 caracteres na direção horizontal na matriz #.

mschauer
fonte
Outro exemplo de saída provavelmente seria útil. E eu espero que o título seja "one liner".
Hobbies de Calvin
O labirinto de entrada sempre será um retângulo? Você poderia dar um exemplo maior para que possamos ver o espaçamento?
xnor
2
Bem-vindo à Programação de quebra-cabeças e troca de pilha de código de golfe! Grande primeiro desafio, mas algumas coisas: a entrada / saída pode ser algo diferente de STDIN / STDOUT (por exemplo, como argumento de função e valor de retorno)? As linhas podem ser separadas por um caractere diferente de novas linhas?
Maçaneta
2
Usar stdin e stdout é obrigatório, se possível, caso contrário "o equivalente mais próximo". Existem razões para enfraquecer a suposição de nova linha?
mschauer

Respostas:

5

Python 3, 226 224 bytes

Meu primeiro golfe em Python, provavelmente muito abaixo do ideal. Ele produz um monte de espaços em branco à direita, mas não há novas linhas anteriores e, no máximo, dois espaços anteriores. A entrada precisa ser fornecida manualmente a partir da linha de comando (talvez alguém conheça uma maneira mais curta de obter entrada multilinha no 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))

A idéia é inicializar uma enorme variedade de espaços r, percorrer a entrada e substituir os espaços por #conforme necessário e, finalmente, imprimir a matriz inteira. Um truque que usei é comparar caracteres em z = '0'vez de testar a igualdade para '/'ou '\', o que economiza um monte de bytes.

Zgarb
fonte
1

Julia, 258 bytes

Uma solução 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

Em ordem de aparência: fcobre '/' e '\' pelos seus padrões de 5 * 5 bits, hdobra a cada quinto e linha seguinte em uma única linha (lembre-se "segmentos de parede adjacentes compartilham um canto") e gfaz o mesmo para as colunas. Por fim, i-j,i+jgira a imagem.

mschauer
fonte
1

JavaScript (ES6), 258

Uma função com o labirinto como parâmetro, retornando a saída.

Não tenho certeza se é válido, devido às regras de entrada / saída (foi divertido de qualquer maneira)

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
fonte