A imagem acima é chamada de hexa-glifo. Hexa-glifos são alguns padrões legais que eu criei enquanto rabiscava durante minha aula DiffEq. Aqui está como você faz um:
- Considere o seguinte conjunto de pontos, em forma de um hexagrama regular. O hexágono interno é o que conterá o glifo final, enquanto os 6 pontos externos formam uma estrela e são onde começaremos a desenhar nossas linhas.
- Dos seis pontos externos, selecione aleatoriamente um par. Por questões de eficiência, deve haver pelo menos um outro ponto entre os dois pontos selecionados (caso contrário, isso não afetaria o valor final). Então, de cada um dos dois pontos, lance um raio na direção do outro. Este raio está bloqueado pelas linhas anteriores.
- Repita esse processo até que todas as 9 arestas tenham sido formadas, conforme mostrado nas próximas imagens.
- Aqui está um exemplo de raios sendo bloqueados. As extremidades do segmento de raio ainda são visíveis, mas a porção do meio é ocluída pelos dois primeiros segmentos que desenhamos.
- Esses dois raios também são "bloqueados", mas isso não causa nenhuma diferença visível porque eles são bloqueados pela mesma outra linha.
- Avanço rápido até que todas as 9 linhas sejam desenhadas. Se você quiser uma explicação mais detalhada sobre essas etapas ignoradas, posso explicar.
- Por fim, remova os pontos da estrela. Para torná-la mais bonita, os pontos grossos também são removidos.
O desafio
Seu desafio é gerar uma representação visual de um hexa-glifo aleatório. Isso é código-golfe, o menor número de bytes vence.
Todos os hexa-glifos possíveis devem aparecer com alguma probabilidade positiva. Diferentes hexa-glifos são gerados alterando a ordem em que as 9 arestas são desenhadas.
Além disso, todas as imagens geradas pelo seu programa devem ser hexa-glifos válidos. Certos padrões (como um esboço completo do hexágono interno) não podem aparecer como um hexa-glifo e, portanto, o programa não deve ser emitido.
A saída deve ser uma imagem gráfica (impressa em tela ou arquivo).
O hexágono deve ser regular, mas pode aparecer em qualquer orientação.
Reflexões / rotações não são consideradas únicas. (Isso pode facilitar o cumprimento do requisito 1).
fonte
I made up while doodling during my DiffEq class
. A maneira como todas as grandes descobertas acontecem ...: P'01'
espaço intercalado em vez de' *'
.Respostas:
Mathematica,
273268264242 bytesÉ
renderizado como um sobrescritoT
no Mathematica e é um operador de transposição postfix.A solução dos bugs levou uma eternidade ... no final, juntei algumas coisas para fazer o trabalho, então isso é definitivamente subótimo. Também me pergunto se seria melhor implementar as especificações mais literalmente através das linhas através do hexágono externo e permitir que as funções de geometria do Mathematica lidem com as interseções.
Observe que este é um programa completo e se você deseja executar o código várias vezes em uma única sessão do REPL, precisará prefixá-lo
Clear[b]
.Aqui estão os resultados de 20 execuções:
Explicação
Esta solução não utiliza os pontos estelares externos. Em vez disso, trabalha diretamente com os pontos que fazem parte do hexaglyph e as linhas que cobrem três deles por vez.
Vamos rotular os pontos:
1
começa em um canto um pouco estranho, mas isso se deve ao comportamento padrão (também um pouco estranho) deCirclePoints
. Começar o hexágono a partir daí ficou mais barato.Agora queremos encontrar as linhas relevantes através de três desses pontos que correspondem aos pontos conectados da estrela externa. Os que estão ao redor do hexágono são, obviamente, apenas 3 pontos adjacentes (módulo 12), começando de um número ímpar. Os em todo o centro consistem em um número par
n
,13
en+6
.Representações dessas linhas (na forma de listas de três pontos são geradas pelo seguinte código):
O
Partition
gera as linhas ao redor do hexágono eArray
as linhas através do centro. Para processar os dois feixes, mapeamos esta função sobre a lista de linhas:Agora, nós as misturamos
RandomSample
para processá-las em uma ordem aleatória.Join @@
nivela a lista de pares para que tenhamos uma lista de vigas.Curto intervalo: para acompanhar quais pontos já estão bloqueados, usamos uma função de pesquisa
b
, que é inicializadaTrue
para todos os valores porb@_=k=1>0;
. Ao processar uma viga, mantemos todos os pontos até o primeiro ponto que possuib[n] == False
( incluindo aquele):Eu sinto que esta é a parte mais fácil de jogar agora ... o uso de duas variáveis temporárias para jogar Mastermind parece realmente caro. De qualquer forma, o resultado disso nos dá os pontos em uma linha que podemos desenhar. Agora esta função está mapeada sobre cada um desses pontos:
A primeira parte gera a lista de todos os 13 pontos usando os resultados intercalados de duas chamadas para
CirclePoints
(com raios diferentes para os centros das arestas e os cantos do hexágono). Observe ob@#=!k
que agora define o valor da tabela de pesquisa para o ponto atual paraFalse
que nenhum feixe adicional possa passar por ele. Finalmente, o valor é usado como um índice na lista de coordenadas para obter o ponto 2D correto.Isso descarta todas as listas de elemento único, porque elas renderizam como pontos individuais (e visíveis). Por fim, renderizamos o resultado:
fonte
b@_=1>0
=b=1>0&
Sapatos (Ruby) Rev C 184 bytes
12 bytes salvos transferindo a responsabilidade de verificar se uma meia-linha específica deve ser desenhada do programa principal para o método de desenho. O programa principal ainda precisa verificar se toda a linha está completamente bloqueada.
Sapatos (Rubi)
205... Rev B 196 bytesO Shoes é uma ferramenta baseada em rubi para criar GUIs, etc. É a primeira vez que eu o uso. mothereff.in/byte-counter conta minha submissão como 196 bytes, mas, por alguma razão, o Shoes considera 202.
Além disso, Ruby permite fazer coisas como
t[a=i.ord]
, estranhamente, parece não funcionar como esperado com o Shoes.Explicação
Não considero as partes da linha fora do hexágono. Eu só desenho a parte que precisa ser desenhada. O importante é se as linhas cruzam as interseções (se apenas desenharmos as partes que precisam ser desenhadas, isso significa que elas começam / terminam nas interseções).
A regra básica é que, se os dois pontos finais de uma linha foram visitados, a linha é bloqueada e não deve ser desenhada. Como as linhas são desenhadas em duas metades, também precisamos verificar se o ponto médio foi visitado para ver se cada metade deve ser desenhada ou não.
Eu mantenho o controle de quais pontos foram visitados na matriz
t[]
. Isso acaba contendo uma entrada para cada coordenada física na grade abaixo. Não há uma matriz lógica de 13 elementos separada. No final,t[]
pode ter 87 elementos, embora apenas 13 contenham dados úteis.Internamente, as coordenadas dos pontos finais das linhas são dadas por um único número z, onde z% 6 é a coordenada y e z / 6 é a coordenada x. Neste sistema, o hexágono é achatado. Quando as linhas são plotadas, a escala x é multiplicada por 8 e a escala y é multiplicada por 14, que é uma aproximação racional muito próxima da razão correta: 14/8 = 1,75 vs sqrt (3) = 1,732.
O sistema de coordenadas interno é mostrado abaixo, com algumas saídas de amostra.
Ungolfed
Mais saídas de amostra
Isso foi feito com uma versão mais antiga do programa. A única diferença é que o posicionamento do hexaglyph na janela agora é um pouco diferente.
fonte
mothereff.in/byte-counter counts my submission as 196 bytes, but for some reason Shoes counts it as 202.
Não sei 100% se isso é verdade, mas acho que o motivo pelo qual o Shoes contou seu código como 202 bytes em vez de 196 é porque suas novas linhas são na verdade uma sequência de dois caracteres "\ r \ n". Isso faz com que cada nova linha seja contada duas vezes. Aqui está uma resposta de excesso de pilha em relação a \ re \ n.Python,
604591574561538531536534528493483452431420419415388385384 bytesI se adaptaram a ideia de nível do rio St de verificar se uma linha será bloqueado, verificando se ambos os pontos finais da linha já foram visitados antes. Isso economiza 27 bytes. Sugestões de golfe são bem-vindas.
Editar: correção de bugs e golfe
g(p,q)
por 3 bytes. Jogou golfeL
por um byte.Ungolfing:
Os próprios hexa-glifos são bem pequenos, pois usamos um hexágono de 12 pixels como base (por razões de golfe). Aqui estão alguns exemplos de hexa-glifos (desculpas pelo mau cultivo):
fonte
R=range;G=goto