विनिमय दर तालिका को दिए गए एक्सचेंजों के अधिकतम लाभदायक अनुक्रम का पता लगाएं।
एक उदाहरण के रूप मुद्राओं पर विचार एक riary (अपने घर मुद्रा), बी aht, सी ईडीआई, और डी ENAR जहां एक से दूसरे की दर (के बाद किसी भी लेन-देन दर लगाया गया है) (पंक्ति, स्तंभ) में प्रवेश द्वारा दिया जाता है नीचे विनिमय दर तालिका:
TO
A B C D
A 0.9999 1.719828 4.509549 0.709929
F B 0.579942 0.9999 2.619738 0.409959
R
O C 0.219978 0.379962 0.9999 0.149985
M
D 1.39986 2.429757 6.409359 0.9999
जाहिर है ए के लिए ए का आदान-प्रदान करना एक महान विचार नहीं है क्योंकि यह डेस्क आपको कुछ भी नहीं करने के लिए खुशी से चार्ज करेगा।
कम स्पष्ट रूप से, लेकिन इस तालिका के साथ सच है, किसी भी अन्य मुद्रा के लिए ए का आदान-प्रदान करना और फिर वापस विनिमय करना एक नुकसान निर्माता है:
via B: 1.719828 × 0.579942 = 0.997400489976
via C: 4.509549 × 0.219978 = 0.992001569922
via D: 0.709929 × 1.39986 = 0.99380120994
हालांकि, ए से डी फिर डी से बी और फिर बी बैक टू ए का आदान-प्रदान लाभ करता है (पर्याप्त पूंजी गोल करने के लिए नहीं ली जाती है):
0.709929 × 2.429757 × 0.579942 = 1.0003738278192194
अवसर मिलने पर कोई भी इसे बार-बार "फ्री लंच" ले सकता है।
लेकिन एक और भी आकर्षक श्रृंखला यहाँ मौजूद है, अर्थात् A से D फिर D से C और फिर C से B और अंत में B से A :
0.709929 × 6.409359 × 0.379962 × 0.579942 = 1.0026612752037345
चुनौती का विवरण
किसी भी उचित प्रारूप में विनिमय दर तालिका को देखते हुए जो घर-मुद्रा के अर्थ को ठीक करती है (जैसे 1 सेंट पंक्ति और 1 सेंट कॉलम हमेशा होम-मुद्रा होती है)
(या ऐसी तालिका और होम-मुद्रा इंडेक्स दिया गया है)
एक * खोजें एक्सचेंजों के रूप में घरेलू मुद्रा के साथ शुरू और समाप्त होने वाले एक्सचेंजों की अधिकतम मध्यस्थता अनुक्रम किसी भी विनिमय के उपयोग को दोहराए बिना मुद्रा सूची में (यानी एक वाई-> एक्स एक्सचेंज एक एक्स-> वाई एक का पालन कर सकता है, लेकिन एक एक्स-> वाई नहीं हो सकता है X-> Y) का पालन करें।
यदि ऐसा कोई लाभदायक अवसर मौजूद नहीं है, तो एक खाली सूची प्राप्त होती है, या कुछ अन्य परिणाम किसी पहचाने गए अवसर के साथ भ्रमित नहीं होते हैं।
- उपरोक्त उदाहरण के लिए ( A-> D, D-> C, C-> B, B-> A ):
- 0-इंडेक्सिंग का उपयोग करके कोई वापस आ सकता है
[[0,3],[3,2],[2,1],[1,0]]
या[0,3,2,1,0]
- 1-अनुक्रमण का उपयोग करके कोई वापस आ सकता है
[[1,4],[4,3],[3,2],[2,1]]
या[1,4,3,2,1]
अन्य प्रारूप ठीक हैं, जब तक कि कोई अस्पष्टता न हो।
- इसके लिए एक बात और ध्यान रखना चाहिए कि घर से एक ही लेन-देन करने का सबसे अच्छा अवसर संभव है-> घर (एक मूर्ख डेस्क)। यदि आप ऊपर (यानी [3,2,1]
या [4,3,2]
) फ्लैट विकल्प के दोनों सिरों से होम करेंसी इंडेक्स को छोड़कर जाने का निर्णय लेते हैं और "कोई अवसर नहीं है" के लिए एक खाली सूची तो सुनिश्चित करें कि घर-> घर भी एक खाली सूची नहीं है।
* यदि कई समान रूप से लाभदायक वैध अवसर मौजूद हैं, तो उनमें से कुछ, या उनमें से सभी को वापस कर दें।
बेलमैन-फोर्ड एल्गोरिथ्म यह दृष्टिकोण करने का एक तरीका है, लेकिन शायद गोल्फ के लिए सबसे उपयुक्त नहीं है।
परीक्षण के मामलों
दिखाए गए इनपुट उदाहरण में उपयोग की गई व्यवस्था में हैं, और परिणाम दिखाए गए हैं 0-इंडेक्सिंग का उपयोग करेंसी-इंडेक्स को सूचीबद्ध करने के लिए (जब एक अवसर मौजूद है घरेलू मुद्रा केवल अनुगामी छोर पर है; कोई अवसर एक खाली सूची नहीं है)।
[[0.999900, 1.719828, 4.509549, 0.709929],
[0.579942, 0.999900, 2.619738, 0.409959],
[0.219978, 0.379962, 0.999900, 0.149985],
[1.399860, 2.429757, 6.409359, 0.999900]] -> [3, 2, 1, 0]
[[0.9999, 1.5645, 0.9048, 1.0929],
[0.6382, 0.9999, 0.5790, 0.6998],
[1.1051, 1.7269, 0.9999, 1.2087],
[0.9131, 1.4288, 0.8262, 0.9999]] -> [1, 2, 0]
[[0.9999, 1.4288, 0.8262, 0.9131],
[0.6998, 0.9999, 0.5790, 0.6382],
[1.2087, 1.7269, 0.9999, 1.1051],
[1.0929, 1.5645, 0.9048, 0.9999]] -> [1, 2, 3, 1, 0]
[[1.002662, 1.719828, 4.509549, 0.709929],
[0.579942, 0.999900, 2.619738, 0.409959],
[0.219978, 0.379962, 0.999900, 0.149985],
[1.399860, 2.429757, 6.409359, 0.999900]] -> [3, 2, 1, 0, 0]
[[1.002662, 1.719828, 4.509549, 0.709929],
[0.579942, 1.002604, 2.619738, 0.409959],
[0.219978, 0.379962, 1.003000, 0.149985],
[1.399860, 2.429757, 6.409359, 1.002244]] -> [3, 3, 2, 2, 1, 1, 0, 0]
[[0.9999, 1.4288, 0.8262, 0.9131],
[0.6998, 0.9999, 0.5790, 0.6382],
[1.2087, 1.7269, 1.0001, 1.1051],
[1.0929, 1.4974, 0.9048, 0.9999]] -> [1, 2, 2, 0]
[[0.9999, 1.3262, 0.7262, 0.9131],
[0.6998, 0.9999, 0.5490, 0.6382],
[1.2087, 1.7269, 0.9999, 1.2051],
[1.0929, 1.5645, 0.9048, 0.9999]] -> [3, 2, 3, 1, 0]
[[0.9999, 1.5645, 0.9048, 0.5790],
[0.6382, 0.9999, 0.5790, 0.3585],
[1.1051, 1.7269, 0.9999, 0.6391],
[1.7271, 2.6992, 1.5645, 0.9999]] -> [1, 2, 0] and/or [3, 2, 0]
[[0.9999, 1.2645, 0.7048, 0.3790],
[0.4382, 0.9999, 0.3790, 0.1585],
[1.0001, 1.5269, 1.0001, 0.4391],
[1.5271, 2.4992, 1.3645, 0.9999]] -> []
[[0.9999, 1.2645, 0.7048, 0.3790],
[0.4382, 0.9999, 0.3790, 0.1585],
[0.9999, 1.5269, 1.4190, 0.4391],
[1.5271, 2.4992, 1.3645, 0.9999]] -> [2, 2, 0]
यह कोड-गोल्फ है इसलिए बाइट्स जीत में सबसे छोटा समाधान है, लेकिन प्रतियोगिता को इंट्रा-भाषा भी बनाया जाना चाहिए, इसलिए कोड-गोल्फिंग भाषाओं को अपने पसंदीदा में जमा करने से न दें!