Нарисуйте символы Ingress

16

В основе определения местоположения AR мобильных игр образ жизни Ingress игрок может взломать вещи , называемые порталами, чтобы получить детали. (Если вы заинтересованы в Ingress, вы можете отправить мне сообщение в чате для получения дополнительной информации. Поверьте мне, это лучше, чем Pokémon. Если вы в конечном итоге скачаете его, не забудьте выбрать Resistance.)

Способом значительно повысить производительность хака является мини-игра для взлома глифов , в которой игрок должен рисовать глифы на гексагональной сетке.

глиф сетка

Всего в игре насчитывается около 115 глифов с около 130 именами.

Глифы

Для целей этой задачи мы будем нумеровать каждую точку сетки следующим образом:

сетка глифа, пронумерованная

Вот список всех глифов для целей этой задачи. Список представляет собой объект JSON, содержащий каждый глиф в виде списка ребер.

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

Некоторые глифы имеют несколько имен (например NO, NOT, INSIDE); Вы должны поддержать их всех.

Отказ от ответственности: я не смог найти хороший список всех глифов, поэтому я объединил несколько источников и, в конце концов, нарисовал их все во взломанном JS-приложении, чтобы получить их список. Возможно, мне не хватает некоторых, и может быть пара псевдонимов, не используемых в игре; Я надеюсь, что я не использовал несколько глифов неправильно.

Отредактируйте на следующее утро, когда не 4 утра: я уже заметил, что ПОБЕДА отсутствует. О, хорошо, тогда это оставлено для лучшего игрока в гольф.

Вызов

Ваша задача - создать программу или функцию, которая берет имя глифа и выводит глиф как изображение.

Изображение должно содержать точки сетки и линии, соединяющие эти точки.

Это , поэтому выигрывает самый короткий ответ в байтах. Стандартные правила применяются.

I / O

В качестве входных данных вы будете использовать имя глифа в том виде, в каком оно найдено в ключах вышеупомянутого объекта JSON. Любой другой ввод - неопределенное поведение.

Вы будете выводить изображение в любом общем формате с глифом, отображаемым в сетке.

Пропорции сетки

Эти пропорции должны быть с точностью до пяти пикселей (для округления и т. Д.)

  • Внешние точки (0-5) должны образовывать правильный шестиугольник.
  • Центральная точка (10) должна находиться в центре шестиугольника.
  • Промежуточные точки (6-9) должны быть на полпути между центральной точкой и соответствующими внешними точками.
  • Сетка должна быть ориентирована как оригинал.
  • Высота внешнего шестиугольника должна быть не менее 100 пикселей.

Другие правила

  • Фон должен быть либо прозрачным, либо залитым сплошным цветом.
  • Линии и точки должны четко отличаться от фона и друг от друга; они не могут быть одинакового сплошного цвета.
    • Например, сплошные синие линии и сплошные розовые точки - это хорошо.
    • Сплошные черные линии и белые точки с черными границами - это хорошо.
    • Красные и белые полосатые линии и футбольные мячи в качестве очков это хорошо.
    • Сплошные зеленые линии и сплошные зеленые точки не в порядке.
  • Радиус точек должен быть больше ширины линий.
  • Вы можете рисовать линии перед или за точками.
  • Вы можете включить любое количество отступов (в цвете фона) в изображение.
  • Вы можете объединить последовательные строки в одну строку, так как это не влияет на результат.

Примеры

Цвета и ширина объектов на этих изображениях являются лишь примерами, которые несколько напоминают внешний вид игры.

неограниченный

неограниченный глиф

PEACE

символ мира

СОПРОТИВЛЕНИЕ

глиф сопротивления

PurkkaKoodari
источник
Пришлось поднять голос за ностальгию (и предложение Сопротивления: P). Жаль, что у меня еще не было времени на эту игру! Некоторые из самых забавных (и упражнений) у меня были за долгое время. И вы на самом деле вручную создали этот JSON?
Carcigenicate
@Carcigenate Нет. Я написал фрагмент кода, который дал мне сетку и имя глифа, попросил нарисовать его и собрал глифы в массив в виде списков узлов. Тогда это было всего десять строк Python и некоторые найти и заменить. Это приложение также откуда примеры.
PurkkaKoodari
при сжатии списка графа играет большую роль в решении задач, я не думаю , что Колмогоров теги подвиг здесь , как у вас есть более чем сто другой вывод
Sefa
@ Pietu1998 О, круто. Думаю, я должен был поверить, что программист написал бы программу, чтобы помочь с чем-то подобным.
Carcigenicate

