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를 사용하면 약간의 검은 간격이 남습니다. 검색하는 동안 도형이 다시 그려 지므로 경우에 따라 실행하는 데 몇 초가 걸릴 수 있으며보기에는 매우 매력적입니다.