Lát lưới 2 ^ N bằng 2 ^ N Lưới với hình tam giác hình chữ L


14

Khi học sinh lần đầu tiên được dạy về kỹ thuật chứng minh cảm ứng toán học , một ví dụ phổ biến là vấn đề ốp lưới 2 N × 2 N với các hình tam giác hình chữ L , để trống một không gian lưới được xác định trước. (N là một số nguyên không âm.)

Tôi sẽ để lại cho bạn để đi qua bằng chứng nếu bạn chưa biết điều đó. Có nhiều tài nguyên thảo luận về nó.

Nhiệm vụ của bạn ở đây là viết một chương trình lấy giá trị cho N, cũng như tọa độ của không gian lưới để trống và in một biểu diễn ASCII của lưới lát tromino kết quả.

Nhân vật Osẽ lấp đầy khoảng trống và 4 vòng quay của tromino của chúng ta sẽ trông như thế này:

|
+-

 |
-+

-+
 |

+-
|

(Vâng, nó có thể mơ hồ +đi theo đó -|cho một số sắp xếp nhất định, nhưng điều đó ổn.)

Chương trình của bạn phải hoạt động cho N = 0 (đối với lưới 1 × 1) tối đa N = 8 (đối với lưới 256 × 256). Nó sẽ được đưa ra các giá trị x và y là tọa độ cho O:

  • x là trục hoành. x = 1 là cạnh lưới bên trái, x = 2 N là cạnh lưới bên phải.
  • y là trục tung. y = 1 là cạnh lưới trên cùng, y = 2 N là cạnh lưới dưới cùng.

Cả x và y luôn nằm trong phạm vi [1, 2 N ].

Vì vậy, đối với N, x và y đã cho, chương trình của bạn phải in lưới 2 N × 2 N , được lát hoàn toàn bằng các hình tam giác hình chữ L, ngoại trừ tọa độ lưới x, y sẽ là một O.

Ví dụ

Nếu N = 0, thì x và y đều phải là 1. Đầu ra đơn giản là

O

Nếu N = 1, x = 1 và y = 2, đầu ra sẽ là

-+
O|

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

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

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

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

N = 3, x = 3, y = 6 (ví dụ: hình ảnh trên trang này ):

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

Chi tiết

  • Bạn có thể viết một hàm lấy 3 số nguyên thay vì viết toàn bộ chương trình. Nó sẽ in hoặc trả về chuỗi lưới.
  • Lấy đầu vào từ stdin, dòng lệnh, (hoặc hàm args nếu bạn viết hàm).
  • Đầu ra có thể tùy chọn chứa một dòng mới đào tạo.
  • Bạn không bắt buộc phải sử dụng phương pháp ốp lát mà bằng chứng thường gợi ý. Chỉ có vấn đề là lưới được lấp đầy bằng các hình tam giác hình chữ L bên cạnh O. (Trominoes có thể không bị cắt hoặc đi ra khỏi giới hạn lưới.)

Mã ngắn nhất tính bằng byte thắng. Tiebreaker là bài trước. ( Bộ đếm byte tiện dụng. )

Câu trả lời:


2

Haskell, 250 240 236 byte

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)]

Điều này theo giải pháp quy nạp cho vấn đề chặt chẽ. Điểm cần đánh dấu được biểu thị bằng một chuỗi các số từ 0 đến 3 cho biết góc phần tư nào giữ điểm ở mỗi mức thu phóng; điều này ban đầu được tính bằng biểu thức bắt đầu bằng z (+). Toán tử (%) kết hợp các hình ảnh cho bốn góc phần tư thành một hình ảnh duy nhất. Hình ảnh cho các góc phần tư không được đánh dấu được tạo bằng cách vẽ các góc phần tư được đánh dấu bằng dấu ở đâu đó ở giữa, được vẽ bằng dấu "+ - |" khi thích hợp để xây dựng gạch L trung tâm.

Kinh doanh hài hước: Vì lý do golf, sự thay thế

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

(mà ít nhiều tính toán chuỗi bit cho một số) rất kém hiệu quả --- nó xác định xem w / 2 ^ p có phải là số lẻ hay thậm chí bằng cách tra cứu phần tử (w / 2 ^ p) của danh sách.

Chỉnh sửa: Đã lưu 10 byte bằng cách nội tuyến tính toán bit và thay thế if / then / other bằng thao tác lập chỉ mục.

Edit2: Đã lưu thêm bốn byte bằng cách chuyển một hàm trở lại toán tử. @randomra, cuộc đua đang diễn ra!

Bản giới thiệu:

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

8

C, 399 byte

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;}

