ปูกระเบื้องกำหนดค่าจุดสุดยอด


11

งาน

ภารกิจคือการเรียงต่อกันรูปหลายเหลี่ยมได้รับการกำหนดค่าจุดสุดยอด

เกณฑ์การให้คะแนน

คะแนนของคุณเท่ากับ "ระดับความซับซ้อน" ที่คุณส่งถึง ระดับความซับซ้อนนั้นเพิ่มขึ้นซึ่งหมายความว่าในการเข้าถึง # 3 คุณต้องสนับสนุน # 1 & # 2 ด้วย

การส่งที่ระดับความซับซ้อนเท่ากันนั้นแยกตามจำนวนไบต์ ชนะต่ำสุด

อินพุต

อินพุตเป็นสตริงที่มีการกำหนดค่าจุดสุดยอดซึ่งแสดงถึงตัวเลขที่จุดสุดยอด นั่นคือรายการที่คั่นด้วยจุดของจำนวนเต็มซึ่งแต่ละจำนวนเต็ม (n) หมายถึง n-gon ปกติเชื่อมต่อกันด้วยจุดสุดยอดทั่วไป

ต้องรองรับการกำหนดค่าจุดสุดยอดต่อไปนี้:

  • 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

เอาท์พุท - ระดับความซับซ้อน # 1: รูปยอด

ที่ระดับความซับซ้อนนี้เอาต์พุตเป็นรูปภาพที่แสดงตัวเลขจุดยอดที่สอดคล้องกับอินพุตที่กำหนด

อินพุตถูกเสริมด้วยFเพื่อแสดงว่ารูปยอดควรเป็นผลลัพธ์และไม่ใช่การเรียงแบบเต็ม

ตัวอย่างเช่นF3.6.3.6ให้ตัวเลขจุดสุดยอดนี้:

3.6.3.6 ตัวเลขยอด

เอาท์พุท - ระดับความซับซ้อน # 2: การปูกระเบื้อง

ผลลัพธ์ที่ระดับความซับซ้อนนี้เป็นภาพที่แสดงการปูกระเบื้องที่สม่ำเสมอโดยใช้ตัวเลขจุดยอดที่สอดคล้องกับอินพุตที่กำหนด

ตัวอย่างเช่น3.6.3.6ให้ปูกระเบื้องนี้:

3.6.3.6 การปูกระเบื้อง

ไม่มีข้อ จำกัด เกี่ยวกับสีหรือรูปแบบ (ยกเว้นช่องโหว่)

เอาท์พุท - ระดับความซับซ้อน # 3: การปูกระเบื้องคู่

ในระดับความซับซ้อนนี้ 'ปูกระเบื้องคู่' สามารถเกิดขึ้นได้จากการเรียงต่อกัน สิ่งนี้สามารถทำได้โดยการวาดเส้นจากจุดกึ่งกลางของแต่ละเหลี่ยมไปยังกึ่งกลางของแต่ละเหลี่ยมที่มีขอบ

ปูกระเบื้องคู่ถูกระบุโดย prepending Vการป้อนข้อมูลด้วย

ตัวอย่างเช่นV3.6.3.6ให้เรียงคู่สองอัน (สีแดง):

การปูกระเบื้อง V3.6.3.6


บางส่วนของแนวหินเหล่านี้มีความหมายเหมือนกัน ตัวอย่างเช่นต่อไปนี้เหมือนกันทั้งหมด: 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. เราจำเป็นต้องสนับสนุนคำพ้องความหมายทั้งหมดหรือเพียงแค่คำย่อต่ำสุด (ตามที่กำหนดในคำถาม) หรือไม่ นอกจากนี้ยัง3.3.3.3.6มีอยู่ในสองรูปแบบภาพสะท้อน ฉันเข้าใจว่าเป็นที่ยอมรับ
เลเวลริเวอร์เซนต์

หน้าที่คุณลิงก์ไม่ตรงกับรายการที่ให้ไว้ 3.3.3.4.4หายไปเช่น en.wikipedia.org/wiki/…ตรงกับรายการของคุณทุกประการ ฉันเข้าใจว่าเค้าร่างหรือรูปหลายเหลี่ยมที่กรอกไว้เป็นที่ยอมรับ (หรือทั้งสองอย่างรวมกันหรือไม่) มีคู่อยู่ในรายการแล้ว ตัวอย่างเช่น4.4.4.4คู่ของตัวเอง3.3.3.3.3.3และ6.6.6เป็นคู่ร่วมกัน เนื่องจากคู่ถูกแสดงอย่างอิสระจากพ่อแม่ของพวกเขาฉันเข้าใจว่าไม่จำเป็นต้องมีการจัดตำแหน่งที่ถูกต้องกับผู้ปกครอง
เลเวลริเวอร์เซนต์

