Penrose Triangle Codegolf

19

Le triangle de Penrose , également connu sous le nom de tribar de Penrose, ou tribar impossible, est un objet impossible.

Le but de ce défi est d'afficher un triangle de Penrose dans le moins d'octets possible.

Triangle de Penrose

Source: Wikipedia

Règles:

  1. Vous devez afficher le triangle de Penrose numériquement après l'avoir généré.
  2. Ils doivent ressembler à l'image ci-dessus de la page wiki (source ci-dessus) sans afficher directement l'image.
  3. La même image avec le même schéma de couleurs doit être affichée dans une taille d'au moins 400x400.
  4. Doit être aussi précis que possible.

Bonne chance et amusez-vous bien!

arodebaugh
la source
2
Je pense que cela a le potentiel d'être un grand défi, mais il y a certaines spécifications qui doivent être clarifiées comme les couleurs de l'image et ses dimensions.
Kritixi Lithos
5
PS! Ne vous découragez pas simplement parce que le défi est clos. Si c'était une mauvaise idée de défi, les votes serrés seraient accompagnés de votes négatifs ... :)
Stewie Griffin
2
@DigitalTrauma, je dirais que non. Cela a beaucoup plus de détails à tirer.
mbomb007
1
Un gris fera-t-il ou doit-il être exactement le même gris? Si c'est le dernier, ce serait bien de fournir le ton de gris exact dans le texte du défi.
Martin Ender
1
Les rations d'aspect seraient également utiles si elles devaient être reproduites exactement.
Martin Ender

Réponses:

3

logo, 129 120 octets

Dessine uniquement les 4 premiers côtés de chaque forme en L, puis soulève le stylo, se déplace à l'endroit correspondant sur la forme en L suivante, abaisse le stylo et dessine 4 côtés de celle-ci. Chaque forme en L emprunte 2 côtés à la précédente.

Dernières modifications: passer de la zone de remplissage noire à la zone de remplissage grise en utilisant fdau lieu de setxet modifier tous les mouvements de fdà bkpour enregistrer un octet sur une rotation de 180 degrés: rt 210-> rt 30, raccourcir setpencoloren setpc(non documenté dans l'interpréteur que j'utilise, mais cela fonctionne .)

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 octets

Dessine les 6 côtés de chaque forme de L, dépasse le dernier bord, puis tourne à 180 degrés pour commencer le suivant.

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

exécuter à http://www.calormen.com/jslogo/#

Il est recommandé de le faire cs pd setpencolor 0avant de courir pour s'assurer que l'écran est clair, la tortue est centrée et pointée vers le haut, le stylo est baissé et réglé sur noir (paramètres par défaut, non requis pour une toute nouvelle session) et aussi htpour cacher la tortue ( stsera montrer à nouveau.)

entrez la description de l'image ici

Level River St
la source
11

SVG (HTML5), 191 octets

<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

Neil
la source
C'est vraiment sympathique!
Steve Bennett
7

Python 2, 211 201 195 188 175 173 octets

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'

Malheureusement, execn'est pas implémenté dans Trinket, donc cela ne peut pas être testé en ligne tel quel. Du moins, pas dans la version gratuite. J'ai imprimé la chaîne et collé comme code pour la tester. Si vous êtes intelligent avec les scripts, vous pouvez redimensionner le html / css si nécessaire pour obtenir un canevas plus grand. Faites-moi savoir si vous le faites.

Essayez-le en ligne - utilise une taille plus petite car la toile du site est trop petite pour 400 px, mais vous pouvez voir la sortie entière.

Non golfé:

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)
mbomb007
la source
Je me demande si la valeur 255*n/2peut être réduite à 128*nje pense que les valeurs RVB flottantes seront arrondies de toute façon, y aurait-il un changement dans les couleurs des pixels?
Albert Renshaw
@AlbertRenshaw C'est le code non golfé. Voir le code ci-dessus pour la version golfée. De plus, c'est Python 2, donc ce ne sont pas des flottants, ce sont des entiers, car la division est une division entière.
mbomb007
Oh je vois; Merci!
Albert Renshaw
6

PHP, 153 octets

Cela ne fonctionnera que si le short_open_tagparamètre est activé. Le code source contient des caractères non imprimables, alors utilisez plutôt un vidage hexadécimal:

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

Les données décompressées ressemblent à ceci (avec des sauts de ligne ajoutés pour plus de lisibilité):

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

Bien que les données SVG ne soient pas entièrement valides, PHP les sert text/htmlpar défaut. Sans déclaration doctype, le document est traité en mode excentrique, ce qui est très indulgent.

Pour améliorer la compression, j'ai divisé l'image en trois parties en forme de "7" qui peuvent être dessinées à l'aide d' <path>éléments presque identiques . L'image résultante se développera pour remplir la fenêtre. Voici une capture d'écran d'une fenêtre de 500 × 500 pixels:

Capture d'écran de l'image SVG triangle Penrose 500 × 500 pixels

ossifrage délicat
la source
5

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

Utilise un biais horizontal de 30 degrés - dans le 3ème argument de la transformation matricielle, la tangente de 30 ° est représentée par pow(3,-.5).

Il y a pas mal de chiffres magiques moches, et cela ne correspond pas tout à fait aux proportions de l'image Wikipedia. Je suis certain qu'il existe une façon plus «mathématique» de procéder à ce sujet; Toute aide serait appréciée.

Voir la version non golfée sur 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>

darrylyeo
la source
4

HTML + CSS, 9 + 315 309 308 = 317 octets

Frontières et biais à gogo! Testé sur Chrome. Voir la version non golfée sur 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>

darrylyeo
la source
Répond-il à l'exigence de min 400x400px?
sergiol
Vous n'avez pas besoin de la finale >, non?
Stan Strum
4

Mathematica 171 octets

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}

Dessine 3 polygones à l'aide d'AnglePath, des multiples de virages à 60 degrés, et en profitant du fait que le point de départ de chaque polygone est le 5e point du polygone précédent.

Kelly Lowder
la source
1
Belle approche, en utilisant 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

Triangle de Penrose

sergiol
la source