Codegolf Penrose Triangle


19

สามเหลี่ยมเพนโรสยังเป็นที่รู้จักในฐานะ tribar เพนโรสหรือ tribar เป็นไปไม่ได้เป็นวัตถุเป็นไปไม่ได้

เป้าหมายในการท้าทายนี้คือการแสดงสามเหลี่ยมเพนโรสในไม่กี่ไบต์ที่เป็นไปได้

สามเหลี่ยมเพนโรส

ที่มา: Wikipedia

กฎ:

  1. คุณต้องแสดงสามเหลี่ยม Penrose แบบดิจิทัลหลังจากสร้างมัน
  2. พวกเขาจะต้องดูเหมือนกับภาพด้านบนของหน้า wiki (แหล่งที่มาด้านบน) โดยไม่ต้องแสดงภาพโดยตรง
  3. ภาพเดียวกันที่มีชุดรูปแบบสีเดียวกันจะต้องแสดงในขนาดอย่างน้อย 400x400
  4. ควรแม่นยำที่สุดเท่าที่จะทำได้

ขอให้โชคดีและสนุก!


2
ฉันคิดว่าสิ่งนี้มีศักยภาพที่จะเป็นความท้าทายที่ยิ่งใหญ่ แต่มีรายละเอียดบางอย่างที่จำเป็นต้องได้รับการชี้แจงเช่นสีของภาพและขนาดของมัน
Kritixi Lithos

5
PS! อย่าท้อแท้เพียงเพราะความท้าทายปิดลง ถ้ามันเป็นความคิดที่ท้าทายความคิดที่ไม่ดีแล้วการโหวตอย่างใกล้ชิดจะมาพร้อมกับ downvotes ... :)
Stewie Griffin

2
@ DigitalTrauma ฉันจะบอกว่าไม่ ที่มีรายละเอียดเพิ่มเติมมากมายที่จะวาด
mbomb007

1
สีเทาใด ๆ ที่ทำหรือมันจะต้องเป็นสีเทาที่แน่นอน? ถ้าเป็นอย่างหลังมันก็ดีที่จะให้โทนสีเทาที่แน่นอนในข้อความท้าทาย
Martin Ender

1
การปันส่วนมุมมองก็จะเป็นประโยชน์เช่นกันหากพวกเขาต้องทำซ้ำอย่างแน่นอน
Martin Ender

คำตอบ:


3

โลโก้129 120 ไบต์

ดึงเฉพาะ 4 ด้านแรกของแต่ละรูปร่าง L จากนั้นยกปากกาย้ายไปยังจุดที่สอดคล้องกันในรูปร่าง L ถัดไปลดปากกาและวาด 4 ด้านของปากกานั้น แต่ละรูปร่าง L ยืม 2 ด้านจากก่อนหน้านี้

การแก้ไขล่าสุด: ย้ายจากพื้นที่เติมสีดำไปยังพื้นที่เติมสีเทาโดยใช้fdแทนsetxและเปลี่ยนการเคลื่อนไหวทั้งหมดจากfdเป็นbkเป็นหนึ่งไบต์ในการหมุน 180 องศา: rt 210-> rt 30, ย่อsetpencolorให้เป็นsetpc(ไม่มีเอกสารใน intepreter ที่ฉันใช้ แต่ทำงานได้ .)

rt 30 repeat 3[pd bk 200 lt 120 bk 360 rt 120 bk 80 rt 60 bk 440 pu rt 139 bk 211 rt 41] setx -2 fill fd 9 setpc 15 fill

โลโก้ 140 ไบต์

ดึงทั้ง 6 ด้านของรูปร่าง L แต่ละรูปร่างไปวางบนขอบสุดท้ายแล้วหมุน 180 องศาเพื่อเริ่มอีกอัน

rt 30 repeat 3[rt 180 fd 200 lt 120 fd 360 rt 120 fd 80 rt 60 fd 440 rt 120 fd 360 rt 120 fd 200] pu setx -5 fill setx 5 setpencolor 15 fill

วิ่งไปที่ http://www.calormen.com/jslogo/#

ขอแนะนำให้ทำcs pd setpencolor 0ก่อนที่จะทำงานเพื่อให้แน่ใจว่าหน้าจอมีความชัดเจนเต่าอยู่ตรงกลางและชี้ขึ้นปากกาลงและตั้งค่าเป็นสีดำ (การตั้งค่าเริ่มต้นไม่จำเป็นสำหรับเซสชันใหม่) และhtเพื่อซ่อนเต่า ( stจะ แสดงอีกครั้ง)

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



