Penrose Triangle Codegolf


19

The Penrose segitiga , juga dikenal sebagai tribar Penrose, atau tribar tidak mungkin, adalah objek yang tidak mungkin.

Tujuan dari tantangan ini adalah untuk menampilkan segitiga Penrose dalam byte sesedikit mungkin.

Segitiga Penrose

Sumber: Wikipedia

Aturan:

  1. Anda harus menampilkan Segitiga Penrose secara digital setelah membuatnya.
  2. Mereka harus terlihat sama dengan gambar di atas dari halaman wiki (sumber di atas) tanpa langsung menampilkan gambar.
  3. Gambar yang sama dengan skema warna yang sama harus ditampilkan setidaknya dalam ukuran 400x400.
  4. Harus seakurat mungkin.

Semoga berhasil dan selamat bersenang - senang!


2
Saya pikir ini berpotensi menjadi tantangan besar, tetapi ada spesifikasi tertentu yang perlu diklarifikasi seperti warna gambar dan dimensinya.
Kritixi Lithos

5
PS! Jangan berkecil hati hanya karena tantangan sudah ditutup. Jika itu adalah ide tantangan yang buruk maka pemungutan suara dekat akan disertai dengan downvotes ... :)
Stewie Griffin

2
@DigitalTrauma saya katakan tidak. Itu memiliki lebih banyak detail untuk menggambar.
mbomb007

1
Apakah abu-abu akan melakukan atau harus abu-abu yang sama persis? Jika yang terakhir, alangkah baiknya untuk memberikan nada abu-abu yang tepat dalam teks tantangan.
Martin Ender

1
Rasio aspek juga akan sangat membantu jika harus direproduksi secara tepat.
Martin Ender

Jawaban:


3

logo, 129 120 byte

Menarik hanya 4 sisi pertama dari setiap bentuk L, lalu mengangkat pena, bergerak ke tempat yang sesuai pada bentuk L berikutnya, menurunkan pena dan menggambar 4 sisi dari itu. Setiap bentuk L meminjam 2 sisi dari yang sebelumnya.

Suntingan terbaru: pindah dari area isian hitam ke area isian abu-abu, fdbukan setx, dan ubah semua gerakan dari fdke bkuntuk menyimpan satu byte pada rotasi 180 derajat: rt 210-> rt 30, perpendek setpencolormenjadi setpc(tidak terdokumentasi dalam intepreter yang saya gunakan, tetapi berfungsi .)

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

logo, 140 byte

Gambarlah 6 sisi setiap bentuk L, overshoot di tepi terakhir, lalu putar 180 derajat untuk memulai yang berikutnya.

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

jalankan di http://www.calormen.com/jslogo/#

Disarankan untuk dilakukan cs pd setpencolor 0sebelum berlari untuk memastikan layarnya bersih, kura-kura berada di tengah dan mengarah ke atas, pena turun dan diatur ke hitam (pengaturan default, tidak diperlukan untuk sesi baru) dan juga htuntuk menyembunyikan kura-kura ( stakan perlihatkan lagi.)

masukkan deskripsi gambar di sini


11

SVG (HTML5), 191 byte

<svg width=498 height=433 stroke=#000><path d=M211,134l38,66L154,365H496L458,431H40 /><path fill=#777 d=M211,2L2,365l38,66L211,134l95,165h76 /><path fill=#FFF d=M496,365L287,2H211L382,299H192


Bagus sekali!
Steve Bennett

7

Python 2, 211 201 195 188 175 175 byte

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'

Sayangnya, execini tidak diterapkan di Trinket, jadi ini tidak dapat diuji online apa adanya. Setidaknya, tidak dalam versi gratis. Saya mencetak string dan menempelkannya sebagai kode untuk mengujinya. Jika Anda pintar dengan skrip, Anda dapat mengubah ukuran html / css sesuai keperluan untuk mendapatkan kanvas yang lebih besar. Beri tahu saya jika Anda melakukannya.

Cobalah online - gunakan ukuran yang lebih kecil karena kanvas situs terlalu kecil untuk 400px, tetapi Anda dapat melihat seluruh hasilnya.

Tidak Disatukan:

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)

Saya bertanya-tanya apakah 255*n/2dapat dikurangi ke 128*nsaya pikir nilai RGB float akan mengumpulkan anyways jadi apakah akan ada perubahan dalam warna pixel?
Albert Renshaw

@AlbertRenshaw Itu kode yang tidak disunat. Lihat kode di atas untuk versi golf. Juga, ini adalah Python 2, jadi mereka tidak mengapung, mereka bilangan bulat, karena divisi tersebut adalah divisi bilangan bulat.
mbomb007

Oh begitu; Terima kasih!
Albert Renshaw

6

PHP, 153 byte

Ini hanya akan berfungsi jika short_open_tagpengaturan diaktifkan. Kode sumber berisi karakter yang tidak dapat dicetak, jadi minta hex dump:

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                   }`....');

Data yang didekompresi terlihat seperti ini (dengan jeda baris ditambahkan untuk keterbacaan):

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

Meskipun data SVG tidak sepenuhnya valid, PHP menyajikannya sebagai text/htmldefault. Tanpa deklarasi tipe dokumen, dokumen ditangani dalam mode quirks, yang sangat memaafkan.

Untuk meningkatkan kompresi, saya memecah gambar menjadi tiga bagian berbentuk "7" yang dapat ditarik menggunakan <path>elemen yang hampir identik . Gambar yang dihasilkan akan diperluas untuk mengisi viewport. Berikut ini ambil layar dari jendela 500 × 500 piksel:

Ambil layar gambar Penrose triangle 500 × 500 piksel SVG


5

HTML + JS (ES6), 34 + 306 = 340 byte

Memanfaatkan kemiringan horizontal 30 derajat - dalam argumen ke-3 dari transformasi matriks, garis singgung 30 ° direpresentasikan sebagai pow(3,-.5) .

Ada beberapa angka ajaib jelek, dan itu tidak cukup cocok dengan proporsi gambar Wikipedia. Saya yakin ada cara yang lebih "matematis" untuk melakukan ini; bantuan apa pun akan dihargai.

Lihat versi yang tidak dikenali pada 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 byte

Perbatasan dan kemiringan yang melimpah! Diuji pada Chrome. Lihat versi yang tidak dikenali pada 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>


Apakah memenuhi persyaratan minimal 400x400px?
sergiol

Anda tidak perlu final >, kan?
Stan Strum

4

Mathematica 171 Bytes

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}

Gambarlah 3 poligon menggunakan AnglePath, kelipatan putaran 60 derajat, dan manfaatkan bahwa titik awal untuk setiap poligon adalah titik ke-5 dari poligon sebelumnya.


1
Pendekatan yang bagus, menggunakan 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

Segitiga Penrose

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.