Ответы:

7

Mathematica, 228 + 184 + 365 + 13 = 790 байт

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

Вышеупомянутая 228-байтовая команда определяет безымянную функцию, которая принимает в качестве входных данных одно из названий глифов выше и возвращает изображение. Например, вот вывод для "UNBOUNDED":

неограниченный

Команда читает три двоичных файла "a"- "b", и -, "c"которые имеют 184, 365 и 13 байтов соответственно. Более удобная для чтения версия:

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

В строке 2 определяется функция ручной распаковки: она читает поток байтов из файла #, преобразует его в целое число-256, а затем расширяет это число в своем списке цифр в базе #2. Строки 3 и 4 определяют функцию (используя третий двоичный файл), которая преобразует целое число от 0 до 10 в координаты соответствующей точки сетки; все эти координаты были выбраны целыми числами от –12 до 12, что делает сжатие удобным (хотя и не таким удобным, как я видел его для первоначального представления).

Линия 5 рисует точки сетки (по умолчанию черный цвет), затем переключается на красный цвет линий. Строка 7 создает ассоциацию (используя первые два двоичных файла), которая преобразует определенные входные целые числа от 0 до 2292 в список целых чисел точки сетки, например {2, 3, 4, 5, 0, 1, 7, 8, 9, 6, 10}, который представляет точку, соединяющую точки от 2 до 3 до 4 до ... до 10 (Это «эйлеров путь», который посещает каждое ребро ровно один раз; все глифы в таблице имеют эйлеров путь, поэтому это представление короче, чем явное перечисление набора ребер.) Команда после ->строки 7 создает этот список эйлеровых путей, считывая целое число от 12, используя, vа затем разбивая его при каждом появлении цифры 11.

Наконец, строка 8 хеширует входную строку путем преобразования всех ее букв в их коды ASCII и получения их произведения по модулю 2293 (наименьший модуль, для которого все ответы различны). Это целое число подается в ассоциацию в строке выше, что приводит к соответствующему эйлерову траектории, а линия 6 рисует результирующий путь по точкам сетки.

Шестнадцатеричные дампы файлов "a", "b" и "c" в следующем порядке:

09d5f27cd2246e0cb06aa243b442d761ac3a5604439f1767a202c4d3fc4fc1b24ce59acfc65a05235cc46354af8820d6733001e1f25ea01479cee027d62e8b1be10891c693ed5887942ca461c461d458a7676bfcd866a70263ad1833b3e836895ce121153c451ad327086e2bd30d6bad7097a9e71c2fc67c2c57716e5ada6907d99f42702dfb8b88c6d26799aa01f42fb89394e00b0752825f2740903276e20ec405473f309cc978aea187da24749d0a44319cd7322dd542

02d9ebf5fc94183ce50f0fc84e88a27bd21a3b3665d54949608c75c86c4507eed3072e02657822bfb83dbca8a708e07d1382c2b6c3c8fcddc88fa7244281a918b3a8aa823048d4a7e070a336c1e5ab83ec4950fc1960f34c6b89c541c9401607882418cac7f79f4edb164b775ecbb97947470016cadea4d06f93a958713b8c23d11be3c9ce8a2824a458d151ac3cafc6d7bb1557e55868434bd5c0da4bd71e66a3f7711018ae5e7f2941a949a85b6e65aebcc2fe43a89cb0479fa9474fe5102cfbf7da8a455f46ac5409dfdc79970ed8dbfc6b84df78c9c19df4d16bda298dca445ad510bf32e14ca5c91ce58e7521492f6e79e05624ab4a4c02c66c22ef670a06d5c5a3dfdf8ccc8c40c353f3aecf17bbb5cb911baefa3ce80e41551376838c166153a1038d83e171077a3f260ccd70358917eeceb5722b58ad6900a40b5b1512b292fb7a7e0d2cbe2bac2a48a4e343e8f2a338808ec9957c64778aba412bec47bcabb2a2789f01c2d5fdd993

254c40dac61bb215386b7361a8
Грег Мартин
источник
Хороший ответ! Тем не менее, вы должны опубликовать hexdumps ваших файлов данных.
PurkkaKoodari
Готово ... и тем временем я понял, что могу также просто сжать список координат точки сетки, поскольку все соответствующие команды уже присутствуют.
Грег Мартин