Dibuja el triángulo de Reutersvärd


33

Este objeto imposible es el triángulo de Reutersvärd :

ingrese la descripción de la imagen aquí

Dibuja tu propia versión de acuerdo con estas reglas:

  • Exactamente 9 cubos en total
  • Cada lado está formado por exactamente 4 cubos
  • Los cubos parecen superponerse de tal manera que el objeto renderizado es de hecho un objeto imposible
  • Se utilizan 4 colores distintos: uno para el fondo y 3 para cada una de las caras de los cubos
  • En la salida de mapa de bits, el triángulo completo debe tener al menos 100 píxeles de alto y al menos 100 píxeles de ancho
  • Relación de aspecto: el ancho y la altura del triángulo completo no deben estar separados por más de un factor de 2
  • El triángulo puede rotarse en cualquier cantidad con respecto a la imagen de arriba
  • El triángulo puede o no reflejarse en relación con la imagen de arriba

Respuestas:


14

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

Desafortunadamente, esto es un poco grande para caber en una respuesta.

PasteBin

Pruébalo en línea

Con la -Abandera, esto genera un archivo ASCII ppm que tiene el siguiente aspecto:

Nueva salida

Explicación

Es posible que ya hayas adivinado que no escribí esto a mano. Así que así es como lo hice:

Primero hice la imagen que ves arriba de la imagen proporcionada por el desafío. Tiene la distinción de no tener un canal de color que tenga un valor diferente 255o de 0esta manera, podemos envolverlo en un archivo más pequeño con el canal de color máximo establecido en 1. Luego escribí un script de Python para desarrollar un programa Brain-Flak eso resuelve esto usando un módulo que escribí yo mismo que se puede encontrar aquí . No está muy pulido, es solo un truco que hice para cosas como esta. pushes una función que devuelve un código Brain-Flak eficiente para empujar un número a la pila y kolmoes un programa de resolución de complejidad de Kolmogorov muy simple que intenta encontrar una manera eficiente de empujar una cadena particular a la pila.

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

Esto fue bastante divertido y espero mejorar mi respuesta


14
¿Has jugado legítimamente a 160088 bytes? ¿Eso es un récord?
Neil

Tal vez algunas respuestas unitarias puedan superar eso
Roman Gräf


Tu código de Python me intriga. ¿Qué es value? (¿No es este módulo en PyPI , supongo?) ¿Qué es kolmo?
Tim Pederick el

@TimPederick Lo siento por eso. Ese es un módulo que me escribí para jugar al golf Brain-Flak. Incluiré un enlace en el cuerpo.
Wheat Wizard

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}

Versión más fácil de leer:

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 línea 1 define una función nque niega la primera coordenada de un par ordenado. Línea 2 define una función gque produce un (unos) triángulo equilátero centrado en el punto c, y apuntando hacia arriba o abajo dependiendo de si ses 1o -1. Línea 3 define ppara ser una plantilla de paralelogramo que consiste en un color y dos triángulos, y las líneas 4-6 definir a, by cser los tres tipos específicos diferentes de paralelogramos que aparecen en los cubos.

La línea 8 define una función {a@#, b@#, c@#}&que dibuja un cubo completo centrado en el punto #; las líneas 9 y 10 aplican eso a los nueve puntos necesarios para hacer el triángulo más grande. Esto produce nueve cubos, que comienzan en la esquina superior derecha y van en sentido antihorario, donde los posteriores cubren partes de los primeros. Finalmente, la línea 11 vuelve a dibujar cuatro paralelogramos (en la esquina superior derecha de la imagen) para que terminen cubriendo los cubos posteriores como se supone que deben hacerlo. La salida está abajo:

ingrese la descripción de la imagen aquí


66
Espera, ¿qué Mathematica no tiene incorporado para esto?
Trauma digital

10

HTML + CSS 3D (855 866 bytes)

HTML 117 bytes + CSS 738 bytes

Mantener el z-indexesorden fue un poco complicado. ;)

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

He mantenido las nuevas líneas para una mejor legibilidad. Tal vez alguien ve potencial para más golf. Sin embargo, no están incluidos en el recuento de bytes.

