जावा 8+ , 1044 बाइट्स, अनुक्रम A008008 (सुरक्षित)
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();}}
इसे ऑनलाइन आज़माएं!
आकार 12 के छिपे हुए स्ट्रिंग का उपयोग करके हल किया जा सकता है । निश्चित रूप से अधिक गोल्फ हो सकता है, लेकिन कोई रास्ता नहीं है यह वास्तव में जीत रहा है। मैं सिर्फ 8008 नंबर के सम्मान में योगदान देना चाहता था।
नोट: इससे पहले कि कोई यह शिकायत करे कि अनुक्रम हार्ड-कोडेड है, मैंने इसे पहली बार परीक्षण किया है कि हार्ड-कोडिंग (13 वां शब्द = 307) से विचलन होता है और इसे धीरे-धीरे सही ढंग से प्राप्त होता है। यह भी है कि यह long
इसके बजाय का उपयोग क्यों कर रहा है int
, अन्यथा यह उस शब्द से पहले ओवरफ्लो करता है।
अपडेट (Jul 12 2019) : थोड़ा और बेहतर प्रदर्शन करने के लिए अपडेट किया गया। मेरे कंप्यूटर पर अब 30 मिनट में 13 वें कार्यकाल की गणना 5 मिनट के बजाय करें।
अपडेट (Jul 17 2019) : g
फ़ंक्शन के लिए लूप सीमा के लिए निश्चित बग , और फ़ंक्शन के निचले भाग में सरणी लंबाई सीमा f
। इन बगों को अंततः समस्याएं पैदा करनी चाहिए थीं, लेकिन इतनी जल्दी नहीं कि केवल आउटपुट की जांच करके पकड़ा जाए। या तो मामले में, खेल में 5 दिन इन कीड़ों की उपस्थिति के बाद से कुछ लोग इस पहेली को हल करने में असमर्थ होने के कारण कुछ लोगों को भ्रमित कर सकते हैं, मैं इस जमा के लिए 24 जुलाई तक "सुरक्षित" समय सीमा तक पूरी तरह से ठीक हूं।
अपडेट (Jul 18 2019) : कुछ परीक्षण के बाद मैंने पुष्टि की है कि ओवरफ्लो अनुक्रम में 4 वें कार्यकाल के बाद शुरू होता है और 19 वें कार्यकाल के बाद आउटपुट की वैधता को प्रभावित करना शुरू कर देता है। साथ ही कार्यक्रम में जैसा कि यहां लिखा गया है, प्रत्येक लगातार शब्द गणना करने के लिए पिछले की तुलना में लगभग 5 गुना अधिक समय लेता है। 15 वें कार्यकाल में मेरे कंप्यूटर पर लगभग 14 मिनट लगते हैं। इसलिए वास्तव में कार्यक्रम का उपयोग करते हुए 19 वें शब्द की गणना करना, जैसा कि 6 दिनों में लिखा जाएगा।
इसके अलावा, यहाँ कोड रिक्ति / इंडेंटेशन के साथ है इसलिए यह पढ़ना थोड़ा आसान है अगर लोगों के पास हाथ से ऑटो-फॉर्मेटिंग के साथ आईडीई नहीं है।
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();
}
}
समाधान
f(1,v[0]=1);
System.out.println
कार्यक्रम के ठीक पहले n'th टेलर के गुणांक की गणना करके कार्यक्रम काम करता है। 0. जहां मूल कार्य बहुपद का एक भाग है, जिसका प्रतिनिधित्व किया है u
और v
जो मुझे यहां से मिला है , सिवाय इसके कि लिंक किए गए दस्तावेज़ में हर बहुआयामी गुणक नहीं है। और कहीं नहीं वे कहते हैं कि आपको टेलर श्रृंखला की गणना करनी है, मैंने उस पर दुर्घटना से ठोकर खाई और फिर एक अन्य स्रोत के माध्यम से पुष्टि की।
गणना डेरिवेटिव के लिए भागफल नियम के दोहराया आवेदन के माध्यम से की जाती है। लोगों के साथ गड़बड़ी करने के लिए
गलत पहला कार्यकाल v
, संपूर्ण सारणी w
और फ़ंक्शन की कुछ अन्य चीजें जैसे f
कोई तर्क दिया जाता है।