Цель этого вопроса - создать самый короткий не слишком медленный решатель судоку. Это определяется как: не повторяться, когда на доске есть пятна, которые могут быть только одной цифрой .
Вот самое короткое, что у меня есть в Python:
r=range(81)
s=range(1,10)
def R(A):
bzt={}
for i in r:
if A[i]!=0: continue;
h={}
for j in r:
h[A[j]if(j/9==i/9 or j%9==i%9 or(j/27==i/27)and((j%9/3)==(i%9/3)))else 0]=1
bzt[9-len(h)]=h,i
for l,(h,i)in sorted(bzt.items(),key=lambda x:x[0]):
for j in s:
if j not in h:
A[i]=j
if R(A):return 1
A[i]=0;return 0
print A;return 1
R(map(int, "080007095010020000309581000500000300400000006006000007000762409000050020820400060"))
Последняя строка, которую я беру, чтобы быть частью ввода строки cmd, она может быть изменена на:
import sys; R(map(int, sys.argv[1]);
Это похоже на другие задачи по судоку на гольф, за исключением того, что я хочу устранить ненужную рекурсию. Любой язык приемлем. Задача включена!