Penrose Triangle Codegolf


19

Penrose trójkąt , znany również jako tribar Penrose, albo niemożliwe tribar, jest niemożliwe obiektu.

Celem tego wyzwania jest wyświetlenie trójkąta Penrose'a w jak najmniejszej liczbie bajtów.

Trójkąt Penrose

Źródło: Wikipedia

Zasady:

  1. Po wygenerowaniu trójkąt Penrose'a należy wyświetlić cyfrowo.
  2. Muszą wyglądać tak samo jak powyższy obraz strony wiki (źródło powyżej) bez bezpośredniego wyświetlania obrazu.
  3. Ten sam obraz o tej samej kolorystyce musi być pokazany w rozmiarze co najmniej 400 x 400.
  4. Powinny być tak dokładne, jak to możliwe.

Powodzenia i miłej zabawy!


2
Myślę, że może to stanowić duże wyzwanie, ale istnieją pewne specyfikacje, które należy wyjaśnić, takie jak kolory obrazu i jego wymiary.
— Kritixi Lithos

5
PS! Nie zniechęcaj się tylko dlatego, że wyzwanie zostało zamknięte. Gdyby to był zły pomysł, ścisłym głosom towarzyszyłyby głosy przegłosowane ... :)
— Stewie Griffin

2
@DigitalTrauma Powiedziałbym, że nie. To ma o wiele więcej szczegółów do narysowania.
— mbomb007

1
Czy jakikolwiek szary zrobi, czy też musi być dokładnie taki sam szary? Jeśli jest to drugie, dobrze byłoby podać dokładny szary odcień w tekście wyzwania.
— Martin Ender

1
Przydatne proporcje byłyby również pomocne, gdyby trzeba je dokładnie odtworzyć.
— Martin Ender

Odpowiedzi:


3

logo, 129 120 bajtów

Rysuje tylko pierwsze 4 boki każdego kształtu L, następnie podnosi pióro, przesuwa się do odpowiedniego miejsca na następnym kształcie L, opuszcza pióro i rysuje 4 boki tego. Każdy kształt L pożycza 2 strony od poprzedniego.

Najnowsze zmiany: przejdź z czarnego obszaru wypełnienia do szarego pola wypełnienia za pomocą fdzamiast setxi zmień wszystkie ruchy z fdna, bkaby zapisać jeden bajt przy obrocie o 180 stopni: rt 210-> rt 30, skróć setpencolordo setpc(nieudokumentowane w interpretatorze, którego używam, ale działa .)

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 bajtów

Rysuje 6 boków każdego kształtu L, przeskakuje na ostatniej krawędzi, a następnie obraca się o 180 stopni, aby rozpocząć następny.

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

uruchomić na http://www.calormen.com/jslogo/#

Zaleca się zrobić cs pd setpencolor 0przed uruchomieniem, aby upewnić się, że ekran jest czysty, żółw jest wyśrodkowany i skierowany w górę, pióro jest opuszczone i ustawione na czarny (ustawienia domyślne, nie są wymagane w przypadku nowej sesji), a także htaby ukryć żółwia ( stbędzie pokaż to ponownie.)

wprowadź opis zdjęcia tutaj


11

SVG (HTML5), 191 bajtów

<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


To naprawdę miłe!
— Steve Bennett

7

Python 2, 211 201 195 188 175 173 bajtów

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'

Niestety execnie jest zaimplementowany w Talizmie, więc nie można tego przetestować online w obecnej postaci. Przynajmniej nie w wersji darmowej. I wydrukowany ciąg i wklejane jako kod, aby go przetestować. Jeśli jesteś sprytny ze skryptami, możesz zmienić rozmiar html / css, aby uzyskać większy obszar roboczy. Daj mi znać, jeśli tak.

Wypróbuj online - używa mniejszego rozmiaru, ponieważ obszar roboczy witryny jest za mały na 400 pikseli, ale możesz zobaczyć cały wynik.

Nie golfowany:

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)

Zastanawiam się, czy 255*n/2można zmniejszyć do, 128*nmyślę, że zmienne wartości RGB i tak zaokrąglą się w górę, więc czy nastąpiłaby zmiana kolorów pikseli?
— Albert Renshaw

@AlbertRenshaw To nielepszy kod. Zobacz powyższy kod dla wersji golfowej. Jest to także Python 2, więc nie są liczbami zmiennoprzecinkowymi, są liczbami całkowitymi, ponieważ podział jest dzieleniem liczb całkowitych.
— mbomb007

Rozumiem; dzięki!
— Albert Renshaw

6

PHP, 153 bajty

Działa to tylko wtedy, gdy short_open_tagustawienie jest włączone. Kod źródłowy zawiera znaki niedrukowalne, więc zamiast tego zrób zrzut heksadecymalny:

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

Zdekompresowane dane wyglądają następująco (z dodanymi podziałami linii dla czytelności):

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

Chociaż dane SVG nie są całkowicie poprawne, PHP text/htmldomyślnie je obsługuje . Bez deklaracji typu doctype dokument jest obsługiwany w trybie dziwactw, co jest bardzo wybaczające.

Aby poprawić kompresję, podzieliłem obraz na trzy części w kształcie „7”, które można narysować przy użyciu niemal identycznych <path>elementów. Powstały obraz zostanie rozwinięty, aby wypełnić rzutnię. Oto zrzut ekranu z okna 500 × 500 pikseli:

Zrzut ekranu obrazu SVG z trójkątem Penrose 500 × 500 pikseli


5

HTML + JS (ES6), 34 + 306 = 340 bajtów

Wykorzystuje pochylenie w poziomie o 30 stopni - w trzecim argumencie transformacji macierzowej styczną 30 ° jest przedstawiona jako pow(3,-.5).

Jest sporo brzydkich liczb magicznych i nie do końca pasuje do proporcji obrazu z Wikipedii. Jestem pewien, że istnieje bardziej „matematyczny” sposób na osiągnięcie tego; każda pomoc byłaby mile widziana.

Zobacz wersję bez golfa na 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 bajtów

Mnóstwo granic i wypaczeń! Testowane na Chrome. Zobacz wersję bez golfa na 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>


Czy spełnia wymagania co najmniej 400 x 400 pikseli?
— sergiol

Nie potrzebujesz finału >, prawda?
— Stan Strum

4

Mathematica 171 bajtów

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}

Rysuje 3 wielokąty za pomocą AnglePath, wielokrotności zwojów 60 stopni i wykorzystując to, że punktem początkowym każdego wielokąta jest 5 punkt poprzedniego wielokąta.


1
Ładne podejście, przy użyciu 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

Trójkąt Penrose

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.