주어진 정점 구성 타일링


11

직무

작업은 정점 구성이 주어지면 다각형을 타일링하는 것입니다.

채점

귀하의 점수는 제출 한 "복잡성 수준"과 같습니다. 복잡성 수준은 누적되므로 # 3에 도달하려면 # 1 및 # 2도 지원해야합니다.

동일한 복잡성 수준에서의 제출은 바이트 수로 구분됩니다. 가장 낮은 승리.

입력

입력은 꼭짓점 그림을 나타내는 꼭짓점 구성을 포함하는 문자열입니다. 즉, 점으로 구분 된 정수 목록으로, 각 정수 (n)는 공통 정점으로 연결된 규칙적인 n-gon을 나타냅니다.

다음 꼭짓점 구성이 지원되어야합니다.

  • 3.3.3.3.3.3
  • 3.3.3.3.6
  • 3.3.3.4.4 (순서가 정점 그림에 반영되므로 아래 내용이 다릅니다)
  • 3.3.4.3.4
  • 3.12.12
  • 3.4.6.4
  • 3.6.3.6
  • 4.4.4.4
  • 4.6.12
  • 4.8.8
  • 6.6.6

출력-복잡성 수준 # 1 : 정점 그림

이 복잡성 수준에서 출력은 주어진 입력에 해당하는 꼭짓점 그림을 보여주는 이미지입니다.

입력 F에는 전체 타일이 아닌 정점 도형이 출력되어야 함을 나타 내기 위해 가 앞에 붙습니다 .

예를 F3.6.3.6들어이 꼭지점 그림을 제공합니다.

정점 수

출력-복잡성 수준 # 2 : 바둑판 식 배열

이 복잡성 수준에서 출력은 주어진 입력에 해당하는 정점 도형을 사용하여 균일 한 타일링 을 보여주는 이미지 입니다.

예를 3.6.3.6들어이 타일링은 다음과 같습니다.

3.6.3.6 바둑판 식 배열

색상이나 형식에 대한 제한은 없습니다 (허점 제거).

출력-복잡성 수준 # 3 : 이중 타일링

이 복잡성 수준에서 '이중 타일링'은 각 타일링에서 형성 될 수 있습니다. 이것은 각 다각형의 중심에서 각 경계 다각형의 중심까지 선을 그려서 달성됩니다.

이중 타일링은 입력 앞에 a를 붙여서 지정합니다 V.

예를 V3.6.3.6들어이 이중 타일링 (빨간색)은 다음과 같습니다.

V3.6.3.6 타일링


이 타일들 중 일부에는 동의어가 있습니다. 예를 들어 다음은 모두 동일 3.3.3.4.4 3.3.4.4.3 3.4.4.3.3 4.4.3.3.3 4.3.3.3.4합니다.. 우리는 모든 동의어 또는 어휘 적으로 가장 낮은 것을 지원해야합니까 (질문에 나와있는 것처럼)? 또한 3.3.3.3.6두 개의 미러 이미지 형식으로 존재합니다. 어느 쪽이든 받아 들일 수 있음을 이해합니다.
Level River St

링크 한 페이지가 주어진 목록과 일치하지 않습니다. 3.3.3.4.4예를 들어 없습니다. en.wikipedia.org/wiki/… 는 목록과 정확히 일치합니다. 윤곽선 또는 채워진 다각형이 허용됨을 이해합니다 (또는이 둘의 조합?). 일부 이중선이 이미 목록에 있습니다. 예를 들어 4.4.4.4듀얼 자신을과 3.3.3.3.3.3하고 6.6.6mutally 듀얼 있습니다. 듀얼은 부모와 독립적으로 표시되므로 부모와 올바르게 정렬 할 필요가 없다는 것을 알고 있습니다.
Level River St

목록에 표시된대로 입력을 지원해야합니다. 동의어를 지원할 수도 있지만 반드시 그럴 필요는 없습니다. 모든 이중, 심지어 자기 이중을 지원해야합니다.
jsh

