एक घूमने वाली रानी बनाएँ


26

स्ट्रिंग का एक घुमाव दो टुकड़ों में एक स्ट्रिंग को विभाजित करके और उनके क्रम को उलट कर बनाया जाता है, उदाहरण के "world! Hello,"लिए एक रोटेशन है "Hello, world!"। ऐसे प्रोग्राम बनाना संभव है जिन्हें एक अलग, लेकिन अभी भी मान्य प्रोग्राम बनाने के लिए घुमाया जा सकता है। अजगर में इस उदाहरण पर विचार करें:

print ")import sys; sys.stdout.write("

इसे बनाने के लिए घुमाया जा सकता है

import sys; sys.stdout.write("print ")

जो स्वयं एक मान्य अजगर कार्यक्रम है।

आपकी चुनौती एक ऐसे प्रोग्राम को लिखना है जो स्वयं के रोटेशन को आउटपुट करता है, जो जब रन करेगा तो मूल प्रोग्राम को आउटपुट देगा। बोनस दो से अधिक एक चक्र की लंबाई के साथ किसी भी प्रविष्टि को इंगित करता है!

यह कोड गोल्फ है, सटीक स्कोरिंग होगा: (कोड की लंबाई) / (साइकिल की लंबाई - 1)।

संपादित करें: हमारे पास एक विजेता है (जब तक कि कोई और 4 के स्कोर को हरा न सके)! मैं अब भी किसी अन्य समाधान को देखने के लिए इच्छुक हूं, चाहे वे दावेदार हों या नहीं।


2
अच्छा! आपने अपने (साइकिल की लंबाई -1) वेटिंग के साथ सस्ते कंसंट्रेशन को बाहर कर दिया है।
बूथ

3
शाब्दिक रोटेशन के साथ, Befunge में ऐसा करने का प्रयास करें ।
यांत्रिक घोंघा

चिकन और अंडे का उपयोग करना भी इस पर एक अच्छा स्पर्श है।
मेवप्लप

जवाबों:


21

APL (158 वर्ण, स्कोर = 4)

'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 

मैं यहाँ Dyalog APL का उपयोग कर रहा हूँ। अभिव्यक्तियों के अंत में और स्ट्रिंग के अंत (पहले ''') में जोड़कर चक्रों की संख्या को एक (0 के बाद एक स्थान) से बढ़ाया जा सकता है । चक्र की लंबाई है (# 0's) + 1, और अभिव्यक्ति की लंबाई है 150 + 4*(cycle length))। यह मानते हुए कि हम हमेशा के लिए शून्य जोड़ना जारी रखते हैं, स्कोर है Limit[(150 + 4*n)/(n - 1), n -> Infinity] = 4, जहां nचक्र की लंबाई है।

यहाँ चक्र लंबाई = 6 के साथ एक उदाहरण दिया गया है:

      '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 
 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0

      0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0
 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0

      0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0
 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0

      0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0
 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0

      0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1

      0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0

192 वर्ण, स्कोर = 2

'''{2≠⍴⍺:¯3⌽(2×1+⍴⍺)⍴(1+⍴⍺)⍴⍺ ⋄ a←⊃2⌷⍺ ⋄ ⍵=0:¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a⋄(-4+⌊10⍟⊃⍺)⌽(2×1+⍴a)⍴(1+⍴a)⍴a}01'''{2≠⍴⍺:¯3⌽(2×1+⍴⍺)⍴(1+⍴⍺)⍴⍺⋄a←⊃2⌷⍺⋄⍵=0:¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a⋄(-4+⌊10⍟⊃⍺)⌽(2×1+⍴a)⍴(1+⍴a)⍴a}01

कार्यान्वयन के आधार पर, विफलता का एक बिंदु तब हो सकता है जब स्ट्रिंग के लिए पूर्वनिर्मित पूर्णांक बहुत बड़ा हो। सैद्धांतिक रूप से, हालांकि, हम दो वर्णों को जोड़कर एक चक्र जोड़ सकते हैं - 1स्ट्रिंग के अंत में (पहले ''') और 1पूरी रेखा के अंत में।

