L 형 트로 미노로 2 ^ N x 2 ^ N 그리드 타일링


14

학생들이 수학 유도증명 기술에 대해 처음 배울 때 , 일반적인 예는 하나의 미리 결정된 그리드 공간을 비워 두는 L 자형 트로 미노 로 2 N × 2 N 그리드를 타일링하는 문제입니다 . (N은 음이 아닌 정수입니다.)

증거를 아직 모르는 경우이를 증명하기 위해 귀하에게 맡기겠습니다. 그것을 논의하는 많은 자료가 있습니다.

여기서는 N 값과 그리드 공간의 좌표를 비워두고 프로그램 된 트로 미노 타일 그리드의 ASCII 표현을 인쇄하는 프로그램을 작성해야합니다.

캐릭터 O는 빈 공간을 채우고 트로 미노의 4 회전은 다음과 같습니다.

|
+-

 |
-+

-+
 |

+-
|

(예,은 모호 할 수 +있는 이동 -|특정 조치에 대한,하지만 괜찮아요.)

프로그램은 N = 0 (1 × 1 그리드의 경우)에서 N = 8 (256 × 256 그리드의 경우)까지 작동해야합니다. 다음에 대한 좌표 인 x 및 y 값이 제공됩니다 O.

  • x는 가로 축입니다. x = 1은 왼쪽 격자 가장자리이고 x = 2 N 은 오른쪽 격자 가장자리입니다.
  • y는 세로 축입니다. y = 1은 상단 그리드 가장자리이고, y = 2 N 은 하단 그리드 가장자리입니다.

x와 y는 항상 [1, 2 N ] 범위에 있습니다.

따라서 주어진 N, x 및 y의 경우, 프로그램은 x, y 그리드 좌표를 제외하고 L 자형 트로 미노로 완전히 바둑판 식으로 배열 된 2 N × 2 N 그리드를 인쇄해야합니다 O.

N = 0이면 x와 y는 모두 1이어야합니다. 출력은 단순히

O

N = 1, x = 1 및 y = 2이면 출력은

-+
O|

N = 2, x = 3, y = 2 :

+--+
||O|
|+-|
+--+

N = 2, x = 4, y = 1 :

+-|O
||+-
|+-|
+--+

N = 3, x = 3, y = 6 (예 : 이 페이지 의 이미지 ) :

+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+

세부

  • 전체 프로그램을 작성하는 대신 3 개의 정수를 사용하는 함수를 작성할 수 있습니다. 그리드 문자열을 인쇄하거나 반환해야합니다.
  • stdin, 명령 행 또는 함수를 작성할 경우 함수 인수에서 입력을 가져옵니다.
  • 출력에는 선택적으로 단일 훈련 줄 바꿈이 포함될 수 있습니다.
  • 증거가 일반적으로 제안하는 바둑판 식 배열 방법을 사용할 필요 는 없습니다 . 그리드는 O. (트로 미노는 자르거나 그리드 경계를 벗어날 수 없습니다.)

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker는 이전 게시물입니다. ( 핸디 바이트 카운터 )

답변:


2

하스켈 250 240 236 바이트