Resultado

ingrese la descripción de la imagen aquí

jsFiddle Demo

Inténtalo tú mismo

Utiliza Goole Chrome. Otros navegadores pueden tener problemas con elz-indexes .

Editar

  • Ahorró 2 bytes al eliminar el duplicado a-selector, gracias a ETHproductions .
  • Se guardaron 9 bytes al eliminar un elemento innecesario margin:0en el aelemento.

¿Sigue siendo HTML válido sin HEAD/BODYetiquetas de cierre? Sé que los navegadores tienden a ignorar los errores de sintaxis e intentan mostrar lo que sea que les arrojes, pero no creo que este código siga las especificaciones. (Dicho esto, ¡gran solución!)
Federico Poloni

2
@FedericoPoloni Gracias. En cuanto a los html|head|bodyelementos: se pueden omitir. Eche un vistazo a "Etiquetas opcionales" , se sorprenderá de cuántos elementos y etiquetas de cierre también se pueden omitir. Lo que no está en las especificaciones pero también funciona es omitir las etiquetas de cierre de los aelementos. Sin embargo, el navegador las cierra correctamente porque no puede anidarlas. También desde el punto de vista de Code Golf: todo lo que se " compila " y tiene el resultado correcto es válido. ;)
insertusernamehere

9

BBC BASIC, 147 bytes

tamaño de archivo tokenizado 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 guardados utilizando una especificación de coordenadas absolutas (MOVE ) y dos especificaciones relativas por paralelogramo, en lugar de cambiar el origen para poder usar todas las especificaciones absolutas. 1 byte de espacio en blanco innecesario eliminado.

BBC BASIC, 150 bytes

tamaño de archivo tokenizado 127 bytes

Descargue el intérprete en 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.

Explicación

Comenzamos con las coordenadas en la parte superior derecha y graficamos rombos en grupos de 3. Antes de cada grupo de 3, movemos el origen (Oeste, Oeste, Oeste, SE, SE SE, NE, NE NE). Eso significa que el grupo de 3 en la parte superior derecha está el último grupo completo que se trazará, devolviendo el origen a su ubicación original. Luego continuamos y trazamos nuevamente el negro y el rojo (pero no el verde) del primer grupo, un total de 29 rombos.

Sin golf

  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

Salida

ingrese la descripción de la imagen aquí


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>

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

Prueba

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

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

Esta es mi primera vez jugando al golf SVG (o cualquier marcado, de hecho); ¡sé gentil!

El entorno de visualización supuesto es un navegador web con capacidad SVG con algo parecido a un tamaño de ventana típico. Lo probé en Firefox 50 y en Chrome 55.

El viewBoxes necesario para cumplir con el requisito de 100 píxeles; hacer explotar todas las mediciones por un factor adecuado también funcionaría, pero tomaría más bytes. Por cierto, es posible guardar otro byte eliminando el espacio en 0 -5el viewBoxvalor, pero Firefox no lo aceptará como válido (mientras que Chrome sí lo hará).

La relación de aspecto es 1: 1 en lugar del verdadero 0,866: 1. No estoy seguro exactamente de cómo se debe interpretar la regla del "factor de 2" (creo que significa que una exageración tan extrema como 0.433: 1 o 1.732: 1 es aceptable), pero estoy bastante seguro de que cumple con el requisito de todas formas.

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>

Resultado

Una representación PNG del código SVG anterior para el triángulo de Reutersvärd


Creo que probablemente podrías eliminar las nuevas líneas aquí, ¿no? IIRC, XML ignora los espacios en blanco en la mayoría de los contextos.

@ ais523: Sí, olvidé hacer eso antes de publicarlo. Facepalm está hecho ahora, sin embargo. Todavía hay nuevas líneas, manteniéndolo vagamente legible, pero solo en lugares (es decir, entre nombres de etiquetas y atributos) donde se necesita un espacio de algún tipo de todos modos.
Tim Pederick el

Su interpretación de la regla de la relación de aspecto es correcta
Trauma digital
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.