문제

포인트의 이 질문을 만드는 최단 지 않을 함부로 느린 스도쿠 해결사입니다.이는 다음과 같이 정의된다: 지 않 recurse 가 있을 때에 보드는 가능하게 한 자리 숫자.

여기에는 짧은 내가 지금까지 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]);

이것은 비슷한 다른 스도쿠 골프 도전을 제외하고,원하는 불필요한 재귀.어떤 언어를 허용됩니다.도전입니다!

도움이 되었습니까?

해결책

난 정말 많은 변화 알고리즘이 동일한지만,여기에 몇 가지 추가 마이크로 최적화할 수 있는 파이썬 코드입니다.

  • 없음에 대한 필요!=0,0 은 거짓에서는 부울 context.

  • 는 경우 다른 c b 보다 더 비싼 사용하여[a,b][c]가 필요하지 않은 경우 짧은 단락,따라서 사용할 수 있는 h[ [0,A[j]][j/9.. rest of boolean condition].더 나은 사실을 이용할 것에 0false 경우,그리고 곱하여 부울 값(로 처리하거나 0*A[j] (ie.0)또는 1*A[j] (ie. A[j]).

  • 를 생략할 수 있는 공간 사이에 자리하고 식별자가 있습니다.예를 들어"9 or" -> "9or"

  • 생략할 수 있습니다 키를 정렬().당신 분류에 첫 번째 요소,정상적인 종류를 생산 효율적으로 동일한(하지 않는 한 당신은에 의존하고 안정하는 보이지 않는 다음과 같)

  • 저장할 수 있습니다 몇 바이트를 생략하여.항목()호출하고 그 지정에서,내가 다음 줄에서 z[l]

  • 당신은 s 를 사용하면 아무에서 사용하는 변수입니다.할 수도 있습니다 사용하지 않는 범위()선택하여 적절한 슬라이스의 r 대신(r[1:10])

  • j not in h 이 될 수 있는 (j in h)-1 (에 의존하 True==1 에 정수 컨텍스트)

  • [편집] 대체할 수도 있습에 대한 첫 번째는 루프의 건축 h dict 생성자와 발전기를 표현합니다.이할 수 있습 압축 논리에 한 줄을 절약,10 바이트다.

더 일반적으로,당신은 아마에 대해 생각하고 싶을 변경하는 방법에는 알고리즘의 수준을 줄이기 위해 중첩이 있습니다.모든 수준의 제한 추가바이트 당선 내에 라이브러리는 모두 지원되며,축적.

여기에 나는 지금까지(나 1 는 공간을 들여쓰기를 얻을 수 있도록 정확한 사진을의 필수 문자입니다.그것은 현재에서의 무게 288 278 는 여전히 아주 큽니다.

r=range(81)
def R(A):
 z={} 
 for i in r:
  if 0==A[i]:h=dict((A[j]*(j/9==i/9or j%9==i%9or j/27==i/27and j%9/3==i%9/3),1)for j in r);z[9-len(h)]=h,i
 for l in sorted(z):
  h,i=z[l]
  for j in r[1:10]:
   if(j in h)-1:
    A[i]=j
    if R(A):return A
  A[i]=0;return[]
 return A

다른 팁

r=range(81)
def R(A):
 if(0in A)-1:yield A;return
 def H(i):h=set(A[j]for j in r if j/9==i/9or j%9==i%9or j/27==i/27and j%9/3==i%9/3);return len(h),h,i
 l,h,i=max(H(i)for i in r if not A[i])
 for j in r[1:10]:
  if(j in h)-1:
   A[i]=j
   for S in R(A):yield S
  A[i]=0

269 문자,그리고 그것을 발견한 모든 솔루션입니다.사용량(에 포함되지 않습 char count):

sixsol = map(int, "300000080001093000040780003093800012000040000520006790600021040000530900030000051")
for S in R(sixsol):
    print S

방금 파이썬을 조금 트리밍했습니다.

r=range(81);s=range(1,10)
def R(A):
    z={}
    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
        z[9-len(h)]=h,i
    for l,(h,i)in sorted(z.items(),cmp,lambda x:x[0]):
        for j in s:
            if j not in h:
                A[i]=j
                if R(A):return A
        A[i]=0;return[]
    return A

print R(map(int, "080007095010020000309581000500000300400000006006000007000762409000050020820400060"))

이것은 410 자, 공백을 계산하지 않으면 250 자입니다. 당신이 그것을 perl로 바꾸면 의심 할 여지없이 내 것보다 나을 것입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top