Desenhe os glifos do Ingress

16

Na AR jogo móvel baseado em localização modo de vida Ingress o jogador pode cortar coisas chamadas portais a fim de obter itens. (Se você está interessado no Ingress, pode me enviar um ping no bate-papo para obter mais informações. Confie em mim, é melhor que o Pokémon. Se você terminar o download, lembre-se de escolher a Resistência.)

Uma maneira de aumentar significativamente a saída de hack é o minijogo de hackers de glifos , no qual o jogador precisa desenhar glifos em uma grade hexagonal.

a grade de glifos

No total, existem cerca de 115 glifos com cerca de 130 nomes que são realmente usados ​​no jogo.

Glifos

Para os propósitos deste desafio, numeraremos cada ponto da grade da seguinte maneira:

a grade de glifos, numerada

Aqui está a lista de todos os glifos para os propósitos deste desafio. A lista é um objeto JSON, contendo cada glifo como uma lista de arestas.

{
"ABANDON": [[1, 6], [3, 4], [4, 8], [6, 10], [8, 10]],
"ACCEPT": [[3, 7], [3, 8], [7, 8]],
"ADVANCE": [[0, 9], [4, 9]],
"AFTER": [[1, 2], [1, 6], [2, 7], [6, 10], [7, 10]],
"AGAIN": [[4, 9], [6, 7], [6, 10], [8, 9], [8, 10]],
"ALL": [[0, 1], [0, 5], [1, 2], [2, 3], [3, 4], [4, 5]],
"ANSWER": [[6, 7], [6, 9], [7, 10]],
"ATTACK": [[0, 6], [0, 9], [2, 6], [4, 9]],
"AVOID": [[0, 5], [0, 6], [1, 6], [1, 7]],
"BALANCE": [[0, 10], [2, 3], [2, 7], [3, 4], [4, 8], [7, 10], [8, 10]],
"BARRIER": [[0, 10], [2, 7], [7, 10]],
"BEFORE": [[4, 5], [4, 8], [5, 9], [8, 10], [9, 10]],
"BEGIN": [[0, 8], [3, 7], [3, 8]],
"BODY": [[6, 9], [6, 10], [9, 10]],
"BREATHE": [[1, 6], [5, 9], [6, 10], [9, 10]],
"CAPTURE": [[1, 7], [3, 4], [4, 8], [7, 10], [8, 10]],
"CHANGE": [[3, 7], [3, 10], [8, 10]],
"CHAOS": [[0, 1], [0, 5], [1, 6], [3, 8], [4, 5], [6, 10], [8, 10]],
"CIVILIZATION": [[1, 6], [5, 9], [6, 7], [7, 8], [8, 9]],
"CLEAR": [[0, 10], [3, 10]],
"CLEAR ALL": [[0, 1], [0, 5], [0, 10], [1, 2], [2, 3], [3, 4], [3, 10], [4, 5]],
"COMPLEX": [[6, 9], [8, 10], [9, 10]],
"CONFLICT": [[2, 6], [4, 9], [6, 7], [7, 8], [8, 9]],
"CONTEMPLATE": [[0, 1], [1, 2], [2, 3], [3, 8], [6, 10], [8, 9], [9, 10]],
"COURAGE": [[4, 9], [7, 8], [8, 9]],
"CREATE": [[1, 6], [4, 8], [6, 10], [8, 10]],
"DANGER": [[0, 9], [3, 10], [9, 10]],
"DATA": [[0, 6], [3, 8], [6, 10], [8, 10]],
"DEFEND": [[1, 7], [3, 7], [3, 8], [5, 8]],
"DESTINY": [[3, 8], [6, 7], [6, 10], [7, 8], [9, 10]],
"DESTROY": [[2, 7], [5, 9], [7, 10], [9, 10]],
"DETERIORATE": [[4, 8], [8, 10], [9, 10]],
"DIE": [[2, 7], [4, 8], [7, 10], [8, 10]],
"DIFFICULT": [[1, 6], [6, 7], [7, 10], [8, 10]],
"DISCOVER": [[1, 2], [2, 3], [3, 4]],
"DISTANCE": [[0, 5], [4, 5]],
"EASY": [[3, 8], [6, 10], [8, 10]],
"END": [[0, 1], [0, 10], [1, 7], [3, 7], [3, 10]],
"ENLIGHTENED": [[0, 1], [0, 9], [1, 2], [2, 3], [6, 9], [6, 10], [9, 10]],
"ENLIGHTENMENT": [[0, 1], [0, 9], [1, 2], [2, 3], [6, 9], [6, 10], [9, 10]],
"EQUAL": [[6, 7], [6, 9], [8, 9]],
"ESCAPE": [[0, 1], [1, 6], [6, 9], [8, 9]],
"EVOLUTION": [[0, 10], [8, 9], [9, 10]],
"FAILURE": [[0, 10], [6, 7], [6, 10]],
"FEAR": [[1, 7], [6, 7], [6, 9]],
"FOLLOW": [[0, 6], [1, 2], [1, 6]],
"FORGET": [[4, 8]],
"FUTURE": [[1, 6], [2, 7], [6, 7]],
"GAIN": [[5, 8]],
"GROW": [[4, 9], [8, 9]],
"HARM": [[0, 6], [0, 9], [2, 7], [6, 10], [7, 10], [9, 10]],
"HARMONY": [[0, 6], [0, 9], [3, 7], [3, 8], [6, 10], [7, 10], [8, 10], [9, 10]],
"HAVE": [[3, 8], [7, 10], [8, 10]],
"HELP": [[5, 9], [7, 8], [8, 10], [9, 10]],
"HIDE": [[1, 6], [1, 7], [6, 9], [7, 8]],
"HUMAN": [[3, 7], [3, 8], [6, 7], [6, 9], [8, 9]],
"IDEA": [[1, 2], [1, 6], [2, 7], [4, 5], [4, 8], [5, 9], [7, 10], [9, 10]],
"IGNORE": [[2, 7]],
"IMPERFECT": [[6, 8], [6, 10], [8, 9], [8, 10], [9, 10]],
"IMPROVE": [[1, 6], [6, 10], [7, 10]],
"IMPURE": [[3, 10], [8, 9], [8, 10], [9, 10]],
"INSIDE": [[6, 7], [6, 9]],
"INTELLIGENCE": [[1, 6], [4, 8], [6, 10], [8, 9], [9, 10]],
"INTERRUPT": [[0, 10], [3, 10], [4, 5], [4, 8], [5, 9], [8, 10], [9, 10]],
"JOURNEY": [[1, 6], [2, 3], [3, 4], [4, 5], [5, 9], [6, 10], [9, 10]],
"KNOWLEDGE": [[3, 6], [3, 9], [6, 10], [9, 10]],
"LEAD": [[0, 5], [3, 8], [4, 5], [4, 8]],
"LEGACY": [[0, 1], [0, 5], [1, 6], [2, 7], [4, 8], [5, 9], [6, 7], [8, 9]],
"LESS": [[6, 10], [9, 10]],
"LIBERATE": [[0, 1], [1, 6], [4, 9], [6, 10], [9, 10]],
"LIE": [[6, 7], [6, 10], [7, 10], [8, 9], [9, 10]],
"LOSE": [[1, 7]],
"MESSAGE": [[1, 7], [4, 9], [7, 10], [9, 10]],
"MIND": [[3, 8], [3, 10], [8, 9], [9, 10]],
"MORE": [[7, 10], [8, 10]],
"MYSTERY": [[0, 6], [0, 9], [5, 9], [6, 9], [8, 9]],
"N'ZEER": [[0, 6], [0, 9], [0, 10], [3, 10], [6, 10], [9, 10]],
"NATURE": [[2, 7], [4, 8], [6, 7], [6, 9], [8, 9]],
"NEW": [[2, 7], [6, 7]],
"NO": [[6, 7], [6, 9]],
"NOT": [[6, 7], [6, 9]],
"NOURISH": [[3, 4], [3, 10], [4, 8], [8, 10]],
"NOW": [[6, 7], [7, 8], [8, 9]],
"OLD": [[5, 9], [8, 9]],
"OPEN": [[3, 7], [3, 8], [7, 8]],
"OPEN ALL": [[0, 1], [0, 5], [1, 2], [2, 3], [3, 4], [3, 7], [3, 8], [4, 5], [7, 8]],
"OUTSIDE": [[0, 5], [4, 5]],
"PAST": [[4, 8], [5, 9], [8, 9]],
"PATH": [[0, 10], [4, 8], [8, 10]],
"PEACE": [[0, 6], [0, 9], [3, 7], [3, 8], [6, 10], [7, 10], [8, 10], [9, 10]],
"PERFECTION": [[0, 10], [2, 3], [2, 7], [3, 4], [4, 8], [7, 10], [8, 10]],
"PERSPECTIVE": [[0, 6], [0, 9], [2, 7], [4, 8], [6, 10], [7, 10], [8, 10], [9, 10]],
"PORTAL": [[1, 2], [1, 6], [2, 7], [4, 5], [4, 8], [5, 9], [6, 9], [7, 8]],
"POTENTIAL": [[0, 10], [1, 2], [2, 7], [7, 10]],
"PRESENT": [[6, 7], [7, 8], [8, 9]],
"PURE": [[0, 10], [6, 7], [6, 10], [7, 10]],
"PURSUE": [[0, 6], [0, 9], [5, 9]],
"QUESTION": [[0, 6], [6, 9], [8, 9]],
"REACT": [[2, 7], [6, 9], [7, 10], [9, 10]],
"REBEL": [[1, 2], [1, 6], [5, 8], [6, 10], [8, 10]],
"RECHARGE": [[0, 5], [0, 10], [5, 9], [9, 10]],
"REPAIR": [[0, 5], [0, 10], [5, 9], [9, 10]],
"REPEAT": [[4, 9], [6, 7], [6, 10], [8, 9], [8, 10]],
"RESISTANCE": [[0, 9], [0, 10], [3, 8], [3, 10], [6, 9]],
"RESTRAINT": [[2, 3], [2, 7], [5, 9], [7, 10], [9, 10]],
"RETREAT": [[0, 6], [2, 6]],
"SAFETY": [[2, 6], [4, 9], [6, 9]],
"SAVE": [[1, 7], [7, 10], [8, 10]],
"SEARCH": [[6, 9], [6, 10], [7, 8], [8, 9]],
"SEE": [[0, 9]],
"SEPARATE": [[2, 7], [5, 9], [6, 7], [6, 10], [8, 9], [8, 10]],
"SHAPER": [[0, 6], [0, 9], [2, 7], [4, 8], [6, 7], [8, 9]],
"SIMPLE": [[7, 8]],
"SOUL": [[3, 7], [3, 10], [6, 7], [6, 10]],
"STABILITY": [[2, 7], [4, 8], [7, 8]],
"STAY": [[2, 7], [4, 8], [7, 8]],
"STRONG": [[6, 7], [6, 9], [7, 8], [8, 9]],
"STRUGGLE": [[0, 9], [0, 10], [3, 8], [3, 10], [6, 9]],
"SUCCESS": [[0, 10], [8, 9], [9, 10]],
"TECHNOLOGY": [[1, 6], [2, 7], [6, 10], [7, 10], [8, 9], [8, 10], [9, 10]],
"THOUGHT": [[1, 2], [1, 6], [2, 7], [4, 5], [4, 8], [5, 9], [7, 10], [9, 10]],
"TOGETHER": [[4, 8], [6, 9], [6, 10], [8, 10], [9, 10]],
"TRUTH": [[6, 7], [6, 10], [7, 10], [8, 9], [8, 10], [9, 10]],
"UNBOUNDED": [[0, 1], [0, 5], [1, 7], [2, 3], [3, 4], [4, 5], [6, 9], [6, 10], [7, 8], [8, 9]],
"US": [[3, 6], [6, 9]],
"USE": [[1, 7], [7, 10]],
"WANT": [[3, 7], [3, 8], [4, 8]],
"WAR": [[0, 6], [0, 9], [2, 6], [4, 9]],
"WEAK": [[5, 9], [6, 7], [6, 9]],
"XM": [[6, 7], [6, 9], [7, 10], [8, 9], [8, 10]],
"YOU": [[0, 7], [0, 8], [7, 8]],
"YOUR": [[0, 7], [0, 8], [7, 8]]
}

