Mathematica 186 (жадібний) та 224 (усі комбінації)
Жадібне рішення
t=MorphologicalTransform;n@w_:=Flatten@w~Count~1
p_~w~q_:=n[p~t~Max]==n[q~t~Max]
g@m_:=Module[{l=m~Position~1,r,d=m},While[l!={},If[w[m,r=ReplacePart[d,#-> 0]&
[l[[1]]]],d=r];l=Rest@l];n@m-n@d]
Це вимикає зайві вогні по черзі. Якщо освітленість не зменшиться, коли світло згасне, це світло може бути ліквідовано. Жадібний підхід дуже швидкий і може легко обробляти матриці розміром 15x15 і набагато більше (див. Нижче). Він повертає єдине рішення, але невідомо, оптимально це чи ні. Обидва підходи, у версіях для гольфу, повертають кількість невикористаних вогнів. Підходи без волейболу також відображають сітки, як показано нижче.
Перед:

Після:

Оптимальні рішення з використанням усіх комбінацій світла (224 символів)
З вдячністю @ Clément.
Безгольова версія з використанням усіх комбінацій вогнів
fМорфологічна функція перетворення, що використовується в обробці як запалене sameCoverageQ(значення = 1 замість нуля), 3 х3 квадрат, в якому проживає кожне світло. Коли світло знаходиться біля краю ферми, тільки кордони (менше 9) у межах господарство рахується. Перенарахування немає; квадратний індикатор, освітлений декількома лампами, просто горить. Програма вимикає кожне світло і перевіряє, чи зменшується загальне освітлення на фермі. Якщо це не так, це світло усувається.
nOnes[w_]:=Count[Flatten@w,1]
sameCoverageQ[m1_,m2_]:=nOnes[MorphologicalTransform[m1,Max]]==
nOnes[MorphologicalTransform[m2,Max]]
(*draws a grid with light bulbs *)
h[m_]:=Grid[m/.{1-> Style[\[LightBulb],24],0-> ""},Frame-> All,ItemSize->{1,1.5}]
c[m1_]:=GatherBy[Cases[{nOnes[MorphologicalTransform[ReplacePart[Array[0&,Dimensions[m1]],
#/.{{j_Integer,k_}:> {j,k}-> 1}],Max]],#,Length@#}&/@(Rest@Subsets[Position[m1,1]]),
{nOnes[MorphologicalTransform[m1,Max]],_,_}],Last][[1,All,2]]
nOnes[matrix]підраховує кількість позначених комірок. Він використовується для підрахунку вогнів, а також для підрахунку освітлених комірок
sameCoverageQ[mat1, mat2] перевіряє, чи освітлені клітини в mat1 дорівнює кількості освітлених комірок в mat2.MorphologicalTransform [[mat] приймає матрицю вогнів і повертає матрицю` клітин, які вони загоряються.
c[m1]бере всі комбінації вогнів з m1 і випробовує їх на охоплення. Серед тих, хто має максимальне покриття, він вибирає ті, у яких є найменші лампочки. Кожне з них - оптимальне рішення.
Приклад 1:
Налаштування 6x6
(*all the lights *)
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0}
h[m]

Всі оптимальні рішення.
(*subsets of lights that provide full coverage *)
h/@(ReplacePart[Array[0&,Dimensions[m]],#/.{{j_Integer,k_}:> {j,k}-> 1}]&/@(c[m]))

Гольф-версія з використанням усіх комбінацій вогнів.
Ця версія розраховує кількість невикористаних вогнів. Він не відображає сітки.
c повертає кількість невикористаних вогнів.
n@w_:=Flatten@w~Count~1;t=MorphologicalTransform;
c@r_:=n@m-GatherBy[Cases[{n@t[ReplacePart[Array[0 &,Dimensions[r]],#
/.{{j_Integer,k_}:> {j,k}-> 1}],Max],#,Length@#}&/@(Rest@Subsets[r~Position~1]),
{n[r~t~Max],_,_}],Last][[1,1,3]]
n[matrix]підраховує кількість позначених комірок. Він використовується для підрахунку вогнів, а також для підрахунку освітлених комірок
s[mat1, mat2] перевіряє, чи освітлені клітини в mat1 дорівнює кількості освітлених комірок в mat2.t [[mat] приймає матрицю вогнів і повертає матрицю` клітин, які вони загоряються.
c[j]бере всі комбінації вогнів з j і перевіряє їх на охоплення. Серед тих, хто має максимальне покриття, він вибирає ті, у яких є найменші лампочки. Кожне з них - оптимальне рішення.
Приклад 2
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0};
m//Grid

Два світла можна зберегти, маючи однакове освітлення. см]
2