개요 / 채움-어느 쪽이든 괜찮습니다. 허점 이외에도 모든 스타일링이 가능합니다 (모든 것을 흰색으로 만들고 그리기 영역을 작게 만듭니다). 정렬이 필요하지 않습니다. 나는 당신이 하나의 반사를 사용할 수 없다고 말할 수 3.3.3.3.6있지만 그것이 무엇인지 어떻게 알 수 있습니까? :)
jsh

이제 점수를 변경했습니다. 동점은 무엇입니까? 여전히 가장 짧은 코드입니까? 그렇다면 정점 구성을 점으로 구분해야합니까, 아니면 쉼표 나 공백과 같은 다른 기호를 선택할 수 있습니까?
Level River St

답변:


9

BBC 기본

개정 1 골프 코드, 655 ASCII 문자, 토큰 화 된 파일 크기 614

데이터 테이블의 일부 주요 개선 사항은 조회 하기 전에 문자열 A.B..N을 숫자 로 해시하고 (1*A+2*B+..n*N)+n하나의 변환 벡터 만 저장하는 것입니다 (다른 하나는 코드로 생성됨). 골프를 마치면 자세한 설명이 있습니다.

t=PI*2DIMm(9)
c=0z=0INPUTz$
FORi=1TOLEN(z$)d%=VAL(MID$(z$,i))IFd%c+=1m(c)=d%i-=d%=12z+=c*d%
NEXTREPEATREADl,e,f
UNTILl=z+c
l=4-3*(m(3)MOD3=0)-8*(l=59)
DATA69,0,70,65,100,35,66,149,0,49,109,0,52,80,0,55,0,189,39,120,0,44,40,40,58,55,95,47,136,0,59,40,0
VDU23,23,3|
FORr=-9TO19FORs=-9TO9a=1+e*(r*2+s)-f*l*s/4b=1+f*(r*2+s)+e*l*s/4p=40q=0FORk=1TOm(c)/2FORj=1TOc
n=m(j)o=TAN(PI/3)IFe=109ANDn<>4o=1
w=-p*COS(t/n)-q*SIN(t/n)q=p*SIN(t/n)-q*COS(t/n)p=w
u=p:v=q
x=a:y=b
MOVEx,y
FORi=1TO14x+=u*2y+=v*2IFVAL(z$)DRAWx,y ELSEGCOL9LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)
w=v*COS(t/n)-u*SIN(t/n)u=v*SIN(t/n)+u*COS(t/n)v=w
NEXTNEXT
p=u:q=v
a=x:b=y
NEXTNEXTNEXT

Rev 0 골프 코드, 770 ASCII 문자, 토큰 화 된 파일 크기 728

내가 한 것은 주석, 불필요한 공백 및 따옴표를 제거 DATA하고 한 줄에 모두 넣는 것 입니다. 더 많은 골프를 즐길 여지가 있습니다.

t=PI*2DIMm(9)
c=0INPUTz$
FORi=1TOLEN(z$)d%=VAL(MID$(z$,i))IFd%c+=1:m(c)=d%:i-=d%=12
NEXTREPEATREADl$,e,f,g,h
UNTILMID$(z$,1-(VAL(z$)=0))=l$
DATA3.3.3.3.3.3,240,0,120,70,3.3.3.3.6,200,70,40,210,3.3.3.4.4,80,0,40,150,3.3.4.3.4,-40,150,150,40,3.12.12,300,0,150,260,3.4.6.4,220,0,110,188,3.6.3.6,160,0,80,140,4.4.4.4,80,0,0,80,4.6.12,0,380,330,-190,4.8.8,272,0,136,136,6.6.6,240,0,120,70
VDU23,23,3|
FORr=-9TO19 FORs=0TO9a=1+e*r+g*s
b=1+f*r+h*s
p=40q=0FORk=1TOm(c)/2FORj=1TOc
n=m(j)o=TAN(PI/3):IFe=220ANDn<>4o=1
w=-p*COS(t/n)-q*SIN(t/n)q=p*SIN(t/n)-q*COS(t/n)p=w
u=p:v=q
x=a:y=b
MOVEx,y
FORi=1TO14x+=u*2y+=v*2IFVAL(z$)DRAWx,y ELSEGCOL9LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)
w=v*COS(t/n)-u*SIN(t/n)u=v*SIN(t/n)+u*COS(t/n)v=w
NEXTNEXT
p=u:q=v
a=x:b=y
NEXTNEXTNEXT

