Penrose Üçgeni Codegolf


19

Penrose üçgen de Penrose tribar, ya da imkansız tribar olarak bilinen, imkansız bir amacıdır.

Bu meydan okumadaki amaç, mümkün olan en az baytta bir Penrose üçgeni göstermektir.

Penrose üçgeni

Kaynak: Wikipedia

Kurallar:

  1. Penrose Üçgeni'ni oluşturduktan sonra dijital olarak göstermelisiniz.
  2. Doğrudan görüntüyü göstermeden, wiki sayfasının yukarıdaki görüntüsüyle (yukarıdaki kaynak) aynı görünmelidirler.
  3. Aynı renk şemasına sahip aynı görüntü en az 400x400 boyutunda gösterilmelidir.
  4. Mümkün olduğunca doğru olmalıdır.

İyi şanslar ve iyi eğlenceler!


2
Bunun büyük bir meydan okuma potansiyeli olduğunu düşünüyorum, ancak görüntünün renkleri ve boyutları gibi netleştirilmesi gereken bazı özellikler var.
Kritixi Lithos

5
PS! Zorluk kapalı olduğu için cesaretiniz kırılmasın. Kötü bir meydan okuma fikri olsaydı, yakın oylara downvotes eşlik edecekti ... :)
Stewie Griffin

2
@DigitalTrauma söylemem. Çizmek için çok daha fazla ayrıntı var.
mbomb007

1
Herhangi bir gri yapacak mı veya tam olarak aynı gri mi olmalı? İkincisi ise, meydan okuma metninde tam gri tonu sağlamak güzel olurdu.
Martin Ender

1
En boy oranları, tam olarak çoğaltılmaları gerektiğinde de yararlı olacaktır.
Martin Ender

Yanıtlar:


3

logo, 129 120 bayt

Her bir L şeklinin sadece ilk 4 tarafını çizer, ardından kalemi kaldırır, bir sonraki L şeklindeki ilgili noktaya hareket eder, kalemi indirir ve bunun 4 tarafını çizer. Her L şekli bir öncekinden 2 taraf ödünç alır.

Son düzenlemeler: fdbunun yerine kullanarak siyah dolgu alanından gri dolgu alanına geçin ve 180 derece dönüşte bir bayt kaydetmek için setxtüm hareketleri değiştirin : -> , kısaltın (kullandığım yorumlayıcıda belgelenmemiş, ancak çalışıyor) .)fdbkrt 210rt 30setpencolorsetpc

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 bayt

Her bir L şeklinin 6 tarafını çizer, son kenarı aşar, sonra bir sonrakini başlatmak için 180 derece döndürür.

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/# adresinde yayınlayın

Yapması önerilir cs pd setpencolor 0ekran açıktır kaplumbağa merkezli ve yukarıyı gösterecek sağlamak için çalıştırmadan önce, kalem aşağı ve siyah (yepyeni oturumu için gerekli değildir varsayılan ayarlara,) ile seti ve ayrıca htkaplumbağa (gizlemek için stirade bir daha göster.)

resim açıklamasını buraya girin


11

SVG (HTML5), 191 bayt

<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


Bu gerçekten iyi!
Steve Bennett

7

Piton 2, 211 201. 195 188 175 173 bayt

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'

Ne yazık ki, execTrinket'te uygulanmadığından, bu çevrimiçi olduğu gibi test edilemez. En azından ücretsiz sürümde değil. Dizeyi yazdırdım ve test etmek için kod olarak yapıştırdım. Komut dosyalarıyla akıllıysanız, daha büyük bir tuval elde etmek için html / css'yi yeniden boyutlandırabilirsiniz. Yaparsan haberim olsun.

Çevrimiçi deneyin - sitenin tuvali 400 piksel için çok küçük olduğu için daha küçük bir boyut kullanır, ancak tüm çıktıyı görebilirsiniz.

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)

Merak ediyorum 255*n/2için azaltılabilir 128*nyüzden piksel renklerde bir değişiklik olacağını şamandıra RGB değerleri neyse yuvarlar düşünüyorum?
Albert Renshaw

@AlbertRenshaw Bu kodlanmamış kod. Golf halindeki versiyon için yukarıdaki koda bakınız. Ayrıca, bu Python 2, bu yüzden yüzen değil, tamsayılar, çünkü bölüm tamsayı bölümüdür.
mbomb007

Ah anlıyorum; Teşekkürler!
Albert Renshaw

6

PHP, 153 bayt

Bu yalnızca short_open_tagayar etkinleştirilmişse çalışır. Kaynak kod yazdırılamayan karakterler içeriyor, bunun yerine onaltılık döküm var:

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

Açılmış veriler şöyle görünür (okunabilirlik için satır sonları eklenir):

<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 verileri tamamen geçerli olmasa da, PHP veriyi şu şekilde sunar: text/html varsayılan olarak sunar. Doküman bildirimi olmadan, belge tuhaf modda işlenir ve bu çok affedicidir.

Sıkıştırmayı geliştirmek için, görüntüyü neredeyse aynı <path>elemanlar kullanılarak çizilebilecek üç "7" şekilli parçaya böldüm . Ortaya çıkan görüntü, görünüm penceresini dolduracak şekilde genişler. İşte 500 × 500 piksel penceresinden bir ekran görüntüsü:

500 × 500 piksel Penrose üçgeni SVG görüntüsünün ekran görüntüsü


5

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

30 derecelik yatay bir eğri kullanır - matris dönüşümünün 3. argümanında, 30 ° 'lik tanjant, pow(3,-.5) .

Birkaç çirkin sihirli sayı var ve Wikipedia görüntüsünün oranlarıyla tam olarak eşleşmiyor. Bu konuda daha "matematiksel" bir yol olduğundan eminim; herhangi bir yardım mutluluk duyacağız.

CodePen'deki ungolfed sürümüne bakın.

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 bayt

Sınırlar ve eğriler bolca! Chrome'da test edildi. CodePen'deki ungolfed sürümüne bakın .

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>


Minimum 400x400 piksel gereksinimini karşılıyor mu?
sergiol

Finale ihtiyacınız yok >, değil mi?
Stan Strum

4

Mathematica 171 Bayt

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}

AnglePath kullanarak 3 çokgen çizer, 60 derecelik dönüşlerin katlarını çizer ve her çokgenin başlangıç ​​noktasının önceki çokgenin 5. noktası olması avantajından yararlanır.


1
Güzel bir yaklaşım, kullanma 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

Penrose üçgeni

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.