คุณต้องสนับสนุนอินพุตตามที่ปรากฏในรายการ - คุณอาจสนับสนุนคำพ้องความหมาย แต่คุณไม่จำเป็นต้อง - คุณต้องสนับสนุนคู่ทุกคนแม้กระทั่งคู่ตนเอง
jsh

ร่าง / เติม - ดีทั้งสองวิธี อนุญาตให้ใส่สไตล์ใดก็ได้นอกเหนือจากช่องว่าง (ทำให้ทุกอย่างเป็นสีขาว, ทำให้พื้นที่วาดเล็ก ๆ ฯลฯ ) ไม่จำเป็นต้องมีการจัดตำแหน่ง ฉันสามารถบอกคุณว่าคุณไม่ได้รับอนุญาตให้ใช้ภาพสะท้อนเดียว3.3.3.3.6แต่คุณจะรู้ได้อย่างไรว่าภาพนั้นเป็นภาพใด :)
jsh

ตอนนี้คุณเปลี่ยนการให้คะแนนแล้วไทเบรกคืออะไร? นี่เป็นรหัสที่สั้นที่สุดหรือไม่ ถ้าเป็นเช่นนั้นการกำหนดค่าจุดสุดยอดจะต้องมีการคั่นด้วยจุดหรือเราสามารถเลือกสัญลักษณ์อื่นเช่นเครื่องหมายจุลภาคหรือช่องว่าง?
เลเวลริเวอร์เซนต์

คำตอบ:


9

BBC BASIC

Rev 1 รหัส Golfed, 655 อักขระ ASCII, ขนาดไฟล์โทเค็น 614

การปรับปรุงที่สำคัญบางอย่างในตารางข้อมูลโดยการแปลงสตริงA.B..Nเป็นตัวเลข(1*A+2*B+..n*N)+nก่อนค้นหาและโดยการจัดเก็บเวกเตอร์การแปลเพียงหนึ่งรายการ (อีกอันหนึ่งถูกสร้างขึ้นโดยรหัส) คำอธิบายเพิ่มเติมเมื่อฉันเล่นกอล์ฟเสร็จแล้ว

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, 770 ตัวอักษร ASCII, ขนาดไฟล์โทเค็น 728

สิ่งที่ฉันทำที่นี่คือลบความคิดเห็นช่องว่างที่ไม่จำเป็นและเครื่องหมายคำพูดและใส่ทั้งหมดDATAในบรรทัดเดียว มีที่ว่างสำหรับเล่นกอล์ฟเพิ่มขึ้นอย่างแน่นอน

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

คำอธิบาย

นี่คือความต่อเนื่องของคำตอบระดับ 1 ก่อนหน้าของฉัน แต่ฉันตัดสินใจที่จะโพสต์แยกต่างหากเพราะมันค่อนข้างยาว

ระดับ 2

สิ่งนี้ทำได้โดยการแปลเทมเพลต "ระดับ 1.5" ของฉันจากคำตอบก่อนหน้าของฉัน เวกเตอร์การแปลสองแบบสำหรับการเรียงต่อกันแต่ละครั้งจะถูกฮาร์ดโค้ด ฉันใช้ประโยชน์จากความจริงที่ว่าสามเหลี่ยมหน้าจั่วของฐาน 80 และความสูง 70 คือการประมาณที่ดีมากของรูปสามเหลี่ยมด้านเท่าและสามเหลี่ยมมุมฉากกับเวกเตอร์ด้านตรงข้ามมุมฉาก(56,56)มีความยาวด้านตรงข้ามมุมฉากมากถึง 80

ระดับ 3

ในการพล็อต duals แทนที่จะพล็อตขอบของรูปหลายเหลี่ยมเราพล็อตก้านจากกึ่งกลางของขอบนั้นไปยังกึ่งกลางของรูปหลายเหลี่ยม นี่คือมุมฉากกับขอบและมีความยาว1/TAN/(PI/n)เท่าของเวกเตอร์ (u, v) ซึ่งจะยาวครึ่งหนึ่งเท่ากับขอบ

