Java 8+ , 1044 byte, chuỗi A008008 (An toàn)
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();}}
Hãy thử trực tuyến!
Có thể được giải quyết bằng cách sử dụng một chuỗi ẩn có kích thước 12 . Chắc chắn có thể được chơi golf nhiều hơn, nhưng không có cách nào đây thực sự là chiến thắng. Tôi chỉ muốn đóng góp vì tôn trọng con số 8008.
Lưu ý: trước khi bất kỳ ai phàn nàn rằng chuỗi được mã hóa cứng, tôi đã thử nghiệm thuật ngữ này cho đến thuật ngữ đầu tiên tách khỏi mã hóa cứng (thuật ngữ thứ 13 = 307) và nó được đưa ra một cách chính xác mặc dù chậm. Đây cũng là lý do tại sao nó sử dụng long
thay vì int
, nếu không nó sẽ tràn ra trước thời hạn đó.
Cập nhật (ngày 12 tháng 7 năm 2019) : được cập nhật để có hiệu suất cao hơn một chút. Tính toán học kỳ thứ 13 trong 30 giây trên máy tính của tôi bây giờ thay vì 5 phút.
Cập nhật (ngày 17 tháng 7 năm 2019) : đã sửa các lỗi trong giới hạn vòng lặp cho g
hàm và giới hạn độ dài mảng ở dưới cùng của f
hàm. Những lỗi này cuối cùng đã gây ra vấn đề, nhưng không đủ sớm để bị bắt bằng cách chỉ kiểm tra đầu ra. Trong cả hai trường hợp, vì sự hiện diện của những con bọ này trong 5 ngày vào trò chơi có thể khiến một số người nhầm lẫn đến mức không thể giải được câu đố này, tôi hoàn toàn ổn với việc gia hạn thời hạn "an toàn" cho đến ngày 24 tháng 7 cho bài nộp này.
Cập nhật (ngày 18 tháng 7 năm 2019) : Sau một số thử nghiệm, tôi đã xác nhận rằng tràn bắt đầu sau nhiệm kỳ thứ 4 trong chuỗi và bắt đầu ảnh hưởng đến hiệu lực của đầu ra sau nhiệm kỳ 19. Cũng trong chương trình như được viết ở đây, mỗi thuật ngữ liên tiếp mất khoảng 5 lần so với trước đó để tính toán. Học kỳ thứ 15 mất khoảng 14 phút trên máy tính của tôi. Vì vậy, thực sự tính toán thuật ngữ thứ 19 bằng cách sử dụng chương trình như đã viết sẽ mất hơn 6 ngày.
Ngoài ra, đây là mã với khoảng cách / thụt lề lành mạnh để dễ đọc hơn một chút nếu mọi người không có IDE với định dạng tự động trên tay.
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();
}
}
Dung dịch
f(1,v[0]=1);
ngay trước khi System.out.println
chương trình hoạt động bằng cách tính hệ số mở rộng Taylor thứ n ở mức 0. Trong đó hàm ban đầu là thương số của đa thức, được biểu thị bởi u
và v
tôi nhận được từ đây , ngoại trừ trong tài liệu được liên kết, mẫu số không được nhân ra, và không nơi nào họ nói rằng bạn phải tính toán loạt Taylor, tôi tình cờ phát hiện ra điều đó và sau đó xác nhận thông qua một nguồn khác.
Việc tính toán được thực hiện thông qua việc áp dụng lặp lại quy tắc thương cho các công cụ phái sinh.
Thuật ngữ đầu tiên không chính xác v
, toàn bộ mảng w
và một vài thứ khác như hàm f
có bất kỳ đối số nào được đưa vào để gây rối với mọi người.