Головоломка чисел Аристотеля - это задача заполнения каждой из 19 ячеек в гексагональной сетке уникальным целым числом от 1 до 19 таким образом, чтобы сумма по каждой оси составляла 38.
Вы можете изобразить игровое поле в следующем виде:
И загадка, по сути, является решением следующего набора из пятнадцати уравнений:
((a + b + c) == 38 && (d + e + f + g) == 38 && (h + i + j + k + l) ==
38 && (m + n + o + p) == 38 && (q + r + s) == 38 && (a + d + h) ==
38 && (b + e + i + m) == 38 && (c + f + j + n + q) ==
38 && (g + k + o + r) == 38 && (l + p + s) == 38 && (c + g + l) ==
38 && (b + f + k + p) == 38 && (a + e + j + o + s) ==
38 && (d + i + n + r) == 38 && (h + m + q) == 38)
Где каждая переменная является уникальным числом в наборе {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}
.
Существует множество возможных решений и 19!
возможных комбинаций целых чисел, поэтому наивная грубая сила будет непрактичной.
Правила:
- Нет жесткого кодирования ответа или поиска ответа в другом месте; ваш код должен найти его самостоятельно
- Скорость не имеет значения, но вы должны показать свои результаты, поэтому код, выполнение которого занимает 1000 лет, вам не поможет
- Найти все ответы
- Относитесь к ответам, которые идентичны при ротации, как к идентичным
- Вычтите 5% от общего количества байтов, если вы выводите результаты в привлекательной соте
- Побеждает несколько байтов
code-golf
game
hexagonal-grid
Майкл Стерн
источник
источник
Ответы:
Haskell
295289Еще один аналогичный ответ, использующий арифметику для получения промежуточных гексов. В отличие от других решений, я не проверяю, чтобы эти суммы были> 0, достаточно проверить, что отсортированные гексы равны диапазону [1..19]. a, c и h ограничены, так что разрешены только повернутые / отраженные решения. Решение появляется через несколько секунд, затем идет минута или около того, пока он решает, что больше нет.
Использование в ghci:
Отредактировано, чтобы побрить несколько символов. 'y 0 t' производит [1..19].
источник
x>0
чек, потому что я сортирую список, включающий в себя негативы, вместо увеличения массива? С другой стороны, я должен ограничить диапазоны (моиy a b
), чтобы заставить Haskell работать, что стоит мне несколько символов. Но обязательно должен быть другой язык со встроенной сортировкой, который побьет меня, работая так же (глядя на вас, Mathematica).Ява
(1517–75,85) = 1441,15(1429–71,45) = 1357,55(1325–66,25) = 1258,75Это было весело
Печатает все уникальные решения с зеркальным отображением и вращением, в приятной соте (следовательно, 5% снижение)
Время работы: ~ 0,122 с (122 миллисекунды) на моем 4-летнем ноутбуке.
Гольф-код ( редактирование показало, что я тупо повторял свои printfs, уменьшил их до одного printf для максимального гольфа) ( новое редактирование Сокращенные вызовы для установки функций в умные меньшие функции, некоторые другие микрооптимизации):
Наслаждайтесь!
источник
return;
утверждение.return;
оператора увеличивает длину моего кода на 7, было бы безумно добавить его, если бы верный ответ включал все 12 решений, которые являются просто повернутыми / зеркальными версиями друг друга. Хотя нельзя исключать безумия, в этом случае добавлениеreturn;
было преднамеренным и, как я описал, основывалось на полном диалоге вопросов и комментариев , который вы должны позаботиться о рассмотрении, прежде чем бросать обвинения. Благодарность!C 366 байт (
C ++ 541 450)Компилировать с
gcc -std=c99 -O3
.Печатает все уникальные решения по модулю поворота и зеркалирования, в формате
a b c d ...
, по одному на строку.Время выполнения: 0,8 секунды на моем компьютере.
источник
Matlab:
333320 символовЭто довольно тупой подход почти грубой силы, который не использует рекурсию. Он создает частичные решения
z
, которые выводятся в конце. Каждый столбец является решением; элементы перечислены z сверху вниз. Время работы 1-2 часа.Бег изнутри Matlab:
источник