BBC BASIC, 570 514 490 byte ASCII
Tải xuống thông dịch viên tại http://www.bbcbasic.co.uk/bbcwin/doad.html
Mã thông báo 435 byte
Chương trình đầy đủ hiển thị đầu vào từ L.bmp
trên màn hình, sau đó sửa đổi nó để tìm giải pháp.
*DISPLAY L
t=PI/8q=FNa(1)
DEFFNa(n)IFn=7END
LOCALz,j,p,i,c,s,x,y,m,u,v
F.z=0TO99u=z MOD10*100v=z DIV10*100ORIGINu,v
F.j=0TO12S.4p=0F.i=j+3TOj+9S.2c=9*COS(i*t)s=9*SIN(i*t)p=p*4-(POINT(c,s)<>0)*2-(POINT(9*c,9*s)<>0)N.
m=n:IFn=5A.(43A.p)=0p=0m=7
IF(ASCM."??O|(C",n)-64A.p)=0THEN
F.i=-1TO0GCOL0,-i*n:c=99*COS(j*t)s=99*SIN(j*t)y=402/3^m MOD3-1MOVE-c-s*y,c*y-s:x=n<3MOVEc*x-s*x,s*x+c*x:x=2778/3^m MOD3-1y=5775/3^m MOD3-1PLOT85-32*(n MOD6>3),c*x-s*y,s*x+c*y:IFi q=FNa(n+1)ORIGINu,v
N.
ENDIF
N.N.=0
Giải trình
Lưu ý rằng trong BBC cơ bản khoảng cách 1 pixel = 2 đơn vị, vì vậy lưới 50x50 pixel trở thành lưới 100x100.
Chúng tôi sử dụng hàm đệ quy để đặt 2 hình tam giác lớn, hình tam giác trung bình, hình vuông và hình bình hành vào hình dạng. Hình dạng trước đó trong danh sách được vẽ trước khi cuộc gọi đệ quy tiếp theo được thực hiện. nếu một cuộc gọi đệ quy trả về mà không tìm thấy giải pháp, hình dạng trước đó sẽ bị tràn ra màu đen và vị trí mới của hình dạng trước đó được thử.
Một khi năm hình dạng này được vẽ, đặt hai hình tam giác nhỏ chỉ là một hình thức. Tuy nhiên, cần phải vẽ một trong số chúng, để phân biệt chúng nếu chúng có chung một lợi thế. Chúng tôi chỉ tô màu một trong hai hình tam giác nhỏ. Cái còn lại có màu đen tự nhiên.
Việc đặt từng hình được thử ở các tọa độ x, y khác nhau và theo 4 góc quay khác nhau. Để kiểm tra xem có không gian trống để vẽ hình không, chúng tôi sử dụng mẫu bên dưới, với các góc 45 độ. Các phép quay được thực hiện về *
và 8 pixel được thử nghiệm nằm trong 2 hình bán nguyệt có bán kính 9 và 81 đơn vị và rơi trên các vạch phóng xạ ở bội số lẻ 22,5 độ so với trục x và y.
Đối với một tam giác lớn, tất cả 8 khoảng trắng được yêu cầu phải rõ ràng. Đối với các hình dạng khác, chỉ một số ô phải rõ ràng để áp dụng mặt nạ.
+----+---- Shape Mask HGFEDCBA Mask decimal
|\ E/|\G /
| \/F|H\/ 1,2. Large triangle 11111111 -1
|C/\ | / 3. Med triangle 00001111 15
|/ D\|/ 4. Square 00111100 60
+----* 5. Parallelogram 11101000 -24
|\ B/ 6. Small triangle 00000011 3
|A\/ 7. Parallogr reversed 00101011 43
| / Note: reversed parallelogram is checked/drawn at recursion depth n=5
|/ with a special check, but the coordinates are encoded as m=7.
Một khi nó được thiết lập rằng một hình dạng sẽ phù hợp, nó phải được vẽ. Nếu nó là một hình tam giác, nó được vẽ với hình bình hành PLOT 85
, nếu nó là hình bình hành, con số này cao hơn 32 (lưu ý rằng với PLOT
mục đích chúng ta coi hình vuông là hình bình hành đặc biệt). Trong cả hai trường hợp, 3 đỉnh liên tiếp phải được đưa ra. Đỉnh thứ hai là gốc của hình (được đánh dấu *
trong bảng trên) ngoại trừ trường hợp tam giác lớn, trong đó (trước khi quay) nó là -1,-1.
2 đỉnh còn lại có thể có tọa độ x và y -1,0 or 1
được trích từ cơ sở 3 số được mã hóa, sau đó được chia tỷ lệ 99 và xoay khi cần thiết bằng cách chuyển đổi với c
và s
.
Mã bị đánh cắp
*DISPLAY L
t=PI/8 :REM Constant 22.5 degrees.
q=FNa(1) :REM Call function, return dummy value to q
END :REM End the program gracefully if no solution. Absent in golfed version.
DEFFNa(n) :REM Recursive function to place shapes.
IFn=7END :REM If n=7 solution found, end program.
LOCALk,z,j,p,i,c,s,x,y,m,u,v :REM declare local variables for function.
k=ASCMID$("??O|(C",n)-64 :REM Bitmasks for big tri, big tri, med tri, sq, normal paralellogram, small tri.
FORz=0TO99 :REM For each point on the grid
u=z MOD10*100:v=z DIV10*100 :REM calculate its x and y coordinates relative to bottom left of screen
ORIGINu,v :REM and set the origin to this point.
FORj=0TO12STEP4 :REM For each rotation 0,90,180,270deg
p=0 :REM assume no non-black pixels found
FORi=j+3TOj+9STEP2 :REM test angles of 3,5,7,9 times 22.5 deg anticlockwise from right x axis.
c=9*COS(i*t) :REM Coords of test points at radius ll
s=9*SIN(i*t)
p*=4 :REM Leftshift any existing data in p
p-=(POINT(c,s)<>0)*2+(POINT(9*c,9*s)<>0) :REM and check pixels at radius 11 and 99.
NEXT
m=n :REM The index of the shape to plot normally corresponds with recursion depth n.
IF n=5 AND (43ANDp)=0 p=0:m=7 :REM If n=5 check if a reverse parallelogram is possible (mask 43). If so, clear p and change m to 7.
REM :REM Check p against mask k, if the shape fits then...
IF (k ANDp)=0 THEN
FOR i=-1 TO 0 :REM draw the shape in colour, and if deeper recursions prove unsuccesful, redraw it in black.
GCOL0,-i*n :REM Colour is equal to n.
c=99*COS(j*t) :REM Set parameters c and s for scaling by 99
s=99*SIN(j*t) :REM and rotation by 0,90,180 or 270 as appropriate.
x=-1 :REM For vertex 1, x=-1 always.
y=402/3^m MOD3-1 :REM Lookup y value for vertex 1.
MOVEc*x-s*y,s*x+c*y :REM Use c and s to transform the vertex and move to it.
x=n<3 :REM For vertex 2, coords are 0,0 except for large triangle where they are -1,-1
y=x :REM in BBC BASIC, TRUE=-1
MOVEc*x-s*y,s*x+c*y :REM Use c and s to transform the vertex and move to it.
x=2778/3^m MOD3-1 :REM Lookup x and y value for vertex 3.
y=5775/3^m MOD3-1 :REM PLOT85 uses last 2 points + specified point to make triangle, PLOT85+32 makes paralelogram (or square.)
PLOT85-32*(n MOD6>3),c*x-s*y,s*x+c*y :REM Use c and s to transform the vertex and draw shape.
IFi q=FNa(n+1):ORIGINu,v :REM If i=-1 recurse to next level. If it fails, reset the origin before replotting this level's shape in black.
NEXT
ENDIF
NEXT
NEXT
=0 :REM Dummy value to return from function
Đầu ra
Đây là một đoạn phim của các giải pháp được tìm thấy bởi chương trình cho các trường hợp thử nghiệm. Sử dụng 99 thay vì 100 vì lý do chơi gôn để lại một số khoảng trống nhỏ màu đen. Vì các hình dạng được vẽ lại trong các tìm kiếm, có thể mất vài giây để chạy trong một số trường hợp và khá hấp dẫn để xem.