Labirinto che genera una fodera


15

La famosa fodera C64 basic one

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

stampa un labirinto di barre e barre rovesciate.

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

Leggi in un tale labirinto fatto di pareti diagonali da stdin e stampa lo stesso labirinto con pareti orizzontali e verticali costituite dal carattere di muro "#"

Ad esempio il piccolo labirinto

/\\
\\/
///

si traduce in

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

     #####    

Per essere precisi, ogni segmento di muro isolato ha la lunghezza di cinque caratteri, i segmenti di muro adiacenti condividono un angolo. Spostare un carattere a destra / sinistra / in alto / in basso nella matrice di barre e barre inverse corrisponde a una traduzione diagonale di 2 caratteri in verticale e 2 caratteri in direzione orizzontale nella matrice #.


Un altro esempio di output sarebbe probabilmente utile. E mi aspetto che il titolo dovrebbe essere "una fodera".
Calvin's Hobbies,

Il labirinto di input sarà sempre un rettangolo? Potresti avere un esempio più ampio in modo che possiamo vedere la spaziatura?
xnor

2
Benvenuti in Puzzle di programmazione e scambio di codici Stack di golf! Grande prima sfida, ma alcune cose: input / output può essere qualcosa di diverso da STDIN / STDOUT (es. Come argomento di funzione e valore di ritorno)? Le linee possono essere separate da un carattere diverso da newline?
Maniglia della porta

2
L'uso di stdin e stdout è obbligatorio, se possibile, altrimenti "l'equivalente più vicino". Ci sono ragioni per indebolire l'ipotesi newline?
mschauer,

Risposte:


5

Python 3, 226 224 byte

Il mio primo golf Python, quindi molto probabilmente non ottimale. Produce un sacco di spazi vuoti finali, ma non ci sono nuove righe precedenti e al massimo due spazi precedenti. L'input deve essere dato manualmente dalla riga di comando (forse qualcuno conosce un modo più breve per ottenere input multilinea in 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))

L'idea è di inizializzare una vasta gamma di spazi r, quindi iterare attraverso l'input e sostituire gli spazi con# le necessità e infine stampare l'intera matrice. Un trucco che ho usato è di confrontare i caratteri z = '0'invece di testare l'uguaglianza con '/'o '\', il che consente di risparmiare un sacco di byte.


1

Julia, 258 byte

Una soluzione funzionale ...

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

In ordine di apparizione: fcopre '/' e '\' con i loro schemi a 5 * 5 bit, hpiega ogni quinto e linea successiva in un'unica linea (ricorda "i segmenti di muro adiacenti condividono un angolo") e gfa lo stesso per le colonne. Infine, i-j,i+jruota l'immagine.


1

JavaScript (ES6), 258

Una funzione con il labirinto come parametro, che restituisce l'output.

Non sono sicuro se è valido, a causa delle regole di input / output (è stato comunque divertente)

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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.