फाइबोनैचि-क्वीन को लागू करें


13

एक Quine एक प्रोग्राम है जो जब चलाने के अपने स्रोत आउटपुट है।

इस चुनौती में, आपको एक फाइबोनैचि-क्वीन बनाना चाहिए, जो कि क्वीन का एक प्रकार है।


फाइबोनैचि-क्वीन क्या है?

एक फिबोनाची-क्वीन एक कार्यक्रम है, जो निम्नलिखित नियम द्वारा स्रोत के एक संशोधन का उत्पादन करता है:

प्रारंभिक स्रोत होना चाहिए ...2...। दूसरे शब्दों में, स्रोत में होना चाहिए 2। (क्यों 2? यदि यह 1 था, तो किसी को भी नहीं पता होगा कि यह पहले 1 या दूसरा था, यहां तक ​​कि कार्यक्रम भी)

जब रन किया जाता है, तो आपको स्रोत का उत्पादन करना चाहिए, लेकिन केवल विशिष्ट संख्या (इस चरण में 2) को अगली अनुक्रम संख्या में बदल दिया। उदाहरण के लिए, ...3...। वही आउटपुट के लिए जाता है, और आउटपुट का आउटपुट आदि, आप पूर्णांक को 2 ^ 32-1 तक समर्थन कर सकते हैं। उस सीमा से अधिक पूर्णांकों के लिए, अगला आउटपुट आपकी पसंद पर है।

ओपी का नोट

मैं वास्तव में इसके लिए एक रचनात्मक समाधान देखना चाहूंगा। मैं इसके लिए एक भी समाधान के बारे में नहीं सोच सकता था, क्योंकि चुनौती के दो महत्वपूर्ण पहलुओं, रिट्रेसमेंट और क्वीन, दोनों आसान नहीं है। मैं इंतज़ार कर रहा हूँ!



4
रानी भाग इस चुनौती के लिए बहुत कुछ नहीं जोड़ता है। यह सिर्फ "फाइबोनैचि अनुक्रम में अगला मूल्य" है, उत्तर के रूप में एक सार्वभौमिक क्वाइन निर्माता हैं।

मैं सहमत हूँ। मैं इसके लिए एक रचनात्मक समाधान भी देखना चाहूंगा। लेकिन अगर आप एक रचनात्मक समाधान इतना बुरा चाहते हैं, तो क्यों नहीं इसे कोड-गोल्फ के बजाय एक कोड-चुनौती बना दें। जीतने के मानदंड कुछ समय के अंतराल या कुछ के बाद सबसे अधिक वोट हो सकते हैं।
फिक्स्ड प्वाइंट

@ फ़िक्सपेड 'एक दूसरे मापदंड' के बारे में क्या? कोई व्यक्ति रचनात्मक समाधान करता है, मैं उन्हें इनाम देता हूं।
मैथ्यू रो

जवाबों:


8

गणितज्ञ, 61 बाइट्स

