Плитка, з урахуванням конфігурації вершин


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наведена ця вершинна фігура:

3.6.3.6 вершинна фігура

Вихід - Рівень складності №2: Черепиця

На цьому рівні складності виводиться зображення, що демонструє рівномірне плитку, використовуючи фігуру вершини, відповідну даному входу.

Наприклад, 3.6.3.6наведена така плитка:

3.6.3.6 плитка

Немає обмежень щодо кольору або формату (лазівки заборонення).

Вихід - Рівень складності №3: Подвійна плитка

На цьому рівні складності може бути сформована "подвійна плитка" з кожної плитки. Це досягається нанесенням ліній від центру кожного багатокутника до центру кожного полігону, що межує.

Подвійне облицювання плит задається попереднім введенням з а 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існує у двох дзеркальних формах зображення. Я розумію, що це прийнятно.
Рівень річки Св.

Сторінка, яку ви пов’язали, не відповідає наведеному списку. 3.3.3.4.4відсутня, наприклад. en.wikipedia.org/wiki/… точно відповідає вашому списку. Я розумію, що контури або заповнені багатокутники є прийнятними (або комбінація двох?) Деякі дуали вже є в списку. Наприклад, 4.4.4.4є власний подвійний 3.3.3.3.3.3і 6.6.6є мутально подвійним. Оскільки дуали відображаються незалежно від батьків, я розумію, що немає необхідності в правильному вирівнюванні з батьком.
Рівень річки Св.

ви повинні підтримувати введення так, як це відображається у списку - ви можете підтримувати синоніми, але цього не потрібно - ви повинні підтримувати всі дуали, навіть самодуали.
jsh

контур / заповнений - добре в будь-якому випадку. будь-яка укладка дозволена, крім лазівки (зробіть все білим, зробіть область малювання крихітною тощо). вирівнювання не потрібно. Я можу вам сказати, що вам не дозволяється використовувати одне відображення, 3.3.3.3.6але як би ви дізналися, яке це? :)
jsh

Тепер ви змінили бал, що таке тай-брейк? Це все-таки найкоротший код? Якщо так, то чи потрібно конфігурації вершин розмежовувати крапками чи ми можемо вибрати інший символ, як кома чи пробіл?
Рівень річки Св.

Відповіді:


9

BBC BASIC

Код Rev 1 Golfed, 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

Код 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}]

подовжений трикутний


Покриття, щоб розібратися

зліва


Я майже на тому ж етапі, що і ти. Я можу створити плитку, але опрацювання плитки займе трохи. Вікі Steveverill, розміщений у своїх коментарях, виглядає так, що схоже, що різні схеми, що склалися, потребують підтримки. Потрібно трохи вивчити :)
MickyT

Міккі, вертикальний і горизонтальний зміщення плитки буде залежати від рядка №, коло № використовуючи зрушення, унікальні для конкретного випадку. Я опрацьовую їх по черзі і згодом узагальнюю.
DavidC

@DavidCarraher чудовий старт. Я змінив критерії оцінки, які можуть вплинути на вас.
jsh

Добре поки що! Якщо скоротити горизонтальний переклад 3.3.3.3.3.3удвічі, так що одиниці перекриваються, ви можете позбутися цих алмазів і виправити цю плитку. Вам ще належить ще зробити 3.3.3.3.6, 3.4.6.4і 4.6.12хоча.
Річка Рівня Св.

Повторне 4.6.12 anyone know what it should look like?- всі необхідні обшивки розміщені на сайті en.wikipedia.org/wiki/… . Дивіться мій коментар до питання. Це інша сторінка від тієї, що згадується у питанні. Але 4.6.12це все одно відображається на цій сторінці.
Рівень Св. Св.

6

R

Крок 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! У вас все справи вже працювали?
Рівень р. Св.

@steveverrill Дякуємо, він працює у всіх випадках.
MickyT

4

BBC BASIC

Завантажте емулятор за адресою http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Рівень 1

введіть тут опис зображення

Рівень 1.5

Рівень 1.5 - це моє власне позначення, але це важлива віха мого методу.

Переклад фігур вершин не завжди призводить до правильної плитки. У деяких випадках рядки відсутні.

Моє рішення для цього - об'їхати найбільший багатокутник, намалювавши фігуру вершини для кожної другої вершини цього багатокутника. Це загальне рішення для всіх випадків. Зауважте, що найбільший багатокутник завжди має парну кількість сторін, і фігурка вершини часто чергується за годинниковою / проти годинникової стрілки, коли ви об'їжджаєте полігон. Це можна зрозуміти найбільш чітко 4.6.12, але це справедливо 4.8.8і для 3.12.12: коли дивитися з будь-якого конкретного 8-го або 12-гогонного, вершини, що чергуються, є дзеркальними зображеннями один одного. Це також відбувається, дещо менш очевидно, з 3.3.3.4.4і 3.3.4.3.4: коли дивитися з будь-якого конкретного квадрата, чергуються вершини - це дзеркальні зображення один одного.

Алгоритм, який я використовую для переміщення двох сторін навколо багатокутника, - це завжди робити 14 ітерацій циклу малювання ребер, незалежно від того, скільки ребер має багатокутник. 8 - коефіцієнт 16, тому при малюванні восьмикутників графічний курсор закінчується 16-14 = 2 вершини позаду, де він почався. 3- 4- 6- та 12-значки мають сторони, що є факторами 12, тому графічний курсор закінчується на 14-12 = 2 вершини до того, з чого він розпочався.

Цифри можна побачити нижче. Завтра я сподіваюся, що я опрацюю правильні переклади, щоб завершити плитку. У всіх випадках накреслюється достатня кількість рядків лише для перекладу на рівень 2. У деяких випадках намалюється набагато більше необхідного мінімуму, але немає проблем із перекриттям: правила нічого не говорять про малювання ліній лише один раз :-)

Загалом найбільший багатокутник є останнім у списку. На жаль, є один випадок, коли це не так: 3.4.6.4Тому малюнок, намальований у цьому випадку, орієнтований на квадрат, а не на шестикутник. Достатньо рядків, щоб виконати рівень 2, використовуючи лише переклади, хоча є певні квадрати, які не намальовані явно. Це створить деякі проблеми на рівні 3 (на щастя, я думаю, я знаю, як це вирішити.) Так само, 3.3.3.3.6як і достатньо рядків, щоб виконати рівень 2, використовуючи лише переклади, але будуть певні трикутники, які не намальовані явно.

введіть тут опис зображення

Код

Код рівня 1,5 коментується, активується лише код рівня 1. Є чотири рядки, що починаються з а REM. Видаліть ці REMs, щоб активувати рівень 1.5.

  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

Дивіться іншу мою відповідь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.