1つのライナーを生成する迷路


15

有名なC64ベーシックワンライナー

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

スラッシュとバックスラッシュの迷路を印刷します。

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

stdinの斜めの壁で作られたそのような迷路を読み、壁の文字「#」で構成される水平および垂直の壁で同じ迷路を印刷します

たとえば、小さな迷路

/\\
\\/
///

に変換する

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

     #####    

正確には、分離された各壁セグメントの長さは5文字で、隣接する壁セグメントは角を共有します。スラッシュとバックスラッシュのマトリックスで文字を右/左/上/下に移動すると、#マトリックスの垂直方向に2文字、水平方向に2文字の対角線変換に対応します。


別の出力例がおそらく役立つでしょう。そして、タイトルは「ワンライナー」であるべきだと思います。
カルバンの趣味

入力迷路は常に長方形ですか?間隔を確認できるように、より大きな例がありますか?
xnor

2
プログラミングパズルとCode Golf Stack Exchangeへようこそ!最初の大きな挑戦ですが、いくつかのことがあります:入出力はSTDIN / STDOUT以外のもの(たとえば、関数の引数と戻り値として)にできますか?行を改行以外の文字で区切ることはできますか?
ドアノブ

2
可能であれば、stdinとstdoutの使用は必須です。それ以外の場合は、「最も近い同等物」です。改行の仮定を弱める理由はありますか?
mschauer

回答:


5

Python 3、226 224バイト

私の最初のPythonゴルフは、おそらく非常に最適ではありません。後続の空白が大量に生成されますが、先行する改行はなく、先行するスペースは最大2つです。入力はコマンドラインから手で与える必要があります(誰かが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))

アイデアは、スペースの巨大な配列を初期化してrから、入力を反復処理し、#必要に応じてスペースを置き換え、最後に配列全体を印刷することです。私が使用したコツは、またはのz = '0'等価性をテストする代わりに、文字を比較することです。これにより、大量のバイトが節約されます。'/''\'


1

ジュリア、258バイト

機能的なソリューション...

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

出現順: f5 * 5ビットパターンで「/」と「\」を覆い、5 h行目以降の行を1行に 折り畳み(「隣接する壁セグメントが角を共有する」ことを思い出してください)g、列についても同じことを行います。最後にi-j,i+j、画像を回転させます。


1

JavaScript(ES6)、258

迷路をパラメーターとする関数。出力を返します。

入出力ルールのために、それが有効かどうかわからない(とにかく楽しかった)

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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.