Narysuj glify Ingress


16

W lokalizacji opartej AR gra komórkowa sposób życia Ingress gracz może włamać rzeczy zwane portale w celu uzyskania przedmiotów. (Jeśli interesujesz się Ingress, możesz pingować mnie na czacie, aby uzyskać więcej informacji. Zaufaj mi, jest lepszy niż Pokémon. Jeśli skończysz, pobierz go, pamiętaj, aby wybrać Opór.)

Sposobem na znaczne zwiększenie wydajności hackowania jest minigra hakowania glifów , w której gracz musi rysować glify na sześciokątnej siatce.

siatka glifów

W sumie w grze jest około 115 glifów o około 130 nazwach.

Glify

Na potrzeby tego wyzwania policzymy każdy punkt siatki w następujący sposób:

siatka glifów, ponumerowana

Oto lista wszystkich glifów na potrzeby tego wyzwania. Lista jest obiektem JSON, zawierającym każdy glif jako listę krawędzi.

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

Niektóre glify mają wiele nazw (np. NO, NOT, INSIDE); musisz wesprzeć ich wszystkich.

Zastrzeżenie: Nie mogłem znaleźć dobrej listy wszystkich glifów, więc połączyłem wiele źródeł i ostatecznie narysowałem je wszystkie w zhakowanej aplikacji JS, aby uzyskać ich listę. Być może brakuje mi niektórych i może być kilka aliasów, które nie są używane w grze; Mam jednak nadzieję, że nie pomyliłem niektórych glifów.

Edytuj następnego dnia rano, kiedy nie jest czwarta rano: już zauważyłem, że ZWYCIĘSTA brakuje. No cóż, pozostawiono go najlepszym golfistom.

Wyzwanie

Twoim zadaniem jest utworzenie programu lub funkcji, która przyjmuje nazwę glifu i wysyła glif jako obraz.

Obraz musi zawierać punkty siatki i linie łączące te punkty.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach. Obowiązują standardowe zasady.

I / O

Jako dane wejściowe weźmiesz w dowolnym formacie nazwę glifu dokładnie taką, jak w kluczach powyższego obiektu JSON. Wszelkie inne dane wejściowe to nieokreślone zachowanie.

Obraz zostanie wydrukowany w dowolnym popularnym formacie z glifem renderowanym na siatce.

Proporcje siatki

Proporcje te muszą być dokładne do pięciu pikseli (aby umożliwić zaokrąglanie itp.)

  • Zewnętrzne punkty (0-5) muszą tworzyć regularny sześciokąt.
  • Punkt środkowy (10) musi znajdować się w środku sześciokąta.
  • Punkty pośrednie (6-9) muszą znajdować się w połowie odległości między punktem środkowym a odpowiadającymi mu punktami zewnętrznymi.
  • Siatka musi być zorientowana jak oryginał.
  • Wysokość zewnętrznego sześciokąta musi wynosić co najmniej 100 pikseli.

Inne zasady

  • Tło musi być przezroczyste lub wypełnione jednolitym kolorem.
  • Linie i punkty muszą wyraźnie różnić się od tła i od siebie; nie mogą mieć tego samego jednolitego koloru.
    • Na przykład ciągłe niebieskie linie i ciągłe różowe punkty są w porządku.
    • Jednolite czarne linie i białe punkty z czarnymi ramkami są w porządku.
    • Czerwone i białe paski i piłki jako punkty są w porządku.
    • Ciągłe zielone linie i ciągłe zielone punkty nie są w porządku.
  • Promień punktów musi być większy niż szerokość linii.
  • Państwo może rysować linie z przodu lub z tyłu punktów.
  • Państwo może zawierać dowolną ilość wyściółki (w kolorze tła) w obrazie.
  • Ty może łączyć kolejne wiersze w jednej linii, ponieważ nie ma wpływu na wynik.

Przykłady

Kolory i szerokości obiektów na tych obrazach to tylko przykłady, które nieco przypominają wygląd gry.

BEZGRANICZNY

nieograniczony glif

POKÓJ

glif pokoju

ODPORNOŚĆ

glif odporności


Musiałem głosować za tęsknotą (i sugestią Ruchu Oporu: P). Chciałbym mieć jeszcze czas na tę grę! Niektóre z najbardziej zabawnych (i ćwiczeń), jakie miałem od dłuższego czasu. I czy faktycznie stworzyłeś ręcznie JSON?
Carcigenicate

@Carcigenate Nie. Napisałem kawałek kodu, który dał mi siatkę i nazwę glifu i kazał mi go narysować, i zebrałem glify w tablicy jako listy węzłów. Potem było tylko dziesięć linii Pythona i niektóre znajdź i zamień. Ta aplikacja jest także źródłem przykładów.
PurkkaKoodari

podczas ściskania listę wykresie odgrywa dużą rolę w wyzwaniu, nie sądzę tag Kołmogorowa feat tutaj jak masz ponad sto różnych wyjście
Sefa

@ Pietu1998 Och, spoko. Chyba powinienem był zaufać, że programista napisałby program, który pomógłby w czymś takim.
Carcigenicate

