Zeichnen Sie die Ingress-Glyphen

16

Im standortbasierten AR-Handyspiel way of life Ingress der Spieler sogenannte Portale hacken, um Gegenstände zu erhalten. (Wenn Sie sich für Ingress interessieren, können Sie mich im Chat anrufen, um weitere Informationen zu erhalten. Vertrauen Sie mir, es ist besser als Pokémon. Wenn Sie es am Ende herunterladen, denken Sie daran, den Widerstand zu wählen.)

Eine Möglichkeit, die Hack-Leistung signifikant zu steigern, ist das Glyphen-Hacking- Minispiel, bei dem der Spieler Glyphen auf einem hexagonalen Gitter zeichnen muss.

das Glyphengitter

Insgesamt gibt es ungefähr 115 Glyphen mit ungefähr 130 Namen, die tatsächlich im Spiel verwendet werden.

Glyphen

Für diese Herausforderung werden wir jeden Punkt des Gitters wie folgt nummerieren:

das Glyphengitter, nummeriert

Hier ist die Liste aller Glyphen für die Zwecke dieser Herausforderung. Die Liste ist ein JSON-Objekt, das die einzelnen Glyphen als Kantenliste enthält.

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

Einige Glyphen haben mehrere Namen (z. B. NO, NOT, INSIDE). du musst sie alle unterstützen.

Haftungsausschluss: Ich konnte keine gute Liste aller Glyphen finden, also habe ich mehrere Quellen kombiniert und sie schließlich in einer gehackten JS-Anwendung gezeichnet, um die Liste zu erhalten. Mir fehlen möglicherweise einige und es gibt möglicherweise ein paar Aliase, die im Spiel nicht verwendet werden. Ich hoffe, dass ich einige der Glyphen nicht falsch gezeichnet habe.

Bearbeiten Sie am nächsten Morgen, wenn es nicht 4 Uhr morgens ist: Ich habe bereits bemerkt, dass VICTORY fehlt. Na ja, es ist dann für den besten Golfer verlassen.

Herausforderung

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu erstellen, die den Namen eines Zeichens aufnimmt und das Zeichen als Bild ausgibt.

Das Bild muss die Rasterpunkte und die Linien enthalten, die die betreffenden Punkte verbinden.

Das ist , also gewinnt die kürzeste Antwort in Bytes. Es gelten Standardregeln.

I / O

Als Eingabe nehmen Sie in einem Format Ihrer Wahl einen Namen eines Glyphen, der genau den Schlüsseln des obigen JSON-Objekts entspricht. Alle anderen Eingaben sind undefiniertes Verhalten.

Sie werden ein Bild in jedem gängigen Format ausgeben, wobei die Glyphe in das Raster gerendert wird.

Rasterproportionen

Diese Proportionen müssen auf fünf Pixel genau sein (zum Runden usw.)

  • Die äußeren Punkte (0-5) müssen ein regelmäßiges Sechseck bilden.
  • Der Mittelpunkt (10) muss in der Mitte des Sechsecks liegen.
  • Die Zwischenpunkte (6-9) müssen auf halber Strecke zwischen dem Mittelpunkt und den entsprechenden Außenpunkten liegen.
  • Das Raster muss wie das Original ausgerichtet sein.
  • Die Höhe des äußeren Sechsecks muss mindestens 100 Pixel betragen.

Andere Regeln

  • Der Hintergrund muss entweder transparent oder einfarbig sein.
  • Die Linien und Punkte müssen sich deutlich vom Hintergrund und voneinander unterscheiden. Sie können nicht die gleiche Farbe haben.
    • Beispielsweise sind durchgezogene blaue Linien und durchgezogene rosa Punkte in Ordnung.
    • Durchgezogene schwarze Linien und weiße Punkte mit schwarzen Rändern sind in Ordnung.
    • Rot-weiß gestreifte Linien und Fußbälle als Punkte sind in Ordnung.
    • Durchgezogene grüne Linien und durchgezogene grüne Punkte sind nicht in Ordnung.
  • Der Radius der Punkte muss größer sein als die Breite der Linien.
  • Sie können die Linien vor oder hinter den Punkten zeichnen.
  • Sie können eine beliebige Menge an Füllmaterial (in der Hintergrundfarbe) in das Bild einfügen.
  • Sie können aufeinanderfolgende Zeilen zu einer Zeile zusammenfassen, da dies das Ergebnis nicht beeinflusst.

Beispiele

Die Farben und Objektbreiten in diesen Bildern sind nur Beispiele, die dem Erscheinungsbild des Spiels etwas ähneln.

UNBEGRENZT

unbegrenzte Glyphe

FRIEDEN

Friedenszeichen

WIDERSTAND

Widerstandsglyphe

PurkkaKoodari
quelle
Musste für die Nostalgie (und den Resistance-Vorschlag: P) stimmen. Ich wünschte, ich hätte noch Zeit für dieses Spiel! Einige der am meisten Spaß (und Übung), die ich seit langer Zeit hatte. Und haben Sie diesen JSON tatsächlich manuell erstellt?
Carcigenicate
@Carcigenate Nein. Ich habe einen Code geschrieben, der mir ein Raster und einen Namen eines Zeichens gab. Ich habe ihn zeichnen lassen und die Zeichen in einem Array als Knotenlisten gesammelt. Dann waren es nur noch zehn Zeilen Python und ein paar Suchen und Ersetzen. Aus dieser App stammen auch die Beispiele.
PurkkaKoodari
Obwohl das Komprimieren der Graphenliste eine große Rolle bei der Herausforderung spielt, glaube ich nicht, dass das Kolmogorov-Tag hier funktioniert, da Sie mehr als hundert verschiedene Ausgaben haben
Sefa
@ Pietu1998 Oh, cool. Ich schätze, ich hätte darauf vertrauen sollen, dass ein Programmierer ein Programm geschrieben hätte, um bei so etwas zu helfen.
Carcigenicate

