Disegna i glifi Ingress


16

Nel modo di vivere del gioco mobile AR basato sulla posizione Ingress il giocatore può hackerare oggetti chiamati portali per ottenere oggetti. (Se sei interessato a Ingress, puoi chiamarmi in chat per maggiori informazioni. Fidati di me, è meglio dei Pokémon. Se finisci per scaricarlo, ricordati di scegliere la Resistenza.)

Un modo per aumentare significativamente l'output di hacking è il minigioco glifo hacking , in cui il giocatore deve disegnare glifi su una griglia esagonale.

la griglia dei glifi

In totale, ci sono circa 115 glifi con circa 130 nomi che sono effettivamente utilizzati nel gioco.

glifi

Ai fini di questa sfida numereremo ogni punto della griglia in questo modo:

la griglia dei glifi, numerata

Ecco l'elenco di tutti i glifi ai fini di questa sfida. L'elenco è un oggetto JSON, contenente ogni glifo come un elenco di bordi.

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

Alcuni glifi hanno più nomi (ad es. NO, NOT, INSIDE); devi supportarli tutti.

Disclaimer: non sono riuscito a trovare un buon elenco di tutti i glifi, quindi ho combinato più fonti e alla fine ho finito per disegnarli tutti in un'applicazione JS messa insieme per ottenere l'elenco di essi. Potrei mancarne un po 'e potrebbero esserci un paio di alias non utilizzati nel gioco; Spero di non aver smarrito alcuni dei glifi, però.

Modifica la mattina successiva quando non sono le 4 del mattino: ho già notato che manca VICTORY. Vabbè, è lasciato per il miglior golfista allora.

Sfida

Il tuo compito è creare un programma o una funzione che assume il nome di un glifo e produca il glifo come immagine.

L'immagine deve contenere i punti della griglia e le linee che collegano i punti in questione.

Questo è , quindi vince la risposta più breve in byte. Si applicano le regole standard.

I / O

Prenderai come input, in un formato a tua scelta, un nome di un glifo esattamente come si trova nelle chiavi dell'oggetto JSON sopra. Qualsiasi altro input è un comportamento indefinito.

Verrà emessa un'immagine in qualsiasi formato comune con il glifo reso alla griglia.

Proporzioni griglia

Queste proporzioni devono essere precise a cinque pixel (per consentire arrotondamenti ecc.)

  • I punti esterni (0-5) devono formare un esagono regolare.
  • Il punto centrale (10) deve essere al centro dell'esagono.
  • I punti intermedi (6-9) devono trovarsi a metà strada tra il punto centrale e i punti esterni corrispondenti.
  • La griglia deve essere orientata come l'originale.
  • L'altezza dell'esagono esterno deve essere di almeno 100 pixel.

Altre regole

  • Lo sfondo deve essere trasparente o riempito con un colore solido.
  • Le linee e i punti devono essere chiaramente distinti dallo sfondo e dall'altro; non possono essere dello stesso colore solido.
    • Ad esempio, le linee blu continue e i punti rosa solidi vanno bene.
    • Le linee nere solide e i punti bianchi con bordi neri vanno bene.
    • Linee a strisce bianche e rosse e palloni da calcio come punti va bene.
    • Le linee verdi continue e i punti verdi solidi non vanno bene.
  • Il raggio dei punti deve essere maggiore della larghezza delle linee.
  • È possibile tracciare le linee davanti o dietro i punti.
  • È possibile includere qualsiasi quantità di imbottitura (nel colore di sfondo) nell'immagine.
  • È possibile combinare righe consecutive in una riga, poiché non influisce sul risultato.

Esempi

I colori e le larghezze degli oggetti in queste immagini sono solo esempi che in qualche modo assomigliano all'aspetto del gioco.

UNBOUNDED

glifo illimitato

PACE

glifo di pace

RESISTENZA

glifo di resistenza


Ho dovuto votare per la nostalgia (e il suggerimento della Resistenza: P). Vorrei avere ancora tempo per questo gioco! Alcuni dei più divertenti (ed esercizi) che ho avuto da molto tempo. E hai effettivamente creato manualmente quel JSON?
Carcigenicato l'

@Carcigenato No. Ho scritto un pezzo di codice che mi ha dato una griglia e un nome di un glifo e mi ha fatto disegnare, e ho raccolto i glifi in una matrice come liste di nodi. Quindi c'erano solo dieci righe di pitone e alcune di ricerca e sostituzione. Quell'app è anche la provenienza degli esempi.
PurkkaKoodari,

mentre comprimere l'elenco dei grafici gioca un ruolo importante nella sfida, non credo che il tag kolmogorov feat qui poiché hai più di cento output diversi
Sefa

