Zeichne Reutersvärds Dreieck


33

Dieses unmögliche Objekt ist das Dreieck von Reutersvärd :

Bildbeschreibung hier eingeben

Zeichne deine eigene Version nach diesen Regeln:

  • Genau 9 Würfel insgesamt
  • Jede Seite besteht aus genau 4 Würfeln
  • Die Würfel scheinen sich so zu überlappen, dass das gerenderte Objekt tatsächlich ein unmögliches Objekt ist
  • Es werden 4 verschiedene Farben verwendet - eine für den Hintergrund und 3 für jede der Würfelflächen
  • Bei der Bitmap-Ausgabe sollte das vollständige Dreieck mindestens 100 Pixel hoch und mindestens 100 Pixel breit sein
  • Seitenverhältnis: Breite und Höhe des vollen Dreiecks sollten nicht mehr als den Faktor 2 abweichen
  • Das Dreieck kann relativ zum obigen Bild um einen beliebigen Betrag gedreht werden
  • Das Dreieck kann relativ zu dem obigen Bild reflektiert werden oder nicht

Antworten:


14

Brain-Flak, 487810 327722 75564 + 1 = 75565 Bytes

Leider ist dies ein bisschen zu groß, um in eine Antwort zu passen.

PasteBin

Probieren Sie es online

Mit dem -AFlag wird eine ASCII-ppm-Datei ausgegeben, die wie folgt aussieht:

Neue Ausgabe

Erläuterung

Sie haben vielleicht schon vermutet, dass ich das nicht von Hand geschrieben habe. So habe ich es gemacht:

Ich habe zuerst das Bild, das Sie oben sehen, aus dem Bild gemacht, das von der Herausforderung bereitgestellt wurde. Es hat den Unterschied, dass es keinen Farbkanal gibt, der irgendeinen anderen Wert hat, 255oder dass 0wir ihn auf diese Weise in eine kleinere Datei packen können, wobei der maximale Farbkanal auf 1 gesetzt ist. Dann habe ich ein Python-Skript geschrieben, um ein Brain-Flak-Programm zu spielen Das löst dieses Problem mit einem Modul, das ich selbst geschrieben habe und das hier zu finden ist . Es ist nicht sehr ausgefeilt, es ist nur ein Hack, den ich für solche Dinge zusammengeschmissen habe. pushist eine Funktion, die einen effizienten Brain-Flak-Code zurückgibt, um eine Zahl in den Stapel zu verschieben, und kolmoist ein sehr einfaches Kolmogorov-Komplexitätslösungsprogramm, das versucht, einen effizienten Weg zu finden, um eine bestimmte Zeichenfolge in den Stapel zu verschieben.

from value import push,kolmo

def group(a, n):
    return zip(*[a[i::n]for i in range(n)]) 

f=open("R.ppm")
a=["".join(x)for x in group(f.read().split()[3:][::-1],3)]
f.close()

def hardcode(string):
    result = push(ord("\n")).join("(<>({})<>"+{"0":"","1":"()"}[x]+")"for x in string)
    return result

last = ""
acc = 0
result = push(ord("0"))+"<>"
for x in a+[""]:
    if x != last:
        string = ("" if not last else kolmo("\n")+hardcode(last))
        result += min([push(acc)+"{({}[()]<%s>)}{}"%string,acc*string],key=len)
        acc=1
    else:
        acc += 1
    last = x
print result+kolmo("P3 100 100 ")

Das hat sehr viel Spaß gemacht und ich hoffe, meine Antwort zu verbessern


14
Sie haben zu Recht 160088 Bytes entfernt? Ist das ein Rekord?
Neil

Vielleicht können einige unäre Antworten das übertreffen
Roman Gräf


Ihr Python-Code fasziniert mich. Was ist value? (Ich vermute , nicht dieses PyPI-Modul ?) Was ist kolmo?
Tim Pederick

@ TimPederick Entschuldigung. Das ist ein Modul, das ich selbst für das Golfen von Brain-Flak geschrieben habe. Ich werde einen Link in den Körper aufnehmen.
Weizen-Assistent

13

Mathematica, 237 Bytes