น่าเสียดายที่เนื่องจากรูปหลายเหลี่ยมบางรูปแบบในแนวเอียง3.3.3.3.6และ3.4.6.4ไม่ได้วางแผนไว้อย่างชัดเจนพวกมันจะไม่ถูกพล็อตถ้าเราทำสิ่งนี้เท่านั้น ดังนั้นก้านจึงขยายออกไปด้านนอกจากรูปหลายเหลี่ยม oส่วนขยายออกไปด้านนอกจะถูกควบคุมโดยตัวแปร

โดยค่าเริ่มต้นส่วนขยายก็เพียงพอที่จะไปยังกึ่งกลางของรูปสามเหลี่ยม แต่3.4.6.4จำเป็นต้องขยายเพิ่มเติมเพื่อดึงคู่ของสี่เหลี่ยมที่ไม่ได้วางแผนไว้อย่างชัดเจน มีการใช้ส่วนขยายมากพอที่จะเติมลงในสี่เหลี่ยมที่ขาดหายไปเมื่อมีการพล็อตรูปหกเหลี่ยมและรูปสามเหลี่ยมอย่างชัดเจน แต่ส่วนขยายปกติจะถูกนำมาใช้เมื่อมีการพล็อตสแควร์อย่างชัดเจนเพื่อหลีกเลี่ยงเส้นปลอมในสามเหลี่ยมที่อยู่ติดกัน

นี่คือสิ่งที่พวกเขาดูเหมือนไม่มีส่วนขยายที่พูด สามารถเห็นรูในลวดลายคู่ได้อย่างชัดเจน ผลลัพธ์ที่ถูกต้องสามารถเห็นได้ในภาพหลักที่ด้านล่างของคำตอบ

ป้อนคำอธิบายรูปภาพที่นี่

แสดงความคิดเห็นรหัส

ความแตกต่างจากคำตอบก่อนหน้านี้ของฉันจะแสดงแบบอินไลน์

  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

เอาท์พุต

โปรแกรมดำเนินการเพียงหนึ่งการเรียงต่อกันหรือสองครั้งสำหรับการรันแต่ละครั้ง อย่างไรก็ตามมันจะแปลงค่า duals เป็นสีแดง เพื่อประหยัดพื้นที่ฉันรันโปรแกรมสองครั้งโดยไม่ต้องล้างหน้าจอเพื่อวางซ้อนทับสองด้านบนของการปูกระเบื้องทั่วไป

ป้อนคำอธิบายรูปภาพที่นี่


8

มาติกา

ระดับ 1 ประกอบด้วยแม่แบบไทล์พื้นฐานที่ถูกประทับซ้ำ ๆ เพื่อเรียงต่อกันระนาบ

ระดับ 2 ปูกระเบื้อง

ยังมีอีก 2 เอียงที่ฉันไม่สามารถทำได้ ดูเหมือนว่าต้องมีการหมุนและการแปล

ระดับ 1: ยอดจุดสุดยอด (559 ไบต์)

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

การทดสอบ

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

แสตมป์


ระดับ 2: การปูกระเบื้อง (690 ไบต์เพิ่มเติม)

กฎจะคืนค่าการเรียงต่อกันใหม่และการเยื้องสำหรับแต่ละการกำหนดค่า

r เป็นฟังก์ชั่นพื้นฐานที่ส่งผลให้เอียง

pแสดงเทมเพลตและการเรียงต่อกันที่เกี่ยวข้อง ช่องว่างสีขาวสอดคล้องกับที่ไม่ครอบคลุมโดยแม่แบบ

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

การทดสอบ

ปูกระเบื้องสามเหลี่ยม

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

เป็นรูปสามเหลี่ยม


หกเหลี่ยม

p[{6, 6, 6}]

หกเหลี่ยม


สี่เหลี่ยม

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

สี่เหลี่ยม


ไม่ทราบ

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

archimedes1


ตารางที่ถูกตัดทอน

p[{4, 8, 8}]

ตารางที่ถูกตัดทอน


trihexagonal

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

trihexagonal


ถูกตัดหกเหลี่ยม

p[{3, 12, 12}]

ถูกตัดหกเหลี่ยม


ไม่มีชื่อ

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

ลาด


เป็นรูปสามเหลี่ยมยาว

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

เป็นรูปสามเหลี่ยมยาว


การเอียงเพื่อคิดออก

ซ้าย


