Dessiner le triangle de Reutersvärd


33

Cet objet impossible est le triangle de Reutersvärd :

entrez la description de l'image ici

Dessinez votre propre version selon ces règles:

  • Exactement 9 cubes au total
  • Chaque côté est composé d’exactement 4 cubes
  • Les cubes semblent se chevaucher, de sorte que l'objet rendu est en fait un objet impossible
  • 4 couleurs distinctes sont utilisées - une pour le fond et 3 pour chacune des faces des cubes
  • En sortie bitmap, le triangle complet doit avoir une hauteur minimale de 100 pixels et une largeur minimale de 100 pixels.
  • Rapport de format: la largeur et la hauteur du triangle ne doivent pas être décalées de plus d'un facteur 2
  • Le triangle peut être pivoté d’un nombre quelconque par rapport à l’image ci-dessus.
  • Le triangle peut ou non être réfléchi par rapport à l'image ci-dessus

Réponses:


14

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

Malheureusement, c'est un peu gros pour trouver une réponse.

PasteBin

Essayez-le en ligne

Avec l' -Aindicateur, cela génère un fichier ppm ASCII qui ressemble à ce qui suit:

Nouvelle sortie

Explication

Vous avez peut-être déjà deviné que je n'avais pas écrit cela à la main. Alors voici comment je l'ai fait:

J'ai d'abord créé l'image que vous voyez ci-dessus à partir de l'image fournie par le défi. Il a la particularité de ne pas avoir de canal de couleur ayant une valeur autre que 255ou de 0cette façon, nous pouvons le résumer dans un fichier plus petit avec le canal de couleur maximum défini sur 1. J'ai ensuite écrit un script python pour piloter un programme Brain-Flak. cela résout ce problème en utilisant un module que j'ai moi-même écrit et qui peut être trouvé ici . Ce n'est pas très poli c'est juste un hack que j'ai jeté ensemble pour des choses comme ça. pushest une fonction qui renvoie un code Brain-Flak efficace pour envoyer un nombre à la pile et kolmoest un programme de résolution de complexité très simple de Kolmogorov qui tente de trouver un moyen efficace de pousser une chaîne particulière vers la pile.

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

C'était très amusant et j'espère améliorer ma réponse


14
Vous avez légitimement joué au golf 160088 octets? Est-ce un record?
Neil

Peut-être que certaines réponses unaires peuvent battre cela
Roman Gräf


Votre code Python m'intrigue. C'est quoi value? (Pas ce module sur PyPI , je suppose?) Qu'est-ce que c'est kolmo?
Tim Pederick

@ TimPederick Désolé pour ça. C’est un module que j’ai écrit pour jouer au golf avec Brain-Flak. Je vais inclure un lien dans le corps.
Wheat Wizard

13

Mathematica, 237 octets

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}

Version plus facile à lire:

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}

La ligne 1 définit une fonction nqui nie la première coordonnée d'une paire ordonnée. Ligne 2 définit une fonction gqui produit un (ou moins) triangle équilatéral centré au niveau du point c, et pointant vers le bas ou vers le haut selon que sest 1ou -1. Ligne 3 définit pd'être un modèle de parallélogramme constitué par une couleur et deux triangles, et les lignes 4-6 de définir a, bet ccomme les trois différents types de parallélogrammes spécifiques qui apparaissent dans les cubes.

