Golfe Flor da Vida

19

O desafio aqui é representar com precisão a flor da vida (que é uma figura geométrica sagrada de acordo com alguns) no idioma de sua escolha.

Flor da vida

O design consiste em um arranjo de círculos e círculos parciais do raio 1, como mostrado, cujos centros estão dispostos em uma grade triangular do passo 1, mais um círculo maior do raio 3 ao redor deles.

O design pode ser dimensionado como você desejar, mas é permitido um erro máximo de 2% em relação matematicamente correto. Se você estiver usando gráficos raster, isso limita efetivamente o diâmetro dos pequenos círculos a pelo menos cerca de 100 pixels.

Como esse é o código-golfe, o código mais curto (bytes) vence.

Benjamin Spector
fonte
10
Bem vindo ao site! Para que você saiba, geralmente é recomendável esperar um pouco antes de aceitar uma resposta, para que outros usuários não vejam o concurso como "acabado" e haverá mais participação e competição.
DJMcMayhem
2
"visual, reconhecível e correto" não é claro nem objetivo. É impossível determinar se um envio é válido ou não sem critérios objetivos de validade. Incentivamos o uso do Sandbox para solucionar possíveis problemas com desafios antes de publicá-los no site principal.
Mego
Além de uma regra abstrata como “reconhecível”, seria melhor especificar um tamanho mínimo.
manatwork
Como ninguém o conectou ainda, temos uma caixa de areia na meta projetada para ajudar novos desafios a obter feedback. Você pode encontrá-lo aqui: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi
11
Na verdade, não são apenas 19 círculos. Existem alguns arcos circulares nas bordas também. (6 deles cobrindo um ângulo de 2π / 3, 12 cobrindo π, 18 cobrindo π / 6)
Martin Ender

Respostas:

23

Mathematica, 177 173 128 124 120 bytes

c=Circle;Graphics@{{0,0}~c~3,Rotate[Table[If[-3<x-y<4,c[{√3x,-x+2y}/2,1,Pi/{6,2}]],{x,-3,2},{y,-4,2}],Pi/3#]&~Array~6}

insira a descrição da imagem aqui

A idéia principal é compor o resultado de seis versões rotacionadas disso:

insira a descrição da imagem aqui

Esta, por sua vez, é uma mesa retangular de arcos circulares idênticos, com dois cantos cortados. Se removermos a tesoura e representar cada centro do círculo com a #, basicamente queremos distribuir os círculos neste padrão:

####
#####
######
######
 #####
  ####

Essas arestas são cortadas impondo a condição -3 < x-y < 4nos índices 2D (já que o valor de x-yé constante ao longo das diagonais) e o cisalhamento vem da multiplicação desses xe yde vetores de base não ortogonais que abrangem a grade que estamos procurando.

Essa orientação específica dos arcos não rotacionados acaba sendo a mais curta, já que ambas as extremidades do arco se dividem uniformemente Pipara que o arco possa ser expresso como Pi/{6,2}(todos os outros arcos exigiriam um sinal de menos adicional ou números inteiros no numerador).

Martin Ender
fonte
Use √3 para salvar 2 caracteres e 0 bytes, enquanto elimina uma fonte de erro numérico.
Kelly Lowder
@KellyLowder Bom ponto, fixo.
Martin Ender
8

OpenSCAD, 228 bytes

$fn=99;module o(a=9){difference(){circle(a);circle(a-1);}}function x(n)=9*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o();q(g-1);}}else{intersection(){translate(x(i))o();circle(9);}}}q(2);o(27);

A seguir, uma versão que permite que alguém defina os parâmetros r (raio) ew (largura dos anéis).

r=1;w=.1;$fn=99;module o(n){difference(){circle(n);circle(n-w);}}function x(n)=(r-w/2)*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o(r);q(g-1);}}else{intersection(){translate(x(i))o(r);circle(r);}}}q(2);o(3*r-w);

Esta versão possui exatamente 246 caracteres.
Parte desse código é tecnicamente desnecessário, mas faz com que pareça mais com a imagem.

