BBC BASIC
Rev 1 Code Golfed, 655 caractères ASCII, taille de fichier à jetons 614
Quelques améliorations majeures à la table de données, en hachant la chaîne A.B..N
à un nombre (1*A+2*B+..n*N)+n
avant de rechercher, et en stockant un seul vecteur de traduction (l'autre est généré par le code.) Plus d'explications quand j'ai fini de jouer au golf.
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
Rév 0 Code golfé, 770 caractères ASCII, taille de fichier à jetons 728
Tout ce que j'ai fait ici est de supprimer les commentaires, les espaces blancs et les guillemets inutiles, et de mettre tout cela DATA
sur une seule ligne. Il y a certainement de la place pour plus de 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
Explication
Il s'agit d'une continuation de ma réponse précédente de niveau 1, mais j'ai décidé de la publier séparément car elle est plutôt longue.
Niveau 2
Ceci est réalisé par la traduction de mes modèles "niveau 1.5" de ma réponse précédente. Les deux vecteurs de traduction pour chaque pavage sont codés en dur. Je profite du fait qu'un triangle isocèle de base 80 et de hauteur 70 est une très bonne approximation d'un triangle équilatéral, et un triangle rectangle avec vecteur hypoténuse (56,56)
a une longueur d'hypoténuse très proche de 80.
Niveau 3
Pour tracer les doubles, au lieu de tracer une arête du polygone, nous tracons un rayon du milieu de cette arête au centre du polygone. Ceci est perpendiculaire au bord et a une longueur de 1/TAN/(PI/n)
temps du vecteur (u, v) qui à son tour est la moitié de la longueur du bord.
Malheureusement, parce que certains polygones dans les pavages 3.3.3.3.6
et 3.4.6.4
ne sont pas tracés explicitement, ils ne le seraient pas si nous ne faisions que cela. Par conséquent, le rayon s'étend également vers l'extérieur du polygone. L'extension vers l'extérieur est contrôlée par la variable o
.
Par défaut, l'extension est suffisante pour atteindre le centre d'un triangle, mais pour 3.4.6.4
cela, elle doit être étendue davantage afin de dessiner les doubles des carrés qui ne sont pas tracés explicitement. Ainsi, une extension suffisante pour remplir les carrés manquants est appliquée lorsque les hexagones et les triangles sont tracés explicitement, mais l'extension normale est appliquée lorsque les carrés sont tracés explicitement, pour éviter les lignes parasites dans les triangles adjacents.
Voici à quoi ils ressemblent sans les extensions de rayon. Les trous du double motif sont clairement visibles. La sortie correcte peut être vue dans l'image principale au bas de la réponse
Code commenté
Les différences par rapport à ma réponse précédente sont indiquées en ligne
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
Production
Le programme effectue un seul pavage ou double pour chaque exécution. Cependant, il trace les duels en rouge. Pour économiser de l'espace, j'ai exécuté le programme deux fois sans effacer l'écran afin de superposer le double au-dessus du pavage normal.
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
. Faut-il prendre en charge tous les synonymes, ou juste le plus bas lexicalement (comme indiqué dans la question)? Existe également3.3.3.3.6
sous deux formes d'image miroir. Je comprends que l'un ou l'autre est acceptable.