Alguns glifos têm vários nomes (por exemplo NO, NOT, INSIDE); você deve apoiar todos eles.

Isenção de responsabilidade: não consegui encontrar uma boa lista de todos os glifos, então combinei várias fontes e finalmente acabei desenhando todas elas em um aplicativo JS hackeado para obter a lista delas. Posso estar perdendo alguns e pode haver alguns apelidos não utilizados no jogo; Espero não ter desviado alguns dos glifos, no entanto.

Edite na manhã seguinte, quando não são 4 da manhã: já notei que VICTORY está ausente. Oh, bem, resta para o melhor jogador de golfe então.

Desafio

Sua tarefa é criar um programa ou função que considere o nome de um glifo e produza o glifo como uma imagem.

A imagem deve conter os pontos da grade e as linhas que conectam os pontos em questão.

Isso é , então a resposta mais curta em bytes vence. Aplicam-se regras padrão.

I / O

Você terá como entrada, em um formato de sua escolha, um nome de um glifo exatamente como encontrado nas chaves do objeto JSON acima. Qualquer outra entrada é um comportamento indefinido.

Você produzirá uma imagem em qualquer formato comum com o glifo renderizado na grade.

Proporções de grade

Essas proporções devem ter precisão de cinco pixels (para permitir arredondamentos, etc.)

  • Os pontos externos (0-5) devem formar um hexágono regular.
  • O ponto central (10) deve estar no centro do hexágono.
  • Os pontos intermediários (6-9) devem estar na metade do caminho entre o ponto central e os pontos externos correspondentes.
  • A grade deve ser orientada como a original.
  • A altura do hexágono externo deve ser de pelo menos 100 pixels.

