Desenhe o triângulo de Reutersvärd


33

Esse objeto impossível é o triângulo da Reutersvärd :

insira a descrição da imagem aqui

Desenhe sua própria versão de acordo com estas regras:

  • Exatamente 9 cubos no total
  • Cada lado é composto de exatamente 4 cubos
  • Os cubos parecem se sobrepor, de modo que o objeto renderizado é de fato um objeto impossível
  • São usadas 4 cores distintas - uma para o fundo e 3 para cada uma das faces dos cubos
  • Na saída de bitmap, o triângulo completo deve ter pelo menos 100 pixels de altura e pelo menos 100 pixels de largura
  • Relação de aspecto: a largura e a altura do triângulo completo não devem ser alteradas em mais de um fator de 2
  • O triângulo pode ser girado em qualquer quantidade relativa à imagem acima
  • O triângulo pode ou não ser refletido em relação à imagem acima

Respostas:


14

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

Infelizmente, isso é um pouco grande para caber em uma resposta.

PasteBin

Experimente Online

Com o -Asinalizador, ele gera um arquivo ASCII ppm parecido com o seguinte:

Nova saída

Explicação

Você já deve ter adivinhado que não escrevi isso à mão. Então, aqui está como eu fiz isso:

Eu criei a imagem que você vê acima a partir da imagem fornecida pelo desafio. Ele tem a distinção de não ter um canal de cores com outro valor que não seja, 255ou 0dessa maneira, podemos agrupá-lo em um arquivo menor com o canal de cores máximo definido como 1. Em seguida, escrevi um script python para jogar no programa Brain-Flak que resolve isso usando um módulo que escrevi para mim mesmo, que pode ser encontrado aqui . Não é muito polido, é apenas um truque que joguei juntos para coisas assim. pushé uma função que retorna código Brain-Flak eficiente para enviar um número para a pilha e kolmoé um programa muito simples de solução de complexidade de Kolmogorov que tenta encontrar uma maneira eficiente de enviar uma sequência específica para a pilha.

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

Isso foi muito divertido e espero melhorar minha resposta


14
Você legitimamente jogou fora 160088 bytes? Isso é um recorde?
Neil

Talvez algumas respostas unárias consigam superar isso
Roman Gräf


Seu código Python me intriga. O que é value? (Não é este módulo no PyPI , suponho?) O que é kolmo?
Tim Pederick

@ TimPederick Desculpe por isso. Esse é um módulo que eu mesmo escrevi para jogar Brain-Flak. Vou incluir um link no corpo.
Assistente de trigo

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}

Versão mais fácil de ler:

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}

A linha 1 define uma função nque nega a primeira coordenada de um par ordenado. A linha 2 define uma função gque produz um triângulo equilátero (aproximadamente) centrado no ponto ce apontando para baixo ou para cima, dependendo de sser 1ou -1. Linha 3 define p-se um modelo de paralelogramo que consiste de uma cor e dois triângulos, e as linhas 4-6 definir a, be cpara ser os três tipos específicos diferentes de paralelogramos que aparecem nos cubos.