ฉันค่อนข้างจะอยู่บนเวทีเดียวกับคุณ ฉันสามารถสร้างกระเบื้องได้ แต่การทำงานกับกระเบื้องจะใช้เวลาสักหน่อย wiki steveverill โพสต์ในประเภทความคิดเห็นของเขาทำให้ดูเหมือนว่ารูปแบบต่างๆที่จำเป็นต้องได้รับการสนับสนุน จำเป็นต้องศึกษานิดหน่อย :)
MickyT

มิกกี้การกระจัดในแนวตั้งและแนวนอนของกระเบื้องจะขึ้นอยู่กับหมายเลขแถว, หมายเลข col. ใช้ offsets ที่ไม่ซ้ำกับกรณีที่อยู่ในมือ ฉันกำลังทำมันทีละคนและจะพูดคุยกันในภายหลัง
DavidC

@DavidCarraher เริ่มต้นที่ดี ฉันได้ทำการเปลี่ยนแปลงเกณฑ์การให้คะแนนที่อาจส่งผลกระทบต่อคุณ
jsh

ดีมาก! หากคุณลดการแปลในแนวนอนลง3.3.3.3.3.3ครึ่งหนึ่งเพื่อให้หน่วยทับซ้อนคุณสามารถกำจัดเพชรเหล่านั้นและแก้ไขการเรียงต่อกันนั้น คุณยังมีอื่น ๆ อีกมากมายที่จะทำใน3.3.3.3.6, 3.4.6.4และ4.6.12แม้ว่า
เลเวลริเวอร์เซนต์

เรื่อง4.6.12 anyone know what it should look like?- ทุก tilings ต้องอยู่ที่en.wikipedia.org/wiki/... ดูความคิดเห็นของฉันในคำถาม นี่คือหน้าอื่นที่กล่าวถึงในคำถาม แต่4.6.12ก็ยังปรากฏอยู่ในหน้านั้นอยู่ดี
ระดับแม่น้ำเซนต์

6

R

ขั้นตอนที่ 1

นี่คือความพยายามของฉันในการสร้างกระเบื้อง กำลังจะปูกระเบื้องต่อไป สิ่งนี้ไม่ได้ตรวจสอบอินพุตดังนั้น Invalids จะวาดไพ่แปลก ๆ อินพุตถูกพิมพ์หลังบรรทัดแรก

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

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ # 1, # 2 & # 3: 1898

ในที่สุดก็กลับไปที่มัน สิ่งนี้ส่วนใหญ่เกิดขึ้นจากการตั้งค่าออฟเซ็ตและจัดการกรณีพิเศษ :) แก้ไข: จัดการ V flag สำหรับ duals แล้ว

กระบวนการทั่วไปคือ:

  • รับอินพุตและสร้างรายการ
  • สร้างรายการมุมเพื่อวาดไทล์เริ่มต้น
  • คำนวณจุดกึ่งกลางของรูปหลายเหลี่ยมแต่ละอันให้มันเรียงต่อกันเป็นรูปสี่เหลี่ยมขนมเปียกปูน
  • กำหนดชุดกระเบื้องที่กำลังวาดและทำรายการออฟเซ็ตมุม กระเบื้องบางแผ่นมีรูปหลายเหลี่ยมเพิ่มเข้ามาเพื่อช่วยในการอุดรู
  • วาดกระเบื้อง
  • วาดเส้นคู่

ฉันอาจจะยังคงเล่นกอล์ฟนี้อีกเล็กน้อย

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

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


ว้าวเพียง 4 ชั่วโมงหลังฉัน และพวกเขาก็ดูดีเช่นกัน +1! คุณมีทุกกรณีที่ทำงานหรือยัง
เลเวลริเวอร์เซนต์

@ สตีฟเวอร์ริลล์ขอบคุณและใช้ได้กับทุกกรณีในคำถาม
MickyT

4

BBC BASIC

ดาวน์โหลดโปรแกรมจำลองที่http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

ระดับ 1

ป้อนคำอธิบายรูปภาพที่นี่

ระดับ 1.5

ระดับ 1.5 เป็นชื่อของฉันเอง แต่มันเป็นเหตุการณ์สำคัญในวิธีการของฉัน

การแปลตัวเลขจุดสุดยอดนั้นไม่ได้นำไปสู่การเรียงแบบที่ถูกต้องเสมอไป ในบางกรณีบรรทัดหายไป