@ Pietu1998 Oh, bello. Immagino che avrei dovuto fidarmi che un programmatore avrebbe scritto un programma per aiutare in qualcosa del genere.
Carcigenicato l'

Risposte:


7

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

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

Il comando 228 byte sopra definisce una funzione senza nome che accetta come input uno dei nomi dei glifi sopra e restituisce un'immagine. Ad esempio, ecco l'output per "UNBOUNDED":

UNBOUNDED

Il comando legge tre file binari "a""b", e "c"— che hanno rispettivamente 184, 365 e 13 byte. Una versione più facile da leggere:

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 riga 2 definisce una funzione di decompressione manuale: legge in un flusso di byte dal file #, lo converte in un numero intero base-256 e quindi espande quel numero intero nel suo elenco di cifre in base #2. Le linee 3 e 4 definiscono una funzione (usando il terzo file binario) che converte un numero intero da 0 a 10 nelle coordinate del corrispondente punto della griglia; tutte queste coordinate sono state scelte per essere numeri interi compresi tra –12 e 12, il che rende la compressione comoda (anche se non così conveniente che l'ho vista per la mia presentazione iniziale).

La linea 5 disegna i punti della griglia (nel colore predefinito nero), quindi passa al colore rosso per le linee. La riga 7 crea un'associazione (utilizzando i primi due file binari) che converte alcuni numeri interi di input tra 0 e 2292 in un elenco di numeri interi di griglia come {2, 3, 4, 5, 0, 1, 7, 8, 9, 6, 10}, che rappresenta un percorso che unisce i punti da 2 a 3 a 4 a ... a 10 a (Questo è un "percorso euleriano", uno che visita ogni bordo esattamente una volta; tutti i glifi nella tabella hanno un percorso euleriano, quindi questa rappresentazione è più breve dell'elenco esplicito dell'insieme di bordi.) Il comando dopo la ->riga 7 crea questo elenco di percorsi euleriani, leggendo un numero intero di base 12 usando ve quindi suddividendolo ad ogni occorrenza della cifra 11.

Infine, la riga 8 esegue l'hashing della stringa di input convertendo tutte le sue lettere nei loro codici ASCII e prendendo il loro prodotto modulo 2293 (il modulo più piccolo per il quale le risposte sono tutte distinte). Quel numero intero viene inserito nell'associazione nella riga sopra, risultante nel percorso euleriano appropriato, e la linea 6 disegna il percorso risultante sui punti della griglia.

Dump esadecimali dei file "a", "b" e "c", in questo ordine:

09d5f27cd2246e0cb06aa243b442d761ac3a5604439f1767a202c4d3fc4fc1b24ce59acfc65a05235cc46354af8820d6733001e1f25ea01479cee027d62e8b1be10891c693ed5887942ca461c461d458a7676bfcd866a70263ad1833b3e836895ce121153c451ad327086e2bd30d6bad7097a9e71c2fc67c2c57716e5ada6907d99f42702dfb8b88c6d26799aa01f42fb89394e00b0752825f2740903276e20ec405473f309cc978aea187da24749d0a44319cd7322dd542

02d9ebf5fc94183ce50f0fc84e88a27bd21a3b3665d54949608c75c86c4507eed3072e02657822bfb83dbca8a708e07d1382c2b6c3c8fcddc88fa7244281a918b3a8aa823048d4a7e070a336c1e5ab83ec4950fc1960f34c6b89c541c9401607882418cac7f79f4edb164b775ecbb97947470016cadea4d06f93a958713b8c23d11be3c9ce8a2824a458d151ac3cafc6d7bb1557e55868434bd5c0da4bd71e66a3f7711018ae5e7f2941a949a85b6e65aebcc2fe43a89cb0479fa9474fe5102cfbf7da8a455f46ac5409dfdc79970ed8dbfc6b84df78c9c19df4d16bda298dca445ad510bf32e14ca5c91ce58e7521492f6e79e05624ab4a4c02c66c22ef670a06d5c5a3dfdf8ccc8c40c353f3aecf17bbb5cb911baefa3ce80e41551376838c166153a1038d83e171077a3f260ccd70358917eeceb5722b58ad6900a40b5b1512b292fb7a7e0d2cbe2bac2a48a4e343e8f2a338808ec9957c64778aba412bec47bcabb2a2789f01c2d5fdd993

254c40dac61bb215386b7361a8

Bella risposta! Tuttavia, dovresti pubblicare i hexdump dei tuoi file di dati.
PurkkaKoodari,

Fatto ... e nel frattempo mi sono reso conto che avrei potuto comprimere anche l'elenco delle coordinate del punto della griglia, poiché tutti i comandi pertinenti sono già presenti.
Greg Martin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.