Java (1517-75.85)= 1441.15 (1429-71.45)= 1357.55(1325-66.25)= 1258.75
これは楽しかったです。
ミラーリングと回転に関するすべてのユニークなソリューションを快適なハニカムで印刷します(したがって5%削減)
ランタイム:4歳のラップトップで〜0.122秒(122ミリ秒)。
ゴルフされたコード(編集は愚かにも自分のprintfを繰り返し、ゴルフを最大化するために1つのprintfに減らしました)(新しい編集 Set関数への呼び出しを賢い小さな関数に減らし、いくつかの他のマイクロ最適化):
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のソリューションがありますが、ローテーションとミラーリングの両方を割引にすると、これはたった1つのユニークなソリューションになります。このソリューションにどのように取り組んでいるかについてのより明確な見解については、GitHubでゴルフの少ないコードをチェックしてください。
楽しい!