설명

이것은 이전 레벨 1 답변의 연속이지만 다소 길기 때문에 별도로 게시하기로 결정했습니다.

레벨 2

이것은 이전 답변에서 "수준 1.5"템플릿을 번역하여 달성됩니다. 각 타일링에 대한 두 개의 변환 벡터는 하드 코딩됩니다. 밑변 80과 높이 70의 이등변 삼각형이 등변 삼각형의 근사값이며, 빗변 벡터 (56,56)가있는 오른쪽 삼각형 의 빗변 길이는 80에 매우 가깝다는 사실을 이용합니다.

레벨 3

폴리곤의 모서리를 플로팅하는 대신 이중선을 플로팅하기 위해 해당 모서리의 중간에서 폴리곤 중심까지 스포크를 플로팅합니다. 이것은 모서리와 직각을 이루며 1/TAN/(PI/n)벡터 (u, v) 의 시간 길이를 가지며, 이는 결국 모서리 길이의 절반입니다.

타일링의 특정 폴리곤 때문에 불행하게도, 3.3.3.3.6그리고 3.4.6.4명시 적으로 그려되지 않습니다 우리는 이런 짓을한다면, 그들은 플롯되지 않습니다. 따라서 스포크도 다각형에서 바깥쪽으로 연장됩니다. 외부 확장은 변수에 의해 제어됩니다 o.

기본적으로 확장은 삼각형의 중심에 도달하기에 충분하지만 3.4.6.4명시 적으로 플롯되지 않은 사각형의 이중선을 그리려면 확장을 더 확장해야합니다. 따라서 육각형과 삼각형을 명시 적으로 플롯하면 누락 된 사각형을 채우기에 충분한 확장이 적용되지만 인접한 삼각형의 허위 선을 피하기 위해 정사각형을 명시 적으로 그릴 때는 일반 확장이 적용됩니다.

스포크 확장이없는 모양은 다음과 같습니다. 이중 패턴의 구멍을 명확하게 볼 수 있습니다. 답변 하단의 메인 사진 에서 올바른 출력을 볼 수 있습니다

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

주석 처리 된 코드