200 वर्ण, स्कोर = 1

'''{a←{2=⍴⍵:⊃2⌷⍵⋄⍵}⍺⋄(⍺{⍵=9:⍬⋄⍕1+{2=⍴⍵:10×⊃⍵⋄0}⍺}⍵),(¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a),⍺{⍵=9:(⍕9),⍕⊃⍺⋄⍕⌊⍵÷10}⍵}'''{a←{2=⍴⍵:⊃2⌷⍵⋄⍵}⍺⋄(⍺{⍵=9:⍬⋄⍕1+{2=⍴⍵:10×⊃⍵⋄0}⍺}⍵),(¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a),⍺{⍵=9:(⍕9),⍕⊃⍺⋄⍕⌊⍵÷10}⍵}91

मेरे एपीएल कार्यान्वयन में डिफ़ॉल्ट रूप से असीमित सटीक पूर्णांक नहीं हैं, इसलिए पूर्णांक को एक फ्लोट में बदल दिया जाता है जब यह बहुत बड़ा हो जाता है, जिससे आउटपुट गलत हो जाता है। तो यह सबसे अधिक बारीक है, लेकिन सैद्धांतिक रूप से (या तो हाथ से या एक अलग एपीएल दुभाषिया के साथ), इसमें 1. का स्कोर होना चाहिए। बस 1अभिव्यक्ति के अंत में एक जोड़ दें , और आप एक और चक्र प्राप्त करें।

अवलोकन (छोटी रानी के साथ)

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

1⌽22⍴11⍴'''1⌽22⍴11⍴'''

मैंने पाया है कि कुछ एपीएल अभिव्यक्तियों को समझने के सर्वोत्तम तरीकों में से एक है संचालकों / कार्यों के कैस्केड के दौरान आउटपुट को देखना। APL में सभी ऑपरेटर और फ़ंक्शन राइट-एसोसिएटिव हैं और उनकी एक ही पूर्वता है, इसलिए यहाँ है, दाएँ से बाएँ:

  • '''1⌽22⍴11⍴''': यह सिर्फ एक स्ट्रिंग शाब्दिक (पात्रों की एक सूची) है। ''एकल उद्धरण चिह्न से बचने का एपीएल तरीका है। आउटपुट: '1⌽22⍴11⍴'
  • 11⍴'''1⌽22⍴11⍴''': यहां, हम लंबाई के होने के लिए स्ट्रिंग को फिर से सेट करते हैं 11। क्योंकि स्ट्रिंग की लंबाई 11 से कम है, इसे दोहराया जाता है (यानी, 5⍴'abc'उपज होगी 'abcab')। आउटपुट: '1⌽22⍴11⍴''। तो अब हमारे पास अंत में दो उद्धरण चिह्न हैं - हम कहीं जा रहे हैं!
  • 22⍴11⍴'''1⌽22⍴11⍴''': इसी तरह, अब हम अपने पिछले आउटपुट को लंबाई का होना मानते हैं 22। आउटपुट: '1⌽22⍴11⍴'''1⌽22⍴11⍴''। हम लगभग वहाँ हैं - हमें केवल पहले एकल उद्धरण को अंत तक ले जाने की आवश्यकता है।
  • 1⌽22⍴11⍴'''1⌽22⍴11⍴''': यहां, हम ( ) वर्णों की सूची को घुमाते हैं 1। यह स्ट्रिंग के पहले चरित्र को अंत तक ले जाता है। एक अन्य उदाहरण के रूप में, 2⌽'abcdef'रिटर्न 'cdefab'। आउटपुट: 1⌽22⍴11⍴'''1⌽22⍴11⍴'''

घूमती हुई रानी

वह छोटी क्वीन हमारे घूमने वाले क्वीन का मुख्य आधार है। अब, यह ध्यान में रखते हुए, आइए एक नज़र डालते हैं:

'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 

