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.