Henry Wildermuth
fonte
Estou recebendo este erro no OpenSCAD.net (Firefox 47): Error: Error: Parse error on line 1: ...x(k))o();circle(9);};}}}q(2);o(27); -----------------------^ Expecting 'TOK_ID', '}', 'TOK_IF', '!', '#', '%', '*', got ';'
HyperNeutrino 14/11
@AlexL. Não estou recebendo esse erro quando uso o cliente OpenSCAD real no meu mac. No entanto, consegui replicar esse erro no OpenSCAD.net usando o chrome, o que é decepcionante. Acha que é um problema com o serviço deles. Você poderia experimentar o aplicativo da área de trabalho?
Henry Wildermuth
11
Trabalhou para mim na versão desktop (Ubuntu 14.04 LTS).
Benjamin Spector
11
Notei o padrão};} no seu código. Eu acho que você poderia substituir com segurança por}} que rasparia um caractere para ambas as versões. Eu mesmo testei e parecia funcionar.
Benjamin Spector
6

Mathematica 263 bytes

Não é realmente competitivo com a participação de @ MartinEnder, mas eu me diverti com isso mesmo assim. Eu deixei as pétalas fazerem um passeio aleatório! A pétala caminha girando 60 graus aleatoriamente em torno de um dos pontos finais, que também é escolhido aleatoriamente. Testo para ver se a extremidade rotativa da pétala fica fora do disco grande e, nesse caso, a rotação ocorre na outra direção.

c=Circle;a=√3;v={e=0{,},{0,2}};f=RandomChoice;Graphics@{e~c~6,Table[q=f@{1,2};t=f@{p=Pi/3,-p};r=RotationTransform[#,v[[q]]]&;v=r[If[r[t]@v[[-q]]∈e~Disk~6,t,-t]]@v;Translate[Rotate[{c[{1,a},2,p{4,5}],c[{1,-a},2,p{1,2}]},ArcTan@@(#-#2)&@@v,e],v[[2]]],{5^5}]}

Aqui está o código subsequente que usei para a animação.

Export[NotebookDirectory[]<>"flower.gif", Table[Graphics[Join[{c[e,6]},(List@@%)[[1,2,1;;n-1]],{Thick,Red,(List@@%)[[1,2,n]]}]],{n,1,3^4,1}]]

Passeio aleatório das pétalas

Li em algum lugar que passeios aleatórios bidimensionais devem retornar à origem. Parece que alguns milhares de etapas garantem o preenchimento do disco grande.

Kelly Lowder
fonte
É uma ideia muito boa, mas com um número finito de iterações, há também uma probabilidade diferente de zero de não encher a flor inteira. Você provavelmente deve adicionar uma condição de terminação depois de desenhar 30 pétalas (essa parece ser a maneira mais curta de determinar se você realmente terminou). Então você saberia que o desenho é feito quando você termina, e a probabilidade de não terminar seria zero.
Martin Ender
Independentemente disso, há muitos bytes que você pode salvar: Sqrt[3]is 3^.5. Você não precisa definir eaté seu primeiro uso e pode usar esse truque para salvar um byte nele v={e=0{,},{0,2}}. Você também pode usar alguma notação de infixo como e~c~6ou e~Disk~6, e ArcTan@@Subtract@@vdeve ser equivalente a ArcTan@@(#-#2)&@@v.
Martin Ender
Infix usado e também o operador √ para cortar 15 bytes. Obrigado pelas dicas @MartinEnder. Livre-se de / 2 e 2 * que foram cancelados. Existem 180 pétalas; portanto, 4 iterações geralmente cobrem cerca de metade do disco e 5 ^ 5 faz o trabalho. A probabilidade de 9 ^ 9 não cobrir o disco é de ~ 1 em 10 ^ 400.000, o que é muito menos que 2% de erro, portanto, não vale os bytes desperdiçados para verificar.
precisa
3

JavaScript (ES6) / SVG, 299 bytes

with(document){write(`<svg height=250 width=250><circle${b=` fill=none stroke=black `}cx=125 cy=125 r=120 />`);for(i=0;i<24;i++)write(`<path${b}d=M5,125${`${a=`a60,60,0,0,1,`}40,0`.repeat(i%4+3)+`${a}-40,0`.repeat(i%4+3)} transform=${`rotate(60,125,125)`.repeat(i>>2)}rotate(-60,${i%4*4}5,125) />`)}

Funciona gerando vários pares de arco de vários comprimentos e girando-os no lugar.

Neil
fonte