Outras regras

  • O plano de fundo deve ser transparente ou preenchido com uma cor sólida.
  • As linhas e pontos devem ser claramente distintos do plano de fundo e um do outro; eles não podem ser da mesma cor sólida.
    • Por exemplo, linhas azuis sólidas e pontos cor de rosa sólidos são bons.
    • Linhas pretas sólidas e pontos brancos com bordas pretas são excelentes.
    • Linhas listradas vermelhas e brancas e bolas de futebol como pontos estão bem.
    • Linhas verdes sólidas e pontos verdes sólidos não são bons.
  • O raio dos pontos deve ser maior que a largura das linhas.
  • Você pode desenhar as linhas na frente ou atrás dos pontos.
  • Você pode incluir qualquer quantidade de preenchimento (na cor de fundo) na imagem.
  • Você pode combinar linhas consecutivas em uma linha, pois isso não afeta o resultado.

Exemplos

As cores e as larguras dos objetos nessas imagens são apenas exemplos que se assemelham à aparência do jogo.

NÃO LIMITADO

glifo ilimitado

PAZ

glifo da paz

RESISTÊNCIA

glifo de resistência

PurkkaKoodari
fonte
Teve que votar pela nostalgia (e a sugestão da Resistência: P). Eu gostaria de ainda ter tempo para este jogo! Algumas das mais divertidas (e exercícios) que já tive há muito tempo. E você realmente criou esse JSON manualmente?
Carcigenicate
@Carcigenate No. Eu escrevi um pedaço de código que me dava uma grade e o nome de um glifo e me fazia desenhá-lo e colecionava os glifos em uma matriz como listas de nós. Depois, eram apenas dez linhas de python e algumas localizações e substituições. Esse aplicativo também é de onde vêm os exemplos.
PurkkaKoodari
enquanto comprimindo a lista de gráfico tem um grande papel no desafio, eu não acho que o feito tag Kolmogorov aqui como você tem mais de cem saída diferente
Sefa
@ Pietu1998 Oh, legal. Acho que eu deveria ter confiado que um programador teria escrito um programa para ajudar com algo assim.
Carcigenicate

