Java 8+ , 1044 bajty, sekwencja A008008 (Bezpieczny)
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();}}
Wypróbuj online!
Można rozwiązać za pomocą ukrytego ciągu o rozmiarze 12 . Zdecydowanie można grać w golfa więcej, ale nie ma szans, żeby to faktycznie wygrało. Chciałem tylko przyczynić się do szacunku dla liczby 8008.
Uwaga: zanim ktokolwiek narzeka, że sekwencja jest zakodowana na stałe, przetestowałem to do pierwszego składnika, który odbiega od zakodowanego na stałe (13. termin = 307) i robi się to poprawnie, choć powoli. Dlatego też używa longzamiast tego int, inaczej przepełni się przed tym terminem.
Aktualizacja (12 lipca 2019 r.) : Zaktualizowana, aby była nieco bardziej wydajna. Oblicza teraz 13. termin w ciągu 30 sekund na moim komputerze zamiast 5 minut.
Aktualizacja (17 lipca 2019 r.) : Naprawiono błędy w obwiedniach pętli dla gfunkcji i obwiedniach długości tablicy na dole ffunkcji. Te błędy powinny ostatecznie spowodować problemy, ale nie na tyle wcześnie, aby zostać złapanym przez sprawdzenie wyniku. W obu przypadkach, ponieważ obecność tych błędów przez 5 dni w grze mogła wprowadzić w błąd niektórych ludzi na tyle, że nie byli w stanie rozwiązać tej zagadki, nie mam nic przeciwko przedłużeniu „bezpiecznego” terminu do 24 lipca na przesłanie tego zgłoszenia.
Aktualizacja (18 lipca 2019 r.) : Po kilku testach potwierdziłem, że przepełnienia zaczynają się po 4 semestrze w sekwencji i zaczynają wpływać na ważność danych wyjściowych po 19 semestrze. Również w programie, jak tu jest napisane, każdy kolejny termin zajmuje około 5 razy dłużej niż poprzedni. 15. kadencja trwa około 14 minut na moim komputerze. Tak więc obliczenie 19. semestru przy użyciu programu w formie napisanej zajęłoby 6 dni.
Ponadto, oto kod z rozsądnymi odstępami / wcięciami, więc jest trochę łatwiej czytać, jeśli ludzie nie mają pod ręką IDE z automatycznym formatowaniem.
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();
}
}
Rozwiązanie
f(1,v[0]=1);tuż przed System.out.println
programem Program oblicza n-ty współczynnik ekspansji Taylora na 0. Tam, gdzie pierwotna funkcja jest ilorazem wielomianów, reprezentowanych przez ui vktóre otrzymałem stąd , z tym wyjątkiem, że w połączonym dokumencie mianownik nie jest mnożony, i nigdzie nie mówią, że musisz obliczyć serię Taylora, natknąłem się na to przez przypadek, a następnie potwierdziłem z innego źródła.
Obliczenia dokonuje się poprzez wielokrotne stosowanie reguły ilorazu dla instrumentów pochodnych.
Niepoprawny pierwszy termin v, cała tablica wi kilka innych rzeczy, takich jak funkcja fmająca jakiekolwiek argumenty, są wprowadzane, aby zadzierać z ludźmi.