วิธีแก้ปัญหาของฉันคือวนรอบรูปหลายเหลี่ยมที่ใหญ่ที่สุดวาดรูปจุดยอดสำหรับจุดยอดที่สองของรูปหลายเหลี่ยมนั้น นี่เป็นวิธีแก้ปัญหาทั่วไปสำหรับทุกกรณี โปรดทราบว่ารูปหลายเหลี่ยมที่ใหญ่ที่สุดมักมีจำนวนด้านเท่ากันและตัวเลขจุดสุดยอดมักจะสลับตามเข็มนาฬิกา / ทวนเข็มนาฬิกาเมื่อคุณไปรอบรูปหลายเหลี่ยม สิ่งนี้สามารถมองเห็นได้ชัดเจนที่สุดด้วย4.6.12แต่มันก็เป็นจริง4.8.8และ3.12.12: เมื่อดูจาก 8-gon หรือ 12-gon ใด ๆ จุดยอดสลับเป็นภาพสะท้อนของกันและกัน นี่เป็นสิ่งที่เกิดขึ้นค่อนข้างชัดเจนด้วย3.3.3.4.4และ3.3.4.3.4เมื่อมองจากจตุรัสใด ๆ จุดยอดสลับเป็นภาพสะท้อนของกันและกัน

อัลกอริทึมที่ฉันใช้ในการเคลื่อนย้าย 2 ด้านรอบ ๆ รูปหลายเหลี่ยมนั้นจะทำซ้ำ 14 ครั้งของลูปการวาดขอบ 8 คือปัจจัย 16 ดังนั้นเมื่อการวาดรูปแปดเหลี่ยมเคอร์เซอร์กราฟิกสิ้นสุดที่ 16-14 = 2 จุดยอดหลังที่มันเริ่ม 3- 4- 6- และ 12- gons ทั้งหมดมีด้านที่เป็นปัจจัย 12 ดังนั้นเคอร์เซอร์กราฟิกสิ้นสุดที่ 14-12 = 2 จุดยอดก่อนที่มันเริ่ม

ตัวเลขสามารถดูได้ด้านล่าง พรุ่งนี้ฉันหวังว่าจะได้งานแปลที่ถูกต้องเพื่อปูกระเบื้องให้สมบูรณ์ ในทุกกรณีบรรทัดที่เพียงพอจะถูกวาดให้เสร็จสมบูรณ์ในระดับ 2 พร้อมคำแปลเท่านั้น ในบางกรณีมีการวาดมากกว่าจำนวนขั้นต่ำที่ต้องการ แต่ไม่มีปัญหาในการทับซ้อน: กฎไม่พูดอะไรเลยเกี่ยวกับการวาดเส้นเพียงครั้งเดียว :-)

โดยทั่วไปรูปหลายเหลี่ยมที่ใหญ่ที่สุดคืออันสุดท้ายในรายการ มีโชคไม่ดีที่กรณีนี้ไม่เป็นเช่นนั้น: 3.4.6.4ดังนั้นตัวเลขที่วาดในกรณีนี้จึงอยู่กึ่งกลางของรูปสี่เหลี่ยมแทนที่จะเป็นรูปหกเหลี่ยม มีบรรทัดเพียงพอที่จะดำเนินการในระดับ 2 โดยใช้การแปลเท่านั้นแม้ว่าจะมีบางช่องที่ไม่ได้วาดอย่างชัดเจน นี่จะนำเสนอปัญหาบางอย่างในระดับ 3 (โชคดีฉันคิดว่าฉันรู้วิธีแก้ปัญหานี้) ในทำนองเดียวกัน3.3.3.3.6มีบรรทัดเพียงพอที่จะดำเนินการในระดับ 2 โดยใช้การแปลเท่านั้น แต่จะมีรูปสามเหลี่ยมบางรูปที่ไม่ได้วาดอย่างชัดเจน

ป้อนคำอธิบายรูปภาพที่นี่

รหัส

รหัสสำหรับระดับ 1.5 ถูกใส่เครื่องหมายเอาความคิดเห็นเฉพาะรหัสสำหรับระดับ 1 เท่านั้นที่เปิดใช้งาน REMมีสี่เส้นเริ่มต้นด้วยการเป็น ลบสิ่งเหล่านี้REMเพื่อเปิดใช้งานระดับ 1.5

  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

ระดับ 2 และ 3

ดูคำตอบอื่นของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.