7

Python 2, 211 201 195 188 175 173 ไบต์

from turtle import*
d="t(120);fd(333);rt(120);fd(67);"
s="color(0,%r);begin_fill();fd(200);l"+d+"rt(60);fd(400);r"+d+"end_fill();fd(133);rt(180);"
exec s%'#fff'+s%0+s%'gray'

น่าเสียดายที่execไม่ได้ใช้งานใน Trinket ดังนั้นจึงไม่สามารถทดสอบทางออนไลน์ได้ตามที่เป็น อย่างน้อยไม่ได้อยู่ในรุ่นฟรี ฉันพิมพ์สตริงและวางเป็นรหัสเพื่อทดสอบ หากคุณฉลาดในการใช้สคริปต์คุณสามารถปรับขนาด html / css ตามความจำเป็นเพื่อให้พื้นที่วาดมีขนาดใหญ่ขึ้น แจ้งให้เราทราบหากคุณทำ

ลองใช้ออนไลน์ - ใช้ขนาดที่เล็กกว่าเนื่องจากพื้นที่ของไซต์มีขนาดเล็กเกินไปสำหรับ 400px แต่คุณสามารถเห็นผลลัพธ์ทั้งหมด

Ungolfed:

from turtle import*
w=200
def f(n):
  c=255*n/2
  color(0,(c,c,c))
  begin_fill()
  fd(w)
  lt(120)
  fd(5*w/3)
  rt(120)
  fd(w/3)
  rt(60)
  fd(2*w)
  rt(120)
  fd(5*w/3)
  rt(120)
  fd(w/3)
  end_fill()
  fd(2*w/3)
  rt(180)
f(2);f(0);f(1)

ฉันสงสัยว่า255*n/2สามารถลดลงได้หรือไม่หาก128*nฉันคิดว่าค่า RGB แบบลอยตัวจะปัดเศษขึ้นเรื่อย ๆ ดังนั้นจะมีการเปลี่ยนแปลงสีพิกเซลหรือไม่?
Albert Renshaw

@AlbertRenshaw นั่นเป็นรหัสที่ไม่ดี ดูรหัสด้านบนว่าสำหรับรุ่น golfed นอกจากนี้นี่คือ Python 2 ดังนั้นพวกเขาจึงไม่ลอยตัวพวกเขาเป็นจำนวนเต็มเนื่องจากการหารเป็นการหารจำนวนเต็ม
mbomb007

อ้อเข้าใจแล้ว; ขอบคุณ!
Albert Renshaw

6

PHP, 153 ไบต์

วิธีนี้จะใช้งานได้หากshort_open_tagเปิดใช้งานการตั้งค่า ซอร์สโค้ดมีอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นให้ใช้ดัมพ์ hex แทน:

