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.
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:
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 golf golfowy , 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
POKÓJ
ODPORNOŚĆ
źródło
Odpowiedzi:
Mathematica, 228 + 184 + 365 + 13 = 790 bajtów
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"
:Komenda czyta trzy files- binarny
"a"
,"b"
i"c"
-co mają 184, 365 i 13 bajtów, odpowiednio. Wersja łatwiejsza do odczytania: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ą,v
a 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:
źródło