Döşeme, tepe yapılandırması verildi


11

Görev

Görev, bir köşe yapılandırması verildiğinde çokgenleri döşemektir.

puanlama

Puanınız, başvurunuzun ulaştığı "karmaşıklık düzeyine" eşittir. Karmaşıklık düzeyleri birikimlidir, yani # 3'e ulaşmak için # 1 ve # 2'yi de desteklemeniz gerekir.

Eşit karmaşıklık düzeyindeki başvurular bayt sayısı ile ayırt edilir; en düşük kazanç.

Giriş

Girdi, bir tepe biçimini temsil eden bir tepe noktası yapılandırması içeren bir dizedir. Diğer bir deyişle, her tamsayı (n) ortak bir tepe noktasıyla bağlanmış normal bir n-gon'u temsil eden noktalarla ayrılmış bir tam sayı listesi.

Aşağıdaki tepe noktası yapılandırmaları desteklenmelidir:

  • 3.3.3.3.3.3
  • 3.3.3.3.6
  • 3.3.3.4.4 (sıralamanın tepe şekline yansıdığını unutmayın, bu nedenle aşağıdakiler farklıdır)
  • 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

Çıktı - Karmaşıklık Seviye # 1: Tepe Şekli

Bu karmaşıklık düzeyinde çıktı, verilen girdiye karşılık gelen tepe şeklini gösteren bir görüntüdür.

Girdi, Ftepe döşemesi şeklinin tam döşemenin değil çıktı olması gerektiğini belirtmek için a ile eklenir .

Örneğin F3.6.3.6bu tepe noktasını verir:

3.6.3.6 köşe şekli

Çıktı - Karmaşıklık Seviye # 2: Döşeme

Bu karmaşıklık seviyesinde çıktı, verilen girdiye karşılık gelen tepe şekli kullanılarak eşit bir döşemeyi gösteren bir görüntüdür .

Örneğin 3.6.3.6bu döşemeyi verir:

3.6.3.6 döşeme

Renk veya biçim (kısıtlama boşlukları) konusunda herhangi bir kısıtlama yoktur.

Çıktı - Karmaşıklık Düzeyi # 3: Çift Döşeme

Bu karmaşıklık seviyesinde, her bir döşemeden bir 'çift döşeme' oluşturulabilir. Bu, her çokgenin merkezinden her bir sınırlama çokgenin merkezine çizgiler çizerek elde edilir.

İkili döşeme, a ile giriş bekleyen tarafından belirlenir V.

Örneğin V3.6.3.6bu ikili döşemeyi (kırmızı renkte) verir:

V3.6.3.6 döşeme


Bu çıkıntılardan bazıları eşanlamlıdır. Örneğin şu hep aynıdır: 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. Tüm eşanlamlıları mı yoksa sadece sözlükteki en düşük olanı mı (soruda verildiği gibi) desteklememiz gerekir mi? Ayrıca, 3.3.3.3.6iki ayna görüntüsü formunda bulunur. Ben de kabul edilebilir anlıyorum.
Level River St

Bağladığınız sayfa verilen listeyle eşleşmiyor. 3.3.3.4.4örneğin eksik. en.wikipedia.org/wiki/… listenizle tam olarak eşleşir. Anahat veya doldurulmuş çokgenlerin kabul edilebilir olduğunu (veya ikisinin bir kombinasyonunu mu?) Anlıyorum. Örneğin 4.4.4.4, kendi ikilisidir 3.3.3.3.3.3ve 6.6.6mutal olarak çifttir. Dualler ebeveynlerinden bağımsız olarak görüntülendiğinden, ebeveynle doğru hizalamaya gerek olmadığını anlıyorum.
Level River St

girişleri listede göründüğü gibi desteklemelisiniz - eşanlamlıları destekleyebilirsiniz ancak zorunda değilsiniz - tüm dual'leri, hatta self-duals'i bile desteklemelisiniz.
jsh