La ligne 8 définit une fonction {a@#, b@#, c@#}&qui dessine un cube entier centré au point #; les lignes 9 et 10 appliquent cela aux neuf points nécessaires pour former le grand triangle. Cela produit neuf cubes, commençant en haut à droite et dans le sens inverse des aiguilles d'une montre, où les derniers recouvrent des parties des précédents. Enfin, la ligne 11 redessine quatre parallélogrammes (dans le coin supérieur droit de l’image) afin qu’ils recouvrent les derniers cubes comme il se doit. La sortie est ci-dessous:

entrez la description de l'image ici


6
Attendez que Mathematica n’ait pas de fonction intégrée pour cela?
Digital Trauma

10

HTML + CSS 3D (855 866 octets)

HTML 117 octets + CSS 738 octets

Garder l' z-indexesordre était un peu délicat. ;)

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

J'ai gardé les nouvelles lignes pour une meilleure lisibilité. Peut-être que quelqu'un découvre un potentiel pour le golf. Cependant, ils ne sont pas inclus dans le nombre d'octets.

Résultat

entrez la description de l'image ici

jsFiddle Demo

Essayez vous-même

Utilisez Goole Chrome. D'autres navigateurs peuvent avoir des problèmes avec lez-indexes .

modifier

  • Sauvegardé 2 octets en supprimant le asélecteur dupliqué , grâce à ETHproductions .
  • Sauvegardé 9 octets en supprimant un élément inutile margin:0sur l' aélément.

Est-il toujours valide HTML sans HEAD/BODYbalises de fermeture? Je sais que les navigateurs ont tendance à ignorer les erreurs de syntaxe et à afficher tout ce que vous leur lancez, mais je ne pense pas que ce code suive les spécifications. (Cela dit, bonne solution!)
Federico Poloni

2
@ Federico Poloni Merci. Concernant les html|head|bodyéléments: Ils peuvent être omis. Jetez un coup d'oeil aux "balises facultatives" , vous serez surpris du nombre d'éléments et de balises de fermeture pouvant également être omis. Ce qui ne figure pas dans les spécifications, mais fonctionne également, est d’omettre les balises de fermeture des aéléments. Ils sont cependant correctement fermés par le navigateur, car vous ne pouvez pas les imbriquer. Également du point de vue de Code Golf: Tout ce qui " compile " et a le bon résultat est valide. ;)
insertusernamehere

9

BBC BASIC, 147 octets

taille de fichier avec jeton 129 octets

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 octets enregistrés en utilisant une spécification de coordonnées absolues ( MOVE) et deux spécifications relatives par parallélogramme, au lieu de modifier l'origine pour pouvoir utiliser toutes les spécifications absolues. 1 octet de blancs inutiles éliminés.

BBC BASIC, 150 octets

127 octets de taille de fichier symbolisée

Téléchargez l'interprète à adresse http://www.bbcbasic.co.uk/bbcwin/download.html

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.

Explication

On commence avec les coordonnées en haut à droite et on trace les losanges par groupes de 3. Avant chaque groupe de 3, on déplace l'origine (Ouest, Ouest, Ouest, SE, SE, SE, NE, NE NE). Cela signifie que le groupe de 3 en haut à droite se trouve le dernier groupe complet à tracer, ramenant l'origine à son emplacement d'origine. Nous continuons ensuite et traçons à nouveau le noir et le rouge (mais pas le vert) du premier groupe, soit un total de 29 losanges.

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

Sortie

entrez la description de l'image ici


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>

Moins golfé

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

Tester

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

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 octets

C'est la première fois que je joue au golf SVG (ou à un balisage en fait); sois gentil!

L’environnement de visualisation supposé est un navigateur Web compatible SVG avec une taille de fenêtre typique. Je l'ai testé sous Firefox 50 et Chrome 55.

Le viewBoxest nécessaire pour répondre à l'exigence de 100 pixels; exploser toutes les mesures avec un facteur approprié fonctionnerait également, mais prendrait plus d'octets. Incidemment, il est possible de sauvegarder un autre octet en supprimant l'espace dans 0 -5la viewBoxvaleur, mais Firefox n'acceptera pas que celui-ci soit valide (contrairement à Chrome).

Le rapport de format est 1: 1 au lieu de 0.866: 1. Je ne sais pas exactement comment la règle du "facteur de 2" doit être interprétée (je pense que cela signifie qu'une exagération aussi extrême que 0,433: 1 ou 1,732: 1 est acceptable), mais je suis à peu près sûr que cela répond à l'exigence en tous cas.

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>

Résultat

Un rendu PNG du code SVG ci-dessus pour le triangle de Reutersvärd


Je pense que vous pourriez probablement supprimer les nouvelles lignes ici, n'est-ce pas? IIRC, XML ignore les espaces dans la plupart des contextes.

@ ais523: Oui, j'ai oublié de le faire avant de le poster. facepalm C'est fait maintenant, cependant. Il y a encore des sauts de ligne, ce qui le rend vaguement lisible, mais uniquement aux endroits (notamment entre les noms de balises et les attributs) où un espace quelconque est nécessaire.
Tim Pederick

Votre interprétation de la règle de format d'image est correcte
Digital Trauma
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.