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.