Giải quyết lưới-Tangram


22

Các Tangram là một câu đố bóc tách làm từ bảy hình dạng: Năm tam giác kích cỡ khác nhau, một hình bình hành và một hình vuông. Cho một hình dạng, mục tiêu là tạo lại hình dạng bằng cách sử dụng tất cả các mảnh và không chồng chéo. Rõ ràng có vô số cách để sắp xếp bộ mảnh này trong mặt phẳng. Một tập hợp con thú vị là

Lưới Tangrams

Chúng ta có thể vẽ hình vuông Tangram "tiêu chuẩn" thành một hình vuông lớn hơn được chia nhỏ bởi một lưới thành 16 hình vuông nhỏ hơn. Lưới tangram chỉ là hình dạng được tạo thành từ các mảnh tangram, sao cho tất cả các đỉnh của các mảnh nằm trên các điểm lưới.

Đây là những loại câu đố Tangram mà chúng tôi muốn xem xét trong thử thách này, vì chúng có thể dễ xử lý hơn những câu đố tổng quát hơn.

Một ghi chú bên lề: Các nhà toán học Trung Quốc Chuan-Chin Hlahoma và Fu Traing Wang đã chứng minh vào năm 1942 rằng chỉ có 13 tangram lồi. Đầu tiên họ chỉ ra rằng vấn đề có thể được giảm xuống thành các tangram lưới, và sau đó sử dụng một số đối số kết hợp và hình học. Đây là tất cả trong số 13:

Thử thách

Cho một tangram lưới có thể giải được, xuất ra một sự phân tách của tangram lưới thành bảy mảnh tangram.

Tôi

Một tangram được đưa ra dưới dạng hình ảnh đen trắng (hình dạng màu đen, nền màu trắng), với bội số của cả hai bên là 50px. Lưới có chiều rộng chính xác là 50px. Các đường lưới song song với các cạnh của hình ảnh.

EDIT: Hình ảnh có thể được chấp nhận làm đầu vào và được trả về làm đầu ra ở bất kỳ định dạng hình ảnh raster thuận tiện nào như PNG, TIFF, PBM, v.v.

Đầu ra một lần nữa nên có cùng kích thước và lại có cùng hình dạng, nhưng với mỗi phần có một màu khác nhau, hoặc xen kẽ với các đường trắng phân cách tất cả các phần. Điều đáng chú ý là tứ giác không phải hình chữ nhật có thể được lật.

Các pixel trên đường viền của các mảnh không chính xác phải khớp với pixel trên hình, ngoài ra nếu có các hiệu ứng răng cưa hoặc fuzz khác thì điều này vẫn ổn.

Ví dụ đầu vào và đầu ra:

Ví dụ:

Phương pháp khả thi:


xử lý hình ảnh là một trở ngại hoàn toàn không cần thiết trong thử thách này. Tôi sẽ thấy nó hấp dẫn hơn nhiều nếu bạn chỉ định đầu vào là một mảng nhị phân nhỏ.
Sparr

1
Như tôi đã nói, điều đó đã được thảo luận khi nó ở trong hộp cát. Nhưng tôi nghi ngờ rằng nó có thêm rất nhiều byte, vì bản thân nhiệm vụ khó khăn hơn rất nhiều.
flawr

3
Tôi là một trong những người khuyến nghị rằng đầu vào và đầu ra là như vậy, và tôi đã đưa ra khuyến nghị đó bởi vì theo tôi, đây là cách tự nhiên và phù hợp nhất để đưa ra một thách thức Tangram. Bất kỳ hình thức đầu vào / đầu ra nào cũng sẽ có số lượng byte đáng kể, vì vậy tôi không nghĩ đó thực sự là một vấn đề ở đây.
El'endia Starman

1
Tôi đồng ý với Elendia. Vấn đề duy nhất với I / O đồ họa là nó có thể giới hạn các ngôn ngữ không có phương tiện đồ họa. Điều đó nói rằng, PBM và PGM rất gần với nghệ thuật ASCII nên không có vấn đề thực sự, NẾU đó là trường hợp mà mọi người nhận thức được các định dạng như vậy. vi.wikipedia.org/wiki/Netpbm_format
Cấp sông St

1
@LevelRiverSt Đó là một điểm tốt, tôi nghĩ rằng nó sẽ hoàn toàn có thể sử dụng được các định dạng đó hoặc thậm chí ví dụ như một mảng 2d / chuỗi các số 0 và các số không.
flawr

Câu trả lời:


31

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.bmptrê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 PLOTmụ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 cs.

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.

nhập mô tả hình ảnh ở đây


4
Ồ, tôi rất ấn tượng. Bây giờ tôi rất muốn xem một video về nó trong hành động! =)
flawr
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.