BBC CƠ BẢN
Rev 1 Mã được đánh gôn, 655 ký tự ASCII, kích thước tệp được mã hóa 614
Một số cải tiến lớn đối với bảng dữ liệu, bằng cách băm chuỗi A.B..N
thành một số (1*A+2*B+..n*N)+n
trước khi tra cứu và chỉ lưu trữ một vectơ dịch (cái còn lại được tạo bởi mã.) Giải thích thêm khi tôi đã chơi golf xong.
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 Mã được đánh gôn, 770 ký tự ASCII, kích thước tệp được mã hóa 728
Tất cả những gì tôi đã làm ở đây là xóa các bình luận, khoảng trắng và dấu ngoặc kép không cần thiết và đặt tất cả các dòng DATA
trên một dòng. Chắc chắn có chỗ để chơi gôn nhiều hơn.
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
Giải trình
Đây là phần tiếp theo của câu trả lời Cấp 1 trước đây của tôi, nhưng tôi đã quyết định đăng riêng vì nó khá dài.
Cấp độ 2
Điều này đạt được bằng cách dịch các mẫu "cấp 1,5" từ câu trả lời trước của tôi. Hai vectơ dịch cho mỗi ốp lát được mã hóa cứng. Tôi lợi dụng thực tế là một tam giác cân của cơ sở 80 và chiều cao 70 là một xấp xỉ rất tốt của một tam giác đều, và một tam giác vuông có vectơ cạnh huyền (56,56)
có độ dài cạnh huyền rất gần với 80.
Cấp 3
Để vẽ đồ thị đối ngẫu, thay vì vẽ một cạnh của đa giác, chúng ta vẽ một ô nói từ giữa cạnh đó đến trung tâm của đa giác. Đây là góc vuông với cạnh và có độ dài 1/TAN/(PI/n)
thời gian của vectơ (u, v) lần lượt dài bằng một nửa so với cạnh.
Thật không may, vì một số đa giác nhất định trong các nghiêng 3.3.3.3.6
và 3.4.6.4
không được vẽ rõ ràng, chúng sẽ không được vẽ nếu chúng ta chỉ làm điều này. Do đó, nói cũng mở rộng ra từ đa giác. Phần mở rộng ra bên ngoài được điều khiển bởi biến o
.
Theo mặc định, phần mở rộng là đủ để đến trung tâm của một hình tam giác, nhưng đối với 3.4.6.4
nó cần phải được mở rộng nhiều hơn để vẽ các hình vuông của các hình vuông không được vẽ rõ ràng. Vì vậy, phần mở rộng đủ để điền vào các ô vuông bị thiếu được áp dụng khi các hình lục giác và hình tam giác được vẽ rõ ràng, nhưng phần mở rộng bình thường được áp dụng khi hình vuông được vẽ rõ ràng, để tránh các đường thẳng trong các hình tam giác liền kề.
Đây là những gì họ trông giống như không có phần mở rộng nói. Các lỗ trong mô hình kép có thể được nhìn thấy rõ ràng. Đầu ra chính xác có thể được nhìn thấy trong hình chính ở dưới cùng của câu trả lời
Mã nhận xét
Sự khác biệt so với câu trả lời trước của tôi được chỉ định nội tuyế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
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
Đầu ra
Chương trình chỉ thực hiện một lát hoặc kép cho mỗi lần chạy. Tuy nhiên, nó vẽ đồ thị màu đỏ. Để tiết kiệm không gian, tôi đã chạy chương trình hai lần mà không xóa màn hình để đặt chồng lên trên lớp ốp thông thường.
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
. Chúng ta có phải hỗ trợ tất cả các từ đồng nghĩa, hoặc chỉ từ đồng nghĩa thấp nhất (như được đưa ra trong câu hỏi) không? Ngoài ra,3.3.3.3.6
tồn tại trong hai hình ảnh phản chiếu. Tôi hiểu một trong hai là chấp nhận được.