Odpowiedzi:


7

Mathematica, 228 + 184 + 365 + 13 = 790 bajtów

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

Powyższe 228-bajtowe polecenie definiuje nienazwaną funkcję, która przyjmuje jako dane wejściowe jedną z powyższych nazw glifów i zwraca obraz. Na przykład oto dane wyjściowe dla "UNBOUNDED":

BEZGRANICZNY

Komenda czyta trzy files- binarny "a", "b"i "c"-co mają 184, 365 i 13 bajtów, odpowiednio. Wersja łatwiejsza do odczytania:

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

Wiersz 2 definiuje ręcznie wykonaną funkcję dekompresyjną: wczytuje strumień bajtów z pliku #, konwertuje go na liczbę całkowitą base-256, a następnie rozwija tę liczbę całkowitą na listę cyfr w bazie #2. Linie 3 i 4 definiują funkcję (przy użyciu trzeciego pliku binarnego), która konwertuje liczbę całkowitą od 0 do 10 na współrzędne odpowiedniego punktu siatki; wszystkie te współrzędne zostały wybrane jako liczby całkowite między –12 a 12, co sprawia, że ​​kompresja jest wygodna (choć nie tak wygodna, że ​​widziałem ją przy pierwszym przesłaniu).

Linia 5 rysuje punkty siatki (w domyślnym kolorze czarnym), a następnie zmienia kolor na czerwony dla linii. Wiersz 7 tworzy skojarzenie (przy użyciu pierwszych dwóch plików binarnych), które konwertuje niektóre liczby całkowite wejściowe z zakresu od 0 do 2292 na listę liczb całkowitych punktu siatki, takich jak {2, 3, 4, 5, 0, 1, 7, 8, 9, 6, 10}, która reprezentuje ścieżkę łączącą punkty od 2 do 3 do 4 do ... do 10 (Jest to „ścieżka Eulera”, taka, która odwiedza każdą krawędź dokładnie raz; wszystkie glify w tabeli mają ścieżkę Eulera, więc ta reprezentacja jest krótsza niż jawne wypisanie zestawu krawędzi.) Polecenie po ->linii 7 tworzy tę listę ścieżek Eulera, czytając liczbę całkowitą base-12 za pomocą, va następnie dzieląc ją przy każdym wystąpieniu cyfry 11.

Wreszcie wiersz 8 miesza ciąg wejściowy, konwertując wszystkie litery na kody ASCII i przyjmując ich moduł produktu 2293 (najmniejszy moduł, dla którego wszystkie odpowiedzi są różne). Ta liczba całkowita jest wprowadzana do asocjacji w linii powyżej, co daje odpowiednią ścieżkę Eulera, a linia 6 rysuje wynikową ścieżkę nad punktami siatki.

Zrzuty szesnastkowe plików „a”, „b” i „c” w następującej kolejności:

09d5f27cd2246e0cb06aa243b442d761ac3a5604439f1767a202c4d3fc4fc1b24ce59acfc65a05235cc46354af8820d6733001e1f25ea01479cee027d62e8b1be10891c693ed5887942ca461c461d458a7676bfcd866a70263ad1833b3e836895ce121153c451ad327086e2bd30d6bad7097a9e71c2fc67c2c57716e5ada6907d99f42702dfb8b88c6d26799aa01f42fb89394e00b0752825f2740903276e20ec405473f309cc978aea187da24749d0a44319cd7322dd542

02d9ebf5fc94183ce50f0fc84e88a27bd21a3b3665d54949608c75c86c4507eed3072e02657822bfb83dbca8a708e07d1382c2b6c3c8fcddc88fa7244281a918b3a8aa823048d4a7e070a336c1e5ab83ec4950fc1960f34c6b89c541c9401607882418cac7f79f4edb164b775ecbb97947470016cadea4d06f93a958713b8c23d11be3c9ce8a2824a458d151ac3cafc6d7bb1557e55868434bd5c0da4bd71e66a3f7711018ae5e7f2941a949a85b6e65aebcc2fe43a89cb0479fa9474fe5102cfbf7da8a455f46ac5409dfdc79970ed8dbfc6b84df78c9c19df4d16bda298dca445ad510bf32e14ca5c91ce58e7521492f6e79e05624ab4a4c02c66c22ef670a06d5c5a3dfdf8ccc8c40c353f3aecf17bbb5cb911baefa3ce80e41551376838c166153a1038d83e171077a3f260ccd70358917eeceb5722b58ad6900a40b5b1512b292fb7a7e0d2cbe2bac2a48a4e343e8f2a338808ec9957c64778aba412bec47bcabb2a2789f01c2d5fdd993

254c40dac61bb215386b7361a8

Niezła odpowiedź! Powinieneś jednak opublikować zrzuty heksadecymalne plików danych.
PurkkaKoodari

Zrobione ... a tymczasem zdałem sobie sprawę, że równie dobrze mogę skompresować listę współrzędnych punktu siatki, ponieważ wszystkie odpowiednie polecenia są już obecne.
Greg Martin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.