Triángulo de Penrose Codegolf


19

El triángulo de Penrose , también conocido como el tribar de Penrose, o el tribar imposible, es un objeto imposible.

El objetivo en este desafío es mostrar un triángulo de Penrose en la menor cantidad de bytes posible.

Triángulo de Penrose

Fuente: Wikipedia

Reglas:

  1. Debe mostrar el triángulo de Penrose digitalmente después de generarlo.
  2. Deben tener el mismo aspecto que la imagen de arriba de la página wiki (fuente arriba) sin mostrar directamente la imagen.
  3. La misma imagen con el mismo esquema de color debe mostrarse en un tamaño de al menos 400x400.
  4. Debe ser lo más preciso posible.

¡Buena suerte y diviertete!


2
Creo que esto tiene el potencial de ser un gran desafío, pero hay ciertas especificaciones que deben aclararse, como los colores de la imagen y sus dimensiones.
Kritixi Lithos

55
¡PD! No se desanime solo porque el desafío está cerrado. Si se tratara de una mala idea de desafío, los votos cerrados estarían acompañados de votos negativos ... :)
Stewie Griffin

2
@DigitalTrauma Yo diría que no. Eso tiene muchos más detalles para dibujar.
mbomb007

1
¿Algún gris será o tiene que ser exactamente el mismo gris? Si es lo último, sería bueno proporcionar el tono gris exacto en el texto del desafío.
Martin Ender

1
Las raciones de aspecto también serían útiles si tuvieran que reproducirse exactamente.
Martin Ender

Respuestas:


3

logotipo, 129 120 bytes

Dibuja solo los primeros 4 lados de cada forma de L, luego levanta el lápiz, se mueve al punto correspondiente en la siguiente forma de L, baja el lápiz y dibuja 4 lados de eso. Cada forma de L toma 2 lados de la anterior.

Últimas ediciones: muévase del área de relleno negro al área de relleno gris usando en fdlugar de setx, y cambie todos los movimientos de fda bkpara guardar un byte en una rotación de 180 grados: rt 210-> rt 30, acortar setpencolora setpc(no documentado en el intérprete que estoy usando, pero funciona .)

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

logotipo, 140 bytes

Dibuja los 6 lados de cada forma de L, sobrepasa el último borde, luego gira 180 grados para comenzar el siguiente.

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

ejecutar en http://www.calormen.com/jslogo/#

Se recomienda hacerlo cs pd setpencolor 0antes de correr para asegurarse de que la pantalla esté despejada, la tortuga esté centrada y apuntando hacia arriba, el lápiz está hacia abajo y configurado en negro (configuración predeterminada, no se requiere para una nueva sesión) y también htpara ocultar la tortuga ( stse muéstralo de nuevo.)

ingrese la descripción de la imagen aquí


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


¡Eso es muy agradable!
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'

Desafortunadamente, execno se implementa en Trinket, por lo que no se puede probar en línea tal como está. Al menos, no en la versión gratuita. Yo imprimí la cadena y pegado como un código para probarlo. Si es inteligente con los scripts, puede cambiar el tamaño del html / css según sea necesario para obtener un lienzo más grande. Deja me saber si lo haces.

Pruébelo en línea : utiliza un tamaño más pequeño ya que el lienzo del sitio es demasiado pequeño para 400 px, pero puede ver la salida completa.

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

Me pregunto si 255*n/2puede reducirse a 128*n, creo, que los valores RGB flotantes se redondearán de todos modos, ¿habría algún cambio en los colores de los píxeles?
Albert Renshaw

@AlbertRenshaw Ese es el código sin golf. Vea el código anterior para la versión de golf. Además, este es Python 2, por lo que no son flotantes, son enteros, ya que la división es la división entera.
mbomb007

Oh ya veo; ¡Gracias!
Albert Renshaw

6

PHP, 153 bytes

Esto solo funcionará si la short_open_tagconfiguración está habilitada. El código fuente contiene caracteres no imprimibles, por lo tanto, tenga un volcado hexadecimal:

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

Los datos descomprimidos se ven así (con saltos de línea agregados para legibilidad):

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

Aunque los datos SVG no son completamente válidos, PHP los sirve de manera text/htmlpredeterminada. Sin una declaración doctype, el documento se maneja en modo peculiar, lo cual es muy indulgente.

Para mejorar la compresión, dividí la imagen en tres partes en forma de "7" que se pueden dibujar utilizando <path>elementos casi idénticos . La imagen resultante se expandirá para llenar la ventana gráfica. Aquí hay una captura de pantalla de una ventana de 500 × 500 píxeles:

Captura de pantalla de imagen SVG de triángulo de Penrose de 500 × 500 píxeles


5

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

Hace uso de una inclinación horizontal de 30 grados: en el tercer argumento de la transformación de matriz, la tangente de 30 ° se representa como pow(3,-.5).

Hay bastantes números mágicos feos, y no coincide con las proporciones de la imagen de Wikipedia. Estoy seguro de que hay una forma más "matemática" de hacerlo; Cualquier ayuda sería apreciada.

Vea la versión sin golf en 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 bytes

Fronteras y sesgos en abundancia! Probado en Chrome. Vea la versión sin golf en 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>


¿Cumple el requisito de min 400x400px?
sergiol

No necesitas la final >, ¿verdad?
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}

Dibuja 3 polígonos usando AnglePath, múltiplos de giros de 60 grados y aprovechando que el punto de partida para cada polígono es el quinto punto del polígono anterior.


1
Buen enfoque, usando 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

Triángulo de Penrose

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.