Chưa có ai tiến lên với bất cứ điều gì, vì vậy tôi sẽ đưa ra một giải pháp ít ỏi. Đánh dấu lời của tôi, đây không phải là kết thúc. Điều này sẽ nhận được ngắn hơn.

Chúng tôi xác định một hàm fcó 10 đối số, nhưng bạn chỉ cần gọi nó với f(N, X, Y). Đầu ra đi đến thiết bị xuất chuẩn.

Đây là phiên bản dễ đọc:

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;
}

Một hương vị đầu ra cho f(3, 2, 7):

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

Đây là một thuật toán đệ quy khá đơn giản để lấp đầy lưới. Tôi có thể tải lên một hình ảnh động của các thuật toán vẽ trominoes vì ​​tôi nghĩ nó khá gọn gàng. Như thường lệ, vui lòng đặt câu hỏi và hét vào mặt tôi nếu mã của tôi bị hỏng!

Hãy thử trực tuyến !


8

Python 3, 276 265 237 byte

Golf Python đầu tiên của tôi vì vậy tôi chắc chắn có rất nhiều chỗ để cải thiện.

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)))

10 byte được lưu nhờ @xnor và 6 byte nữa nhờ @ Sp3000.

Hàm trả về một chuỗi. Ví dụ sử dụng:

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

1
Lần chạy đầu tiên ấn tượng tại sân golf Python! Một số charsaves nhanh chóng. Bạn có thể cắt không gian trước if p!=i; danh sách bên trong .join()không cần []; (1-i%2)có thể được thực hiện như ~i%2; bạn có thể sử dụng giải nén lặp để viết t,l,a=[],...như *t,l,a=...; if n==0có thể được kiểm tra if n<1nkhông thể âm tính; cuối cùng "\n".joincó thể được thực hiện bằng cách in từng phần tử, vì các quy tắc chung cho phép in thay cho trả lại; if p!=icó thể if p-ibởi vì các giá trị khác không là Truthy.
xnor

@xnor Cảm ơn lời khuyên! Việc giải nén để có được một danh sách trống ẩn rất gọn gàng. Tôi sử dụng return thay vì in như flà một hàm đệ quy. Tôi thực sự phải hoàn nguyên định dạng đầu ra split()sau mỗi lần tự gọi.
Randomra

Một vài điều nữa: Dòng cuối cùng có thể được viết là A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D))), t+=[...]trên dòng cuối cùng thứ hai có thể được viết là t+=...,(thêm một tuple thay vì một danh sách) và tôi không chắc chắn nếu dòng này hoạt động nhưng A if B else Ccó thể được viết là B and A or C(cũng trên dòng thứ hai cuối cùng), nhưng chỉ khi A không bao giờ giả dối (mà tôi không nghĩ là nó?)
Sp3000

4

JavaScript (ES6) 317 414

Rất nhiều công việc để chơi golf, nhưng vẫn còn khá dài.

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,'')

Chạy đoạn mã để kiểm tra (tìm kiếm tốt hơn bằng cách sử dụng các ký tự khối Unicode - nhưng thậm chí lâu hơn một chút)


1

IDL 8.3+, 293 byte

Cái này quá dài, tôi đang cố gắng cắt nó xuống nhưng tôi vẫn chưa đến đó.

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

Đầu ra:

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 | - + | |
| + - | | - + |
+ - - + + - - +

Và, uh ... chỉ để cho vui thôi ...

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

0

Ruby Rev 1, 288

Là một lambda vô danh theo nghĩa đen. Hiển thị trong chương trình thử nghiệm (nghĩa đen là lambda ->(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))

Ruby Rev 0, 330 vô danh

Hiện tại việc chơi golf duy nhất tôi tuyên bố là loại bỏ các bình luận, các dòng mới và thụt lề không cần thiết.

Đây là thuật toán thích hợp đầu tiên của tôi được mã hóa trong Ruby và nó đã rất khó. Tôi chắc chắn có ít nhất 50 ký tự có thể bị loại bỏ, nhưng tôi đã làm đủ rồi. Có một số nỗi kinh hoàng thực sự, ví dụ như đầu vào. Điều đó có thể được sửa bởi một hàm hoặc lambda thay vì một chương trình, nhưng hàm bên trong trút ra các trominoes vẫn cần truy cập vào các biến toàn cục. Tôi sẽ phải tìm ra cú pháp cho điều đó.

Một tính năng của câu trả lời của tôi không có trong các câu hỏi khác là tôi khởi tạo một chuỗi các chuỗi có |ký tự. Điều đó có nghĩa là tôi chỉ phải vẽ +-hoặc -+, nằm cạnh nhau trên cùng một dòng.

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

Haskell, 170 byte

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

Chạy trực tuyến tại Ideone

Chạy ví dụ:

*Main> putStr(f 3 3 6)
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.