Mathematica 186 (chciwy) i 224 (wszystkie kombinacje)
Chciwe rozwiązanie
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]
To wyłącza zbędne światła jeden po drugim. Jeśli zasięg światła nie zmniejsza się, gdy światło gaśnie, światło to można wyeliminować. Chciwe podejście jest bardzo szybkie i może z łatwością obsługiwać matryce 15 x 15 i znacznie większe (patrz poniżej). Zwraca pojedyncze rozwiązania, ale nie wiadomo, czy jest to optymalne, czy nie. Oba podejścia, w wersjach golfowych, zwracają liczbę nieużywanych świateł. Podejścia bez golfa również wyświetlają siatki, jak poniżej.
Przed:

Po:

Optymalne rozwiązania wykorzystujące wszystkie kombinacje świateł (224 znaki)
Dzięki dzięki @ Clément.
Wersja bez golfa wykorzystująca wszystkie kombinacje świateł
f Funkcja transformacji morfologicznej stosowana w sameCoverageQtraktowanych jako oświetlonych (wartość = 1 zamiast zera) kwadracie 3 x 3, w którym znajduje się każde światło. Kiedy światło znajduje się w pobliżu krawędzi farmy, tylko kwadraty (mniej niż 9) w granicach farma jest liczona. Nie ma liczenia; kwadrat oświetlony przez więcej niż jedną lampę jest po prostu zapalony. Program wyłącza każde światło i sprawdza, czy całkowite pokrycie oświetlenia w gospodarstwie jest zmniejszone. Jeśli tak nie jest, światło to jest eliminowane.
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]zlicza liczbę oznaczonych komórek. Służy do zliczania świateł, a także do zliczania zapalonych komórek
sameCoverageQ[mat1, mat2] sprawdza, czy zapalone komórki w macie1 są równe liczbie zapalonych komórek w macie2.MorphologicalTransform [[mat] pobiera macierz świateł i zwraca macierz` komórek, które zapalają.
c[m1]pobiera wszystkie kombinacje świateł z m1 i testuje je pod kątem zasięgu. Spośród tych, które mają maksymalny zasięg, wybiera te, które mają najmniej żarówek. Każdy z nich jest optymalnym rozwiązaniem.
Przykład 1:
Konfiguracja 6x6
(*all the lights *)
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0}
h[m]

Wszystkie optymalne rozwiązania.
(*subsets of lights that provide full coverage *)
h/@(ReplacePart[Array[0&,Dimensions[m]],#/.{{j_Integer,k_}:> {j,k}-> 1}]&/@(c[m]))

Wersja golfowa wykorzystująca wszystkie kombinacje świateł.
Ta wersja oblicza liczbę nieużywanych świateł. Nie wyświetla siatek.
c zwraca liczbę nieużywanych świateł.
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]zlicza liczbę oznaczonych komórek. Służy do zliczania świateł, a także do zliczania zapalonych komórek
s[mat1, mat2] sprawdza, czy zapalone komórki w macie1 są równe liczbie zapalonych komórek w macie2.t [[mat] pobiera macierz świateł i zwraca macierz` komórek, które zapalają.
c[j]pobiera wszystkie kombinacje świateł z j i testuje je pod kątem zasięgu. Spośród tych, które mają maksymalny zasięg, wybiera te, które mają najmniej żarówek. Każdy z nich jest optymalnym rozwiązaniem.
Przykład 2
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0};
m//Grid

Dwa światła można zapisać, zachowując taki sam zasięg oświetlenia. cm]
2)