n={-1,1}#&;c_~g~s_:=Polygon[c+s#&/@{k={12,9},m=n@k,t={0,-12}}];p={#,#2~g~1,#3~g~-1}&;a=p[Cyan,#-k,#+m]&;b=p[Blue,#-t,#+k]&;c=p[Red,#-m,#+t]&;Graphics@{{a@#,b@#,c@#}&/@{j=4k,s=4{4,9},n@s,4m,r={-32,8},q=-4{4,5},4t,n@q,n@r},a@j,b@s,c@j,c@s}

Einfacher zu lesende Version:

1  n = {-1, 1} # &;
2  c_~g~s_ := Polygon[c + s # & /@ {k = {12, 9}, m = n@k, t = {0, -12}}];
3  p = {#, #2~g~1, #3~g~-1} &;
4  a = p[Cyan, # - k, # + m] &;
5  b = p[Blue, # - t, # + k] &;
6  c = p[Red, # - m, # + t] &;
7  Graphics@{
8    {a@#, b@#, c@#} & /@
9      {j = 4 k, s = 4{4, 9}, n@s, 4 m, r = {-32, 8},
10       q = -4{4, 5}, 4 t, n@q, n@r},
11   a@j, b@s, c@j, c@s}

Zeile 1 definiert eine Funktion n, die die erste Koordinate eines geordneten Paares negiert. Linie 2 definiert eine Funktion g, die ein (ungefähr) gleichseitiges Dreieck erzeugt, das am Punkt zentriert cist und nach oben oder unten zeigt, je nachdem, ob dies der Fall sist 1oder nicht -1. Zeile 3 definiert peine Parallelogramm Vorlage zu sein , bestehend aus einer Farbe und zwei Dreiecken und Linien 4-6 definieren a, bund cdie drei verschiedenen spezifischen Typen von Parallelogrammen zu sein , die in den Würfeln erscheinen.

Linie 8 definiert eine Funktion {a@#, b@#, c@#}&, die einen ganzen Würfel zeichnet, der am Punkt zentriert ist #. Die Linien 9 und 10 beziehen sich auf die neun Punkte, die für das größere Dreieck benötigt werden. Dies ergibt neun Würfel, die oben rechts beginnen und gegen den Uhrzeigersinn verlaufen, wobei die späteren Teile der früheren Würfel verdecken. Schließlich werden in Zeile 11 vier Parallelogramme (oben rechts im Bild) neu gezeichnet, sodass sie die späteren Würfel so abdecken, wie sie sollen. Die Ausgabe ist unten:

Bildbeschreibung hier eingeben


6
Warten Sie, was Mathematica nicht eingebaut hat?
Digitales Trauma

10

HTML + CSS 3D (855 866 Byte)

HTML 117 Bytes + CSS 738 Bytes

Die z-indexesOrdnung zu halten war etwas schwierig. ;)

/* CSS */
p{position:absolute;left:110px;top:0;width:50px;height:50px;transform-style:preserve-3d;transform:rotateX(-45deg)rotateY(21deg)rotateZ(20deg)}
p+p{left:140px;top:50px}
p+p+p{left:170px;top:100px}
p+p+p+p{left:200px;top:150px}
p+p+p+p+p{left:140px;top:150px}
p+p+p+p+p+p{left:80px;top:150px}
p+p+p+p+p+p+p{left:20px;top:150px}
p:nth-child(8){z-index:1;left:50px;top:100px}
p:nth-child(9){z-index:-1;left:80px;top:50px}
p:nth-child(10){z-index:1;left:67px;top:59px;transform:rotateX(-45deg)rotateY(21deg)rotateZ(20deg)scale(0.6)}
a{position:absolute;width:50px;height:50px;background:red;transform:rotateY(0deg)translateZ(25px)}
a+a{background:tan;transform:rotateY(-90deg)translateZ(25px)}
a+a+a{background:navy;transform:rotateX(90deg)translateZ(25px
<!-- HTML -->
<p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a>

Ich habe die neuen Zeilen zur besseren Lesbarkeit beibehalten. Vielleicht entdeckt jemand das Potenzial für mehr Golf. Sie sind jedoch nicht in der Byteanzahl enthalten.

Ergebnis

Bildbeschreibung hier eingeben

jsFiddle Demo

Versuch es selber

Verwenden Sie Goole Chrome. Andere Browser können Probleme mit dem habenz-indexes .

Bearbeiten

  • 2 Bytes gespart durch Entfernen des Duplikat- aSelektors dank ETHproductions .
  • 9 Bytes gespart durch Entfernen eines unnötigen Elements margin:0auf dem a-Element.

Ist es noch gültiges HTML ohne HEAD/BODYund schließende Tags? Ich weiß, dass Browser Syntaxfehler ignorieren und versuchen, alles anzuzeigen, was Sie auf sie werfen, aber ich glaube nicht, dass dieser Code den Spezifikationen entspricht. (Das heißt, tolle Lösung!)
Federico Poloni

2
@ FedericoPoloni Vielen Dank. Zu den html|head|body-Elementen: Sie können weggelassen werden. Werfen Sie einen Blick auf "Optionale Tags" , Sie werden überrascht sein, wie viele Elemente und schließende Tags auch weggelassen werden können. Was nicht in der Spezifikation steht, sondern auch funktioniert, ist das Weglassen der schließenden Tags der a-Elemente. Sie werden jedoch vom Browser korrekt geschlossen, da Sie sie nicht verschachteln können. Auch aus der Sicht von Code Golf: Alles, was " kompiliert " und die richtige Ausgabe hat, ist gültig. ;)
insertusernamehere

9

BBC BASIC, 147 Bytes

tokenisierte Dateigröße 129 Bytes

t=PI/1.5x=500y=x:FORi=0TO28b=i MOD3GCOL0,b:b*=t:a=i DIV9*t:IFb=0x-=99*COSa:y-=99*SINa
MOVEx,y:VDU25;66*COSb;66*SINb;28953;66*COS(b-t);66*SIN(b-t);:NEXT

2 Bytes werden durch Verwendung einer absoluten Koordinatenspezifikation ( MOVE) und zwei relativen Spezifikationen pro Parallelogramm gespeichert , anstatt den Ursprung zu ändern, um alle absoluten Spezifikationen verwenden zu können. 1 Byte unnötiges Leerzeichen entfernt.

BBC BASIC, 150 Bytes

tokenisierte Dateigröße 127 Bytes

Laden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/download.html herunter

t=PI/1.5x=500y=x:F.i=0TO28b=i MOD3GCOL0,b:b*=t:a=i DIV9*t:IFb=0 x-=99*COSa:y-=99*SINa:ORIGINx,y
L.66*COSb,66*SINb,0,0PLOT117,66*COS(b-t),66*SIN(b-t)N.

Erläuterung

Wir beginnen mit den Koordinaten oben rechts und zeichnen Rauten in Dreiergruppen. Vor jeder Dreiergruppe verschieben wir den Ursprung (West, West, West, SE, SE, NE, NE NE.) Das heißt, die Dreiergruppe Oben rechts befindet sich die letzte vollständige Gruppe, die geplottet werden soll, wodurch der Ursprung an seine ursprüngliche Position zurückgebracht wird. Dann fahren wir fort und zeichnen erneut das Schwarz und Rot (aber nicht das Grün) der ersten Gruppe, insgesamt 29 Rauten.

Ungolfed

  t=PI/1.5                                 :REM 120 deg
  x=500                                    :REM coordinates of top right corner
  y=x
  FORi=0TO28
    b=i MOD3:GCOL0,b                       :REM set colour 0=black,1=red,2=green
    b*=t                                   :REM convert b to a multiple of 120deg
    a=i DIV9*t
    IFb=0 x-=99*COSa:y-=99*SINa:ORIGINx,y  :REM before each group of 3 rhombs move the graphics origin
    LINE66*COSb,66*SINb,0,0                :REM define one side of a rhombus
    PLOT117,66*COS(b-t),66*SIN(b-t)        :REM define one further corner and plot the rhombus
  NEXT

Ausgabe

Bildbeschreibung hier eingeben


8

HTML + JavaScript (ES6), 351 374 384

<canvas id=C></canvas><script>c=C.getContext("2d");`133124222162184253104213162164244191224182133191064104222093164253122224284151284`.match(/.../g).map((v,i)=>(c.fillStyle=['#fc0','#f04','#08a'][a=i%3],c.beginPath(),c[l='lineTo'](x=5*~~v/10,y=v%10*25),c[l](x-10,y+(--a+!a)*17),a&&c[l](x-30,y+a*17),c[l](x-20,y),!a&&c[l](x-10,y-17),c.fill()))</script>

Weniger golfen

<canvas id=C></canvas>
<script>
  c=C.getContext("2d");
  [133,124,222,162,184,253,104,213,162,164,244,191,224,182,133,191,64,104,222,93,164,253,122,224,284,151,284]
  .map((v,i)=>(
    a = i % 3,
    x = 5 * ~~ v / 10,
    y = v % 10 * 25,
    c.fillStyle = ['#fc0','#f04','#0a8'][a],
    c.beginPath(),
    --a,
    c[l='lineTo'](x, y),
    c[l]( x -10, y + (a+!a) * 17),
    a&&c[l](x - 30, y + a * 17),
    c[l](x - 20, y),
    !a&&c[l](x - 10, y - 17),
    c.fill()
  ))
</script>

Prüfung

<canvas id=C></canvas><script>c=C.getContext("2d");`133124222162184253104213162164244191224182133191064104222093164253122224284151284`.match(/.../g).map((v,i)=>(c.fillStyle=['#fc0','#f04','#08a'][a=i%3],c.beginPath(),c[l='lineTo'](x=5*~~v/10,y=v%10*25),c[l](x-10,y+(--a+!a)*17),a&&c[l](x-30,y+a*17),c[l](x-20,y),!a&&c[l](x-10,y-17),c.fill()))</script>


5

JavaScript (ES6) / SVG (HTML5), 350 312 Byte

document.write(`<svg width=390 height=338>`)
a=`195,52;240,130;285,208;330,286;240,286;150,286;60,286;105,208;150,130;`
a=(a+a).split`;`
for(i=9;i--;)document.write(`<path fill=#FD0 d=M${a[i]}h60l-30,-52h-60z /><path fill=#088 d=M${a[i+3]}h60l-30,52h-60z /><path fill=#F64 d=M${a[i+6]}l-30,-52l-30,52l30,52z />`)


3

SVG, 562 540 520 504 487 473 Bytes

Dies ist mein erstes Mal, dass ich SVG spiele (oder sogar einen Aufschlag). sei sanft!

Als Anzeigeumgebung wird ein SVG-fähiger Webbrowser mit einer typischen Fenstergröße angenommen. Ich habe es in Firefox 50 und in Chrome 55 getestet.

Dies viewBoxist erforderlich, um die 100-Pixel-Anforderung zu erfüllen. Das Aufblasen aller Messungen um einen geeigneten Faktor würde ebenfalls funktionieren, aber mehr Bytes benötigen. Im Übrigen ist es möglich , eine andere Byte durch Entfernen der Raum in sparen 0 -5im viewBoxWert, aber Firefox wird dies nicht als gültig akzeptiert (während Chrome).

Das Seitenverhältnis beträgt 1: 1 statt der wahren 0,866: 1. Ich bin mir nicht sicher, wie die "Faktor 2" -Regel genau zu interpretieren ist (ich denke, es bedeutet, dass eine Übertreibung von 0,433: 1 oder 1,732: 1 akzeptabel ist), aber ich bin mir ziemlich sicher, dass dies die Anforderung erfüllt sowieso.

SVG

<svg xmlns="http://www.w3.org/2000/svg"
xmlns:l="http://www.w3.org/1999/xlink"
viewBox="0 -5 26 26"><g
id="a"><path d="m7,9H3V5h6z"/><g
id="f"><path fill="red" d="m9,5H3V1h4z"/><path
fill="blue" d="m3,1l2,4L3,9l-2-4z"/></g></g><use
l:href="#a" x="3" y="6"/><use
l:href="#e" x="12"/><g
id="e"><use l:href="#a" x="-6" y="12"/><use l:href="#a" x="-12" y="12"/></g><use
l:href="#a" x="-9" y="6"/><use
l:href="#a" x="-6"/><use
l:href="#a" x="-3" y="-6"/><use
l:href="#f"/></svg>

Ergebnis

Ein PNG-Rendering des obigen SVG-Codes für Reutersvärds Dreieck


Ich denke, Sie könnten wahrscheinlich die Zeilenumbrüche hier löschen, oder? IIRC, XML ignoriert Leerzeichen in den meisten Kontexten.

@ ais523: Ja, das habe ich vergessen, bevor ich es gepostet habe. facepalm Jetzt ist es soweit. Es gibt immer noch Zeilenumbrüche, die vage lesbar bleiben, aber nur an Stellen (nämlich zwischen Tag-Namen und Attributen), an denen sowieso ein Leerzeichen benötigt wird.
Tim Pederick

Ihre Interpretation der Regel für das Seitenverhältnis ist korrekt
Digitales Trauma
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.