แก้ Grid-Tangram


22

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

ตารางกริด

เราสามารถวาดสี่เหลี่ยมจัตุรัส Tangram "มาตรฐาน" ลงในสี่เหลี่ยมจัตุรัสที่ใหญ่กว่าซึ่งแบ่งออกเป็นตารางย่อยเป็นสี่เหลี่ยมจัตุรัสเล็ก ๆ 16 อัน tangrams เป็นเพียงรูปทรงที่สร้างขึ้นจากชิ้นส่วน tangram เช่นว่าจุดยอดทั้งหมดของชิ้นส่วนที่อยู่ในจุดตาราง

นี่คือปริศนา Tangram ประเภทที่เราต้องการพิจารณาในการท้าทายนี้เนื่องจากพวกมันอาจจะจัดการได้ง่ายกว่าปริศนาทั่วไป

ตามหมายเหตุด้าน: นักคณิตศาสตร์จีน Chuan-Chin Hsiung และ Fu Traing Wang พิสูจน์ในปี 1942 ว่ามีเพียง 13 tangrams นูน ก่อนอื่นพวกเขาแสดงให้เห็นว่าปัญหาสามารถลดลงเป็นเส้นตารางกราฟแล้วใช้อาร์กิวเมนต์ combinatorial และเรขาคณิต เหล่านี้คือทั้งหมดที่ 13:

ท้าทาย

ให้แกรมแกรมที่แก้ไขได้เอาท์พุทการแยกแกรมแกรมออกเป็นเจ็ดแกรม

IO

tangram ให้เป็นภาพขาวดำ (รูปร่างเป็นสีดำ, พื้นหลังเป็นสีขาว) โดยทั้งสองฝ่ายทวีคูณ 50px ตารางมีความกว้าง 50px ที่แน่นอน เส้นกริดนั้นขนานกับด้านข้างของภาพ

แก้ไข: ภาพที่สามารถยอมรับได้เป็นอินพุตและส่งกลับเป็นเอาท์พุทในรูปแบบภาพแรสเตอร์ใด ๆ ที่สะดวกเช่น PNG, TIFF, PBM ฯลฯ แต่การแสดงเป็นอาร์เรย์ไบนารี 2D หรือสตริงหรือเมทริกซ์เป็นที่ยอมรับ

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

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

ตัวอย่างอินพุตและเอาต์พุต:

ตัวอย่าง:

การแก้ปัญหาที่เป็นไปได้:


การประมวลผลภาพเป็นสิ่งกีดขวางที่ไม่จำเป็นโดยสิ้นเชิงในความท้าทายนี้ ฉันจะพบว่ามันน่าสนใจยิ่งขึ้นถ้าคุณเพิ่งระบุอินพุตเป็นอาร์เรย์ไบนารีขนาดเล็ก
Sparr

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

3
ฉันเป็นหนึ่งในคนที่แนะนำว่าสิ่งที่นำเข้าและส่งออกเป็นอย่างที่เป็นและฉันก็ทำตามคำแนะนำเพราะในความคิดของฉันวิธีที่เป็นธรรมชาติและเหมาะสมที่สุดที่จะนำเสนอความท้าทาย Tangram รูปแบบใด ๆ ของอินพุต / เอาต์พุตจะมีจำนวนไบต์ที่มีนัยสำคัญดังนั้นฉันไม่คิดว่านี่เป็นปัญหาจริงๆ
El'endia Starman

1
ฉันเห็นด้วยกับ Elendia ปัญหาเดียวของกราฟิก I / O คือสามารถ จำกัด ภาษาที่ไม่มีระบบกราฟิกได้ ที่กล่าวว่า PBM และ PGM นั้นใกล้กับ ASCII มากจนไม่มีปัญหาจริงหากเป็นกรณีที่ผู้คนตระหนักถึงรูปแบบดังกล่าว en.wikipedia.org/wiki/Netpbm_format
เลเวลริเวอร์เซนต์

1
@ LevelRiverSt นั่นเป็นจุดที่ดีฉันคิดว่ามันจะเป็น accepptable อย่างสมบูรณ์ในการใช้รูปแบบเหล่านั้นหรือแม้กระทั่งเช่นอาร์เรย์ 2d / สตริงของศูนย์และคน
ข้อบกพร่อง

