การเรียงตาราง 2 ^ N คูณ 2 ^ N ด้วย Trominoes รูปตัว L


14

เมื่อนักเรียนได้รับการสอนครั้งแรกเกี่ยวกับเทคนิคการพิสูจน์การอุปนัยทางคณิตศาสตร์ตัวอย่างทั่วไปคือปัญหาของการเรียงตัวกันของตาราง 2 N × 2 N ที่มีรูปตัวTrominoesรูปตัว L ทิ้งไว้หนึ่งช่องว่างที่กำหนดไว้ล่วงหน้า (N เป็นจำนวนเต็มที่ไม่ใช่ค่าลบ)

ฉันจะปล่อยให้คุณข้ามไปพิสูจน์ถ้าคุณยังไม่รู้ มีทรัพยากรมากมายที่กล่าวถึง

งานของคุณที่นี่คือการเขียนโปรแกรมที่รับค่า N รวมถึงพิกัดของพื้นที่กริดเพื่อปล่อยให้ว่างเปล่าและพิมพ์การแทนค่า ASCII ของกริด tromino ที่เป็นผลลัพธ์

ตัวละครOจะเติมเต็มพื้นที่ว่างและการหมุนของ tromino ของเราทั้ง 4 จะมีลักษณะดังนี้:

|
+-

 |
-+

-+
 |

+-
|

(ใช่มันอาจจะไม่ชัดเจนที่+จะไปกับที่-และ|สำหรับการเตรียมการบางอย่าง แต่ที่ ok.)

โปรแกรมของคุณจะต้องทำงานกับ N = 0 (สำหรับ 1 × 1 grid) อย่างน้อย N = 8 (สำหรับ 256 × 256 grid) มันจะได้รับค่า x และ y ที่เป็นพิกัดสำหรับO:

  • x คือแกนนอน x = 1 คือขอบกริดด้านซ้าย x = 2 Nคือขอบกริดด้านขวา
  • y คือแกนตั้ง y = 1 คือขอบกริดด้านบน, y = 2 Nคือขอบกริดด้านล่าง

ทั้ง x และ y อยู่ในช่วง [1, 2 N ] เสมอ

ดังนั้นสำหรับรับ N, x, y และโปรแกรมของคุณจะต้องพิมพ์ 2 N × 2 Nตารางกระเบื้องสมบูรณ์ด้วย trominoes รูปตัว L ยกเว้น x, y 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, บรรทัดคำสั่ง (หรือฟังก์ชัน args หากคุณเขียนฟังก์ชัน)
  • ผลลัพธ์อาจมีทางเลือกขึ้นบรรทัดใหม่ของการฝึกอบรมเดี่ยว
  • คุณไม่จำเป็นต้องใช้วิธีการเรียงต่อกันที่การพิสูจน์ตามปกติแนะนำ มันเป็นเรื่องสำคัญที่ตารางที่เต็มไปด้วย trominoes รูปตัว L Oนอกจาก (Trominoes อาจไม่ถูกตัดออกไปนอกขอบเขตกริด)

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นโพสต์ก่อนหน้า ( ตัวนับไบต์ที่มีประโยชน์ )

คำตอบ:


2

Haskell, 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 (+) ผู้ประกอบการ (%) รวมรูปภาพสำหรับควอดเรนท์สี่ตัวเป็นภาพเดียว รูปภาพสำหรับจตุภาคที่ไม่มีเครื่องหมายถูกสร้างขึ้นโดยการวาดจตุภาคที่มีเครื่องหมายกำกับไว้ที่ใดที่หนึ่งที่อยู่ใกล้ตรงกลางวาดด้วยเครื่องหมาย "+ - |" ตามความเหมาะสมในการสร้างแผ่นกลาง L

ธุรกิจตลก: สำหรับเหตุผลเรื่องกอล์ฟ

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

(ซึ่งมากขึ้นหรือน้อยลงคำนวณลำดับบิตสำหรับตัวเลข) นั้นไม่มีประสิทธิภาพอย่างสนุกสนาน --- มันเป็นตัวกำหนดว่า w / 2 ^ p เป็นเลขคี่หรือแม้กระทั่งโดยการค้นหาองค์ประกอบ (w / 2 ^ p) th ของรายการ

แก้ไข:บันทึก 10 ไบต์โดยการคำนวณบิตบิตและแทนที่ if / then / else ด้วยการทำดัชนี

แก้ไข 2:บันทึกอีกสี่ไบต์โดยสลับฟังก์ชั่นกลับไปเป็นโอเปอเรเตอร์ @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;}

ยังไม่มีใครออกมาข้างหน้ากับอะไรเลยดังนั้นฉันจะเสนอวิธีแก้ปัญหาให้น้อย ทำเครื่องหมายคำพูดของฉันนี่ไม่ใช่จุดจบ สิ่งนี้จะสั้นลง