Antworten:

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

Der obige 228-Byte-Befehl definiert eine unbenannte Funktion, die einen der oben genannten Glyphennamen als Eingabe verwendet und ein Bild zurückgibt. Hier ist zum Beispiel die Ausgabe für "UNBOUNDED":

UNBEGRENZT

Der Befehl liest drei binäre Dateien - "a", "b"und "c"-die hat 184, 365, und 13 Bytes. Eine leichter lesbare Version:

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

Zeile 2 definiert eine handgefertigte Dekomprimierungsfunktion: Sie liest einen Strom von Bytes aus der Datei ein #, konvertiert sie in eine Ganzzahl zur Basis 256 und erweitert diese Ganzzahl dann in ihre Liste der Ziffern zur Basis #2. Die Zeilen 3 und 4 definieren eine Funktion (unter Verwendung der dritten Binärdatei), die eine Ganzzahl von 0 bis 10 in die Koordinaten des entsprechenden Gitterpunkts umwandelt. Alle diese Koordinaten wurden als Ganzzahlen zwischen –12 und 12 gewählt, was die Komprimierung bequem macht (obwohl es nicht so bequem ist, dass ich es für meine erste Einreichung gesehen habe).

Linie 5 zeichnet die Rasterpunkte (in der Standardfarbe Schwarz) und wechselt dann zu der Farbe Rot für die Linien. Zeile 7 erstellt eine Zuordnung (unter Verwendung der ersten beiden Binärdateien), die bestimmte Eingabe-Ganzzahlen zwischen 0 und 2292 in eine Liste von Gitterpunkt-Ganzzahlen umwandelt, z. B. {2, 3, 4, 5, 0, 1, 7, 8, 9, 6, 10}, die einen Pfad darstellt, der die Punkte 2 bis 3 bis 4 bis ... bis 10 verbindet (Dies ist ein "Eulerscher Pfad", der jede Kante genau einmal besucht. Alle Glyphen in der Tabelle haben einen Eulerschen Pfad, daher ist diese Darstellung kürzer als die explizite Auflistung der Kanten.) Der Befehl nach der ->Zeile 7 erstellt diese Liste von Eulerschen Pfaden, indem eine Ganzzahl zur Basis 12 mit eingelesen vund dann bei jedem Auftreten der Ziffer 11 geteilt wird.

Schließlich wird in Zeile 8 die Eingabezeichenfolge durch Konvertieren aller Buchstaben in ihre ASCII-Codes und Verwenden des Produktmoduls 2293 (des kleinsten Moduls, für das alle Antworten unterschiedlich sind) durchsucht. Diese Ganzzahl wird in die Assoziation in der obigen Zeile eingespeist, was den entsprechenden Eulerschen Pfad ergibt, und die Linie 6 zeichnet den resultierenden Pfad über die Gitterpunkte.

Hex-Dumps der Dateien "a", "b" und "c" in dieser Reihenfolge:

09d5f27cd2246e0cb06aa243b442d761ac3a5604439f1767a202c4d3fc4fc1b24ce59acfc65a05235cc46354af8820d6733001e1f25ea01479cee027d62e8b1be10891c693ed5887942ca461c461d458a7676bfcd866a70263ad1833b3e836895ce121153c451ad327086e2bd30d6bad7097a9e71c2fc67c2c57716e5ada6907d99f42702dfb8b88c6d26799aa01f42fb89394e00b0752825f2740903276e20ec405473f309cc978aea187da24749d0a44319cd7322dd542

02d9ebf5fc94183ce50f0fc84e88a27bd21a3b3665d54949608c75c86c4507eed3072e02657822bfb83dbca8a708e07d1382c2b6c3c8fcddc88fa7244281a918b3a8aa823048d4a7e070a336c1e5ab83ec4950fc1960f34c6b89c541c9401607882418cac7f79f4edb164b775ecbb97947470016cadea4d06f93a958713b8c23d11be3c9ce8a2824a458d151ac3cafc6d7bb1557e55868434bd5c0da4bd71e66a3f7711018ae5e7f2941a949a85b6e65aebcc2fe43a89cb0479fa9474fe5102cfbf7da8a455f46ac5409dfdc79970ed8dbfc6b84df78c9c19df4d16bda298dca445ad510bf32e14ca5c91ce58e7521492f6e79e05624ab4a4c02c66c22ef670a06d5c5a3dfdf8ccc8c40c353f3aecf17bbb5cb911baefa3ce80e41551376838c166153a1038d83e171077a3f260ccd70358917eeceb5722b58ad6900a40b5b1512b292fb7a7e0d2cbe2bac2a48a4e343e8f2a338808ec9957c64778aba412bec47bcabb2a2789f01c2d5fdd993

254c40dac61bb215386b7361a8
Greg Martin
quelle
Gute Antwort! Sie sollten jedoch die Hexdumps Ihrer Datendateien veröffentlichen.
PurkkaKoodari
Fertig ... und in der Zwischenzeit wurde mir klar, dass ich die Liste der Gitterpunktkoordinaten genauso gut komprimieren könnte, da alle relevanten Befehle bereits vorhanden sind.
Greg Martin