迷宫产生一个内胆


15

著名的C64基本型内胆

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

打印斜杠和反斜杠的迷宫。

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

从stdin读取由对角线墙组成的迷宫,并打印出水平垂直的迷宫,其中水平垂直墙由墙字符“#”组成

例如小迷宫

/\\
\\/
///

转换为

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

     #####    

确切地说,每个隔离的墙段的长度为五个字符,相邻的墙段共享一个角。在斜杠和反斜杠的矩阵中向右/左/上/下移动一个字符,对应于#矩阵中垂直两个字符和水平两个字符的对角线平移。


另一个输出示例可能会有用。我希望标题应该是“一个班轮”。
加尔文的爱好

输入迷宫将始终是矩形吗?您可以举一个更大的例子,以便我们看到间距吗?
xnor

2
欢迎使用编程难题和代码高尔夫球堆栈交换!首要的挑战是,但有几件事:输入/输出可以不是STDIN / STDOUT之外的其他东西(例如作为函数参数和返回值)吗?可以使用换行符以外的字符来分隔行吗?
门把手

2
如果可能,必须使用stdin和stdout,否则使用“最接近的等效项”。是否有理由削弱换行假设?
mschauer 2015年

Answers:


5

Python 3中,226个 224字节

我的第一个Python高尔夫,所以可能不是很理想。它产生大量的尾随空白,但是没有前面的换行符,并且最多两个前面的空格。输入需要从命令行手动给出(也许有人知道用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

按出现的顺序: f用5 * 5位模式覆盖'/'和'\',h将每五行 及以下的行折叠为单行(回想一下“相邻的墙段共享一个角”),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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.