그리드-탱그램 해결


22

지혜 놀이는 다섯 다른 크기의 삼각형, 평행 사변형과 사각형 : 일곱 개 모양으로 만든 해부 퍼즐입니다. 모양이 주어지면 목표는 모든 조각을 사용하고 겹치지 않고 모양을 다시 만드는 것입니다. 이 조각들을 평면에 배열하는 방법은 분명히 무한히 많습니다. 흥미로운 부분 집합은

그리드 탄 그램

"표준"Tangram 정사각형을 더 큰 정사각형으로 그릴 수 있습니다. 더 큰 정사각형은 격자 로 16 개의 더 작은 정사각형으로 세분됩니다 . 그리드 탄 그램은 탄 그램 조각으로 구성된 모양이므로 조각의 모든 정점이 그리드 점에 있습니다.

이것들은 우리 가이 도전에서 고려하고 싶은 Tangram 퍼즐의 종류입니다. 왜냐하면 그들은 일반적인 퍼즐보다 다루기가 더 쉽기 때문입니다.

참고로 중국의 수학자 Chuan-Chin Hsiung과 Fu Traing Wang은 1942 년에 볼록한 탱그램이 13 개라는 것을 증명했습니다. 그들은 먼저 문제를 그리드 탄 그램으로 줄일 수 있음을 보여준 다음, 조합적이고 기하학적 인 주장을 사용했습니다. 이들은 모두 그 13입니다 :

도전

해결할 수있는 그리드 탄 그램이 주어지면 그리드 탄 그램의 해부를 7 개의 탄 그램 조각으로 출력합니다.

IO

탠 그램은 흑백 이미지 (모양은 검은 색, 배경은 흰색)로 제공되며 양면 배수는 50px입니다. 격자의 너비는 정확히 50px입니다. 격자 선은 이미지의 측면과 평행합니다.

편집 : PNG, TIFF, PBM 등과 같은 편리한 래스터 이미지 형식으로 이미지를 입력으로 받아 출력으로 반환 할 수 있지만 이진 2 차원 배열 또는 문자열 또는 행렬로 표현할 수 있습니다.

출력물의 크기는 다시 같아야하고 다시 같은 모양이어야하지만 각 조각마다 다른 색이 사용되거나 모든 조각을 분리하는 흰색 선이 있습니다. 직사각형이 아닌 사각형을 뒤집을 수 있다는 점은 주목할 가치가 있습니다.

조각의 경계에있는 픽셀은 모양에있는 픽셀과 정확하게 일치 할 필요는 없습니다. 또한 앨리어싱 효과 나 다른 퍼지가있는 경우에도 여전히 괜찮습니다.

입력 및 출력 예 :

예 :

가능한 해결책:


이 문제에서 이미지 처리는 전적으로 불필요한 장애물입니다. 입력을 작은 이진 배열로 지정하면 훨씬 더 매력적입니다.
Sparr

1
내가 말했듯이, 그것은 샌드 박스에있을 때 논의되었습니다. 그러나 작업 자체가 훨씬 더 어려워 많은 바이트를 추가하는 것은 의심됩니다.
flawr

3
나는 입력과 출력을 그대로 유지하도록 권유 한 사람들 중 한 명이며, 이것이 내 의견으로는 Tangram 과제를 제시하는 가장 자연스럽고 적합한 방법이기 때문에 권장 사항을 제시했습니다. 모든 형식의 입력 / 출력에는 많은 바이트가 필요하므로 여기서는 실제로 문제가되지 않습니다.
El'endia Starman

1
나는 Elendia에 동의합니다. 그래픽 I / O의 유일한 문제점은 그래픽 기능이없는 언어를 제한 할 수 있다는 것입니다. 그러나 PBM과 PGM은 ASCII 형식에 너무 가깝기 때문에 사람들이 그러한 형식을 알고 있다면 실제 문제는 없습니다. en.wikipedia.org/wiki/Netpbm_format
Level River St

1
@LevelRiverSt 좋은 지적입니다. 이러한 형식을 사용하거나 심지어 0과 1의 2D 배열 / 문자열을 사용하는 것이 완전히 가능하다고 생각합니다.
flawr

답변:


31

BBC BASIC은 570 (514) 490 ASCII 바이트

http://www.bbcbasic.co.uk/bbcwin/download.html 에서 통역사 다운로드

435 바이트 토큰 화

전체 프로그램 L.bmp은 화면에 입력을 표시 한 다음 수정하여 솔루션을 찾습니다.

*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

설명

BBC 기본적으로 1 픽셀 = 2 단위의 거리이므로 50x50 픽셀 그리드는 100x100 그리드가됩니다.

재귀 함수를 사용하여 2 개의 큰 삼각형, 중간 삼각형, 정사각형 및 평행 사변형을 모양에 배치합니다. 다음 재귀 호출이 이루어지기 전에 목록의 이전 모양이 그려집니다. 솔루션을 찾지 않고 재귀 호출이 반환되면 이전 모양이 검은 색으로 그려지고 이전 모양의 새 위치가 시도됩니다.

이 다섯 가지 도형이 그려지면 두 개의 작은 삼각형을 배치하는 것은 단지 형식적인 것입니다. 공통된 우위를 공유하는 경우이를 구별하기 위해 그 중 하나를 그릴 필요가 있습니다. 우리는 두 개의 작은 삼각형 중 하나만 채색합니다. 다른 하나는 자연스러운 검은 색입니다.

각 모양의 배치는 다른 x, y 좌표 및 4 개의 다른 회전에서 시도됩니다. 도형을 그릴 여유 공간이 있는지 테스트하기 위해 45도 각도로 아래 템플릿을 사용합니다. 회전은 *테스트 된 8 개의 픽셀이 반경 9와 81 단위의 2 개의 반원에 있으며 x와 y 축에 22.5 도의 홀수 배수로 방사선에 떨어집니다.

큰 삼각형의 경우 8 개의 공백이 모두 없어야합니다. 다른 모양의 경우 일부 셀만 비워야 마스크가 적용됩니다.

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

모양이 적합하다는 것이 확인되면 그려야합니다. 삼각형 PLOT 85인 경우으로 표시되고 평행 사변형 인 경우 숫자가 32보다 높습니다 ( PLOT목적으로 정사각형을 특수 평행 사변형으로 간주 함). 두 경우 모두 3 개의 연속 정점이 주어져야합니다. 제 정점 (마크 모양의 원점 *(종래 회전)이있는 큰 삼각형의 경우를 제외하고, 상기 테이블에) -1,-1.다른 두 버텍스 x 및 y 좌표 수 -1,0 or 1베이스 (3)로부터 추출 부호화 된 번호는, 다음 (99)에 의해 스케일링과 함께 변환에 의해 필요에 따라 회전 c하고 s.

Ungolfed 코드

  *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

산출

테스트 사례를 위해 프로그램에서 찾은 솔루션의 몽타주입니다. 골프를 위해 100 대신 99를 사용하면 약간의 검은 간격이 남습니다. 검색하는 동안 도형이 다시 그려 지므로 경우에 따라 실행하는 데 몇 초가 걸릴 수 있으며보기에는 매우 매력적입니다.

여기에 이미지 설명을 입력하십시오


4
와, 감동합니다. 이제 그 비디오가 실제로 작동하는 모습을보고 싶습니다! =)
flawr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.