Anahat / dolu - her iki şekilde de iyi. boşlukların yanında herhangi bir stile izin verilir (her şeyi beyaz yapın, çizim alanını küçük yapın vb.). hizalama gerekli değildir. Size bir yansımasını kullanma izniniz olmadığını söyleyebilirim, 3.3.3.3.6ama hangisinin yansımasını nasıl bilebilirsiniz? :)
jsh

Şimdi skoru değiştirdin, tie-break nedir? Bu hala en kısa kod mu? Öyleyse, tepe noktası yapılandırmaları noktalarla sınırlandırılmalı mı yoksa virgül veya boşluk gibi başka bir sembol seçebilir miyiz?
Level River St

Yanıtlar:


9

BBC TEMEL

Rev 1 Golfçü kodu, 655 ASCII karakter, tokalı dosya boyutu 614

Veri tablosunda bazı büyük iyileştirmeler, dizeyi aramadan önce A.B..Nbir sayıya ayırarak ve (1*A+2*B+..n*N)+nyalnızca bir çeviri vektörü (diğeri kod tarafından oluşturulur.) Golf işlemini bitirdiğimde daha fazla açıklama.

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 Golfçü kodu, 770 ASCII karakter, sembolize dosya boyutu 728

Burada yaptığım tek şey yorumları kaldırmak, gereksiz boşluk ve alıntı işaretlerini kaldırmak ve hepsini DATAtek bir satıra koymak . Kesinlikle daha fazla golf için yer var.

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

açıklama

Bu, önceki 1. Seviye cevabımın devamıdır, ancak ayrı olarak göndermeye karar verdim çünkü oldukça uzun.

Seviye 2

Bu, önceki cevabımdaki "seviye 1.5" şablonlarımın çevirisi ile elde edilir. Her döşeme için iki çeviri vektörü sabit kodlanmıştır. Taban 80 ve yükseklik 70'in ikizkenar üçgeninin eşkenar üçgenin çok iyi bir yaklaşımından ve hipotenüs vektörü (56,56)olan sağ bir üçgenin 80'e çok yakın bir hipotenüs uzunluğuna sahip olması gerçeğinden faydalanıyorum .

3. seviye

Dualleri çizmek için, çokgenin bir kenarını çizmek yerine, o kenarın ortasından çokgenin merkezine bir konuşmacı çizeriz. Bu, kenara dik açılıdır ve 1/TAN/(PI/n)vektörün (u, v) uzunluğuna sahiptir ve bu da kenarın yarısı kadardır.

Ne yazık ki, belirli çokgenler eğimde olduğu 3.3.3.3.6ve 3.4.6.4açık bir şekilde çizilmediğinden, sadece bunu yaparsak bunlar çizilmez . Bu nedenle, jant teli de çokgenden dışarı doğru uzanır. Dışa doğru uzantı değişken tarafından kontrol edilir o.

Varsayılan olarak uzantı, bir üçgenin merkezine ulaşmak için yeterlidir, ancak 3.4.6.4açıkça çizilmeyen karelerin çiftlerini çizmek için daha fazla genişletilmesi gerekir. Böylece, altıgenler ve üçgenler açık bir şekilde çizildiğinde eksik kareleri doldurmak için yeterli uzantı uygulanır, ancak bitişik üçgenlerdeki sahte çizgileri önlemek için kareler açıkça çizildiğinde normal uzantı uygulanır.

Konuşmacı uzantıları olmadan nasıl göründükleri aşağıda açıklanmıştır. Çift modeldeki delikler açıkça görülebilir. Doğru çıktı cevabın altındaki ana resimde görülebilir.

resim açıklamasını buraya girin

Yorumlu Kod

Önceki cevabımdan farklılıklar satır içinde belirtildi

  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

Çıktı