A linha 8 define uma função {a@#, b@#, c@#}&que desenha um cubo inteiro centrado no ponto #; as linhas 9 e 10 aplicam isso aos nove pontos necessários para formar o triângulo maior. Isso produz nove cubos, começando no canto superior direito e indo no sentido anti-horário, onde os últimos cobrem partes dos anteriores. Finalmente, a linha 11 redesenha quatro paralelogramos (no canto superior direito da figura) para que eles cubram os cubos posteriores como deveriam. A saída está abaixo:

insira a descrição da imagem aqui


6
Espere o que o Mathematica não tem um built-in para isso?
Digital Trauma

10

HTML + CSS 3D (855 866 bytes)

HTML 117 bytes + CSS 738 bytes

Manter a z-indexesordem em ordem era um pouco 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>

Eu mantive as novas linhas para melhor legibilidade. Talvez alguém encontre potencial para mais golfe. No entanto, eles não estão incluídos na contagem de bytes.

Resultado

insira a descrição da imagem aqui

jsFiddle Demo

Tente você mesmo

Use o Goole Chrome. Outros navegadores podem ter problemas com oz-indexes .

Editar

  • Economizou 2 bytes removendo o aseletor duplicado , graças ao ETHproductions .
  • Economizou 9 bytes removendo um elemento desnecessário margin:0no aelemento.

Ainda é HTML válido sem HEAD/BODYas tags de fechamento? Eu sei que os navegadores tendem a ignorar erros de sintaxe e tentam exibir o que você joga neles, mas não acho que esse código siga as especificações. (Dito isto, grande solução!)
Federico Poloni

2
@FedericoPoloni Obrigado. Em relação aos html|head|bodyelementos: eles podem ser omitidos. Dê uma olhada em "Tags opcionais" ; você ficará surpreso com quantos elementos e tags de fechamento também podem ser omitidos. O que não está nas especificações, mas também funciona, é omitir as tags de fechamento dos aelementos. No entanto, eles são fechados corretamente pelo navegador, porque você não pode aninhá-los. Também do ponto de vista do Code Golf: tudo o que " compila " e tem a saída correta é válido. ;)
insertusernamehere

9

BBC BASIC, 147 bytes

tamanho do arquivo 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 salvos usando uma especificação de coordenada absoluta ( MOVE) e duas especificações relativas por paralelogramo, em vez de alterar a origem para poder usar todas as especificações absolutas. 1 byte de espaço em branco desnecessário eliminado.

BBC BASIC, 150 bytes

tamanho do arquivo tokenizado 127 bytes

Faça o download do intérprete em 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.

Explicação

Começamos com as coordenadas no canto superior direito e plotamos losangos em grupos de 3. Antes de cada grupo de 3, movemos a origem (Oeste, Oeste, Oeste, SE, SE SE, NE, NE NE.) Isso significa que o grupo de 3 no canto superior direito, é o último grupo completo a ser plotado, retornando a origem à sua localização original. Em seguida, continuamos e plotamos o preto e o vermelho (mas não o verde) do primeiro grupo novamente, um total de 29 losangos.

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

Saída

insira a descrição da imagem aqui


8

HTML + JavaScript (ES6), 351337384

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

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

Teste

<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 é minha primeira vez jogando golfe SVG (ou qualquer marcação, de fato); seja gentil!

O ambiente de visualização assumido é um navegador da Web compatível com SVG com algo como um tamanho de janela típico. Eu testei no Firefox 50 e no Chrome 55.

O viewBoxé necessário para cumprir a exigência 100-pixel; explodir todas as medições por um fator adequado também funcionaria, mas levaria mais bytes. Aliás, é possível salvar outro byte, removendo o espaço 0 -5no viewBoxvalor, mas o Firefox não vai aceitar isso como válido (ao passo que o Chrome vai).

A proporção é de 1: 1 em vez do verdadeiro 0,866: 1. Não sei exatamente como a regra "fator de 2" deve ser interpretada (acho que significa que um exagero tão extremo quanto 0,433: 1 ou 1,732: 1 é aceitável), mas tenho certeza de que isso atende aos requisitos de qualquer forma.

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

Uma renderização PNG do código SVG acima para Reutersvärd's Triangle


Eu acho que você provavelmente poderia excluir as novas linhas aqui, não poderia? IIRC, XML desconsidera espaço em branco na maioria dos contextos.

@ ais523: Sim, eu esqueci de fazer isso antes de postar. facepalm Já está feito agora. Ainda há novas linhas, mantendo-a vagamente legível, mas apenas em lugares (nomeadamente entre nomes e atributos de tags) onde é necessário um espaço de algum tipo.
Tim Pederick

Sua interpretação da regra proporção é correta
Digital Trauma
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.