이전 답변과의 차이점은 인라인으로 표시됩니다

  t=PI*2                                          :REM constant Tau = PI*2

  DIMm(9)                                         :REM declare array for the numbers in the input
  c=0                                             :REM number of polygons in the list

  INPUTz$
  FORi=1TOLEN(z$)                                 :REM for each character in the input
    d%=VAL(MID$(z$,i))                            :REM use VAL to return the numeric value of the substring to the right and store to integer variable
    IF d% c+=1 :m(c)=d%: i-=d%=12                 :REM if the last character read was a number, d% contains it, otherwise 0. Advance c and store to m. If it is 12, increment i to skip a character.
  NEXT

  REM BLOCK OF NEW CODE to define vectors (e,f) and (g,h) for each possible tiling

  REPEAT
    READ l$,e,f,g,h                               :REM read an entire line of the data below
  UNTIL MID$(z$,1-(VAL(z$)=0))=l$                 :REM abort the loop when l$ coincides with the input. the MID$ strips off the 'V' from the input where necessary.

  DATA"3.3.3.3.3.3",240,0,120,70
  DATA"3.3.3.3.6",200,70,40,210
  DATA"3.3.3.4.4",80,0,40,150
  DATA"3.3.4.3.4",-40,150,150,40
  DATA"3.12.12",300,0,150,260
  DATA"3.4.6.4",220,0,110,188
  DATA"3.6.3.6",160,0,80,140
  DATA"4.4.4.4",80,0,0,80
  DATA"4.6.12",0,380,330,-190
  DATA"4.8.8",272,0,136,136
  DATA"6.6.6",240,0,120,70

  VDU23,23,3|                                           :REM change linewidth to 3 (default is 1)

  REM END BLOCK OF NEW CODE

  FORr=-9TO19 FORs=0TO9                                 :REM two new loops for translations

      a=1+e*r+g*s                                       :REM modified code for
      b=1+f*r+h*s                                       :REM coordinates to start drawing at


      p=40:q=0                                          :REM vector of first line

      FORk=1TOm(c)/2                                    :REM draw half as many vertex figures as there are sides on the last polygon in the list

        FORj=1TOc                                       :REM for each polygon on the list
          n=m(j)                                        :REM n=number of sides
          o=TAN(PI/3): IF e=220 AND n<>4 o=1            :REM new code for the spoke extension 1/o. 

          w=-p*COS(t/n)-q*SIN(t/n)                      :REM rotate the starting vector anticlockwise by the internal angle of the current polygon
          q=p*SIN(t/n)-q*COS(t/n)                       :REM to avoid overlapping the previous one, if any.
          p=w

          u=p:v=q                                       :REM make a local copy of the vector and coordinates
          x=a:y=b                                       :REM to avoid corruption of p,q,a,b during the drawing of the polygon
          MOVE x,y                                      :REM move the graphics cursor to the start without drawing
          FORi=1TO14                                    :REM do 14 iterations regardless of the number of sides on the polygon
            x+=u*2                                      :REM increment x and y by the vector representing the side
            y+=v*2                                      :REM the value is double (u,v) to facilitate drawing duals later

            REM if z$ begins with a numeric character, draw an edge. If not, change to red and draw a spoke.
            IFVAL(z$) DRAW x,y ELSE GCOL9: LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)             

            w=v*COS(t/n)-u*SIN(t/n)                     :REM rotate the vector clockwise
            u=v*SIN(t/n)+u*COS(t/n)                     :REM through the external angle of the polygon
            v=w
          NEXT                                          :REM draw next edge of the current polygon
        NEXT                                            :REM draw next polygon of the current vertex

        p=u:q=v                                         :REM once the vertex is finished, we will be two sides around the perimeter of the last polygon.
        a=x:b=y                                         :REM copy the position and direction data into p,q,a,b.
      NEXT                                              :REM draw next vertex figure

    NEXT                                                :REM close the two new translation loops
  NEXT

산출

프로그램은 각 실행에 대해 하나의 타일링 또는 이중화 만 수행합니다. 그러나 듀얼을 빨간색으로 표시합니다. 공간을 절약하기 위해 화면을 지우지 않고 프로그램을 두 번 실행하여 일반 타일 위에 이중을 겹쳐 놓았습니다.

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


8

매스 매 티카

레벨 1에는 평면을 타일링하기 위해 반복적으로 스탬프 처리되는 기본 타일 템플릿이 포함되어 있습니다.

레벨 2는 타일링을 수행합니다.

아직 달성 할 수 없었던 2 개의 타일이 여전히 있습니다. 회전뿐만 아니라 회전이 필요한 것으로 보입니다.

레벨 1 : 정점 그림 (559 바이트)

