BBC BASIC
Rev 1 Golfed Code, 655 ASCII-Zeichen, tokenisierte Dateigröße 614
Einige wichtige Verbesserungen an der Datentabelle, indem der String vor dem Nachschlagen A.B..N
auf eine Zahl (1*A+2*B+..n*N)+n
gehasht und nur ein Übersetzungsvektor gespeichert wird (der andere wird durch Code generiert). Weitere Erklärungen, wenn ich mit dem Golfen fertig bin.
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 Golfed Code, 770 ASCII-Zeichen, tokenisierte Dateigröße 728
Alles, was ich hier getan habe, ist, Kommentare, unnötige Leerzeichen und Anführungszeichen zu entfernen und alles DATA
in eine Zeile zu setzen. Es gibt sicherlich Platz für mehr Golf.
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
Erläuterung
Dies ist eine Fortsetzung meiner vorherigen Antwort auf Stufe 1, aber ich habe beschlossen, sie separat zu veröffentlichen, da sie ziemlich lang ist.
Level 2
Dies wird durch die Übersetzung meiner "Level 1.5" -Vorlagen aus meiner vorherigen Antwort erreicht. Die zwei Translationsvektoren für jede Kachelung sind fest codiert. Ich nutze die Tatsache, dass ein gleichschenkliges Dreieck der Basis 80 und der Höhe 70 eine sehr gute Annäherung an ein gleichseitiges Dreieck darstellt und ein rechtwinkliges Dreieck mit Hypotenusenvektor (56,56)
eine Hypotenusenlänge sehr nahe bei 80 hat.
Stufe 3
Um die Duals zu zeichnen, zeichnen wir anstelle einer Kante des Polygons eine Speiche von der Mitte dieser Kante bis zur Mitte des Polygons. Dieser ist rechtwinklig zur Kante und hat die Länge des 1/TAN/(PI/n)
Vektors (u, v), der wiederum halb so lang ist wie die Kante.
Unglücklicherweise werden bestimmte Polygone in Pflasterungen 3.3.3.3.6
und 3.4.6.4
nicht explizit aufgetragen sind, würden sie nicht aufgetragen werden , wenn wir dies nur tat. Daher erstreckt sich die Speiche auch vom Polygon nach außen. Die Ausdehnung nach außen wird von der Variablen gesteuert o
.
Standardmäßig reicht die Erweiterung aus, um die Mitte eines Dreiecks zu erreichen. 3.4.6.4
Sie muss jedoch weiter erweitert werden, um die Dualen der Quadrate zu zeichnen, die nicht explizit dargestellt werden. Wenn also Sechsecke und Dreiecke explizit dargestellt werden, wird eine ausreichende Erweiterung angewendet, um die fehlenden Quadrate auszufüllen. Die normale Erweiterung wird jedoch angewendet, wenn Quadrate explizit dargestellt werden, um störende Linien in den benachbarten Dreiecken zu vermeiden.
So sehen sie ohne die Speichenerweiterungen aus. Die Löcher im Doppelmuster sind deutlich zu erkennen. Die korrekte Ausgabe ist im Hauptbild am Ende der Antwort zu sehen
Kommentierter Code
Unterschiede zu meiner vorherigen Antwort werden inline angezeigt
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
Ausgabe
Das Programm führt für jeden Lauf nur eine Kachelung oder eine Doppelkachelung durch. Die Duals werden jedoch rot dargestellt. Um Platz zu sparen, habe ich das Programm zweimal ausgeführt, ohne den Bildschirm zu löschen, um das Dual über die regulären Kacheln zu legen.
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
. Müssen wir alle Synonyme unterstützen oder nur das lexikalisch niedrigste (wie in der Frage angegeben)? Auch3.3.3.3.6
existiert in zwei spiegelbildlichen Formen. Ich verstehe, dass beides akzeptabel ist.