Codegolf do triângulo de Penrose


19

O triângulo de Penrose , também conhecido como tribar de Penrose, ou tribar impossível, é um objeto impossível.

O objetivo deste desafio é exibir um triângulo de Penrose no menor número possível de bytes.

Triângulo de Penrose

Fonte: Wikipedia

Regras:

  1. Você deve exibir o triângulo Penrose digitalmente depois de gerá-lo.
  2. Eles devem ter a mesma aparência da imagem acima da página wiki (fonte acima) sem mostrar diretamente a imagem.
  3. A mesma imagem com o mesmo esquema de cores deve ser mostrada em pelo menos 400x400.
  4. Deve ser o mais preciso possível.

Boa sorte e divirta-se!


2
Eu acho que isso tem potencial para ser um grande desafio, mas há algumas especificações que precisam ser esclarecidas, como as cores da imagem e suas dimensões.
Kritixi Lithos 28/02

5
PS! Não desanime apenas porque o desafio está encerrado. Se era uma idéia ruim desafio, então os próximos votos seriam acompanhados com downvotes ... :)
Stewie Griffin

2
@DigitalTrauma, eu diria que não. Isso tem muito mais detalhes para desenhar.
Mbomb007

11
Algum cinza faz ou precisa ser exatamente o mesmo cinza? Se for o último, seria bom fornecer o tom exato de cinza no texto do desafio.
Martin Ender

11
As relações de aspecto também seriam úteis se precisassem ser reproduzidas exatamente.
Martin Ender

Respostas:


3

logotipo, 129 120 bytes

Desenha apenas os 4 primeiros lados de cada forma de L, depois levanta a caneta, move-se para o ponto correspondente na próxima forma de L, abaixa a caneta e desenha 4 lados dela. Cada forma de L empresta 2 lados da anterior.

Edições mais recentes: mova da área de preenchimento preto para a área de preenchimento cinza usando em fdvez de setxe altere todos os movimentos de fdpara bksalvar um byte em uma rotação de 180 graus: rt 210-> rt 30, abrevie setpencolorpara setpc(não documentado no intérprete que estou usando, mas 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

Desenha os 6 lados de cada forma de L, ultrapassa a última borda e gira 180 graus para iniciar a próxima.

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

execute em http://www.calormen.com/jslogo/#

É recomendável fazer isso cs pd setpencolor 0antes da execução para garantir que a tela fique limpa, a tartaruga esteja centralizada e apontando para cima, a caneta abaixada e definida como preta (configurações padrão, não necessárias para uma nova sessão) e também htpara ocultar a tartaruga ( stserá mostre novamente.)

insira a descrição da imagem aqui


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


Isso é muito legal!
Steve Bennett

7

Python 2, 211 201 195 188 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'

Infelizmente, execnão está implementado no Trinket, portanto, isso não pode ser testado online como está. Pelo menos, não na versão gratuita. Eu impresso a corda e coladas como código para testá-lo. Se você for inteligente com scripts, poderá redimensionar o html / css conforme necessário para obter uma tela maior. Deixe-me saber se você faz.

Experimente online - usa um tamanho menor, pois a tela do site é muito pequena para 400px, mas você pode ver toda a saída.

Ungolfed:

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)

Eu estou querendo saber se o 255*n/2pode ser diminuído para 128*neu acho que os valores RGB flutuantes serão arredondados de qualquer maneira, então haveria uma alteração nas cores dos pixels?
Albert Renshaw

@AlbertRenshaw Esse é o código não destruído. Veja o código acima para a versão golfed. Além disso, este é o Python 2, então eles não são carros alegóricos, são números inteiros, pois a divisão é uma divisão inteira.
mbomb007

Ah eu vejo; obrigado!
Albert Renshaw 28/02

6

PHP, 153 bytes

Isso funcionará apenas se a short_open_tagconfiguração estiver ativada. O código fonte contém caracteres não imprimíveis; portanto, faça um dump 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                   }`....');

Os dados descompactados têm esta aparência (com quebras de linha adicionadas para legibilidade):

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

Embora os dados SVG não sejam totalmente válidos, o PHP os serve como text/htmlpadrão. Sem uma declaração de tipo de documento, o documento é tratado no modo peculiar, o que é muito indulgente.

Para melhorar a compactação, quebrei a imagem em três partes em forma de "7" que podem ser desenhadas usando <path>elementos quase idênticos . A imagem resultante será expandida para preencher a janela de visualização. Aqui está uma captura de tela de uma janela de 500 × 500 pixels:

Captura de tela da imagem SVG de triângulo Penrose de 500 × 500 pixels


5

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

Utiliza uma inclinação horizontal de 30 graus - no terceiro argumento da transformação de matriz, a tangente de 30 ° é representada como pow(3,-.5).

Existem alguns números mágicos feios e não correspondem exatamente às proporções da imagem da Wikipedia. Estou certo de que existe uma maneira mais "matemática" de fazer isso; Qualquer ajuda seria apreciada.

Veja a versão não destruída no 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

Fronteiras e inclinações em abundância! Testado no Chrome. Veja a versão não destruída no 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>


Atende ao requisito mínimo de 400x400px?
sergiol 25/09

Você não precisa da final >, certo?
Stan Strum 30/09

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}

Desenha 3 polígonos usando AnglePath, múltiplos de giros de 60 graus e aproveitando que o ponto inicial de cada polígono seja o 5º ponto do polígono anterior.


11
Boa abordagem, 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

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.