자바 (1517-75.85) = 1441.15 ( 1429-71.45) = 1357.55 (1325-66.25 ) = 1258.75
재미있었습니다.
쾌적한 벌집 모양으로 모든 독특한 솔루션을 미러링 및 회전 인쇄 (따라서 5 % 감소)
런타임 : 4 년 된 랩톱에서 ~ 0.122 초 (122 밀리 초)
Golfed 코드 ( 편집 , 내가 바보 내 printfs을 반복 깨달았다 최대 골프에 대해 하나의 printf로 감소) ( 새 편집 영리한 작은 기능, 다른 마이크로 최적화로 설정 함수를 호출 감소)
import java.util.*;class A{boolean c(Set<Integer>u,int z){return!u.contains(z);}Set<Integer>b(Set<Integer>c,int...v){Set<Integer>q=new HashSet<Integer>(c);for(int x:v)q.add(x);return q;}void w(){Set<Integer>U,t,u,v,w,y,z;int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,X,Z;X=20;Z=38;for(a=1;a<X;a++)for(b=1;b<X;b++)if(b!=a)for(c=1;c<X;c++)if(c!=a&&c!=b&&a+b+c==Z){U=b(new HashSet<Integer>(),a,b,c);for(d=1;d<X;d++)if(c(U,d))for(h=1;h<X;h++)if(h!=d&&c(U,h)&&a+d+h==Z){t=b(U,a,b,c,d,h);for(m=1;m<X;m++)if(c(t,m))for(q=1;q<X;q++)if(q!=m&&c(t,q)&&h+m+q==Z){u=b(t,m,q);for(r=1;r<X;r++)if(c(u,r))for(s=1;s<X;s++)if(s!=r&&c(u,s)&&q+r+s==Z){v=b(u,r,s);for(p=1;p<X;p++)if(c(v,p))for(l=1;l<X;l++)if(l!=p&&c(v,l)&&s+p+l==Z){w=b(v,p,l);for(g=1;g<X;g++)if(c(w,g)&&l+g+c==Z)for(e=1;e<X;e++)if(e!=g&&c(w,e))for(f=1;f<X;f++)if(f!=e&&f!=g&&c(w,f)&&d+e+f+g==Z){y=b(w,g,e,f);for(i=1;i<X;i++)if(c(y,i))for(n=1;n<X;n++)if(n!=i&&c(y,n)&&d+i+n+r==Z&&b+e+i+m==Z){z=b(y,i,n);for(o=1;o<X;o++)if(c(z,o))for(k=1;k<X;k++)if(k!=o&&c(z,k)&&m+n+o+p==Z&&r+o+k+g==Z&&b+f+k+p==Z)for(j=1;j<X;j++)if(c(z,j)&&j!=o&&j!=k&&a+e+j+o+s==Z&&c+f+j+n+q==Z&&h+i+j+k+l==Z){System.out.printf("%6d%4d%4d\n\n%4d%4d%4d%4d\n\n%2d%4d%4d%4d%4d\n\n%4d%4d%4d%4d\n\n%6d%4d%4d\n\n",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);return;}}}}}}}}}public static void main(String[]a){(new A()).w();}}
무차별 대입은지나 갔지만 아주 작은 솔루션 집합 만 존재한다는 사실을 현명하게 사용하면 반복 기반의 대답으로 이어졌습니다. 반복의 각 루프 내에서 아직 "할당되지 않은"정수만 고려합니다. Java의 HashSet을 사용하여 이전에 사용한 숫자에 대한 O (1) 조회를 얻습니다. 마지막으로 정확히 12 개의 솔루션이 있지만 회전과 미러링을 모두 할인하면 하나의 고유 한 솔루션으로 축소되므로 첫 번째 솔루션이 발견되면 인쇄하여 종료합니다. 이 솔루션에 어떻게 접근하고 있는지 좀 더 명확하게 보려면 github에서 덜 골프 한 코드를 확인하십시오 .
즐겨!