Mathicala 186 (tham lam) và 224 (tất cả các kết hợp)
Giải pháp tham lam
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]
Điều này tắt từng cái đèn thừa. Nếu độ che phủ của ánh sáng không bị giảm khi ánh sáng tắt, ánh sáng đó có thể bị loại bỏ. Cách tiếp cận tham lam rất nhanh và có thể dễ dàng xử lý các ma trận 15x15 và lớn hơn nhiều (xem bên dưới). Nó trả về một giải pháp duy nhất, nhưng không biết liệu điều đó có tối ưu hay không. Cả hai cách tiếp cận, trong các phiên bản golf, trả lại số lượng đèn không sử dụng. Phương pháp tiếp cận không chơi gôn cũng hiển thị các lưới, như dưới đây.
Trước:

Sau:

Giải pháp tối ưu bằng cách sử dụng tất cả các kết hợp đèn (224 ký tự)
Cảm ơn @ Clément.
Phiên bản Ungolfed sử dụng tất cả các kết hợp đèn
f Hàm biến đổi hình thái được sử dụng trong sameCoverageQxử lý như lit (value = 1 thay vì 0) hình vuông 3 x3 trong đó mỗi ánh sáng cư trú. Khi một ánh sáng ở gần rìa trang trại, chỉ có các hình vuông (nhỏ hơn 9) trong các viền của trang trại được tính. Không có quá nhiều; một hình vuông được thắp sáng bởi nhiều hơn một đèn chỉ đơn giản là được thắp sáng. Chương trình tắt từng đèn và kiểm tra xem liệu độ che phủ tổng thể trong trang trại có bị giảm hay không. Nếu không, ánh sáng đó sẽ bị loại bỏ.
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]đếm số lượng tế bào được gắn cờ. Nó được sử dụng để đếm đèn và cũng để đếm các ô sáng
sameCoverageQ[mat1, mat2] kiểm tra xem các ô sáng trong mat1 có bằng số lượng ô được chiếu sáng trong mat2 hay không. Dạng biến đổi [[mat] có ma trận ánh sáng và trả về ma trận của các ô mà chúng sáng lên.
c[m1]lấy tất cả các kết hợp ánh sáng từ m1 và kiểm tra độ che phủ của chúng. Trong số những người có phạm vi bảo hiểm tối đa, nó chọn những người có ít bóng đèn nhất. Mỗi trong số này là một giải pháp tối ưu.
Ví dụ 1:
Thiết lập 6x6
(*all the lights *)
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0}
h[m]

Tất cả các giải pháp tối ưu.
(*subsets of lights that provide full coverage *)
h/@(ReplacePart[Array[0&,Dimensions[m]],#/.{{j_Integer,k_}:> {j,k}-> 1}]&/@(c[m]))

Phiên bản chơi golf sử dụng tất cả các kết hợp của đèn.
Phiên bản này tính toán số lượng đèn không sử dụng. Nó không hiển thị các lưới.
c trả về số lượng đèn không sử dụng.
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]đếm số lượng tế bào được gắn cờ. Nó được sử dụng để đếm đèn và cũng để đếm các ô sáng
s[mat1, mat2] kiểm tra xem các ô sáng trong mat1 có bằng số lượng ô sáng trong mat2.t [[mat] có ma trận ánh sáng không và trả về ma trận `của các ô mà chúng sáng lên.
c[j]lấy tất cả các kết hợp ánh sáng từ j và kiểm tra chúng cho phạm vi bảo hiểm. Trong số những người có phạm vi bảo hiểm tối đa, nó chọn những người có ít bóng đèn nhất. Mỗi trong số này là một giải pháp tối ưu.
Ví dụ 2
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0};
m//Grid

Hai đèn có thể được lưu trong khi có phạm vi bao phủ ánh sáng giống nhau. c [m]
2