하나의 라이너를 생성하는 미로


15

유명한 C64 베이직 원 라이너

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

슬래시와 백 슬래시의 미로를 인쇄합니다.

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

stdin에서 대각선 벽으로 만들어진 미로를 읽고 벽 문자 "#"로 구성된 수평수직 벽으로 동일한 미로를 인쇄하십시오.

예를 들어 작은 미로

/\\
\\/
///

로 번역

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

     #####    

정확하게 말하면, 각 분리 된 벽 세그먼트의 길이는 5 자이며 인접한 벽 세그먼트는 모서리를 공유합니다. 슬래시 및 백 슬래시 행렬에서 문자를 오른쪽 / 왼쪽 / 위로 / 아래로 이동하면 #-행렬에서 세로로 2 자, 가로로 2 자씩 대각선으로 변환됩니다.


다른 출력 예제가 유용 할 것입니다. 그리고 나는 제목이 "하나의 라이너"여야한다고 생각합니다.
Calvin 's Hobbies

입력 미로는 항상 직사각형입니까? 간격을 볼 수 있도록 더 큰 예를 들어 주시겠습니까?
xnor

2
프로그래밍 퍼즐 및 코드 골프 스택 교환에 오신 것을 환영합니다! 큰 첫 번째 도전이지만 몇 가지 사항 : 입력 / 출력이 STDIN / STDOUT 이외의 것이 될 수 있습니까 (예 : 함수 인수 및 반환 값)? 줄 바꿈 이외의 문자를 통해 줄을 분리 할 수 ​​있습니까?
Doorknob

2
가능한 경우 stdin 및 stdout을 사용해야합니다. 그렇지 않으면 "가장 가까운 것"입니다. 줄 바꿈 가정을 약화시킬 이유가 있습니까?
mschauer

답변:


5

파이썬 3, 226224 바이트

내 첫 파이썬 골프, 아마도 매우 차선책 일 것입니다. 그것은 후행 공백을 많이 생성하지만 선행 줄 바꿈이 없으며 최대 두 개의 선행 공백이 없습니다. 입력은 명령 줄에서 직접 제공해야합니다 (파이썬에서 여러 줄 입력을 얻는 더 짧은 방법을 알고있을 수도 있습니다 ...).

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번째 및 이후 행을 한 줄로 접습니다 ( "인접한 벽 세그먼트는 모서리를 공유 함"을 기억함) g. 마지막으로 i-j,i+j그림을 회전시킵니다.


1

자바 스크립트 (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.