Respostas:

7

Mathematica, 228 + 184 + 365 + 13 = 790 bytes

Graphics@{v=255#+##&~Fold~BinaryReadList@#~IntegerDigits~#2&;p=#~Partition~2&;c=p["c"~v~25-12][[#+1]]&;Array[Disk@*c,11,0],Red,Line[c/@<|Thread["a"~v~2293->First/@p@SplitBy["b"~v~12,#>10&]]|>@Mod[1##&@@ToCharacterCode@#,2293]]}&

O comando acima de 228 bytes define uma função sem nome que recebe como entrada um dos nomes de glifo acima e retorna uma imagem. Por exemplo, aqui está a saída para "UNBOUNDED":

NÃO LIMITADO

O comando lê três arquivos binários "a"- "b", e "c"- que possuem 184, 365 e 13 bytes, respectivamente. Uma versão mais fácil de ler:

1  Graphics@{
2    v = 255#+##&~Fold~BinaryReadList@#~IntegerDigits~#2 &;
3    p = #~Partition~2 &;
4    c = p["c"~v~25-12][[#+1]] &;
5    Array[Disk@*c, 11, 0], Red, 
6    Line[c /@
7      <| Thread[ "a"~v~2293 -> First/@p@SplitBy["b"~v~12, #>10&] ] |>
8        @ Mod[1##& @@ ToCharacterCode@#, 2293]]
9  } &

A linha 2 define uma função de descompactação manual: lê em um fluxo de bytes do arquivo # , converte-o em um número inteiro de base 256 e depois expande esse número inteiro em sua lista de dígitos na base #2. As linhas 3 e 4 definem uma função (usando o terceiro arquivo binário) que converte um número inteiro de 0 a 10 nas coordenadas do ponto de grade correspondente; todas essas coordenadas foram escolhidas para serem inteiros entre –12 e 12, o que torna a compactação conveniente (embora não tão conveniente que eu a tenha visto na minha submissão inicial).

A linha 5 desenha os pontos da grade (na cor preta padrão) e depois muda para a cor vermelha das linhas. A linha 7 cria uma associação (usando os dois primeiros arquivos binários) que converte certos números inteiros de entrada entre 0 e 2292 em uma lista de números inteiros em pontos de grade como {2, 3, 4, 5, 0, 1, 7, 8, 9, 6, 10}, que representa um caminho que une os pontos 2 a 3 a 4 a ... a 10 (Esse é um "caminho euleriano", que visita cada extremidade exatamente uma vez; todos os glifos da tabela têm um caminho euleriano, portanto, essa representação é mais curta do que listar explicitamente o conjunto de bordas.)-> linha 7 cria essa lista de caminhos eulerianos, lendo um número inteiro de base 12 usando ve dividindo-o em cada ocorrência do dígito 11.

Finalmente, a linha 8 hashes a sequência de entrada convertendo todas as suas letras em seus códigos ASCII e utilizando o módulo 2293 do produto (o menor módulo para o qual as respostas são todas distintas). Esse número inteiro é alimentado na associação na linha acima, resultando no caminho euleriano apropriado, e a linha 6 desenha o caminho resultante sobre os pontos da grade.

Dumps hexadecimais dos arquivos "a", "b" e "c", nessa ordem:

09d5f27cd2246e0cb06aa243b442d761ac3a5604439f1767a202c4d3fc4fc1b24ce59acfc65a05235cc46354af8820d6733001e1f25ea01479cee027d62e8b1be10891c693ed5887942ca461c461d458a7676bfcd866a70263ad1833b3e836895ce121153c451ad327086e2bd30d6bad7097a9e71c2fc67c2c57716e5ada6907d99f42702dfb8b88c6d26799aa01f42fb89394e00b0752825f2740903276e20ec405473f309cc978aea187da24749d0a44319cd7322dd542

02d9ebf5fc94183ce50f0fc84e88a27bd21a3b3665d54949608c75c86c4507eed3072e02657822bfb83dbca8a708e07d1382c2b6c3c8fcddc88fa7244281a918b3a8aa823048d4a7e070a336c1e5ab83ec4950fc1960f34c6b89c541c9401607882418cac7f79f4edb164b775ecbb97947470016cadea4d06f93a958713b8c23d11be3c9ce8a2824a458d151ac3cafc6d7bb1557e55868434bd5c0da4bd71e66a3f7711018ae5e7f2941a949a85b6e65aebcc2fe43a89cb0479fa9474fe5102cfbf7da8a455f46ac5409dfdc79970ed8dbfc6b84df78c9c19df4d16bda298dca445ad510bf32e14ca5c91ce58e7521492f6e79e05624ab4a4c02c66c22ef670a06d5c5a3dfdf8ccc8c40c353f3aecf17bbb5cb911baefa3ce80e41551376838c166153a1038d83e171077a3f260ccd70358917eeceb5722b58ad6900a40b5b1512b292fb7a7e0d2cbe2bac2a48a4e343e8f2a338808ec9957c64778aba412bec47bcabb2a2789f01c2d5fdd993

254c40dac61bb215386b7361a8
Greg Martin
fonte
Boa resposta! Você deve publicar os hexdumps de seus arquivos de dados.
PurkkaKoodari
Concluído ... e, enquanto isso, percebi que também poderia compactar a lista de coordenadas do ponto da grade, pois todos os comandos relevantes já estão presentes.
Greg Martin