{ ... }एक अनाम फ़ंक्शन को परिभाषित करता है, जो वह जगह है जहां हम काम करेंगे। ध्यान दें कि एपीएल में कार्य एक सही तर्क लेते हैं, जिसे निरूपित किया गया है , और एक वैकल्पिक बाएं तर्क, द्वारा निरूपित किया गया है (विचार करें)। हम इस कार्य को हमारे क्वीन स्ट्रिंग और कुछ को खिलाना चाहते हैं ताकि हमें चक्र की मनमानी संख्या बनाने में सहायता मिल सके। अपने आप पर चीजों को आसान बनाने के लिए (और कोई भी साइकिल जोड़ना चाहता है), हम क्वीन स्ट्रिंग को बाएं तर्क बनाते हैं। सही तर्क, तब है, जहां हमने अपनी सूची में चक्र लगाए हैं। एक स्थान से अलग 2 या अधिक आइटम एक सूची बनाता है, इसलिए इस उदाहरण में, हमारे पास 2-तत्व सूची है जिसमें a 1और a शामिल हैं 0

हम देख सकते हैं कि फ़ंक्शन पहले से क्वीन के समान दिखता है। हमारे पास ...⌽...⍴...⍴...पहले से एक ही फॉर्म है। तो यह अच्छा है - हम कम से कम इतना तो समझते हैं! के अनेक बिंदुओं में गहरा गड्ढा, पिछले के बाद सब कुछ के साथ शुरू करते हैं : ⊃,/(~^/¨⍺=0)/⍺

  • जैसा कि आप ऊपर दिए गए उदाहरण को देखकर कह सकते हैं, हम स्ट्रिंग को दाएं हाथ की तरफ से उपसर्ग करते हैं, प्रत्येक जोड़ के साथ एक जोड़ते हैं; लेकिन हम अभी उन लोगों के बारे में परवाह नहीं है। हम सिर्फ स्ट्रिंग चाहते हैं!
  • पहले, विचार करें कि कोष्ठक में क्या है। (वे अधिकांश अन्य भाषाओं की तरह समूह बनाते हैं।)
    • ⍺=0एक सूची देता है, इस मामले में, उसी आकार के साथ , जहां प्रत्येक तत्व को प्रतिस्थापित किया जाता है 1यदि यह समान है 0, और 0अन्यथा। यह पुनरावर्ती रूप से किया जाता है; इसलिए यदि हमारे पास पात्रों की सूची की एक सूची है, तो व्यक्तिगत वर्णों को 0 के विरुद्ध परीक्षण किया जाएगा, और आपको द्विआधारी मूल्यों की सूची की सूची की एक सूची वापस मिल जाएगी।
    • तो अगर हमारे तार सिर्फ शामिल होते हैं, तो हमें 0 की सूची वापस मिल जाती है। अन्यथा, हमारे बाएं तर्क में कुछ 0 उपसर्ग है (जैसे 0 0 0 'quinestring'), इसलिए यह एक सूची है जिसमें 0 और एक अन्य सूची है, हमारी स्ट्रिंग। तब हमारा आउटपुट दिखता है 1 1 1 <sub-list of zeros>
    • ^/¨⍺=0: हम व्युत्पन्न फ़ंक्शन को लागू करते हैं ^/, जो प्रत्येक के ( ) तत्व के /लिए तार्किक और ( ^) फ़ंक्शन का उपयोग करके कम ( ) करता ¨है ⍺=0। यह शून्य की उप-सूची को समतल करना है ताकि हम क्वीन स्ट्रिंग को एक बाइनरी मान मान सकें। पिछले उदाहरण को ध्यान में रखते हुए, आउटपुट होगा 1 1 1 0
    • ~: हम पहले से प्रत्येक मान को बाइनरी नहीं करते हैं (उदाहरण के लिए, लौटना 0 0 0 1)।
  • (~^/¨⍺=0)/⍺: प्रत्येक तत्व के लिए , हम /इसे ( ) बाएं तर्क में संबंधित तत्व द्वारा दिए गए समय की संख्या कहते हैं। यह 0 के सभी को समाप्त कर देता है, हमें केवल हमारे क्विन स्ट्रिंग के साथ छोड़ देता है।
  • ⊃,/यह सुनिश्चित करने के लिए कुछ आवश्यक कागजी कार्रवाई है कि हम नतीजे फ़ंक्शन ( ,) के साथ परिणाम को कम करके वर्णों की एक चपटी सूची प्राप्त करें । यदि इनपुट पहले से ही एक चपटी सूची है (यानी, हमारे मुख्य फ़ंक्शन के लिए बाएं तर्क केवल स्ट्रिंग है), तो हमें उस सूची से युक्त 1-तत्व सूची मिलती है। दूसरे मामले में, जब हमारे पास एक सूची होती है जिसमें स्ट्रिंग के लिए एक उप-सूची होती है, तो हमें एक ही चीज़ वापस मिलती है (एक उप-सूची वाली सूची)। फिर हम इसे अनपैक करते हैं ( ), हमें सूची का पहला तत्व देते हैं (यानी, पात्रों की उप-सूची)। यह अनावश्यक प्रतीत हो सकता है, लेकिन अन्यथा हम 1-तत्व सूची को फिर से खोलने की कोशिश कर रहे होंगे!