คำตอบ:


31

BBC BASIC, 570 514 490 bytes ASCII

ดาวน์โหลดล่ามได้ที่http://www.bbcbasic.co.uk/bbcwin/download.html

โทเค็น 435 ไบต์

โปรแกรมแบบเต็มแสดงอินพุตจากL.bmpบนหน้าจอจากนั้นแก้ไขเพื่อค้นหาวิธีแก้ไข

*DISPLAY L
t=PI/8q=FNa(1)
DEFFNa(n)IFn=7END
LOCALz,j,p,i,c,s,x,y,m,u,v
F.z=0TO99u=z MOD10*100v=z DIV10*100ORIGINu,v
F.j=0TO12S.4p=0F.i=j+3TOj+9S.2c=9*COS(i*t)s=9*SIN(i*t)p=p*4-(POINT(c,s)<>0)*2-(POINT(9*c,9*s)<>0)N.
m=n:IFn=5A.(43A.p)=0p=0m=7
IF(ASCM."??O|(C",n)-64A.p)=0THEN
F.i=-1TO0GCOL0,-i*n:c=99*COS(j*t)s=99*SIN(j*t)y=402/3^m MOD3-1MOVE-c-s*y,c*y-s:x=n<3MOVEc*x-s*x,s*x+c*x:x=2778/3^m MOD3-1y=5775/3^m MOD3-1PLOT85-32*(n MOD6>3),c*x-s*y,s*x+c*y:IFi q=FNa(n+1)ORIGINu,v
N.
ENDIF
N.N.=0

คำอธิบาย

โปรดทราบว่าใน BBC พื้นฐานระยะทาง 1 พิกเซล = 2 หน่วยดังนั้นกริด 50x50 พิกเซลจึงกลายเป็นกริด 100x100

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

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

การวางรูปร่างแต่ละครั้งจะพยายามที่พิกัด x, y ที่แตกต่างกันและในการหมุน 4 แบบที่แตกต่างกัน เพื่อทดสอบว่ามีพื้นที่ว่างในการวาดรูปร่างหรือไม่เราใช้เทมเพลตด้านล่างพร้อมมุม 45 องศา การหมุนเกิดขึ้นเกี่ยวกับการ*ทดสอบ 8 พิกเซลและในรัศมีครึ่งวงกลม 9 และ 81 หน่วยและตกหล่นบนเส้นที่แผ่ที่ทวีคูณของ 22.5 องศาถึงแกน x และ y

สำหรับสามเหลี่ยมขนาดใหญ่จำเป็นต้องมีช่องว่างทั้ง 8 ช่อง สำหรับรูปร่างอื่น ๆ มีเพียงบางเซลล์เท่านั้นที่ต้องล้างเพื่อใช้มาสก์

+----+----   Shape             Mask HGFEDCBA Mask decimal 
|\ E/|\G /  
| \/F|H\/    1,2. Large triangle    11111111    -1
|C/\ | /     3. Med triangle        00001111    15
|/ D\|/      4. Square              00111100    60
+----*       5. Parallelogram       11101000   -24
|\ B/        6. Small triangle      00000011     3
|A\/         7. Parallogr reversed  00101011    43
| /          Note: reversed parallelogram is checked/drawn at recursion depth n=5
|/           with a special check, but the coordinates are encoded as m=7.  

เมื่อมีการสร้างรูปร่างที่พอดีจะต้องวาด ถ้ามันเป็นรูปสามเหลี่ยมมันถูกพล็อตด้วยPLOT 85ถ้าเป็นรูปสี่เหลี่ยมด้านขนานจำนวนนั้นสูงกว่า 32 (โปรดทราบว่าสำหรับPLOTวัตถุประสงค์ที่เราพิจารณาสี่เหลี่ยมเป็นรูปสี่เหลี่ยมด้านขนานพิเศษ) ในทั้งสองกรณีต้องมีการวางจุดยอด 3 จุดติดต่อกัน จุดสุดยอดที่สองคือต้นกำเนิดของรูปร่าง (ทำเครื่องหมาย*ในตารางด้านบน) ยกเว้นในกรณีของรูปสามเหลี่ยมขนาดใหญ่โดยที่ (ก่อนการหมุน) เป็น-1,-1.จุดยอดอีก 2 จุดสามารถมีพิกัด x และ y -1,0 or 1ซึ่งสกัดจากฐาน 3 หมายเลขเข้ารหัสปรับขนาดแล้วโดย 99 และหมุนได้ตามความจำเป็นโดยการเปลี่ยนแปลงด้วยและ cs