เรากำหนดฟังก์ชั่นfที่ใช้เวลา 10 ข้อโต้แย้ง f(N, X, Y)แต่คุณจำเป็นต้องใช้เพียงเรียกมันว่าด้วย เอาต์พุตไปที่ stdout

นี่เป็นเวอร์ชันที่อ่านได้:

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

มันเป็นอัลกอริทึมแบบเรียกซ้ำที่ค่อนข้างง่ายเพื่อเติมกริด ฉันอาจอัปโหลดแอนิเมชั่นของอัลกอรึทึมการวาด trominoes เนื่องจากฉันคิดว่ามันค่อนข้างเรียบร้อย ตามปกติอย่าลังเลที่จะถามคำถามและตะโกนใส่ฉันถ้ารหัสของฉันแตก!

ลองออนไลน์ !


8

Python 3, 276 265 237 ไบต์

Python Golf ตัวแรกของฉันดังนั้นฉันแน่ใจว่ามีพื้นที่มากมายสำหรับการปรับปรุง

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 ไบต์ด้วย @xnor และอีก 6 ไบต์ขอบคุณ @ Sp3000

ฟังก์ชันส่งคืนสตริง ตัวอย่างการใช้งาน:

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

1
การวิ่งครั้งแรกที่น่าประทับใจที่ Python golfing! charsaves บางอย่างรวดเร็ว คุณสามารถตัดช่องว่างก่อนif p!=i; ภายในรายการ.join()ไม่จำเป็นต้อง[]; (1-i%2)สามารถทำได้เช่น~i%2; คุณสามารถใช้การเปิดอ่านซ้ำเพื่อเขียนt,l,a=[],...เป็น*t,l,a=...; if n==0สามารถตรวจสอบได้if n<1เพราะnไม่สามารถลบ; สุดท้าย"\n".joinอาจจะทำได้โดยการพิมพ์แต่ละองค์ประกอบเนื่องจากกฎทั่วไปอนุญาตให้พิมพ์แทนกลับ; if p!=iอาจเป็นif p-iเพราะค่าที่ไม่ใช่ศูนย์เป็นความจริง
xnor

@xnor ขอบคุณสำหรับเคล็ดลับ! การเปิดออกเพื่อรับรายการว่างโดยนัยนั้นเป็นระเบียบมาก ฉันใช้ return แทนการพิมพ์เพราะfเป็นฟังก์ชั่นวนซ้ำ ฉันต้องเปลี่ยนรูปแบบผลลัพธ์ด้วยsplit()หลังจากทุกการโทรด้วยตนเอง
randomra

อีกไม่กี่: บรรทัดสุดท้ายสามารถเขียนเป็น A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D))) , t+=[...]ในบรรทัดวินาทีสุดท้ายที่สามารถเขียนเป็นt+=...,(เพิ่ม tuple แทนของรายการ) และผมไม่แน่ใจว่านี้เป็นหนึ่งในผลงาน แต่A if B else Cสามารถเขียนเป็นB and A or C(ยังอยู่ใน บรรทัดที่สองสุดท้าย) แต่ถ้า A ไม่เคยเป็นเท็จ (ซึ่งฉันไม่คิดว่ามันคืออะไร)
Sp3000

4

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

เรียกใช้ตัวอย่างเพื่อทดสอบ (ดูดีขึ้นโดยใช้อักขระบล็อก Unicode - แต่ยิ่งยาวขึ้นอีกนิด)


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

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

Ruby Rev 0, 330 ungolfed

ปัจจุบันการตีกอล์ฟเพียงอย่างเดียวที่ฉันอ้างคือกำจัดความคิดเห็นบรรทัดใหม่ที่ไม่จำเป็นและการเยื้อง

นี่เป็นอัลกอริทึมที่เหมาะสมครั้งแรกของฉันที่เข้ารหัสใน Ruby และทำงานหนัก ฉันแน่ใจว่ามีอย่างน้อย 50 ตัวอักษรเกินกว่าที่จะถูกกำจัด แต่ตอนนี้ฉันทำไปพอแล้ว มีความน่ากลัวจริง ๆ เช่นอินพุต นั่นอาจจะสามารถแก้ไขได้โดยฟังก์ชั่นหรือแลมบ์ดาแทนที่จะเป็นโปรแกรม แต่ฟังก์ชั่นด้านในtที่ดึง trominoes ยังต้องการการเข้าถึงตัวแปรทั่วโลก ฉันจะต้องหาไวยากรณ์สำหรับสิ่งนั้น

คุณสมบัติของคำตอบของฉันซึ่งไม่ปรากฏในที่อื่นคือฉันเริ่มต้นอาร์เรย์ของสตริงด้วย|อักขระ นั่นหมายความว่าฉันต้องวาด+-หรือ-+ซึ่งอยู่ติดกันในบรรทัดเดียวกัน

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.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.