इसके बाद, हम कोष्ठक के भीतर पहले पुनर्वसन के लिए दी गई लंबाई को देखते हैं:

  • ⍺,⍵: हम पहले तर्क को सही तर्क देते हैं
  • ⊃,/⍺,⍵: पहले की तरह ही - सूची को समतल करें।
  • +/0=⊃,/⍺,⍵: /जोड़ ( +) फ़ंक्शन का उपयोग करके कम करके सूची में शून्य की संख्या जोड़ें ।
  • 2×+/0=⊃,/⍺,⍵: उस संख्या को दो से गुणा करें।
  • z←2×+/0=⊃,/⍺,⍵: असाइन करें ( ) एक चर के लिए परिणाम z,। पुनरावृत्ति करने के लिए, zअब बाएँ और दाएँ दोनों तर्कों में शून्य की संख्या दोगुनी है।
  • 77+z←2×+/0=⊃,/⍺,⍵: फिर हम जोड़ते हैं 77, क्वीन स्ट्रिंग के पात्रों के लिए, निम्नलिखित स्थान के बाद सब कुछ अनदेखा करना 1। प्रारंभिक क्वीन उदाहरण की तरह, हम एक और एकल उद्धरण प्राप्त करने के लिए स्ट्रिंग की लंबाई में 1 जोड़ते हैं।
  • इस उदाहरण में, इस आकार का आउटपुट है: '{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 ''

इस प्रकार है कि फेरबदल का तर्क सरल है और छोटी रानी (पहले पुनर्वसन के लिए 2 गुना लंबाई) को दर्शाता है। अब हमारा आउटपुट है:

'{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 ''

अब अंतिम चरण के लिए, जहां हम गणना करते हैं कि आउटपुट स्ट्रिंग को घुमाने के लिए कितना:

  • जैसा कि आप पिछले आउटपुट को देखकर देख सकते हैं, हम शुरुआत में 2 अंतिम उद्धरण लाने के लिए इसे वापस (एक नकारात्मक राशि) घुमाना चाहते हैं। क्योंकि हम चाहते हैं कि 0(और एक अन्य स्थान) शुरुआत में भी आगे बढ़े, हम इसे अतिरिक्त 3 वर्णों को घुमाना चाहते हैं।
  • +/+/¨⍺=0: बाएँ तर्क में शून्य की संख्या जोड़ें । पहला (दाईं ओर से) +/¨प्रत्येक तत्व की गणना (अर्थात, एक सबलिस्ट या सिर्फ एक पूर्णांक) पर हस्ताक्षर करता है, और दूसरा +/हमें उस परिणामी सूची का योग देता है।
  • 5+2×+/+/¨⍺=0: दो से गुणा करें (साथ ही रिक्त स्थान को घुमाने के लिए), और 5 जोड़ें (परिणाम हम पहले के साथ आए थे)।
  • अब, -जब हम अपने चक्र के अंत में केस को संभालने के लिए बाएं तर्क से पिछले मान को घटाते हैं:
    • (3+z)×^/⍵: और सही तर्क में सभी तत्व एक साथ यह देखने के लिए कि क्या हम अपने अंत तक पहुँच चुके हैं ( 1), और इससे गुणा करें 3+z