0000000: 3c3f 3d67 7a69 6e66 6c61 7465 2827 b329  <?=gzinflate('.)
0000010: 2e4b 5728 cb4c 2d77 caaf b0d5 3531 3000  .KW(.L-w....510.
0000020: 611d 0b08 5628 2e29 cacf 4eb5 5536 3030  a...V(.)..N.U600
0000030: b0b3 2948 2cc9 5048 b1f5 d535 35d6 3536  ..)H,.PH...55.56
0000040: b7d0 8152 c6a6 263a 8626 c6ba 8626 0660  ...R..&:.&...&.`
0000050: dac2 5cc7 14c8 b234 0452 510a 6999 3939  ..\....4.RQ.i.99
0000060: b6ca 6969 690a 2545 8979 c569 f945 b9b6  ..iii.%E.y.i.E..
0000070: 45f9 2589 25a9 1a06 9a0a fa14 990a 7415  E.%.%.........t.
0000080: a6a9 8646 949a 9b5e 945a 8969 ae2e cc60  ...F...^.Z.i...`
0000090: 7d60 88d9 0100 2729 3b                   }`....');

ข้อมูลที่คลายการบีบอัดจะมีลักษณะดังนี้ (เพิ่มการแบ่งบรรทัดเพื่อความชัดเจน):

<svg viewBox=-400-400,800,800 stroke=#000>
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=#fff transform=rotate(0) />
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=#000 transform=rotate(120) />
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=grey transform=rotate(-120) />
</svg>

แม้ว่าข้อมูล SVG จะไม่ถูกต้อง แต่ PHP ก็ใช้เป็น text/htmlตามค่าเริ่มต้น หากไม่มีการประกาศประเภทเอกสารเอกสารจะถูกจัดการในโหมด quirks ซึ่งเป็นการให้อภัยอย่างมาก

เพื่อปรับปรุงการบีบอัดฉันแบ่งภาพออกเป็นสามส่วนที่มีรูปร่าง "7" ที่สามารถวาดได้โดยใช้<path>องค์ประกอบใกล้เคียงกัน รูปภาพผลลัพธ์จะขยายออกเพื่อเติมวิวพอร์ต นี่คือการคว้าหน้าจอจากหน้าต่าง 500 × 500 พิกเซล:

หน้าจอคว้าภาพ SVG ขนาด 500 × 500 พิกเซลรูปสามเหลี่ยม SVG


5

HTML + JS (ES6), 34 + 306 = 340 ไบต์

ทำให้เอียงในแนวนอน 30 องศา - ในอาร์กิวเมนต์ที่ 3 ของการแปลงเมทริกซ์แทนเจนต์ของ 30 °จะแทนpow(3,-.5)ด้วย

มีตัวเลขเวทย์มนตร์ที่น่าเกลียดอยู่บ้างและมันไม่ตรงกับสัดส่วนของภาพ Wikipedia ฉันแน่ใจว่ามีวิธี "คณิตศาสตร์" เพิ่มเติมเกี่ยวกับเรื่องนี้; ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

ดูเวอร์ชั่นที่ไม่ได้อัปโหลดใน CodePen

f=

_=>{with(Math)with(C=c.getContext`2d`)for(l=lineTo.bind(C),lineWidth=.01,transform(50,0,0,50,200,224),N=4;N--;rotate(PI*2/3))beginPath(fill(save(fillStyle=N?N>1?'#fff':'#000':'#777'))),transform(-1,0,-pow(3,-.5),-1,3.965,1.71),l(0,0),l(0,6),l(1,6),l(1,1),l(4.616,1),l(5.772,0),closePath(restore(stroke()))}

f()
<canvas id=c width=400 height=400>


4

HTML + CSS, 9 + 315 309 308 = 317 ไบต์

เส้นขอบและ skews มากมาย! ทดสอบบน Chrome แล้ว ดูรุ่น ungolfed บน CodePen

body{margin:9em}b,:after{position:fixed;transform:rotate(240deg)}b:after{content:'';left:-6.1em;top:-7.95em;width:6em;height:9em;border-left:transparent 2.32em solid;border-right:2em solid;border-bottom:2em solid;transform:skew(30deg);filter:drop-shadow(0 0 .1em)}b{color:#777}b>b{color:#000}b>b>b{color:#fff
<b><b><b>


มันตอบสนองความต้องการขั้นต่ำ 400x400px หรือไม่
sergiol

คุณไม่ต้องการคนสุดท้าย>ใช่ไหม?
Stan Strum

4

Mathematica 171 ไบต์

w=(v=AnglePath)[s={{9,0},{11,2(b=Pi/3)},{2,b},{9,2b},{5,-2b},{2,b}}];x={w[[5]],2b}~v~s;y={x[[5]],-2b}~v~s;Graphics@{White,EdgeForm[Black],(p=Polygon)@w,Gray,p@x,Black,p@y}

ดึง 3 รูปหลายเหลี่ยมโดยใช้ AnglePath ทวีคูณของ 60 องศาและใช้ประโยชน์จากจุดเริ่มต้นสำหรับรูปหลายเหลี่ยมแต่ละจุดเป็นจุดที่ 5 ของรูปหลายเหลี่ยมก่อนหน้า


1
AnglePathวิธีการที่ดีโดยใช้
DavidC

1

Tcl / Tk, 205

grid [canvas .c -w 402 -he 402]
.c cr p 171 2 237 2 401 337 125 337 156 280 301 280 -f #FFF
.c cr p 2 335 171 2 310 280 250 280 171 121 31 401 -f gray
.c cr p 171 127 34 401 374 401 401 337 127 337 201 188

สามเหลี่ยมเพนโรส

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