पृष्ठभूमि
फ्रैक्ट्रन जॉन कॉनवे द्वारा आविष्कार की गई एक गूढ़ ट्यूरिंग-पूर्ण प्रोग्रामिंग भाषा है। एक फ्रैक्ट्रन कार्यक्रम में भिन्नों की क्रमबद्ध सूची होती है। कार्यक्रम इनपुट के रूप में एक पूर्णांक लेकर शुरू होता है। कार्यक्रम के प्रत्येक पुनरावृत्ति, यह पहले अंश के लिए सूची खोजता है जैसे कि उस अंश से संख्या को गुणा करना एक और पूर्णांक बनाता है। फिर इस प्रक्रिया को नए नंबर के साथ दोहराता है, सूची की शुरुआत में वापस। जब सूची पर कोई अंश नहीं होता है जिसे संख्या के साथ गुणा किया जा सकता है, तो कार्यक्रम समाप्त हो जाता है और संख्या को आउटपुट के रूप में देता है।
फ्रैक्चरन ट्यूरिंग-पूर्ण होने का कारण यह है कि यह एक रजिस्टर मशीन का अनुकरण करता है। संख्या का प्रधान गुणनखंडन रजिस्टरों की सामग्री को संग्रहीत करता है, जबकि विभाजन और गुणा, रजिस्टरों से सशर्त रूप से जोड़ने और घटाने का एक तरीका है। मैं विकिपीडिया लेख (ऊपर लिंक) पढ़ने की सलाह दूंगा।
चुनौती
आपका कार्य संभवतया सबसे छोटा प्रोग्राम लिखना है जो एसटीडीआईएन से केवल एक ही इनपुट के रूप में एक वैध फ्रैक्ट्रन कार्यक्रम ले सकता है और एसटीडी के लिए एक वैध बीएफ कार्यक्रम उत्पन्न करता है जो फ्रैक्ट्रन कार्यक्रम का अनुकरण करता है। वहाँ दो तरीके हैं कि आप BF के साथ एक फ्रैक्ट्रन कार्यक्रम का अनुकरण कर सकते हैं।
नोट: आपका उत्तर BF प्रोग्राम नहीं है। आपका उत्तर वह कोड है जो किसी भी फ्रैक्ट्रन प्रोग्राम से बीएफ प्रोग्राम उत्पन्न करता है। लक्ष्य बीएफ कार्यक्रम को फ्रैक्ट्रन कार्यक्रम के बराबर प्राप्त करना है। (तकनीकी रूप से आप बीएफ में प्रतियोगिता कर सकते थे, लेकिन यह कठिन होगा)
विकल्प 1
आपके प्रोग्राम को बीएफ प्रोग्राम आउटपुट करना चाहिए जो निम्न कार्य करता है:
- इसी ASCII चरित्र के रूप में एसटीडीआईएन से ठीक 1 नंबर लेता है (जिस तरह से बीएफ इनपुट काम करता है), जो कि फ्रैक्ट्रन कार्यक्रम के लिए इनपुट है।
- इसी ASCII वर्ण के रूप में STDOUT को ठीक 1 नंबर प्रिंट करता है, जो कि फ्रैक्ट्रन प्रोग्राम से आउटपुट है।
यह विकल्प फ्रैक्ट्रन वर्चुअल मशीन से सटीक इनपुट और आउटपुट का प्रतिनिधित्व करने के लिए है।
विकल्प 2
आपके प्रोग्राम का उत्पादन करने वाला BF कोड निम्नलिखित कार्य करना चाहिए:
- पहले से ही मेमोरी में एन्कोडेड संख्या (प्रोग्राम को चलाने से पहले) का इनपुट करके प्राइमरी फैक्ट्री लें। यदि इनपुट 28 (2 * 2 * 7) है, तो दूसरी सेल में 2 का मान होगा और सातवें सेल में 1 का मान (सेल 0 पर पॉइंटर शुरू होता है)। अन्य सभी कोशिकाएँ शून्य होंगी।
- जब प्रोग्राम समाप्त हो जाता है, तो मेमोरी में एन्कोड किए गए आउटपुट का मुख्य गुणनखंड होने पर आउटपुट दें। यदि आउटपुट 10 है, तो प्रत्येक कोशिकाओं में 1 का मान 2 और 5 होना चाहिए। अन्य सभी अभाज्य संख्या वाले कोशिकाओं का मूल्य शून्य होना चाहिए। अन्य कोशिकाओं की सामग्री मायने नहीं रखती है।
यह विकल्प फ्रैक्ट्रन भाषा के पीछे कंप्यूटिंग मॉडल का प्रतिनिधित्व करता है।
नियम और आवश्यकताएँ
- इनपुट (अपने कार्यक्रम के ऊपर) STDIN पर अंशों की एक सूची होगी। अंश और हर के बीच अल्पविराम के साथ प्रति पंक्ति एक अंश होगा। एक खाली रेखा इनपुट के अंत का प्रतिनिधित्व करती है। भिन्नों को हमेशा सबसे कम शब्दों में कम किया जाएगा।
- आपके प्रोग्राम का आउटपुट एकल-पंक्ति, मान्य BF प्रोग्राम से STDOUT होना चाहिए। यह कार्यक्रम दो विकल्पों में से एक के अनुसार उस विशेष फ्रैक्ट्रन कार्यक्रम को अनुकरण करने में सक्षम होना चाहिए। किसी भी इनपुट के लिए, उत्पन्न बीएफ प्रोग्राम को फ्रैक्ट्रन प्रोग्राम के समान आउटपुट का उत्पादन करने में सक्षम होना चाहिए।
- आपको यह बताना होगा कि आपने कौन सा विकल्प चुना है।
- आप बीएफ मेमोरी और टेप पर सीमाएं चुन सकते हैं, और चाहे वे लपेट रहे हों
- कोड GOLF। साथ ही, आउटपुट किए गए BF प्रोग्राम्स का आकार मायने नहीं रखता है, केवल उस प्रोग्राम का आकार जो कन्वर्सेशन कर रहा है।
- कार्यक्रम में केवल मुद्रण योग्य ASCII शामिल होना चाहिए
अगर मैं कहीं भी अस्पष्ट हूं, तो पूछने में संकोच न करें। यह वर्णन करने के लिए एक बहुत ही जटिल चुनौती है।
इसके अलावा, कृपया निम्न इनपुट के लिए अपने प्रोग्राम के जेनरेट किए गए बीएफ कोड को पोस्ट करें, ताकि यह जांचने का आसान तरीका प्रदान किया जा सके कि आपका प्रोग्राम काम कर रहा है या नहीं:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
यह प्रोग्राम किसी संख्या के द्विआधारी विस्तार में 1s की संख्या की गणना करता है। हालांकि, इनपुट और आउटपुट को अजीब तरीके से स्वरूपित किया गया है (जैसा कि सभी फ्रैक्ट्रन कार्यक्रमों के साथ)। इनपुट फॉर्म 2 ^ ए का है, जबकि आउटपुट फॉर्म 13 ^ बी का है।