और हम कर रहे हैं!


वाह, बहुत अच्छा, जब मैंने मूल प्रश्न लिखा तो मुझे इस तरह की कोई उम्मीद नहीं थी! मैं एपीएल बिल्कुल नहीं बोलता, क्या कोई मौका है कि आप यह कैसे काम कर सकते हैं?
गॉर्डन बैली

ज़रूर! मुझे पोस्ट करने के लिए कुछ और संस्करण मिले हैं (सैद्धांतिक रूप से कम स्कोर के साथ), इसलिए मैं कल उन लोगों के साथ एक सिंहावलोकन जोड़ूंगा।
डिलन कवर्स

आपके अत्यंत गहन प्रलेखन के लिए बहुत-बहुत धन्यवाद, आप यहाँ कुछ साफ-सुथरी तरकीबों का उपयोग कर रहे हैं। मैं विशेष रूप से ऑपरेटर (?) के उपयोग को पसंद करता हूं । मुझे लगता है कि इससे पहले कि मैं इसे पूरी तरह से पचा लूं, मुझे एक-दो बार पूरी बात पढ़नी पड़ेगी!
गॉर्डन बैली

13

गोल्फस्क्रिप्ट, 10046/9999 100 1.0047 (असममित स्कोर 1)

ठीक है, मैं कोशिश कर रहा हूँ और इस के साथ डीसी की एपीएल प्रविष्टि को हराया :

{\''+.,{(;\'.~1'}{'1'9999*@'.~']puts:puts}if}.~

इसके बाद के संस्करण कोड है नहीं वास्तविक Quine - मुझे लगा कि एक 10kb एक लाइनर पोस्टिंग एक बहुत अच्छा विचार नहीं होगा। बल्कि, ऊपर दिए गए कोड को चलाने से एक बार वास्तविक 10046-चार गोल्फस्क्रिप्ट प्रोग्राम का उत्पादन होता है, जो जब प्रश्न में निर्दिष्ट के रूप में पुनरावृत्त होता है, तो स्वयं के 9999 रोटेशन उत्पन्न करता है और, अंत में, फिर से।

चक्र की लंबाई (और कार्यक्रम) को स्थिर बदलकर समायोजित किया जा सकता है 9999। संक्षिप्तता और सुविधा के लिए, मैं दिखाऊंगा कि निरंतर उत्पादन कम होने पर पुनरावृत्त आउटपुट कैसा दिखता है 9:

