Penrose Triangle Codegolf


19

Das Penrose-Dreieck , auch als Penrose-Tribar oder als unmögliches Tribar bekannt, ist ein unmögliches Objekt.

Das Ziel dieser Herausforderung besteht darin, ein Penrose-Dreieck in möglichst wenigen Bytes anzuzeigen.

Penrose Dreieck

Quelle: Wikipedia

Regeln:

  1. Sie müssen das Penrose-Dreieck nach dem Generieren digital anzeigen.
  2. Sie müssen genauso aussehen wie das obige Bild der Wiki-Seite (Quelle oben), ohne dass das Bild direkt angezeigt wird.
  3. Das gleiche Bild mit dem gleichen Farbschema muss in einer Größe von mindestens 400x400 angezeigt werden.
  4. Sollte so genau wie möglich sein.

Viel Glück und hab Spaß!


2
Ich denke, dass dies eine große Herausforderung sein kann, aber es gibt bestimmte Spezifikationen, die geklärt werden müssen, wie die Farben des Bildes und seine Abmessungen.
Kritixi Lithos

5
PS! Lassen Sie sich nicht entmutigen, nur weil die Herausforderung abgeschlossen ist. Wenn es eine schlechte Idee für eine Herausforderung wäre, würden die engen Abstimmungen mit Abstimmungen einhergehen ... :)
Stewie Griffin

2
@DigitalTrauma würde ich nicht sagen. Das hat viele weitere Details zu zeichnen.
mbomb007

1
Wird irgendein Grau das gleiche Grau haben oder muss es das gleiche sein? In letzterem Fall wäre es schön, den genauen Grauton im Aufforderungstext anzugeben.
Martin Ender

1
Seitenverhältnisse wären auch hilfreich, wenn sie exakt reproduziert werden müssten.
Martin Ender

Antworten:


3

Logo, 129 120 Bytes

Zeichnet nur die ersten 4 Seiten jeder L-Form, hebt dann den Stift an, bewegt sich zur entsprechenden Stelle in der nächsten L-Form, senkt den Stift und zeichnet 4 Seiten davon. Jede L-Form leiht 2 Seiten von der vorherigen.

Letzte Änderungen: Wechseln Sie fdstatt von von schwarzer Fläche zu grauer Fläche setxund ändern Sie alle Bewegungen von fdbis bk, um ein Byte bei einer Drehung um 180 Grad zu sparen: rt 210-> rt 30Verkürzen setpencolorauf setpc(undokumentiert in dem von mir verwendeten Interpreter, aber es funktioniert .)

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 Bytes

Zeichnet die 6 Seiten jeder L-Form, überschreitet die letzte Kante und dreht sich dann um 180 Grad, um die nächste zu starten.

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

Laufen auf http://www.calormen.com/jslogo/#

Es wird empfohlen, dies cs pd setpencolor 0vor dem Laufen zu tun , um sicherzustellen, dass der Bildschirm klar ist, die Schildkröte zentriert ist und nach oben zeigt, der Stift nach unten zeigt und auf Schwarz eingestellt ist (Standardeinstellungen, nicht für eine brandneue Sitzung erforderlich) und htdie Schildkröte auszublenden ( stwird) zeig es nochmal.)

Bildbeschreibung hier eingeben


11

SVG (HTML5), 191 Bytes

<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


Das ist wirklich schön!
Steve Bennett

7

Python 2, 211 201 195 188 175 173 Bytes

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'

Ist leider execnicht in Trinket implementiert, kann also nicht online getestet werden. Zumindest nicht in der kostenlosen Version. Ich habe den String ausgedruckt und als Code eingefügt, um ihn zu testen. Wenn Sie mit Skripten klug sind, können Sie die Größe von HTML / CSS nach Bedarf ändern, um eine größere Zeichenfläche zu erhalten. Lass es mich wissen, wenn du es tust.

Online ausprobieren - Verwendet eine kleinere Größe, da der Erstellungsbereich der Site für 400 Pixel zu klein ist. Sie können jedoch die gesamte Ausgabe anzeigen.

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)

Ich frage mich, ob die RGB-Werte des Float-Effekts auf einen Wert 255*n/2gesenkt werden können, der sich auf 128*njeden Fall aufrundet. Würde sich also eine Änderung der Pixelfarben ergeben?
Albert Renshaw

@ AlbertRenshaw Das ist der ungolfed Code. Siehe den Code darüber für die Golfversion. Dies ist auch Python 2, es handelt sich also nicht um Gleitkommazahlen, sondern um Ganzzahlen, da es sich bei der Division um eine Ganzzahldivision handelt.
mbomb007

Oh ich verstehe; Vielen Dank!
Albert Renshaw

6

PHP, 153 Bytes

Dies funktioniert nur, wenn die short_open_tagEinstellung aktiviert ist. Der Quellcode enthält nicht druckbare Zeichen. Geben Sie stattdessen einen Hex-Dump ein:

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

Die dekomprimierten Daten sehen folgendermaßen aus (mit Zeilenumbrüchen zur besseren Lesbarkeit):

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

Obwohl die SVG-Daten nicht vollständig gültig sind, wird sie von PHP text/htmlstandardmäßig bereitgestellt. Ohne eine Doctype-Deklaration wird das Dokument im Macken-Modus behandelt, was sehr verzeihend ist.

Um die Komprimierung zu verbessern, habe ich das Bild in drei "7" -förmige Teile aufgeteilt, die mit nahezu identischen <path>Elementen gezeichnet werden können . Das resultierende Bild wird vergrößert, um das Ansichtsfenster auszufüllen. Hier ist ein Screenshot aus einem 500 × 500 Pixel großen Fenster:

Bildschirmaufnahme eines SVG-Bilds mit einem Penrose-Dreieck (500 × 500 Pixel)


5

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

Verwendet eine horizontale Neigung von 30 Grad - im dritten Argument der Matrixtransformation wird der Tangens von 30 ° als dargestellt pow(3,-.5).

Es gibt einige hässliche magische Zahlen, die nicht ganz den Proportionen des Wikipedia-Bildes entsprechen. Ich bin sicher, dass es einen "mathematischeren" Weg gibt, dies zu tun. Jede Hilfe wäre dankbar.

Siehe die ungolfed Version auf 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

Grenzen und Schrägstriche in Hülle und Fülle! Getestet auf Chrome. Siehe die ungolfed Version auf 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>


Erfüllt es die Anforderung von mindestens 400x400px?
Sergiol

Du brauchst das Finale nicht >, oder?
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}

Zeichnet 3 Polygone mit AnglePath, einem Vielfachen von 60-Grad-Umdrehungen und unter Berücksichtigung des Vorteils, dass der Startpunkt für jedes Polygon der fünfte Punkt des vorherigen Polygons ist.


1
Nizza Ansatz mit 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 Dreieck

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.