Labyrinthe générant un liner

15

Le célèbre chausson de base C64

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

imprime un labyrinthe de barres obliques et de barres obliques inverses.

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

Lire dans un tel labyrinthe fait de murs diagonaux de stdin et imprimer le même labyrinthe avec des murs horizontaux et verticaux constitués du caractère de mur "#"

Par exemple le petit labyrinthe

/\\
\\/
///

Se traduit par

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

     #####    

Pour être précis, chaque segment de mur isolé a la longueur de cinq caractères, les segments de mur adjacents partagent un coin. Déplacer un caractère vers la droite / gauche / haut / bas dans la matrice des barres obliques et des barres obliques inverses correspond à une translation diagonale de 2 caractères en vertical et de 2 caractères en direction horizontale dans la matrice #.

mschauer
la source
Un autre exemple de sortie serait probablement utile. Et je m'attends à ce que le titre soit "one liner".
Calvin's Hobbies
Le labyrinthe d'entrée sera-t-il toujours un rectangle? Pourriez-vous avoir un exemple plus grand afin que nous puissions voir l'espacement?
xnor
2
Bienvenue dans la programmation des puzzles et du code Golf Stack Exchange! Grand premier défi, mais quelques choses: l'entrée / sortie peut-elle être autre chose que STDIN / STDOUT (ex. Comme argument de fonction et valeur de retour)? Les lignes peuvent-elles être séparées via un caractère autre que les retours à la ligne?
Poignée de porte
2
L'utilisation de stdin et stdout est obligatoire si possible, sinon "l'équivalent le plus proche". Y a-t-il des raisons d'affaiblir l'hypothèse de nouvelle ligne?
mschauer

Réponses:

5

Python 3, 226 224 octets

Mon premier golf Python, donc probablement très sous-optimal. Il produit beaucoup d'espaces de fin, mais il n'y a pas de retour à la ligne précédent et au plus deux espaces précédents. L'entrée doit être donnée à la main à partir de la ligne de commande (peut-être que quelqu'un connaît un moyen plus court d'obtenir une entrée multiligne 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))

L'idée est d'initialiser un énorme tableau d'espaces r, puis de parcourir l'entré et de remplacer les espaces par #si nécessaire, et enfin d'imprimer tout le tableau. Une astuce que j'ai utilisée consiste à comparer les caractères à z = '0'au lieu de tester l'égalité à '/'ou '\', ce qui économise un tas d'octets.

Zgarb
la source
1

Julia, 258 octets

Une solution fonctionnelle ...

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

Dans l'ordre d'apparition: fcouvre '/' et '\' par leurs motifs 5 * 5 bits, se hplie tous les cinq et la ligne suivante en une seule ligne (rappelez-vous que "les segments de mur adjacents partagent un coin") et gfait de même pour les colonnes. Enfin, i-j,i+jfait pivoter l'image.

mschauer
la source
1

JavaScript (ES6), 258

Une fonction avec le labyrinthe comme paramètre, renvoyant la sortie.

Je ne sais pas si c'est valide, en raison des règles d'entrée / sortie (c'était amusant de toute façon)

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
la source