ToString[#0 /. v:2 :> RuleCondition[Round[GoldenRatio v]]] & 

ध्यान दें कि एक अनुगामी स्थान है। यह एक फ़ंक्शन क्वीन है, अर्थात उपरोक्त कोड एक अनाम फ़ंक्शन का मूल्यांकन करता है, जिसे अगर कोड को एक स्ट्रिंग के रूप में वापस लौटाया जाता है ( 2अगले फाइबोनैचि संख्या में बदल दिया जाता है)।

यह काम पाने के लिए आश्चर्यजनक रूप से मुश्किल था। मूल विचार यह है कि फ़ंक्शन को स्वयं (साथ #0) लें और अगले फ़ंक्शन के साथ उस फ़ंक्शन में एक संख्या को प्रतिस्थापित करें /. v:2 :> nextFib[v]। हालांकि, nextFibइस स्तर पर मूल्यांकन नहीं किया जाएगा ताकि हम वास्तव में स्रोत कोड में नए नंबर के साथ समाप्त न हों। तत्काल मूल्यांकन को मजबूर करने के लिए कुछ समय के लिए चारों ओर खोज करने के बाद, मुझे यह महान पोस्ट Mathematica.SE पर मिली । "मानक" तकनीक एक Withब्लॉक का उपयोग करती है जो मूल्यांकन के लिए बाध्य करती है, लेकिन WReach द्वारा दूसरे उत्तर में अनजाने में निर्मित एक का उपयोग करके एक छोटा विकल्प होता है RuleConditionजिसमें मूल्यांकन भी होता है।

जिस तरह से हम अगले फाइबोनैचि संख्या की गणना करते हैं वह इस तथ्य का उपयोग करके है कि लगातार संख्याओं का अनुपात लगभग स्वर्ण अनुपात 1.618 है ... और यह गोलाई तक सटीक है। इसलिए हमें अंतिम दो नंबरों पर नज़र रखने की ज़रूरत नहीं है और बस कर सकते हैं Round[GoldenRatio v]। यह कभी भी सटीकता नहीं खोएगा क्योंकि गणितज्ञ GoldenRationएक प्रतीकात्मक मूल्य है और इसलिए Roundहमेशा एक सटीक परिणाम की गणना कर सकता है।

संक्षेप में:

... #0 ... &

एक अनाम फ़ंक्शन, जहाँ #0फ़ंक्शन ऑब्जेक्ट को संदर्भित करता है।

... /. v:2 :> ...

2फ़ंक्शन के अभिव्यक्ति ट्री में खोजें (यह 2केवल खुद से मेल खाता है), इसे कॉल करें vऔर इसे बदलें ...

... RuleCondition[Round[GoldenRatio v]]

... अगला फिबोनाची नंबर।

ToString[...]

और परिणामी अभिव्यक्ति ट्री को इसके स्ट्रिंग प्रतिनिधित्व में परिवर्तित करें।


यह जानकर अच्छा लगता है कि आपको कभी-कभी इन पर कड़ी मेहनत करनी
ग्रेग मार्टिन

क्या स्वर्णिम अनुपात के लिए कोई प्रतीक नहीं है?
केयर्ड कॉइनरहाइडिंग

@cairdcoinheringaahing नहीं।
मार्टिन एंडर

7

सीजेएम , 26 बाइट्स

2{0X{_@+_W$>!}go;\;"_~"}_~

इसे ऑनलाइन आज़माएं!

शायद काफी इष्टतम नहीं है। हम केवल फिबोनाची अनुक्रम को पुनरावृत्त करते हैं, जब तक कि मूल्य पिछले एक से अधिक न हो और कार्यक्रम की शुरुआत में नए मूल्य के रूप में परिणाम का उपयोग करें।


6
थी..तो जल्दी?
मैथ्यू रो





4

जेली , 14 बाइट्स

“×Øp+.ḞṭØv”Ṙv2

इसे ऑनलाइन आज़माएं! या सभी आवश्यक पुनरावृत्तियों को सत्यापित करें

यह काम किस प्रकार करता है

“×Øp+.ḞṭØv”Ṙv2  Main link. No arguments.

“×Øp+.ḞṭØv”     Set the left argument and return value to the string "×Øp+.ḞṭØv".
           Ṙ    Print a string representation of the return value and yield the
                unaltered return value.
            v2  Evaluate the return value as a Jelly program with left argument 2.
 ×Øp                Multiply the left argument by the golden ratio.
    +.              Add 0.5 to the resulting product.
      Ḟ             Floor; round the resulting sum down to the nearest integer.
        Øv          Yield the string "Øv".
       ṭ            Tack; append the result to the left to the result to the right.

1

स्विफ्ट, 251 बाइट्स

मेरे लिए एक बिट क्रिया, लेकिन मैं यह पता नहीं लगा सकता कि इसे कैसे छोटा किया जाए:

import Foundation;var n="\"";var u="\\";var s="import Foundation;var n=%@%@%@%@;var u=%@%@%@%@;var s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))";print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

Ungolfed:

import Foundation
var n="\""
var u="\\"
var s="import Foundation;var n=%@%@%@%@;var u=%@%@%@%@;var s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))"
print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

मेरी परेशानी के नए संस्करण के आसपास उद्धरण प्राप्त करने की कोशिश कर रहा है s



1

जावास्क्रिप्ट (ईएस 6), 151 60 बाइट्स

नया संस्करण, @ लीक नन का श्रेय

x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)

पुराना संस्करण :

x=i=>{var s=Math.sqrt(5),a=1;f=n=>{return Math.ceil((((1+s)/2)**n-((1-s)/2)**n)/s)};while(f(++a)<=i);console.log('x='+String(x)+';x('+f(a)+')');};x(2)

के आधार पर यह


1
PPCG में आपका स्वागत है! हमें उम्मीद है कि आपके पास यहां एक अच्छा समय होगा।
लीक नून

@LeakyNun उम्मीद है कि अब तय हो गया है!
rbntd

गोल्फ संस्करण:x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
लीक नून

@LeakyNun वाह, यह छोटा है! लेकिन क्या यह बहुत अनुमानित नहीं है? यह i = 31000 के लिए 50159 आउटपुट करता है, हालांकि सही उत्तर 46368 होना चाहिए
rbntd

मुझे समझ नहीं आ रहा है। 31000एक फाइबोनैचि संख्या नहीं है।
लीक नून

1

डीसी , 35 बाइट्स

2[r9k5v1+2/*.5+0k1/n91PP93P[dx]P]dx

पुनरावृत्ति वाला संस्करण (56 बाइट्स):

2[rsP1dsN[lN+lNrsNdlP[s.q]s.=.lFx]dsFxlNn91PP93P[dx]P]dx

1

स्विफ्ट, 235 बाइट्स

यह कालेब के उत्तर का एक उन्नत संस्करण है ।

import Foundation;var n="\"",u="\\",s="import Foundation;var n=%@%@%@%@,u=%@%@%@%@,s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))";print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.