Java 8+ , 1044 bayt, dizi A008008 (Güvenli)
class c{long[]u={1,4,11,21,35,52,74,102,136,172,212,257,306,354,400,445,488,529,563,587,595,592,584,575,558,530,482,421,354,292,232,164,85,0,-85,-164,-232,-292,-354,-421,-482,-530,-558,-575,-584,-592,-595,-587,-563,-529,-488,-445,-400,-354,-306,-257,-212,-172,-136,-102,-74,-52,-35,-21,-11,-4,-1},v={0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,-1,0,0,0,0,0,0,0,-1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,-1,0,0,0,0,0,0,0,-1,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,1},w={1,0,0,-1,5};long d=1,e=1;void f(long a,long b){long[]U=u,V=v,W,X;while(a-->0){U=g(U);w=h(v,w);}W=h(v,U);while(b-->0){V=g(V);v=h(v,v);}X=h(V,u);if(w[0]!=v[0]){int i,j,k=0;u=new long[i=(i=W.length)>(j=X.length)?i:j];for(;k<i;k++)u[k]=(k<i?W[k]:0)-(k<j?X[k]:0);d*=e++;}}long[]g(long[]y){int s=y.length,i=1;long[]Y=new long[s-1];for(;i<s;){Y[i-1]=y[i]*i++;}return Y;}long[]h(long[]x,long[]y){int q=x.length,r=y.length,i=0,j;long[]z=new long[q+r-1];for(;i<q;i++)if(x[i]!=0)for(j=0;j<r;)z[i+j]+=x[i]*y[j++];return z;}c(){f(3,0);System.out.println(u[0]/d);}public static void main(String[]args){new c();}}
Çevrimiçi deneyin!
Boyutu 12 gizli bir dize kullanılarak çözülebilir . Kesinlikle daha fazla golf oynayabilir, ancak bunun kazanmasının bir yolu yok. Sadece 8008 numaraya olan saygımdan katkıda bulunmak istedim.
Not: Herhangi biri dizinin kodlanmış olduğundan şikayet etmeden önce, bunu kodlamadan ayrılan ilk terime kadar test ettim (13. terim = 307) ve yavaş yavaş da olsa doğru bir şekilde alır. Bu yüzden bunun long
yerine kullanılmasının nedeni de budur int
, aksi halde bu terimden önce taşar.
Güncelleme (Temmuz 12 2019) : biraz daha fazla performans gösterecek şekilde güncellendi. Bilgisayarımdaki 13. terimi 30 saniye içinde şimdi 5 dakika yerine hesaplıyor.
Güncelleme (17 Temmuz 2019) : g
işlevin döngü sınırları için sabit hatalar ve işlevin altındaki dizi uzunluğu sınırları f
. Bu hatalar nihayetinde sorunlara neden olmuş olmalı, ancak sadece çıktıyı kontrol ederek yakalanacak kadar erken olmamalıdır. Her iki durumda da, bu hataların oyunda 5 gün olması bazı insanları bu bulmacayı çözememek için yeterince şaşırttığı için, bu başvuru için 24 Temmuz'a kadar "güvenli" son süreyi uzatma konusunda gayet iyiyim.
Güncelleme (18 Temmuz 2019) : Bazı testlerden sonra, taşmaların dizideki 4. terimden sonra başladığını ve 19. terimden sonra çıktının geçerliliğini etkilemeye başladığını onayladım. Ayrıca burada yazıldığı gibi programda, her ardışık terim hesaplamak için öncekinden kabaca 5 kat daha fazla zaman alır. 15. dönem bilgisayarımda yaklaşık 14 dakika sürüyor. Bu yüzden aslında 19'uncu terimi programın yazıldığı gibi kullanmak 6 günden fazla sürecek.
Ayrıca, mantıksal boşluk / girintili kod buradadır, bu nedenle insanların ellerinde otomatik formatlama olan bir IDE bulunmaması durumunda okunması biraz daha kolaydır.
class c {
long[] u = {1, 4, 11, 21, 35, 52, 74, 102, 136, 172, 212, 257, 306, 354, 400, 445, 488, 529, 563, 587, 595, 592, 584,
575, 558, 530, 482, 421, 354, 292, 232, 164, 85, 0, -85, -164, -232, -292, -354, -421, -482, -530, -558, -575,
-584, -592, -595, -587, -563, -529, -488, -445, -400, -354, -306, -257, -212, -172, -136, -102, -74, -52, -35,
-21, -11, -4, -1},
v = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
w = {1, 0, 0, -1, 5};
long d = 1, e = 1;
void f(long a, long b) {
long[] U = u, V = v, W, X;
while (a-- > 0) {
U = g(U);
w = h(v, w);
}
W = h(v, U);
while (b-- > 0) {
V = g(V);
v = h(v, v);
}
X = h(V, u);
if (w[0] != v[0]) {
int i, j, k = 0;
u = new long[i = (i = W.length) > (j = X.length) ? i : j];
for (; k < i; k++)
u[k] = (k < i ? W[k] : 0) - (k < j ? X[k] : 0);
d *= e++;
}
}
long[] g(long[] y) {
int s = y.length, i = 1;
long[] Y = new long[s - 1];
for (; i < s;) {
Y[i - 1] = y[i] * i++;
}
return Y;
}
long[] h(long[] x, long[] y) {
int q = x.length, r = y.length, i = 0, j;
long[] z = new long[q + r - 1];
for (; i < q; i++)
if (x[i] != 0)
for (j = 0; j < r;)
z[i + j] += x[i] * y[j++];
return z;
}
c() {
f(3, 0);
System.out.println(u[0] / d);
}
public static void main(String[] args) {
new c();
}
}
Çözüm
f(1,v[0]=1);
System.out.println
Program hemen önce, n . Taylor genişleme katsayısını 0'da hesaplayarak çalışır. Orijinal işlevin, burada temsil edilen u
ve v
buradan aldığım polinomların bir bölümü olduğu durumlarda, bağlantılı belgede payda ile çarpılmayanlar hariç, hiçbir yerde Taylor serisini hesaplamanız gerektiğini söylemiyorlar, bunun üzerine tesadüfen rastlamıştım ve sonra başka bir kaynaktan onayladım.
Hesaplama, türevlere ilişkin bölüm kuralının tekrar tekrar uygulanmasıyla yapılır.
Yanlış ilk terim, dizinin tamamı ve herhangi bir argüman içeren işlev gibi birkaç şey insanlarla uğraşmak için fırlatılır.
v
w
f