c=cycle
z o(#)(x,y)=zipWith o(1#x)(2#y)
f n x y=unlines$(z(+)(\m w->[c[0,m]!!div(w-1)(2^(n-k))|k<-[1..n]])(x,y),"O")%n
(_,x)%0=[x]
((p:o),x)%k=z(++)(\_ q->((o,x):c[(c[3-q],[" |-+| +--+ |+-|"!!(4*p+q)])])!!abs(p-q)%(k-1))=<<[(0,1),(2,3)]

이것은 문제에 대한 유도 솔루션을 밀접하게 따릅니다. 포인트 투 마크는 0에서 3까지의 숫자 시퀀스로 표시되며, 각 사분면은 각 줌 레벨에서 포인트를 유지하는 사분면을 나타냅니다. 이것은 처음에 z (+)로 시작하는 표현식으로 계산됩니다. 연산자 (%)는 4 사분면의 그림을 단일 그림으로 결합합니다. 표시되지 않은 사분면의 그림은 "+-|"표시로 그려진 중간 근처에 표시가있는 사분면을 그려 생성됩니다. 중앙 L 타일을 만들기에 적합합니다.

재미있는 사업 : 골프 때문에 하위 표현

\m w->[c[0,m]!!div(w-1)(2^(n-k))|k<-[1..n]]

(숫자에 대한 비트 시퀀스를 다소 계산합니다)는 유감스럽게 비효율적입니다 .- w / 2 ^ p가 홀수인지 또는 목록의 (w / 2 ^ p) 번째 요소를 찾아서 결정합니다.

편집 : 비트 계산을 인라인하고 if / then / else를 인덱싱 작업으로 대체하여 10 바이트를 절약했습니다.

Edit2 : 함수를 연산자로 다시 전환하여 4 바이트를 더 절약했습니다. @randomra, 경주가 시작되었습니다!

데모:

λ> putStr $ f 4 5 6
+--++--++--++--+
|+-||-+||+-||-+|
||+--+||||+--+||
+-|+-|-++-|-+|-+
+-||-+-++--+||-+
||+-O||||-+|-+||
|+-||-+|-+|||-+|
+--++--+||-++--+
+--++-|-+|-++--+
|+-|||+--+|||-+|
||+-|+-||-+|-+||
+-||+--++--+||-+
+-|+-|-++-|-+|-+
||+--+||||+--+||
|+-||-+||+-||-+|
+--++--++--++--+

8

C, 399 바이트

char*T=" |-+ | +-| ",*B;w;f(N,x,y,m,n,F,h,k,i,j){w=B?F=0,w:1<<N|1;char b[N?w*w:6];for(k=w;k--;)b[k*w-1]=10;B=!B?F=1,m=0,n=0,x--,y--,b:B;if(N>1){h=1<<N-1;i=x>--h,j=y>h;while(++k<4)if(k%2-i||k/2-j)f(N-1,!(k%2)*h,!(k/2)*h,m+k%2*(h+1),n+k/2*(h+1));f(1,h&i,h&j,m+h,n+h);h++;f(N-1,x-h*i,y-h*j,m+h*i,n+h*j);}else while(++k<4)B[w*(n+k/2)+m+k%2]=T[5*x+2*y+k];if(F)B[y*w+x]=79,B[w*w-w-1]=0,puts(N?B:"O"),B=0;}

아직 아무것도 나오지 않았으므로 빈약 한 솔루션을 제안 할 것입니다. 내 말을 표시하십시오. 이것이 끝이 아닙니다. 이것은 더 짧아 질 것이다.

f10 개의 인수를 받는 함수 를 정의 하지만로만 호출하면됩니다 f(N, X, Y). 출력은 표준 출력으로갑니다.

다음은 읽을 수있는 버전입니다.

char*T=" |-+ | +-| ",*B;
w;
f(N,x,y,m,n,F,h,k,i,j){
    w=B?F=0,w:1<<N|1;
    char b[N?w*w:6];
    for(k=w;k--;)
        b[k*w-1]=10;
    B=!B?F=1,m=0,n=0,x--,y--,b:B;
    if(N>1){
        h=1<<N-1;
        i=x>--h,j=y>h;
        while(++k<4)
            if(k%2-i||k/2-j)
                f(N-1,!(k%2)*h,!(k/2)*h,m+k%2*(h+1),n+k/2*(h+1));
        f(1,h&i,h&j,m+h,n+h);
        h++;
        f(N-1,x-h*i,y-h*j,m+h*i,n+h*j);
    }
    else
        while(++k<4)
            B[w*(n+k/2)+m+k%2]=T[5*x+2*y+k];
    if(F)B[y*w+x]=79,B[w*w-w-1]=0,puts(N?B:"O"),B=0;
}

출력 맛 f(3, 2, 7):

+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
|-+|-+||
|O|||-+|
+--++--+

그리드를 채우는 것은 매우 간단한 재귀 알고리즘입니다. 꽤 깔끔하다고 생각하기 때문에 알고리즘 그리기 트로 미노의 애니메이션을 업로드 할 수 있습니다. 평소와 같이 코드가 깨지는 경우 언제든지 질문하고 나에게 소리 지르십시오!

온라인으로 사용해보십시오 !


8

파이썬 3, 276 265 237 바이트

내 첫 파이썬 골프이므로 개선의 여지가 많이 있다고 확신합니다.

def f(n,x,y,c='O'):
 if n<1:return c
 *t,l,a='x|-+-|',2**~-n;p=(a<x)+(a<y)*2
 for i in 0,1,2,3:t+=(p-i and f(n-1,1+~i%2*~-a,1+~-a*(1-i//2),l[p+i])or f(n-1,1+~-x%a,1+~-y%a,c)).split(),
 u,v,w,z=t;return'\n'.join(map(''.join,zip(u+w,v+z)))

@xnor 덕분에 10 바이트가 절약되고 @ Sp3000 덕분에 6 바이트가 더 절약되었습니다.

이 함수는 문자열을 반환합니다. 사용법 예 :

>>>print(f(3,3,6))    
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+

1
Python golfing에서 인상적인 첫 달리기! 몇 가지 빠른 문자 저장. 당신은 전에 공간을자를 수 있습니다 if p!=i; 내부 목록 .join()은 필요하지 않습니다 []. (1-i%2)로 수행 할 수 있습니다 ~i%2; iterable unpacking을 사용하여 다음 t,l,a=[],...과 같이 쓸 수 있습니다 *t,l,a=.... 음수가 될 수 없기 때문에 if n==0확인할 수 있습니다 . 최종 규칙은 각 요소를 인쇄하여 수행 할 수 있습니다. 일반 규칙은 반환 대신 인쇄를 허용하므로; 0이 아닌 값이 Truthy이기 때문일 수 있습니다 . if n<1n"\n".joinif p!=iif p-i
xnor

@xnor 팁을 주셔서 감사합니다! 암시 적 빈 목록을 얻기위한 압축 풀기는 매우 깔끔합니다. f재귀 함수이므로 인쇄 대신 return을 사용 합니다. 실제로 split()모든 자기 호출 후에 출력 형식을 되돌려 야합니다 .
randomra

몇 가지 더 : 마지막 줄은 다음과 같이 쓸 수있다 A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D))), t+=[...]두 번째 마지막 줄에이 같이 쓸 수있다 t+=...,(대신 목록의 튜플을 추가)이 하나의 작품 만이 있는지 확실하지 않습니다 A if B else C과 같이 쓸 수있다 B and A or C(도에 두 번째 마지막 줄), 그러나 A가 결코 거짓이 아닌 경우에만 (나는 생각하지 않습니까?)
Sp3000

4

자바 스크립트 (ES6) 317 (414)

골프에 많은 일이 있지만 여전히 꽤 오래되었습니다.

T=(b,x,y)=>
  (F=(d,x,y,f,t=[],q=y<=(d>>=1)|0,
      b=d?x>d
       ?q
         ?F(d,x-d,y,0,F(d,1,1,2))
         :F(d,1,d,2,F(d,x-d,y-d))
       :F(d,1,d,1-q,F(d,1,1,q)):0,
      r=d?(x>d
         ?F(d,d,d,1-q,F(d,d,1,q))
         :q
           ?F(d,x,y,1,F(d,d,1,2))
           :F(d,d,d,2,F(d,x,y-d))
      ).map((x,i)=>x.concat(b[i])):[[]]
    )=>(r[y-1][x-1]='|+-O'[f],r.concat(t))
  )(1<<b,x,y,3).join('\n').replace(/,/g,'')

테스트하기 위해 스 니펫 실행


1

IDL 8.3+, 293 바이트

너무 길어서 잘라내려고했지만 아직 얻지 못했습니다.

function t,n,x,y
m=2^n
c=['|','+','-']
b=replicate('0',m,m)
if m eq 1 then return,b
h=m/2
g=h-1
k=[1:h]
o=x gt h
p=y gt h
q=o+2*p
if m gt 2then for i=0,1 do for j=0,1 do b[i*h:i*h+g,j*h:j*h+g]=t(n-1,i+2*j eq q?x-i*h:k[i-1],i+2*j eq q?y-j*h:k[j-1])
b[g+[1-o,1-o,o],g+[p,1-p,1-p]]=c
return,b
end

출력 :

IDL> print,t(1,1,2)
- +
0 |
IDL> print,t(2,3,2)
+ - - +
| | 0 |
| + - |
+ - - +
IDL> print,t(2,4,1)
+ - | 0
| | + -
| + - |
+ - - +
IDL> print,t(3,3,6)
+ - - + + - - +
| + - | | - + |
| | + - - + | |
+ - | - + | - +
+ - - + | | - +
| | 0 | - + | |
| + - | | - + |
+ - - + + - - +

그리고, 어 ... 그냥 재미로 ...

IDL> print,t(6,8,9)
+ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - +
| + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + |
| | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | |
+ - | + - | - + + - | - + | - + + - | + - | - + + - | - + | - + + - | + - | - + + - | - + | - + + - | + - | - + + - | - + | - +
+ - | | + - - + + - - + | | - + + - | | + - - + + - - + | | - + + - | | + - - + + - - + | | - + + - | | + - - + + - - + | | - +
| | + - | + - | | - + | - + | | | | + - | + - | | - + | - + | | | | + - | + - | | - + | - + | | | | + - | + - | | - + | - + | |
| + - | | | + - - + | | | - + | | + - | | | + - - + | | | - + | | + - | | | + - - + | | | - + | | + - | | | + - - + | | | - + |
+ - - + + - | - + | - + + - - + + - - + + - | - + | - + + - - + + - - + + - | + - | - + + - - + + - - + + - | - + | - + + - - +
+ - - + + - | 0 | | - + + - - + + - - + + - - + | | - + + - - + + - - + + - | | + - - + + - - + + - - + + - - + | | - + + - - +
| + - | | | + - - + | | | - + | | + - | | - + | - + | | | - + | | + - | | | + - | + - | | - + | | + - | | - + | - + | | | - + |
| | + - | + - | | - + | - + | | | | + - - + | | | - + | - + | | | | + - | + - | | | + - - + | | | | + - - + | | | - + | - + | |
+ - | | + - - + + - - + | | - + + - | - + | - + + - - + | | - + + - | | + - - + + - | + - | - + + - | - + | - + + - - + | | - +
+ - | + - | - + + - | - + | - + + - - + | | - + + - | - + | - + + - | + - | - + + - | | + - - + + - - + | | - + + - | - + | - +
| | + - - + | | | | + - - + | | | - + | - + | | | | + - - + | | | | + - - + | | | | + - | + - | | - + | - + | | | | + - - + | |
| + - | | - + | | + - | | - + | - + | | | - + | | + - | | - + | | + - | | - + | | + - | | | + - - + | | | - + | | + - | | - + |
+ - - + + - - + + - - + + - - + | | - + + - - + + - - + + - - + + - - + + - - + + - - + + - | - + | - + + - - + + - - + + - - +
+ - - + + - - + + - - + + - | - + | - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + | | - + + - - + + - - + + - - +
| + - | | - + | | + - | | | + - - + | | | - + | | + - | | - + | | + - | | - + | | + - | | - + | - + | | | - + | | + - | | - + |
| | + - - + | | | | + - | + - | | - + | - + | | | | + - - + | | | | + - - + | | | | + - - + | | | - + | - + | | | | + - - + | |
+ - | + - | - + + - | | + - - + + - - + | | - + + - | - + | - + + - | + - | - + + - | - + | - + + - - + | | - + + - | - + | - +
+ - | | + - - + + - | + - | - + + - | - + | - + + - - + | | - + + - | | + - - + + - - + | | - + + - | - + | - + + - - + | | - +
| | + - | + - | | | + - - + | | | | + - - + | | | - + | - + | | | | + - | + - | | - + | - + | | | | + - - + | | | - + | - + | |
| + - | | | + - | + - | | - + | | + - | | - + | - + | | | - + | | + - | | | + - - + | | | - + | | + - | | - + | - + | | | - + |
+ - - + + - | | + - - + + - - + + - - + + - - + | | - + + - - + + - - + + - | - + | - + + - - + + - - + + - - + | | - + + - - +
+ - - + + - | + - | - + + - - + + - - + + - | - + | - + + - - + + - - + + - - + | | - + + - - + + - - + + - | - + | - + + - - +
| + - | | | + - - + | | | - + | | + - | | | + - - + | | | - + | | + - | | - + | - + | | | - + | | + - | | | + - - + | | | - + |
| | + - | + - | | - + | - + | | | | + - | + - | | - + | - + | | | | + - - + | | | - + | - + | | | | + - | + - | | - + | - + | |
+ - | | + - - + + - - + | | - + + - | | + - - + + - - + | | - + + - | - + | - + + - - + | | - + + - | | + - - + + - - + | | - +
+ - | + - | - + + - | - + | - + + - | + - | - + + - | - + | - + + - - + | | - + + - | - + | - + + - | + - | - + + - | - + | - +
| | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | - + | - + | | | | + - - + | | | | + - - + | | | | + - - + | |
| + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | - + | | | - + | | + - | | - + | | + - | | - + | | + - | | - + |
+ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + | | - + + - - + + - - + + - - + + - - + + - - + + - - + + - - +
+ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - | - + | - + + - - + + - - + + - - + + - - + + - - + + - - + + - - +
| + - | | - + | | + - | | - + | | + - | | - + | | + - | | | + - - + | | | - + | | + - | | - + | | + - | | - + | | + - | | - + |
| | + - - + | | | | + - - + | | | | + - - + | | | | + - | + - | | - + | - + | | | | + - - + | | | | + - - + | | | | + - - + | |
+ - | + - | - + + - | - + | - + + - | + - | - + + - | | + - - + + - - + | | - + + - | - + | - + + - | + - | - + + - | - + | - +
+ - | | + - - + + - - + | | - + + - | | + - - + + - | + - | - + + - | - + | - + + - - + | | - + + - | | + - - + + - - + | | - +
| | + - | + - | | - + | - + | | | | + - | + - | | | + - - + | | | | + - - + | | | - + | - + | | | | + - | + - | | - + | - + | |
| + - | | | + - - + | | | - + | | + - | | | + - | + - | | - + | | + - | | - + | - + | | | - + | | + - | | | + - - + | | | - + |
+ - - + + - | + - | - + + - - + + - - + + - | | + - - + + - - + + - - + + - - + | | - + + - - + + - - + + - | - + | - + + - - +
+ - - + + - | | + - - + + - - + + - - + + - | + - | - + + - - + + - - + + - | - + | - + + - - + + - - + + - - + | | - + + - - +
| + - | | | + - | + - | | - + | | + - | | | + - - + | | | - + | | + - | | | + - - + | | | - + | | + - | | - + | - + | | | - + |
| | + - | + - | | | + - - + | | | | + - | + - | | - + | - + | | | | + - | + - | | - + | - + | | | | + - - + | | | - + | - + | |
+ - | | + - - + + - | + - | - + + - | | + - - + + - - + | | - + + - | | + - - + + - - + | | - + + - | - + | - + + - - + | | - +
+ - | + - | - + + - | | + - - + + - | + - | - + + - | - + | - + + - | + - | - + + - | - + | - + + - - + | | - + + - | - + | - +
| | + - - + | | | | + - | + - | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | - + | - + | | | | + - - + | |
| + - | | - + | | + - | | | + - | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | - + | | | - + | | + - | | - + |
+ - - + + - - + + - - + + - | | + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + | | - + + - - + + - - + + - - +
+ - - + + - - + + - - + + - | + - | - + + - - + + - - + + - - + + - - + + - - + + - - + + - | - + | - + + - - + + - - + + - - +
| + - | | - + | | + - | | | + - - + | | | - + | | + - | | - + | | + - | | - + | | + - | | | + - - + | | | - + | | + - | | - + |
| | + - - + | | | | + - | + - | | - + | - + | | | | + - - + | | | | + - - + | | | | + - | + - | | - + | - + | | | | + - - + | |
+ - | + - | - + + - | | + - - + + - - + | | - + + - | - + | - + + - | + - | - + + - | | + - - + + - - + | | - + + - | - + | - +
+ - | | + - - + + - | + - | - + + - | - + | - + + - - + | | - + + - | | + - - + + - | + - | - + + - | - + | - + + - - + | | - +
| | + - | + - | | | + - - + | | | | + - - + | | | - + | - + | | | | + - | + - | | | + - - + | | | | + - - + | | | - + | - + | |
| + - | | | + - | + - | | - + | | + - | | - + | - + | | | - + | | + - | | | + - | + - | | - + | | + - | | - + | - + | | | - + |
+ - - + + - | | + - - + + - - + + - - + + - - + | | - + + - - + + - - + + - | | + - - + + - - + + - - + + - - + | | - + + - - +
+ - - + + - | + - | - + + - - + + - - + + - | - + | - + + - - + + - - + + - | + - | - + + - - + + - - + + - | - + | - + + - - +
| + - | | | + - - + | | | - + | | + - | | | + - - + | | | - + | | + - | | | + - - + | | | - + | | + - | | | + - - + | | | - + |
| | + - | + - | | - + | - + | | | | + - | + - | | - + | - + | | | | + - | + - | | - + | - + | | | | + - | + - | | - + | - + | |
+ - | | + - - + + - - + | | - + + - | | + - - + + - - + | | - + + - | | + - - + + - - + | | - + + - | | + - - + + - - + | | - +
+ - | + - | - + + - | - + | - + + - | + - | - + + - | - + | - + + - | + - | - + + - | - + | - + + - | + - | - + + - | - + | - +
| | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | | | | + - - + | |
| + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + | | + - | | - + |
+ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - +

0

루비 레브 1, 288

익명의 람다 리터럴로. 테스트 프로그램에 표시됨 (람다 리터럴은 ->(n,a,b){...})

g=
->(n,a,b){
$x=a-1
$y=b-1
$a=Array.new(m=2**n){"|"*m}
def t(u,v,m,r,f)
(m/=2)==1?$a[v+1-r/2%2][u,2]='-+-'[r%2,2]:0
if m>1 
4.times{|i|i==r ?t(u+m/2,v+m/2,m,r,0):t(u+i%2*m,v+i/2*m,m,3-i,0)}
f>0?t(u+r%2*m,v+r/2*m,m,2*$x/m&1|$y*4/m&2,1):0
end
end
t(0,0,m,2*$x/m|$y*4/m,1) 
$a[$y][$x]='O'
$a
}

n=gets.to_i
a=gets.to_i
b=gets.to_i
puts(g.call(n,a,b))

루비 Rev 0, 330 ungolfed

현재 내가 주장하는 유일한 골프는 의견, 불필요한 줄 바꿈 및 들여 쓰기를 제거하는 것입니다.

이것은 루비로 인코딩 된 첫 번째 적절한 알고리즘이며 열심히했습니다. 제거 할 수있는 것보다 적어도 50 자 이상이라고 확신하지만 지금은 충분합니다. 예를 들어 입력과 같은 실제 공포가 있습니다. 아마도 프로그램 대신 함수 또는 람다로 t해결할 수는 있지만 트로 미노를 그리는 내부 함수 는 여전히 전역 변수에 액세스해야합니다. 그 구문을 알아 내야합니다.

다른 답변에는없는 내 대답의 특징은 |문자 로 문자열 배열을 초기화한다는 것 입니다. 즉 , 같은 줄에서 서로 옆에 있는 +-또는 만 그려야합니다 -+.

m=2**gets.to_i                                         #get n and store 2**n in m
$x=gets.to_i-1                                         #get x and y, and...
$y=gets.to_i-1                                         #convert from 1-indexed to 0-indexed
$a=Array.new(m){"|"*m}                                 #array of m strings length m, initialized with "|"

def t(u,v,m,r,f)                                       #u,v=top left of current field. r=0..3= quadrant containing O. f=flag to continue surrounding O
  m/=2
  if m==1 then $a[v+1-r/2%2][u,2] ='-+-'[r%2,2];end    #if we are at char level, insert -+ or +- (array already initialized with |'s)
  if m>1 then                                          #at higher level, 4 recursive calls to draw trominoes of next size down 
    4.times{|i| i==r ? t(u+m/2,v+m/2,m,r,0):t(u+i%2*m,v+i/2*m,m,3-i,0)}
    f>0?t(u+r%2*m,v+r/2*m,m,2*$x/m&1|$y*4/m&2,1):0     #then one more call to fill in the empty quadrant (this time f=1)
  end
end

$a[$y][$x]='O'                                         #fill in O
t(0,0,m,2*$x/m&1|$y*4/m&2,1)                           #start call. 2*x/m gives 0/1 for left/right quadrant, similarly 4*y/m gives 0/2 for top/bottom 

puts $a                                                #dump array to stdout, elements separated by newlines.

0

하스켈, 170 바이트

r=reverse
g n s x y|n<1=[s]|x>k=r<$>g n s(2^n+1-x)y|y>k=r$g n s x$2^n+1-y|0<1=zipWith(++)(h s x y++h"-"k 1)$h"|"1 k++h"+"1 1 where m=n-1;k=2^m;h=g m
f n x=unlines.g n"O"x

Ideone에서 온라인으로 실행

예제 실행 :

*Main> putStr(f 3 3 6)
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.