Dessinez les glyphes Ingress

16

Dans le AR jeu mobile géolocalisé mode de vie Ingress le joueur peut pirater des choses appelées portails afin d'obtenir des éléments. (Si vous êtes intéressé par Ingress, vous pouvez me cingler dans le chat pour plus d'informations. Faites-moi confiance, c'est mieux que Pokémon. Si vous finissez par le télécharger, n'oubliez pas de choisir la Résistance.)

Le mini-jeu de piratage de glyphes permet au joueur de dessiner des glyphes sur une grille hexagonale.

la grille de glyphes

Au total, il y a environ 115 glyphes avec environ 130 noms qui sont réellement utilisés dans le jeu.

Glyphes

Aux fins de ce défi, nous numéroterons chaque point de la grille comme suit:

la grille des glyphes, numérotée

Voici la liste de tous les glyphes aux fins de ce défi. La liste est un objet JSON, contenant chaque glyphe comme une liste d'arêtes.

{
"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]]
}

Certains glyphes ont plusieurs noms (par exemple NO, NOT, INSIDE); vous devez tous les soutenir.

Avis de non-responsabilité: je n'ai pas pu trouver une bonne liste de tous les glyphes, j'ai donc combiné plusieurs sources et j'ai finalement fini par les dessiner dans une application JS piratée pour en obtenir la liste. Il me manque peut-être certains et il peut y avoir quelques alias non utilisés dans le jeu; J'espère cependant que je n'ai pas mal dessiné certains des glyphes.

Modifier le lendemain matin quand il n'est pas 4h du matin: j'ai déjà remarqué que VICTORY manquait. Eh bien, c'est parti pour le meilleur golfeur alors.

Défi

Votre tâche consiste à créer un programme ou une fonction qui prend le nom d'un glyphe et génère le glyphe sous forme d'image.

L'image doit contenir les points de la grille et les lignes reliant les points en question.

Il s'agit de , donc la réponse la plus courte en octets l'emporte. Des règles standard s'appliquent.

E / S

Vous prendrez en entrée, dans un format de votre choix, un nom de glyphe exactement tel que trouvé dans les clés de l'objet JSON ci-dessus. Toute autre entrée est un comportement non défini.

Vous allez générer une image dans n'importe quel format commun avec le glyphe rendu à la grille.

Proportions de la grille

Ces proportions doivent être précises à cinq pixels (pour permettre l'arrondissement, etc.)

  • Les points extérieurs (0-5) doivent former un hexagone régulier.
  • Le point central (10) doit être au centre de l'hexagone.
  • Les points intermédiaires (6-9) doivent être à mi-chemin entre le point central et les points extérieurs correspondants.
  • La grille doit être orientée comme l'original.
  • La hauteur de l'hexagone extérieur doit être d'au moins 100 pixels.

Autres règles

  • L'arrière-plan doit être transparent ou rempli d'une couleur unie.
  • Les lignes et les points doivent être clairement distincts de l'arrière-plan et les uns des autres; ils ne peuvent pas être de la même couleur unie.
    • Par exemple, les lignes bleues solides et les points roses solides conviennent.
    • Les lignes noires pleines et les points blancs avec des bordures noires conviennent.
    • Les lignes rayées rouges et blanches et les ballons de football en tant que points sont très bien.
    • Les lignes vertes pleines et les points verts solides ne conviennent pas .
  • Le rayon des points doit être supérieur à la largeur des lignes.
  • Vous pouvez tracer les lignes devant ou derrière les points.
  • Vous pouvez inclure n'importe quelle quantité de rembourrage (dans la couleur d'arrière-plan) dans l'image.
  • Vous pouvez combiner des lignes consécutives en une seule ligne, car cela n'affecte pas le résultat.

Exemples

Les couleurs et les largeurs des objets dans ces images ne sont que des exemples qui ressemblent un peu à l'apparence du jeu.

SANS BORNES

glyphe illimité

PAIX

glyphe de paix

LA RÉSISTANCE

glyphe de résistance

PurkkaKoodari
la source
J'ai dû voter pour la nostalgie (et la suggestion de la résistance: P). J'aurais aimé avoir encore du temps pour ce jeu! Certains des plus amusants (et exercices) que j'ai eu depuis longtemps. Et avez-vous réellement créé manuellement ce JSON?
Carcigenicate
@Carcigenate No. J'ai écrit un morceau de code qui m'a donné une grille et un nom de glyphe et m'a fait le dessiner, et a collecté les glyphes dans un tableau sous forme de listes de nœuds. Ensuite, il ne restait plus que dix lignes de python et quelques recherches et remplacements. Cette application est également d'où proviennent les exemples.
PurkkaKoodari
tout en compressant la liste des graphiques joue un grand rôle dans le défi, je ne pense pas que l'exploit de tag kolmogorov ici car vous avez plus de cent sorties différentes
Sefa
@ Pietu1998 Oh, cool. Je suppose que j'aurais dû croire qu'un programmeur aurait écrit un programme pour aider avec quelque chose comme ça.
Carcigenicate