Program her çalışma için sadece bir döşeme veya ikili gerçekleştirir. Ancak duals kırmızı renkte çizer. Yerden tasarruf etmek için, ikili döşemeyi normal döşemenin üzerine yerleştirmek için ekranı temizlemeden iki kez çalıştırdım.

resim açıklamasını buraya girin


8

Mathematica

Seviye 1, bir düzlemi döşemek için tekrar tekrar damgalanan temel döşeme şablonlarını içerir.

Seviye 2 fayans yapar.

Hâlâ başaramadığım 2 hareket var. Çeviri yanı sıra rotasyon gerektiriyor gibi görünüyor.

Seviye 1: Köşe Şekli (559 bayt)

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]}])

Test yapmak

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}}]

pullar


Seviye 2: Döşeme (690 ek bayt)

Kurallar, her yapılandırma için döşeme ofsetleri ve girintileri döndürür.

r eğim çıkışı sağlayan temel işlevdir.

pşablonu ve döşemeyi gösterir. Beyaz boşluklar şablon tarafından kapsanmayanlara karşılık gelir.

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}];

Test yapmak

Üçgen fayans

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

üçgensel


altıgen şeklinde

p[{6, 6, 6}]

altıgen şeklinde


Meydan

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

Meydan


Bilinmeyen

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

archimedes1


kesik kare

p[{4, 8, 8}]

kesik kare


trihexagonal

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

trihexagonal


kesik altıgen

p[{3, 12, 12}]

kesik altıgen


adsız

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

eğimli


uzatılmış üçgen

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

uzatılmış üçgen


Anlamak için yatırmalar

ayrıldı


Ben seninle hemen hemen aynı aşamadayım. Fayans oluşturabilirim, ancak fayans üzerinde çalışmak biraz zaman alacaktır. Yorumlarında yayınlanan wiki steveverill, çeşitli şemaların desteklenmesi gerektiği gibi görünüyor. Biraz çalışma yapmalıyım :)
MickyT

Micky, Bir döşemenin dikey ve yatay yer değiştirmesi sıra no., Sütun no. eldeki duruma özgü ofsetleri kullanarak. Onları tek tek çalışıyorum ve daha sonra genelleştireceğim.
DavidC

@DavidCarraher harika bir başlangıç. Sizi etkileyebilecek puanlama ölçütlerinde bir değişiklik yaptım.
jsh

Şimdiye kadar iyi! Yatay çevirinizi 3.3.3.3.3.3yarıya indirirseniz, birimler çakışırsa, o elmaslardan kurtulabilir ve o döşemeyi düzeltebilirsiniz. Sen hala yapacak daha var 3.3.3.3.6, 3.4.6.4ve 4.6.12olsa.
Level River St

Yeniden 4.6.12 anyone know what it should look like?- Gerekli tüm kaplamalar en.wikipedia.org/wiki/… adresindedir . Soru hakkındaki yorumuma bakın. Bu sözü birine farklı bir sayfası içinde söz. Ancak 4.6.12yine de bu sayfada gösterilir.
Level River St

6

R,

Aşama 1

Fayansları inşa etme çabam. Sonraki için fayans. Bu, girişi doğrulamaz, bu nedenle geçersiz sayılar bazı garip karolar çizer. Giriş ilk satırdan sonra yazılır

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")

resim açıklamasını buraya girin

Adım # 1, # 2 & # 3: 1898

Sonunda geri döndüm. Bunların çoğu ofsetlerin ayarlanması ve özel durumların ele alınması ile ele alınmaktadır :). Düzenle: Dual'ler için V bayrağı artık ele alındı

Genel süreç:

  • Girdiyi alın ve bir liste yapın
  • İlk döşemeyi çizmek için bir açı listesi oluşturun
  • Her çokgenin merkezini karo ve kenarlarını ikiye bölmek için vektörleri hesaplayın
  • Çizilen karo setini belirleyin ve açı ofsetlerinin bir listesini yapın. Bazı karoların, doldurma deliklerine yardımcı olmak için ek poligonları vardır.
  • Fayans çizmek
  • Dualleri çizin

