Темно-черные чернила разбрызгались по всему белому листу бумаги для принтера! Очевидное решение состоит в том, чтобы сложить бумагу таким образом, чтобы черные и белые части встречались, и обе стали серыми, когда чернила диффундируют. Затем разверните и переверните, пока ваша бумага не станет одинаково серой.
Найти лучший способ сделать эти сгибы - ваша задача в этой задаче кодирования. Этот Pastebin содержит четыре сетки разного размера из единиц и нулей. Каждая сетка представляет собой кусок обрызганной чернилами бумаги, который вы должны стать серым. Нули бумажные, а чернильные.
В этих сетках допустимы только горизонтальные и вертикальные сгибы вдоль промежутков между линиями и столбцами. Когда складывается, пары перекрывающихся значений усредняются. Складки выполняются по одному и всегда разворачиваются. Сгибы изменяют только распределение чернил, а не размер бумаги.
Rn обозначает сгибание левого края сетки вправо, начиная с n-го столбца. Dn обозначает складывание верхнего края сетки вниз, начиная с n-го ряда. (n индексируется 1)
пример
Учитывая эту сетку
0 1 1 1
0 0 0 0
0 0 0 0
сгиб D1 означает «сложить весь верхний ряд, а затем развернуть».
0 0.5 0.5 0.5
0 0.5 0.5 0.5
0 0 0 0
Тогда R2 будет производить
0.25 0.5 0.5 0.25
0.25 0.5 0.5 0.25
0 0 0 0
а другой R2 ничего не изменит.
Цель
Ваша цель состоит в том, чтобы написать алгоритм, который находит наилучшую последовательность складывания чернил для каждой из четырех сеток, используя каждый раз ровно 8 сгибов . Складки могут быть любой комбинацией Rs или Ds.
счет
Оценка вашего представления - это сумма ваших оценок по каждой сетке. Оценка сетки - это сумма абсолютных разностей между каждым из ее значений и ее средним значением (сумма, деленная на площадь). Чем ниже баллы, тем лучше. Счет 0 идеален, но, вероятно, невозможен только в 8 раз.
Вы должны сообщить о четырех последовательностях сворачивания из 8 шагов с кодом в своем ответе. Это так, чтобы мы могли убедиться, что ваш алгоритм действительно работает.
Пожалуйста, поместите их в эту форму:
20*20R1D2R3D4R5D6R7D8
40*20R1D2R3D4R5D6R7D8
40*40R1D2R3D4R5D6R7D8
20*80R1D2R3D4R5D6R7D8
Вот скрипт на Python, который подсчитает ваши очки с учетом ваших последовательностей свертывания.
Естественно, вы не должны копировать чью-либо последовательность представления. Последовательности для каждой сетки принадлежат только тому, кто их создал.
Разъяснения
В идеале ваш алгоритм будет хорошо работать на любой сетке, хотя вы можете адаптировать его к этим конкретным.
Вы должны предоставить свой код с вашей последовательностью. Чтобы выиграть, вам нужен наименьший набор из 8 последовательностей сворачивания, который еще не был опубликован, а также алгоритм, который выдерживает публичную проверку. Объясните свой код, не запутывайте его.
Сетка никогда не должна содержать отрицательных чисел.
Применяются стандартные лазейки.
источник
Ответы:
питон
Исчерпывающе пробует различные комбинации сгибов для первых нескольких сгибов, затем делает остальные сгибы, используя жадный подход.
Исчерпывающий подход ограничен разумным диапазоном сгибов в центре, так что он не будет длиться вечно, не игнорируя слишком много возможных сгибов, чтобы получить хороший минимум.
Побежал, используя pypy на моем MacBook Air.
ответы:
Выходы:
Общая оценка: 7,91125 + 16,34375 + 42,13 + 32,30875 = 98,69375
Код:
источник
С 16,344 (4 минуты 33 секунды)
Лучшие ходы, найденные до сих пор: D6, D13, R19, D9, D11, R21, D10, R20
Использует смесь Монте-Карло и альпинизма. Я уверен, что можно заставить работать намного быстрее.
источник