Réponses:

7

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

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]]}&

La commande de 228 octets ci-dessus définit une fonction sans nom qui prend en entrée l'un des noms de glyphes ci-dessus et renvoie une image. Par exemple, voici la sortie pour "UNBOUNDED":

SANS BORNES

La commande lit trois fichiers binaires "a"- "b", et "c"- qui ont respectivement 184, 365 et 13 octets. Une version plus facile à lire:

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

La ligne 2 définit une fonction de décompression à la main: elle lit un flux d'octets dans le fichier #, le convertit en un entier de base 256, puis développe cet entier dans sa liste de chiffres en base #2. Les lignes 3 et 4 définissent une fonction (à l'aide du troisième fichier binaire) qui convertit un entier de 0 à 10 en coordonnées du point de grille correspondant; toutes ces coordonnées ont été choisies pour être des entiers compris entre –12 et 12, ce qui rend la compression pratique (mais pas si pratique que je l'ai vue pour ma soumission initiale).

La ligne 5 dessine les points de la grille (en noir par défaut), puis passe à la couleur rouge pour les lignes. La ligne 7 crée une association (en utilisant les deux premiers fichiers binaires) qui convertit certains entiers d'entrée entre 0 et 2292 en une liste d'entiers de points de grille tels que {2, 3, 4, 5, 0, 1, 7, 8, 9, 6, 10}, qui représente un chemin reliant les points 2 à 3 à 4 à ... à 10 . (Il s'agit d'un "chemin eulérien", celui qui visite chaque arête exactement une fois; tous les glyphes du tableau ont un chemin eulérien, donc cette représentation est plus courte que la liste explicite de l'ensemble des arêtes.) La commande après la ->ligne 7 crée cette liste de chemins eulériens, en lisant un entier de base 12 en utilisant vpuis en le divisant à chaque occurrence du chiffre 11.

Enfin, la ligne 8 hache la chaîne d'entrée en convertissant toutes ses lettres en leurs codes ASCII et en prenant leur produit modulo 2293 (le plus petit module pour lequel les réponses sont toutes distinctes). Cet entier est introduit dans l'association sur la ligne ci-dessus, ce qui donne le chemin eulérien approprié, et la ligne 6 trace le chemin résultant sur les points de la grille.

Vidages hexadécimaux des fichiers "a", "b" et "c", dans cet ordre:

09d5f27cd2246e0cb06aa243b442d761ac3a5604439f1767a202c4d3fc4fc1b24ce59acfc65a05235cc46354af8820d6733001e1f25ea01479cee027d62e8b1be10891c693ed5887942ca461c461d458a7676bfcd866a70263ad1833b3e836895ce121153c451ad327086e2bd30d6bad7097a9e71c2fc67c2c57716e5ada6907d99f42702dfb8b88c6d26799aa01f42fb89394e00b0752825f2740903276e20ec405473f309cc978aea187da24749d0a44319cd7322dd542

02d9ebf5fc94183ce50f0fc84e88a27bd21a3b3665d54949608c75c86c4507eed3072e02657822bfb83dbca8a708e07d1382c2b6c3c8fcddc88fa7244281a918b3a8aa823048d4a7e070a336c1e5ab83ec4950fc1960f34c6b89c541c9401607882418cac7f79f4edb164b775ecbb97947470016cadea4d06f93a958713b8c23d11be3c9ce8a2824a458d151ac3cafc6d7bb1557e55868434bd5c0da4bd71e66a3f7711018ae5e7f2941a949a85b6e65aebcc2fe43a89cb0479fa9474fe5102cfbf7da8a455f46ac5409dfdc79970ed8dbfc6b84df78c9c19df4d16bda298dca445ad510bf32e14ca5c91ce58e7521492f6e79e05624ab4a4c02c66c22ef670a06d5c5a3dfdf8ccc8c40c353f3aecf17bbb5cb911baefa3ce80e41551376838c166153a1038d83e171077a3f260ccd70358917eeceb5722b58ad6900a40b5b1512b292fb7a7e0d2cbe2bac2a48a4e343e8f2a338808ec9957c64778aba412bec47bcabb2a2789f01c2d5fdd993

254c40dac61bb215386b7361a8
Greg Martin
la source
Bonne réponse! Vous devez cependant publier les hexdumps de vos fichiers de données.
PurkkaKoodari
Terminé ... et en attendant, j'ai réalisé que je pourrais aussi bien compresser la liste des coordonnées du point de grille, car toutes les commandes pertinentes sont déjà présentes.
Greg Martin