Muhtemelen hala bu biraz daha golf olabilir.

##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")}}}}

resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin


Vay be, sadece 4 saat arkamda. Ve onlar da güzel görünüyorlar, +1! Tüm davalarınız henüz çalışıyor mu?
Level River St

@steveverrill Teşekkürler ve sorudaki tüm vakalar için çalışır.
MickyT

4

BBC TEMEL

Emülatörü http://www.bbcbasic.co.uk/bbcwin/bbcwin.html adresinden indirin.

Seviye 1

resim açıklamasını buraya girin

Seviye 1.5

Seviye 1.5 benim atamamdır, ancak benim yöntemimde önemli bir kilometre taşıdır.

Tepe değerlerinin çevrilmesi her zaman doğru döşemeye yol açmaz. Bazı durumlarda çizgiler eksik.

Buna benim çözümüm, en büyük çokgenin etrafından dolaşmak ve o çokgenin her ikinci köşesi için köşe figürü çizmektir. Bu, tüm durumlar için genel bir çözümdür. En büyük çokgenin her zaman eşit sayıda kenara sahip olduğunu ve çokgen etrafında dolaşırken tepe şeklinin genellikle saat yönünde / saat yönünün tersine değiştiğini unutmayın. Bu en çok görülebilir 4.6.12, fakat, aynı zamanda, doğru 4.8.8ve 3.12.12: bakıldığında herhangi bir 8-gon ya da 12-gon, alternatif köşe birbirinin ayna görüntüleridir. Aynı şekilde, daha az belirgin bir şekilde 3.3.3.4.4ve ile olan da budur 3.3.4.3.4: herhangi bir belirli kareden bakıldığında, alternatif köşeler birbirinin ayna görüntüleridir.

Poligonun 2 kenarını hareket ettirmek için kullandığım algoritma, poligonun kaç kenarına bakılmaksızın her zaman kenar çizim döngüsünün 14 yinelemesini yapmaktır. 8, 16'lık bir faktördür, bu nedenle sekizgen çizilirken grafik imleci başladığı yerin 16-14 = 2 köşesine ulaşır. 3- 4- 6- ve 12-gons'ların 12 faktörü olan kenarları vardır, bu nedenle grafik imleci başladığı yerden 14-12 = 2 köşeye ulaşır.

Rakamlar aşağıda görülebilir. Yarın, döşemeyi tamamlamak için doğru çevirileri yapmayı umuyorum. Her durumda, 2. çeviriyi sadece çevirilerle tamamlamak için yeterli satırlar çizilir. Bazı durumlarda gereken minimumdan çok daha fazlası çizilir, ancak örtüşme ile ilgili bir sorun yoktur: kurallar sadece bir kez çizgi çizmeyle ilgili hiçbir şey söylemez :-)

Genel olarak, en büyük çokgen listede sonuncudur. Maalesef bunun böyle olmadığı bir durum var: 3.4.6.4Bu durumda çizilen rakam altıgen yerine bir kare üzerinde ortalanıyor. Sadece çevirileri kullanarak 2. seviyeyi tamamlamak için yeterli satır vardır, ancak açıkça çizilmeyen belirli kareler olacaktır. Bu, seviye 3'te bazı problemler sunacaktır (neyse ki bunu nasıl çözeceğimizi biliyorum.) Benzer şekilde, 3.3.3.3.6sadece çevirileri kullanarak seviye 2'yi tamamlamak için yeterli satırlar var, ancak açıkça çizilmeyen belirli üçgenler olacak.

resim açıklamasını buraya girin

kod

Seviye 1.5 kodu yorumlanır, sadece seviye 1 kodu etkinleştirilir. A ile başlayan dört satır vardır REM. REMSeviye 1.5'i etkinleştirmek için bunları kaldırın .

  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

Seviye 2 ve 3

Diğer cevabımı gör.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.