nGon[n_]:=
{ColorData[46,"ColorList"][[n]],Polygon@Switch[n,
3,{{0,0},{-1/2,.866},{-1,0},{0,0}},
4,{{0,0},{0,1},{-1,1},{-1,0},{0,0}},
6,Table[{Cos[i 2Pi/n],Sin[i 2Pi/n]}+{-.5,.866},{i,0,n}],
8,Table[1.31{Cos[i Pi/4],Sin[i Pi/4]}+{-0.5`,1.207},{i,1/2,9}],
_,Table[2{Cos[i 2Pi/n],Sin[i 2Pi/n]}+{-0.5176,1.932},{i,1/2,13}]]}
innerAngle[n_]:=180-360/n
g[{}]=0;
g[a_]:=-(Plus@@innerAngle/@a)

h[{{},__,out_}]:=out
h[{list_,angles_,out_}]:=(
z=GeometricTransformation[nGon[l=list[[1]]],RotationTransform[g[angles] Degree]];
h[{Rest@list,Append[angles,l],Append[out,z]}])

테스팅

Row[Graphics[{EdgeForm[{Blue}], #}, 
      ImageSize -> 70] & @@ {h[{#, {}, {}}]} & /@ {{3, 3, 3, 3, 3, 
    3}, {3, 3, 3, 3, 6}, {3, 3, 3, 4, 4}, {3, 3, 4, 3, 4}, {3, 12, 
    12}, {3, 4, 6, 4}, {3, 6, 3, 6}, {4, 4, 4, 4}, {4, 6, 12}, {4, 8, 
    8}, {6, 6, 6}}]

우표


레벨 2 : 바둑판 식 배열 (690 바이트 추가)

규칙은 각 구성에 대한 타일링 오프셋 및 들여 쓰기를 반환합니다.

r 타일링을 출력하는 기본 기능입니다.

p템플릿과 해당 타일을 보여줍니다. 공백은 템플릿에 포함되지 않은 공백에 해당합니다.

rules={
{3,6,3,6}-> {2,3.47,0,0},
{4,4,4,4}-> {1,1,0,0},
{6,6,6}-> {3,2.6,1.5,0},
{3,3,3,3,3,3}-> {1.5,1.74,0,.9},
{3,3,3,3,6}-> {2,2.6,-0.4,1.8},

{4,6,12}->{4.2,4.9,0,2.5},
{3,3,4,3,4}-> {1.87,1.86,-.5,-0.5},
{4,8,8}-> {3.4,3.4,0,0},
{3,3,3,4,4}-> {2,1.87,.52,0},
{3,12,12}-> {3.82,6.73,0,0},
{3,4,6,4}-> {1.4,4.3,0(*1.375*)-1,-2.4}};


r[nGons_]:=
Module[{horizHop,vertHop,indent,downIndent},
{horizHop,vertHop,indent,downIndent}=(nGons/.rules);
Graphics[{EdgeForm[{Blue}],Table[GeometricTransformation[h[{#,{},{}}]&/@{nGons},
TranslationTransform[{
If[MemberQ[{{3,3,4,3,4},{3,3,3,3,6},{3,4,6,4}},nGons],indent *row,indent Boole[OddQ[row]]]+col horizHop,
If[MemberQ[{{3,3,4,3,4},{3,3,3,3,6},{3,4,6,4}},nGons],downIndent *col,downIndent Boole[OddQ[col]]]-row vertHop}]],
{col,0,5},{row,0,4}]},ImageSize-> 250]]

p[nGon_]:=Row[{Graphics[{EdgeForm[{Blue}],h[{nGon,{},{}}]},ImageSize->70],r@nGon}];

테스팅

삼각 타일링

p[{3, 3, 3, 3, 3, 3}]

삼각


육각형

p[{6, 6, 6}]

육각형


광장

p[{4, 4, 4, 4}]

광장


알 수 없는

p[{3, 3, 4, 3, 4}]

아르키메데스 1


잘린 사각형

p[{4, 8, 8}]

잘린 사각형


삼육 각

p[{3, 6, 3, 6}]

삼육 각


잘린 육각형

p[{3, 12, 12}]

잘린 육각형


이름이없는

p[{3, 3, 3, 3, 6}]

경 사진


길쭉한 삼각형

p[{3, 3, 3, 4, 4}]

길쭉한 삼각형


파악할 타일링

왼쪽


나는 당신과 거의 같은 단계에 있습니다. 타일을 만들 수는 있지만 타일링 작업에는 약간의 시간이 걸립니다. Wiki steveverill은 자신의 의견에 게시하여 다양한 구성표를 지원해야하는 것처럼 보입니다. 약간의 연구가 필요합니다 :)
MickyT

미키, 타일의 수직 및 수평 변위는 행 번호, 열 번호에 따라 다릅니다. 해당 사례에 고유 한 오프셋을 사용합니다. 나는 하나씩 하나씩 작업하고 나중에 일반화 할 것입니다.
DavidC

@DavidCarraher 위대한 시작. 귀하에게 영향을 줄 수있는 점수 기준을 변경했습니다.
jsh

아직 까진 좋음! 수평 변환을 3.3.3.3.3.3반으로 줄이면 단위가 겹치므로 해당 다이아몬드를 제거하고 타일을 수정할 수 있습니다. 당신은 여전히해야 할 더 가지고 3.3.3.3.6, 3.4.6.4그리고 4.6.12생각.
Level River St

다시 4.6.12 anyone know what it should look like?-필요한 모든 기와는 en.wikipedia.org/wiki/…에 있습니다. 질문에 대한 내 의견을 참조하십시오. 이것은 질문 에서 언급 한 것과 다른 페이지 입니다. 그러나 4.6.12어쨌든 해당 페이지에도 표시됩니다.
레벨 리버 세인트

6

아르 자형

1 단계

다음은 타일을 만드는 노력입니다. 다음에 올 타일링. 이것은 입력의 유효성을 검사하지 않으므로 무효 인은 이상한 타일을 그립니다. 입력은 첫 줄 이후에 입력됩니다

i=as.numeric(unlist(strsplit(readline(),"[.]")))
e=c()
for(n in 1:length(i)){
    o=sum(c(0,180-360/i[1:n-1]))
    for(z in 1:i[n]){
        e=c(e,(360/i[n])*(z-1)+o)
    }
}
f=pi/180
plot(c(0,cumsum(sin(e*f))),c(0,cumsum(cos(e*f))),type="l")

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

1 단계, 2 단계 및 3 단계 : 1898

마침내 다시 돌아 왔습니다. 이것의 대부분은 오프셋을 설정하고 특수한 경우를 처리합니다 :). 편집 : 이제 듀얼에 대한 V 플래그가 처리됩니다.

일반적인 과정은 다음과 같습니다.

  • 입력을 받아 목록을 만드십시오
  • 초기 타일을 그릴 각도 목록을 만듭니다.
  • 각 다각형의 중심을 타일로 계산하고 그로부터의 벡터를 계산하여 가장자리를 이등분합니다.
  • 그려지는 타일 세트를 결정하고 각도 오프셋 목록을 만듭니다. 일부 타일에는 구멍을 채우는 데 도움이되는 추가 다각형이 추가되어 있습니다.
  • 타일을 그립니다
  • 듀얼을 그립니다

나는 아직도 이것을 조금 더 골프를 칠 수있다.

##Get input (Enter by itself then type in the tile scheme)
i=strsplit(readline(),"[.]")[[1]]
## Run once i is set
q=0
if(substr(i[1],1,1)=="V"){q=1;i[1]=substr(i[1],2,9)}
i=as.numeric(i)
f=pi/180
e=x=y=q=p=c()
l=length(i)
d=1/(2*tan(pi/3))
g=1/(2*sin(pi/3))
for(n in 1:l){o=sum(c(0,180-360/i[1:n-1]))
r=1/(2*sin(pi/i[n]))
a=o+(180-360/i[n])/2
b=1/(2*tan(pi/i[n]))+d
for(z in 1:i[n]){x=c(x,r*sin(a*f))
y=c(y,r*cos(a*f))
q=c(q,b)
p=c(p,(360/i[n])*(z-1)+o-90)
e=c(e,(360/i[n])*(z-1)+o)}}
if(sum(i)==18&l==6){h=c(60,0);w=c(60,120)}
if(sum(i)==18&l==5){h=c(0,0,60);w=c(60,120,60)
e=c(e,0,-60,60,180,60,180)
x=c(x,g*sin(-30*f),g*sin(-30*f),g*sin(90*f))
y=c(y,1+g*cos(-30*f),1+g*cos(-30*f),1)
q=c(q,d+d,d+d,d+d)
p=c(p,-30,90,-30)}
if(sum(i)==17&l==5&sum(abs(diff(c(i,i[1]),1)))==2){h=c(0,0);w=c(90,60)}
if(sum(i)==17&l==5&sum(abs(diff(c(i,i[1]),1)))==4){h=c(0,30);w=c(270,300)}
if(sum(i)==17&l==4){h=c(0,30,-30);w=c(60,30,90)
e=c(e,150,120,210,300)
x=c(x,sin(150*f)+g*sin(90*f),sin(150*f)+sin(210*f)/2)
y=c(y,cos(150*f)+(1/(2*cos(pi/3)))*cos(90*f),cos(150*f)+cos(210*f)/2)
q=c(q,1,1)
p=c(p,210,120)}
if(sum(i)==18&l==4){h=c(0,0);w=c(120,120)}
if(sum(i)==16&l==4){h=c(0,0);w=c(90,90)}
if(sum(i)==27&l==3){h=c(0,-30,0,30);w=c(60,90,120,150,180)}
if(sum(i)==22&l==3){h=c(0,-30,30,90,60,30)
w=c(90,150,120,90,60,30)
e=c(e,0,-30,-60,30,120,210,30,90,150)
q=q-d+1/(2*tan(pi/4));q[13]=q[17]=q[21]=q[21]+3}
if(sum(i)==20&l==3){h=c(0,-45,-90);w=c(90,0,45)}
if(sum(i)==18&l==3){h=c(0,60,0,-60);w=c(0,60,120,60)}
hx=sum(sin(h*f))
hy=sum(cos(h*f))
wx=sum(sin(w*f))
wy=sum(cos(w*f))
plot(0,0,type="n")
par(pin=c(5,5),usr=c(0,20,0,20))
for(c in -20:20){for(j in -20:20){lines(c((c*hx)+(j*wx)+0,(c*hx)+(j*wx)+cumsum(sin(e*f))),c((c*hy)+(j*wy)+0,(c*hy)+(j*wy)+cumsum(cos(e*f))),type="l")
if(q){for(n in 1:length(x)){lines(c((c*hx)+(j*wx)+x[n],(c*hx)+(j*wx)+x[n]+q[n]*sin(p[n]*f)),c((c*hy)+(j*wy)+y[n],(c*hy)+(j*wy)+y[n]+q[n]*cos(p[n]*f)),col="RED")}}}}

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


와우, 4 시간 남았 어 그리고 그들은 +1도 좋아 보인다! 모든 사건이 아직 해결 되었습니까?
Level River St

@ steveverrill 감사하고 질문의 모든 경우에 작동합니다.
MickyT

4

BBC 기본

http://www.bbcbasic.co.uk/bbcwin/bbcwin.html 에서 에뮬레이터를 다운로드 하십시오.

레벨 1

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

레벨 1.5

레벨 1.5는 제 자신의 지정이지만 제 방법에서 중요한 이정표입니다.

꼭짓점 수치를 변환한다고해서 항상 올바른 타일이 생성되는 것은 아닙니다. 경우에 따라 줄이 없습니다.

이것에 대한 나의 해결책은 가장 큰 다각형을 돌아 다니며 해당 다각형의 두 번째 정점마다 정점 그림을 그리는 것입니다. 이것은 모든 경우에 대한 일반적인 솔루션입니다. 가장 큰 다각형에는 항상 짝수의면이 있으며 정점 그림은 다각형 주위를 이동할 때 시계 방향 / 반 시계 방향으로 교대로 나타납니다. 이것은 가장 명확하게 볼 수 4.6.12있지만 다음 4.8.83.12.12같은 경우 에도 마찬가지입니다 . 특정 8-gon 또는 12-gon에서 볼 때 교점은 서로 거울상입니다. 이와 함께 다소 덜 분명 무슨 일이 일어나고 있는지 또한 3.3.3.4.43.3.4.3.4: 특정 광장에서 볼 때, 교류 정점이 서로의 미러 이미지입니다.

다각형 주위에서 2면을 이동하는 데 사용하는 알고리즘은 다각형의 가장자리 수에 관계없이 항상 가장자리 그리기 루프를 14 회 반복하는 것입니다. 8은 16의 요소이므로 팔각형을 그릴 때 그래픽 커서는 시작 위치에서 16-14 = 2 개의 정점으로 끝납니다. 3--4-6- 및 12-gon은 모두 12의 요소 인 변을 가지므로 그래픽 커서는 시작 위치보다 14-12 = 2 정점으로 끝납니다.

아래 그림을 볼 수 있습니다. 내일 나는 타일링을 완성하기 위해 올바른 번역을하기를 희망합니다. 모든 경우에 번역만으로 레벨 2를 완성하기에 충분한 선이 그려집니다. 경우에 따라 필요한 최소값 이상이 많이 발생하지만 겹치는 문제는 없습니다. 규칙은 선을 한 번만 그리는 것에 대해 아무 것도 말하지 않습니다 :-)

일반적으로 가장 큰 다각형은 목록의 마지막 다각형입니다. 불행히도 그렇지 않은 경우가 하나 있습니다. 3.4.6.4따라서이 경우에 그려진 그림은 육각형이 아닌 정사각형의 중심에 있습니다. 명시 적으로 그려지지 않는 특정 사각형이 있지만 변환 만 사용하여 레벨 2를 완료하기에 충분한 행이 있습니다. 이것은 레벨 3에서 약간의 문제를 야기 할 것입니다 (다행스럽게도이 문제를 해결하는 방법을 알고 있다고 생각합니다.) 마찬가지로 3.3.3.3.6번역 만 사용하여 레벨 2를 완성하기에 충분한 선이 있지만 명시 적으로 그려지지 않은 특정 삼각형이 있습니다.

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

암호

레벨 1.5의 코드는 주석 처리되며 레벨 1의 코드 만 활성화됩니다. 로 시작하는 네 줄이 있습니다 REM. REM레벨 1.5를 활성화하려면 이 s를 제거하십시오 .

  t=PI*2                                          :REM constant Tau = PI*2
  DIMm(9)                                         :REM declare array for the numbers in the input
  c=0                                             :REM number of polygons in the list

  INPUTz$
  FORi=1TOLEN(z$)                                 :REM for each character in the input
    d%=VAL(MID$(z$,i))                            :REM use VAL to return the numeric value of the substring to the right and store to integer variable
    IF d% c+=1 :m(c)=d%: i-=d%=12                 :REM if the last character read was a number, d% contains it, otherwise 0. Advance c and store to m. If it is 12, increment i to skip a character.
  NEXT

  FORi=1TOc PRINTm(i),:NEXT                       :REM parsing check for debugging.


  a=601:b=601                                     :REM coordinates to start drawing at
  p=40:q=0                                        :REM vector of first line

  REM FORk=1TOm(c)/2                              :REM draw half as many vertex figures as there are sides on the last polygon in the list

  FORj=1TOc                                       :REM for each polygon on the list
    n=m(j)                                        :REM n=number of sides

    w=-p*COS(t/n)-q*SIN(t/n)                      :REM rotate the starting vector anticlockwise by the internal angle of the current polygon
    q=p*SIN(t/n)-q*COS(t/n)                       :REM to avoid overlapping the previous one, if any.
    p=w

    u=p:v=q                                       :REM make a local copy of the vector and coordinates
    x=a:y=b                                       :REM to avoid corruption of p,q,a,b during the drawing of the polygon
    MOVE x,y                                      :REM move the graphics cursor to the start without drawing
    FORi=1TO14                                    :REM do 14 iterations regardless of the number of sides on the polygon
      x+=u*2                                      :REM increment x and y by the vector representing the side
      y+=v*2                                      :REM the value is double (u,v) to facilitate drawing duals later
      IFVAL(z$) DRAW x,y ELSE LINEx-u,y-v,x-u,y-v :REM if the first character of the input is a number, draw the side of the polygon. The ELSE part is unfinished and will be for drawing duals.
      w=v*COS(t/n)-u*SIN(t/n)                     :REM rotate the vector clockwise
      u=v*SIN(t/n)+u*COS(t/n)                     :REM through the external angle of the polygon
      v=w
    NEXT                                          :REM draw next edge of the current polygon
  NEXT                                            :REM draw next polygon of the current vertex

  REM p=u:q=v                                     :REM once the vertex is finished, we will be two sides around the perimeter of the last polygon.
  REM a=x:b=y                                     :REM copy the position and direction data into p,q,a,b.
  REM NEXT                                        :REM draw next vertex figure

레벨 2와 3

내 다른 답변을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.