मैथमेटिका, 159 100 87 86 85 बाइट्स
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
बदलने के लिए n
सिर्फ शुरुआत में चर परिभाषा बदल जाते हैं।
चूंकि यह जानवर बल है, यह काफी धीमा है, लेकिन यहां पहले आठ परिणाम हैं:
n P(n)
1 1/2
2 3/8
3 7/32
4 89/512
5 269/2048
6 903/8192
7 3035/32768
8 169801/2097152
आखिरी वाला पहले से ही 231 सेकंड का समय ले चुका था और रनटाइम बुरी तरह से घातीय है।
व्याख्या
जैसा कि मैंने कहा कि यह क्रूर बल है। अनिवार्य रूप से, मैं बस सभी संभव गणना कर रहा हूं A
और B
, हर संभव जोड़ी के लिए दो डॉट उत्पादों की गणना करता हूं और फिर जोड़े के अंश का पता लगाता हूं जो कि उपज है {0, 0}
। मैथेमेटिका के कॉम्बिनेटरिक्स और लीनियर अलजेब्रा फ़ंक्शंस इस गोल्फिंग में काफी मददगार थे:
{1,-1}~(t=Tuples)~n
यह सभी n-tuples युक्त 1
या -1
सभी संभव बनाता है A
। उसके लिए n = 3
यह है:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
गणना करने के लिए B
हम लगभग वही करते हैं:
{1,0,0,-1}~t~n
दोहराने से 0
, हम प्रत्येक के लिए प्रत्येक टपल को डुप्लिकेट करते 0
हैं, जिसमें 0
दो बार संभव होता है 1
या जैसा कि संभव है -1
। n = 3
एक उदाहरण के रूप में फिर से उपयोग :
{{-1, -1, -1},
{-1, -1, 0}, {-1, -1, 0},
{-1, -1, 1},
{-1, 0, -1}, {-1, 0, -1},
{-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0},
{-1, 0, 1}, {-1, 0, 1},
{-1, 1, -1},
{-1, 1, 0}, {-1, 1, 0},
{-1, 1, 1},
{0, -1, -1}, {0, -1, -1},
{0, -1, 0}, {0, -1, 0}, {0, -1, 0}, {0, -1, 0},
{0, -1, 1}, {0, -1, 1},
{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1},
{0, 1, -1}, {0, 1, -1},
{0, 1, 0}, {0, 1, 0}, {0, 1, 0}, {0, 1, 0},
{0, 1, 1}, {0, 1, 1},
{1, -1, -1},
{1, -1, 0}, {1, -1, 0},
{1, -1, 1},
{1, 0, -1}, {1, 0, -1},
{1, 0, 0}, {1, 0, 0}, {1, 0, 0}, {1, 0, 0},
{1, 0, 1}, {1, 0, 1},
{1, 1, -1},
{1, 1, 0}, {1, 1, 0},
{1, 1, 1}}
अब, प्रत्येक संभव के लिए A
, हम उन B
दोनों में से प्रत्येक का डॉट उत्पाद चाहते हैं , दोनों के साथ A[1 .. n]
और A[2 .. n+1]
। जैसे अगर हमारा करंट A
है {1, 1, -1}
, तो हम डॉट प्रोडक्ट को दोनों के {1, 1, -1}
साथ और उसके साथ चाहते हैं {1, -1, 1}
। चूँकि हमारे सभी B
पहले से ही एक मैट्रिक्स की पंक्तियों में सुविधाजनक हैं, हम चाहते हैं कि हम दो उप-कलाकारों A
को एक और मैट्रिक्स के कॉलम के रूप में दें, ताकि हम उनके बीच एक साधारण डॉट उत्पाद की गणना कर सकें। लेकिन ट्रांसपोसिंग {{1, 1, -1}, {1, -1, 1}}
बस देता है, {{1, 1}, {1, -1}, {-1, 1}}
जो सभी 2-तत्व चक्रीय सब्लिस्ट की एक सूची है A
। यही वह करता है:
Partition[#,2,1,1]
तो हम गणना करते हैं और हमारी सूची के साथ डॉट उत्पाद लेते हैं B
। चूँकि अब हम एक नेस्टेड सूची प्राप्त करते हैं (चूंकि प्रत्येक संभव A
एक अलग वेक्टर पैदा करता है), हम उन लोगों के साथ समतल करते हैं ##&@@
।
यह जानने के लिए एक जोड़ी {x, y}
है {0, 0}
हम गणना Sign[Norm[{x,y}]]
जहां Norm
देता है √(x²+y²)
। यह देता है 0
या 1
।
अंत में, चूँकि हम अब केवल 1
s की सूची में 0
s के अंशों को जानना चाहते हैं और 1
हम सभी की आवश्यकता सूची का अंकगणितीय माध्य है। हालांकि, यह कम से कम एक डॉट उत्पाद के गैर-शून्य होने की संभावना पैदा करता है, इसलिए हम 1
वांछित परिणाम प्राप्त करने के लिए इसे घटाते हैं ।
n
मददगार होंगे। इसके अलावा शायद ए, बी और दो आंतरिक उत्पादों का एक स्पष्ट उदाहरण मदद कर सकता है।