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..N
bir sayıya ayırarak ve (1*A+2*B+..n*N)+n
yalnı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 DATA
tek 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.6
ve 3.4.6.4
açı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.4
açı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.
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.
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.6
iki ayna görüntüsü formunda bulunur. Ben de kabul edilebilir anlıyorum.