111111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~
11111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~1
1111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~11
111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~111
11111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~1111
1111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~11111
111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~111111
11{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~1111111
1{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~11111111
{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~111111111
111111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~
11111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~1
1111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~11
111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~111
etc.

जैसे-जैसे निरंतर 9999वृद्धि होती जाती है, प्रोग्राम की लंबाई और चक्र की लंबाई (माइनस वन) का अनुपात एक हो जाता है। मुझे पूरा यकीन है कि इस समाधान को पीटा नहीं जा सकता है, कम से कम asymptotically नहीं। ;-)

यह कैसे काम करता है?

गोल्फस्क्रिप्ट क्विंस लिखने के लिए एक बहुत ही आसान भाषा है, क्योंकि मूल रूप से कोई भी नंबर शाब्दिक रूप से क्वीन के रूप में कार्य करता है: उदाहरण के लिए, गोल्फस्क्रिप्ट प्रोग्राम 12345आउटपुट - आपने यह अनुमान लगाया है - 12345। साथ ही, कई क्वीनों को मिलाकर एक क्वीन का उत्पादन होता है। इस प्रकार, मैं 11111...111अपने चक्रीय कुनैन के दोहराव वाले भाग की तरह एक सरल संख्या का उपयोग कर सकता हूं।

हालांकि, वास्तव में चक्र को प्राप्त करने के लिए, हमें गैर-तुच्छ "पेलोड" को ले जाने और निष्पादित करने की आवश्यकता है। सबसे सरल गोल्फस्क्रिप्ट क्वीन जो मैं सोच सकता था कि वह निम्नलिखित है:

{PAYLOAD'.~'}.~

इसलिए मेरी योजना एक पुनरावृत्ति के साथ एक पुनरावृत्ति की तरह था, एक दोहराव वाले संख्यात्मक स्थिर के साथ, और एक पेलोड का उपयोग करें जो संख्या से एक अंक काटता है और इसे कार्यक्रम के अंत में ले जाता है। यदि प्रोग्राम पहचान लेता है कि है उसके सामने कोई सांख्यिक निरंतर (इस स्थिति में स्टैक पर यह नीचे दिए गए मान कोई रिक्त स्ट्रिंग हो जाएगा, कोई इनपुट संभालने), यह बजाय के सामने एक निश्चित लंबाई संख्यात्मक निरंतर पहले जोड़ें जाएगा अपने आप।

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

हालांकि, वहाँ से बचने के लिए एक (AFAIK) अनिर्दिष्ट तरीका है: दुभाषिया वास्तव putsमें मुद्रण करने के लिए पूर्वनिर्धारित फ़ंक्शन को कॉल करता है , इसलिए उस फ़ंक्शन को पुन: परिभाषित करता है क्योंकि एक नो-ऑप स्वचालित आउटपुट को दबा देता है। बेशक, इसका मतलब यह भी है कि putsजिस स्टैक को हम प्रिंट करना चाहते हैं उसके हिस्से को प्रिंट करने के लिए हमें पहले खुद को कॉल करना होगा ।

अंतिम कोड बहुत गन्दा लगता है (भले ही गोल्फस्क्रिप्ट के लिए), लेकिन कम से कम यह काम करता है। मुझे संदेह है कि कुछ चालाक तरीके हो सकते हैं, मैंने अभी तक पेलोड से कुछ चार्ट को दाढ़ी बनाने के बारे में नहीं सोचा है, लेकिन इस संस्करण के लिए मैं मुख्य रूप से केवल अस्वाभाविक स्कोर पर ध्यान केंद्रित कर रहा था।


मेरे बिना काम करने लगता है puts{}:puts, हालांकि मैं {print}:putsइस आधार पर एक तर्क देख सकता था कि आउटपुट में एक नई लाइन का मतलब होगा कि यह कड़ाई से साइकिल नहीं है।
पीटर टेलर

@Peter: ]puts{}:putsरैप-अराउंड के लिए की जरूरत {STUFF}.~111111111है 111111111{STUFF}.~, अन्यथा 1कार्यक्रम के अंत में s की संख्या सिर्फ बढ़ती और बढ़ती रहती है। ( {}अनावश्यक प्रतीत होता है, हालांकि, जाहिर तौर पर, गोल्फस्क्रिप्ट दुभाषिया एक खाली स्टैक से असाइनमेंट की अनुमति देता है।)
इल्मरी करोनें

बहुत अच्छा है, हालांकि ऐसा लग रहा है कि डीसी ने 1 के एक असममित स्कोर के साथ एक समाधान भी पोस्ट किया है, इसलिए हमारे पास एक टाई हो सकती है।
गॉर्डन बेली

-3

HTML, माइनस इनफिनिटी (लगभग)

-2

AA

-10

AAAAAAAAAA

और इसी तरह ... अगर कोई बताता है कि यह धोखा है, तो हम इसके बारे में बहस कर सकते हैं, लेकिन मुझे सवाल में एक छेद मिला है :)

इसलिए मुझे लगता है कि हर कोई समझता है कि कोड करता है, इसमें कोई लूप नहीं है, इसलिए सबसे लंबा लूप है 0और प्रोग्राम की लंबाई है n, स्कोर है n / (0 - 1)या -n, मैं प्रोग्राम लिख सकता हूं जिसमें nबड़ा सकारात्मक पूर्णांक है, लेकिन यह बेकार है, क्योंकि हर कोई इसे समझता है।


7
कहने के लिए क्षमा करें, लेकिन आपकी साइकिल की लंबाई 1 है, 0. नहीं। तो आपका स्कोर n / 0 है जो न तो नकारात्मक है और न ही छोटा है।
पॉल थॉमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.