Изображение выше называется гекса-глифом. Гекса-глифы - это несколько классных шаблонов, которые я придумал во время рисования на уроках DiffEq. Вот как вы это делаете:
- Рассмотрим следующий набор точек в форме правильной гексаграммы. Внутренний шестиугольник - это то, что будет содержать окончательный глиф, а внешние 6 точек образуют звезду, и именно там мы начнем рисовать наши линии.
- Из шести внешних точек случайным образом выберите пару. Для эффективности между двумя выбранными точками должна быть хотя бы одна другая точка (в противном случае это не повлияет на конечный показатель). Затем из каждой из двух точек наведите луч на другой. Этот луч заблокирован предыдущими строками.
- Повторяйте этот процесс, пока все 9 ребер не будут сформированы, как показано на следующих нескольких изображениях.
- Вот пример блокировки лучей. Концы сегмента луча все еще видны, но средняя часть закрыта первыми двумя нарисованными нами сегментами.
- Эти два луча также «заблокированы», но это не вызывает видимой разницы, потому что они заблокированы той же самой другой линией.
- Перемотка вперед, пока все 9 линий не нарисованы. Если вы хотите более подробное объяснение этих пропущенных шагов, я могу изложить.
- Наконец, удалите точки звезды. Чтобы сделать его более красивым, толстые точки также удаляются.
Соревнование
Ваша задача - вывести визуальное представление случайного гекса-глифа. Это код-гольф, побеждает меньше байтов.
Все возможные гекса-глифы должны появляться с некоторой положительной вероятностью. Различные гекса-глифы создаются путем изменения порядка прорисовки 9 ребер.
Кроме того, все изображения, выводимые вашей программой, должны быть действительными гекса-символами. Определенные шаблоны (например, полный контур внутреннего шестиугольника) не могут отображаться в виде гекса-глифа, и поэтому ваша программа не должна их выводить.
На выходе должно быть графическое изображение (напечатанное на экране или в файле).
Шестиугольник должен быть правильным, но может появляться в любой ориентации.
Отражения / повороты не считаются уникальными. (Это может облегчить выполнение требования 1).
источник
I made up while doodling during my DiffEq class
, Как происходят все великие открытия ...: P'01'
чередования пробелов вместо' *'
.Ответы:
Mathematica,
273268264242 байта
Оказывает как верхний индексT
в Mathematica и постфиксный оператор транспонирования.Разобраться с ошибками в этом потребовалось навсегда ... ближе к концу я взломал несколько вещей, чтобы все заработало, так что это определенно неоптимально. Я также спрашиваю себя, не лучше ли в целом реализовать спецификацию буквально через линии через внешний шестиугольник и позволить геометрическим функциям Mathematica обрабатывать пересечения.
Обратите внимание, что это полноценная программа, и если вы хотите запустить код несколько раз в течение одного сеанса REPL, вам придется использовать префикс
Clear[b]
.Вот результаты 20 пробежек:
объяснение
Это решение вообще не использует внешние звездные точки. Вместо этого он работает непосредственно с точками, которые являются частью гексаглифа, и линиями, которые покрывают три из них одновременно.
Давайте обозначим точки:
1
начинается с немного странного угла, но это происходит из-за (также несколько странного) поведения по умолчаниюCirclePoints
. Стартовый шестигранник оттуда оказался самым дешевым.Теперь мы хотим найти соответствующие линии через три из этих точек, которые соответствуют соединенным точкам внешней звезды. Те, что расположены вокруг шестиугольника - это, конечно, всего 3 смежные точки (по модулю 12), начиная с нечетного числа. Те, что в центре состоят из четного числа
n
,13
иn+6
.Представления этих линий (в виде списков из трех точек генерируются следующим кодом):
Partition
Генерирует линию вокруг шестиугольника иArray
линии через центр. Чтобы обработать оба луча, мы сопоставляем эту функцию со списком линий:Теперь мы перемешиваем их,
RandomSample
чтобы обработать их в случайном порядке.Join @@
сглаживает список пар, так что у нас есть список лучей.Короткий перерыв: чтобы отслеживать, какие точки уже заблокированы, мы используем функцию поиска
b
, которая инициализируетсяTrue
для всех значений с помощьюb@_=k=1>0;
. При обработке луча мы сохраняем все точки до первой точки, которая имеетb[n] == False
( включая эту):Я чувствую, что сейчас это самая играбельная часть игры ... использование двух временных переменных для игры в Mastermind кажется действительно дорогим. В любом случае, результат этого дает нам точки на линии, которую мы можем нарисовать. Теперь эта функция отображается на каждой из этих точек:
Первая часть генерирует список всех 13 точек, используя результаты чередования двух вызовов
CirclePoints
(с разными радиусами для центров краев и углов шестиугольника). Обратите внимание,b@#=!k
что теперь устанавливает значение таблицы поиска для текущей точки, чтобыFalse
никакой дальнейший луч не мог пройти через нее. Наконец, значение используется в качестве индекса в списке координат для получения правильной 2D-точки.Это отбрасывает все одноэлементные списки, потому что они будут отображаться как отдельные (и видимые) точки. Наконец, мы отображаем результат:
источник
b@_=1>0
=b=1>0&
Обувь (Рубин) Rev C 184 байта
12 байтов, сохраненных за счет передачи ответственности за проверку того, следует ли выводить конкретную половину линии из основной программы в метод рисования. Основная программа все же должна проверить, полностью ли заблокирована вся строка.
Обувь (Рубин)
205... Rev B 196 байтОбувь - это инструмент для построения графического интерфейса на основе рубина и т. Д. Я впервые его использую. mothereff.in/byte-counter считает мое представление 196 байтами, но по какой-то причине Shoes считает его 202.
Кроме того, Ruby позволяет вам делать что-то вроде,
t[a=i.ord]
но, как ни странно, с ботинками это работает не так, как ожидалось.объяснение
Я не рассматриваю части линии вне шестиугольника. Я рисую только ту часть, которая должна быть нарисована. Важно то, пересекают ли линии пересечения (если мы рисуем только те части, которые должны быть нарисованы, это означает, что они начинаются / заканчиваются на пересечениях.)
Основное правило состоит в том, что, если обе конечные точки линии были посещены, линия блокируется и не должна быть нарисована. Поскольку линии нарисованы в двух половинах, мы также должны проверить, была ли достигнута средняя точка, чтобы увидеть, следует ли рисовать каждую половину или нет.
Я отслеживаю, какие точки были посещены в массиве
t[]
. В конечном итоге в нем содержится запись для каждой физической координаты в сетке ниже. Не существует отдельного 13-элементного логического массива. К концуt[]
может быть 87 элементов, хотя только до 13 будут содержать полезные данные.Внутри координаты конечных точек линий задаются одним числом z, где z% 6 - координата y, а z / 6 - координата x. В этой системе шестигранник сплющен. Когда линии построены, масштаб x умножается на 8, а масштаб y умножается на 14, что является очень близким рациональным приближением к правильному отношению: 14/8 = 1,75 против sqrt (3) = 1,732.
Внутренняя система координат показана ниже с несколькими примерами выходных данных.
Ungolfed
Больше примеров выходов
Это было сделано с более старой версией программы. Разница лишь в том, что расположение гексаглифа в окне теперь немного отличается.
источник
mothereff.in/byte-counter counts my submission as 196 bytes, but for some reason Shoes counts it as 202.
Я не на 100% знаю, правда ли это, но я думаю, что причина, по которой Shoes считал ваш код как 202 байта вместо 196, заключается в том, что ваши символы новой строки на самом деле представляют собой последовательность из двух символов «\ r \ n». Это делает каждый перевод строки учитывается дважды. Вот ответ переполнения стека относительно \ r и \ n.Python,
604591574561538531536534528493483452431420419415388385384 байтаЯ адаптировал идею Level River St, чтобы проверить, будет ли линия заблокирована, проверяя, посещали ли обе конечные точки ранее. Это экономит 27 байтов. Предложения по игре в гольф приветствуются.
Редактировать: Исправление ошибок и игра в гольф
g(p,q)
на 3 байта. ГольфL
на один байт.Ungolfing:
Сами гекса-глифы довольно малы, поскольку в качестве основы мы используем 12-пиксельный шестиугольник (по соображениям игры в гольф). Вот несколько примеров гекса-глифов (извинения за плохое обрезание):
источник
R=range;G=goto