Фермер Джек очень беден. Он хочет зажечь всю свою ферму, но с минимальными затратами. Лампа может освещать как свою ячейку, так и восемь соседей. Он установил лампы в своей области, но ему нужна ваша помощь, чтобы выяснить, сохранил ли он какие-либо дополнительные лампы.
Дополнительные лампы: лампы, которые при снятии с фермы не влияют на количество освещенных ячеек. Кроме того, лампы, которые вы укажете, не будут удалены одна за другой, но они будут удалены одновременно.
Примечание. Единственное действие, которое вы можете выполнить, это удалить некоторые лампы. Вы не можете ни переставлять, ни вставлять лампы. Ваша конечная цель состоит в том, чтобы удалить максимальное количество ламп, чтобы каждая ячейка, которая была освещена ранее, все еще горит.
Помогите Фармеру Джеку определить максимальное количество бесполезных ламп, чтобы он мог использовать их в других местах.
вход
В первой строке вам будут даны размеры поля M и N. Далее M строк, содержащих по N символов, каждый из которых представляет поле.
«1» обозначает ячейку, в которой хранится лампа.
«0» представляет пустую ячейку.
Вывод
Вы должны вывести целое число, содержащее количество бесполезных ламп.
Пример ввода:
3 3
100
010
001
Пример вывода:
2
Победитель:
Поскольку это код гольф, победителем станет тот, кто успешно выполнит задание в наименьшем количестве символов.
Ответы:
Mathematica 186 (жадный) и 224 (все комбинации)
Жадное решение
Это выключает лишние огни один за другим. Если при выключенном свете освещение не уменьшается, этот свет можно устранить. Жадный подход очень быстр и может легко обрабатывать матрицы 15х15 и намного больше (см. Ниже). Он возвращает единичные решения, но неизвестно, является ли это оптимальным или нет. Оба подхода в версиях для гольфа возвращают количество неиспользованных огней. Подходы без игры в гольф также отображают сетки, как показано ниже.
Перед:
После:
Оптимальные решения с использованием всех комбинаций источников света (224 символа)
С благодарностью @ Clément.
Ungolfed версия с использованием всех комбинаций огней
fФорма морфологического преобразования, используемая в,
sameCoverageQ
рассматривает как освещенный (значение = 1 вместо нуля) квадрат 3 x3, в котором находится каждый источник света. Когда источник света находится вблизи края фермы, только квадраты (меньше 9) в пределах границ ферма подсчитана. Перебега нет; Квадрат, освещенный несколькими лампами, просто горит. Программа выключает каждую лампу и проверяет, не уменьшается ли общее освещение на ферме. Если это не так, этот свет исчезает.nOnes[matrix]
считает количество помеченных ячеек Он используется для подсчета света, а также для подсчета освещенных клеток.sameCoverageQ[mat1, mat2]
проверяет, равно ли количество подсвеченных ячеек в mat1 числу подсвеченных ячеек в mat2.MorphologicalTransform [[mat] принимает матрицу источников света и возвращает матрицу ячеек, которые они освещают.c[m1]
берет все комбинации источников света от m1 и проверяет их на предмет покрытия. Среди тех, которые имеют максимальный охват, он выбирает те, которые имеют наименьшее количество лампочек. Каждый из них является оптимальным решением.Пример 1:
Настройка 6x6
Все оптимальные решения.
Гольф версия с использованием всех комбинаций огней.
Эта версия рассчитывает количество неиспользованных источников света. Он не отображает сетки.
c
возвращает количество неиспользованных источников света.n[matrix]
считает количество помеченных ячеек Он используется для подсчета света, а также для подсчета освещенных клеток.s[mat1, mat2]
проверяет, равно ли количество подсвеченных ячеек в mat1 числу подсвеченных ячеек в mat2.t [[mat] берет матрицу источников света и возвращает матрицу ячеек, которые они освещают.c[j]
берет все комбинации источников света из j и проверяет их на предмет покрытия. Среди тех, которые имеют максимальный охват, он выбирает те, которые имеют наименьшее количество лампочек. Каждый из них является оптимальным решением.Пример 2
Два источника света можно сохранить при одинаковом освещении. см]
источник
Питон, 309 символов
Работает с использованием битовых масок.
L
представляет собой список источников света, где каждый источник света представлен целым числом с (до) 9 битами, установленными для его шаблона освещения. Затем мы исчерпывающе ищем подмножества этого списка, побитовые или совпадающие с побитовыми или всего списка. Самое короткое подмножество - победитель.m
это маска, которая предотвращает закручивание бит при смещении.источник
Java 6 - 509 байт
Я сделал некоторые предположения о пределах и решил проблему, как заявлено в это время.
Запустите так:
java F <inputfile 2>/dev/null
источник
java F <inputfile 2>nul
, если это не сработает, тогдаjava F <inputfile
и игнорируйте исключение. Кроме того, он не будет работать с Java 7.с ++ - 477 байт
источник
Руби, 303
[это было закодировано, чтобы ответить на предыдущую версию вопроса; прочитайте примечание ниже]
Преобразование в массивы логических значений, а затем сравнение окрестностей на предмет изменений.
Ограничение (?): Максимальный размер поля фермы составляет 1000 x 1000. Проблема гласит: «Фермер Джек очень беден», поэтому я предполагаю, что его ферма не больше. ;-) Ограничение можно снять, добавив 2 символа.
ПРИМЕЧАНИЕ. Поскольку я начал кодировать это, похоже, требования к вопросу изменились. Было добавлено следующее уточнение: «Лампы, на которые вы укажете, не будут удаляться одна за другой, но будут удалены одновременно» . Неоднозначность исходного вопроса позволила мне сохранить код, протестировав отдельные извлечения ламп. Таким образом, мое решение не будет работать для многих тестовых случаев в соответствии с новыми требованиями. Если у меня будет время, я исправлю это. Я могу не. Пожалуйста, не голосуйте за этот ответ, так как другие ответы здесь могут быть полностью совместимы.
источник
APL, 97 символов / байт *
Предполагается
⎕IO←1
и⎕ML←3
APL среды.Безголовая версия:
Я согласен, что больше тестов будет лучше. Вот случайный:
Входные данные:
Выход (бесполезные лампы):
Схема с минимальными лампами (не входит в версию для гольфа):
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL может быть записан в своей собственной (устаревшей) однобайтовой кодировке, которая отображает символы APL в верхние 128-байтовые значения. Следовательно, для целей оценки программа из N символов, в которой используются только символы ASCII и символы APL, может рассматриваться как длина N байтов.
источник
C ++ 5,806 байт
Это еще не оптимизировано для размера. Но так как участников немного, я оставлю это пока.
Заголовок FarmersField:
FarmersField CPP:
И набор тестов, чтобы показать, что код делает то, для чего он был создан:
источник
Perl 3420 байт
Не решение для гольфа, но я нашел эту проблему интересной:
(Ввод / вывод был удален, чтобы я мог показать конкретные тесты)
источник
Python - 305 байт
источник