รหัสไม่ได้รับการตอบ

  *DISPLAY L
  t=PI/8                                          :REM Constant 22.5 degrees.
  q=FNa(1)                                        :REM Call function, return dummy value to q
  END                                             :REM End the program gracefully if no solution. Absent in golfed version.

  DEFFNa(n)                                       :REM Recursive function to place shapes.
  IFn=7END                                        :REM If n=7 solution found, end program.
  LOCALk,z,j,p,i,c,s,x,y,m,u,v                    :REM declare local variables for function.
  k=ASCMID$("??O|(C",n)-64                        :REM Bitmasks for big tri, big tri, med tri, sq, normal paralellogram, small tri.
  FORz=0TO99                                      :REM For each point on the grid
    u=z MOD10*100:v=z DIV10*100                   :REM calculate its x and y coordinates relative to bottom left of screen
    ORIGINu,v                                     :REM and set the origin to this point.
    FORj=0TO12STEP4                               :REM For each rotation 0,90,180,270deg
      p=0                                         :REM assume no non-black pixels found
      FORi=j+3TOj+9STEP2                          :REM test angles of 3,5,7,9 times 22.5 deg anticlockwise from right x axis.
        c=9*COS(i*t)                             :REM Coords of test points at radius ll
        s=9*SIN(i*t)
        p*=4                                      :REM Leftshift any existing data in p
        p-=(POINT(c,s)<>0)*2+(POINT(9*c,9*s)<>0)  :REM and check pixels at radius 11 and 99.
      NEXT
      m=n                                         :REM The index of the shape to plot normally corresponds with recursion depth n.
      IF n=5 AND (43ANDp)=0 p=0:m=7               :REM If n=5 check if a reverse parallelogram is possible (mask 43). If so, clear p and change m to 7.
      REM                                         :REM Check p against mask k, if the shape fits then...
      IF (k ANDp)=0 THEN
        FOR i=-1 TO 0                               :REM draw the shape in colour, and if deeper recursions prove unsuccesful, redraw it in black.
          GCOL0,-i*n                                :REM Colour is equal to n.
          c=99*COS(j*t)                             :REM Set parameters c and s for scaling by 99
          s=99*SIN(j*t)                             :REM and rotation by 0,90,180 or 270 as appropriate.
          x=-1                                      :REM For vertex 1, x=-1 always.
          y=402/3^m MOD3-1                          :REM Lookup y value for vertex 1.
          MOVEc*x-s*y,s*x+c*y                       :REM Use c and s to transform the vertex and move to it.
          x=n<3                                     :REM For vertex 2, coords are 0,0 except for large triangle where they are -1,-1
          y=x                                       :REM in BBC BASIC, TRUE=-1
          MOVEc*x-s*y,s*x+c*y                       :REM Use c and s to transform the vertex and move to it.
          x=2778/3^m MOD3-1                         :REM Lookup x and y value for vertex 3.
          y=5775/3^m MOD3-1                         :REM PLOT85 uses last 2 points + specified point to make triangle, PLOT85+32 makes paralelogram (or square.)
          PLOT85-32*(n MOD6>3),c*x-s*y,s*x+c*y      :REM Use c and s to transform the vertex and draw shape.
          IFi q=FNa(n+1):ORIGINu,v                  :REM If i=-1 recurse to next level. If it fails, reset the origin before replotting this level's shape in black.
        NEXT
      ENDIF
    NEXT
  NEXT
  =0                                                :REM Dummy value to return from function

เอาท์พุต

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

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


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