रैंडम क्वाइन


15

एक ऐसा प्रोग्राम लिखें जो बेतरतीब ढंग से खुद को पैदा करने में सक्षम हो।

यह अपने स्रोत कोड में उपयोग किए गए टोकन के आधार पर करना चाहिए । यदि आपके प्रोग्राम का सोर्स कोड 50 यूनीक टोकन से बना है और 60 टोकन लंबा है, तो प्रोग्राम को 60 टोकन का उत्पादन करना चाहिए जहां प्रत्येक टोकन को अनूठे रूप से 50 यूनीक टोकन में से चुना जाता है।

उदाहरण के लिए, इस कार्यक्रम में 50 ^ 60 में खुद को पुन: पेश करने का मौका होगा।

एक टोकन क्या है? वह भाषा पर निर्भर करता है। उदाहरण के लिए, पहचानकर्ता ( foo_bar), कीवर्ड ( while), और नंबर ( 42) अधिकांश भाषाओं में टोकन के रूप में गिना जाएगा। अधिकांश भाषाओं में व्हॉट्सएप की गिनती नहीं होगी।

अतिरिक्त नियम:

  • आउटपुट में केवल प्रोग्राम प्रोग्राम कोड में पाए जाने वाले टोकन हो सकते हैं, जिन्हें उपयुक्त सीमांकक द्वारा अलग किया गया है
  • आउटपुट को प्रोग्राम के सोर्स कोड के समान लंबाई होना चाहिए, जो टोकन द्वारा गिना जाता है
  • केवल एक प्रोग्रामिंग भाषा का उपयोग किया जा सकता है
  • स्रोत कोड में कम से कम 3 अद्वितीय टोकन होने चाहिए
  • स्रोत कोड से टिप्पणियों को छोड़ दें
  • कार्यक्रम को केवल यू ^ एल में एक ही होना चाहिए जो खुद को पुन: उत्पन्न करने का मौका देता है

स्कोरिंग: वह कार्यक्रम जिसमें खुद को पुन: पेश करने का सबसे अच्छा मौका होता है, जीतता है।


@ मैथियोरोडिक: आप मान रहे हैं कि कार्यक्रम पुनरावृत्ति के बिना टोकन खींचता है।
user2357112

@MathieuRodic: मुझे rephrase दें। आप कार्यक्रम को अपने स्रोत में उपयोग किए जाने वाले यू टोकन के सेट से पुनरावृत्ति के साथ एल टोकन को आकर्षित करने के बजाय, अपने टोकन के मल्टीसेट को बेतरतीब ढंग से साफ़ कर रहे हैं।
user2357112

@ user2357112: मैं देख रहा हूं। मेरी गलती थी कि मैं इस समस्या को बिना प्रतिस्थापन के एक ड्रॉ के रूप में मानता हूं।
मैथ्यू रोडिक

1
नियम # 1 और # 5 मेरे विरोधाभासी प्रतीत होते हैं।
क्रंचर

4
क्या आप मान सकते हैं कि यादृच्छिक कार्यों में निर्मित TRNG हैं? विशिष्ट कार्यान्वयन में सभी आउटपुट उत्पन्न करने के लिए बहुत कम बीज होते हैं और इस प्रकार वास्तव में स्वयं को पुन: उत्पन्न करने में असमर्थ हो सकते हैं।
कोडइन्चोस 20

जवाबों:


11

पायथन 2, 3 ^ -3 = 0.037

execटोकन काउंट को कम करने के लिए दुरुपयोग काफी आसान है। अब स्रोत फ़ाइल को न पढ़ने के लिए अपडेट किया गया है!

exec '' """
s = '''{a}
s = {b}
s = s.format(a='"'*3, b="'"*3+s+"'"*3)
import random
tokens = ['exec', "''", s]
print random.choice(tokens), random.choice(tokens), random.choice(tokens),
{a}'''
s = s.format(a='"'*3, b="'"*3+s+"'"*3)
import random
tokens = ['exec', "''", s]
print random.choice(tokens), random.choice(tokens), random.choice(tokens),
"""

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

मूल, शुरुआती-स्रोत-फ़ाइल संस्करण:

exec '''
# String literals are one token!
import random
import tokenize

with open(__file__) as f:
    tokens = [x[1] for x in tokenize.generate_tokens(f.readline)][:-1]

''' '''
# Splitting the string into two strings pads the token count to the minimum of 3.

print random.choice(tokens), random.choice(tokens), random.choice(tokens),
'''

कड़ाई से बोलते हुए, पायथन व्याकरण स्रोत फ़ाइल के अंत में एक ENDMARKER टोकन रखता है, और हम ENDMARKERs के साथ एक स्रोत फ़ाइल का उत्पादन नहीं कर सकते हैं जिसके बारे में बेतरतीब ढंग से बताया गया है। हम दिखावा करते हैं यह मौजूद नहीं है।


@ क्रंचर संभावना है। 3 ^ -3 ==
1/3

2
नियमों के शानदार हैक के लिए +1। एक ही विचार जम्मू में लागू: ".]';(?3 3 3){]`".;~({:,],{:,],6#{:)'';(?3 3 3){]`".;~({:,],{:,],6#{:)'''''''
एल्गोरिदमार्क

5

जावास्क्रिप्ट, 102 टोकन, 33 अद्वितीय, 7.73 × 10 -154

ध्यान दें, यह एक सच्ची रानी है। यह फ़ाइल को पढ़ने या उपयोग evalया नहीं करता हैFunction.toString

meta = "meta = ; out = '' ; tokens = meta . split ( '\\u0020' ) ; tokens . push ( '\"' + meta + '\"' ) ; length = tokens . length ; tmp = length ; unique = { } ; while ( tmp -- ) unique [ tokens [ tmp ] ] = unique ; unique = Object . keys ( unique ) ; tmp = unique . length ; while ( length -- ) out += tokens [ ~~ ( Math . random ( ) * tmp ) ] + '\\u0020' ; console . log ( out )"; 
out = '';
tokens = meta.split('\u0020');
tokens.push('"' + meta + '"');
//console.log(tokens);
length = tokens.length;
tmp = length;
unique = { };
while(tmp--) unique[tokens[tmp]] = unique;
unique = Object.keys(unique);
//console.log(unique);
tmp = unique.length;
while(length--)
    out += unique[~~(Math.random() * tmp)] + '\u0020';
console.log(out)

4

पायथन: पी (1 परीक्षण में प्रोग्राम बनाना) = 3.0317 * 10 ^ -123

34 अद्वितीय टोकन, 80 कुल टोकन। ध्यान दें कि प्रत्येक पंक्ति के अंत में एक स्थान है।

import tokenize , random 
tokens = [ x [ 1 ] for x in tokenize . generate_tokens ( open ( __file__ , 'r' ) . readline ) ] [ : -1 ] 
s = '' 
for x in tokens : s += random . choice ( list ( set ( tokens ) ) ) ; s += [ ' ' , '' ] [ s [ -1 ] == '\n' ] 
print s 

नमूना उत्पादन:

' ' random len set 'r' , for ( list , import ] ] tokens : random [ for '\n' import readline readline 'r' tokens [ len 'r' import '' choice '' '' for in ( readline ( = open readline , list 1 list s += for s 1 , '' : 1 += list len - __file__ ; open __file__ print . - ] 'r' for import [ print . , 

; . [ [ print print __file__ generate_tokens ] ; open ] , readline 

पिछले दो टोकन को छोड़ने और उपयोग करने के लिए मुझे याद दिलाने के लिए user2357112 द्वारा अन्य पायथन समाधान के लिए धन्यवाद __file__


3

J - 1 में 11 17 = 1.978 x 10 -18

;(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''

जम्मू में इस तरह के काम करने के लिए छोटे छोटे उपकरण हैं।

  • सबसे पहले, किसी भी स्थान को अलग किए गए स्ट्रिंग की संख्या एक टोकन है । इसका अर्थ है उन संख्याओं का एक आयामी आयाम। इसी तरह से जे का लेक्सर काम करता है। वैसे, यह सत्रह 11एस है, अगर कोई भी उत्सुक है।

  • (,,,{:,{:)'QUINE'''जे में एक सामान्य क्वीन ट्रिक है, जिसे संभव के रूप में कुछ टोकन का उपयोग करने के लिए बनाया गया है: टेल का{: मतलब है , इसलिए यह स्ट्रिंग को खुद को जोड़ता है, और फिर अंतिम चरित्र की दो प्रतियां जोड़ता है। चूंकि अंतिम चरित्र एक एकल उद्धरण है (जे पास्कल-शैली के तार का उपयोग करता है), परिणाम है ।QUINE'QUINE'''

  • ;:एक टोकन है, और एक इनपुट स्ट्रिंग को तोड़ता है जैसे कि यह जे कोड था, जो बक्से की एक सूची लौटाता है। इस परिणाम की लंबाई 17 है।

  • ~.इस सरणी के सभी अद्वितीय तत्व लेता है। इस परिणाम की लंबाई 11 है।

  • ?रोल कहा जाता है । अपने तर्क में प्रत्येक पूर्णांक के लिए, यह उस संख्या से कम शून्य के बराबर या उससे अधिक एक यादृच्छिक सकारात्मक संख्या का चयन करता है। तो यहाँ J, 0 से 10 समावेशी तक 17 संख्याएँ उत्पन्न करेगा।

  • { अद्वितीय-टोकन-इन-बॉक्स की हमारी सूची में से आइटम का चयन करने के लिए यादृच्छिक सूचकांकों का उपयोग करता है।

  • ; इन सभी बॉक्स को खोलता है और परिणाम को एक साथ चलाता है।

कुछ उदाहरण अनुसरण करते हैं। इंडेंटेड लाइनें इनपुट प्रॉम्प्ट हैं, और बाईं ओर के साथ फ्लश लाइनें इंटरप्रेटर का आउटपुट हैं।

   ;(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''
~.~.(?;;:11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''(){11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){(;:;
   ;(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''
{';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)''',?{:;:{:';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11{:{;(;:{:,~.

2

परिशिष्ट भाग

यह एक मजेदार था

/cvx /cvx cvx /exec /exec cvx /dup /rand /mod /get /== /array /astore /realtime
/srand /repeat 6 17 54 17 /array cvx exec /astore cvx exec 54 /dup cvx /rand
cvx 17 /mod cvx /get cvx /== cvx 6 /array cvx exec /astore cvx exec cvx /realtime
cvx exec /srand cvx exec /repeat cvx exec

3.6e-67 मौका में लगभग 1 के लिए 17 अद्वितीय टोकन और 54 टोकन हैं।


2

व्हाट्सएप, 3 ^ -205 3 ^ -189 3 ^ -181 3 ^ -132 ~ = 10 ^ -63

यह एक व्हाट्सएप प्रोग्राम है, जिसमें यादृच्छिक वर्णों के साथ अंकुश लगाने पर 1 ^ 3 ^ 132 में खुद को पुन: उत्पन्न करने का मौका होता है (3 अलग टोकन, बार-बार 132)। इसे चलाते समय कम से कम 132 यादृच्छिक वर्णों के साथ सीड किया जाना चाहिए, (जैसे व्हाट्सएप में कोई अंतर्निहित यादृच्छिक या दिनांक फ़ंक्शन नहीं है some_whitespace_interpreter my_quine.ws <some_random_source >quine_output.ws। यदि कार्यक्रम को और अधिक चलाया जा सकता है, तो स्कोर में सुधार किया जाएगा, लेकिन यह मेरा पहला "वास्तविक" व्हॉट्सएप कार्यक्रम है, इसलिए मैं इसे केवल गोल्फ की मेरी अल्प राशि के साथ छोड़ दूंगा।

सादा व्हाट्सएप कोड, या इसे देखें : (इसे आज़माने के लिए, "संपादित करें" पर क्लिक करें, <प्री> टैग्स के अंदर सामान कॉपी करें; यूनिक्स-शैली EOL के साथ 132 अक्षर होने चाहिए)

    

























कोड क्या कमांड के साथ एनोटेट है (तकनीकी रूप से एक क्वीन नहीं है, क्योंकि यह टिप्पणियों को पुन: पेश नहीं करेगा):

स्टैक पुश_नंबर + 0 छोर
स्टैक पुश_नंबर + 1 0 0 1 छोर
ढेर की दुकान ढेर push_number + 1 छोर
स्टैक पुश_नंबर + 1 0 0 0 0 0 छोर
ढेर की दुकान ढेर push_number + 1 0 छोर
स्टैक पुश_नंबर + 1 0 1 0 छोर
हीप स्टोर स्टैक पुश_नंबर + 1 0 0 0 0 0 1 1 छोर
बहे
make_label loop_begin  
स्टैक पुश_नंबर + 1 1 छोर
आईओ  
पढ़ें चरित्र ढेर push_number + 1 1 छोर
ढेर ढेर push_number + 1 1 अंत प्राप्त करते हैं
अंकगणित मोडुलो हीप IO को पुनः प्राप्त करता है  
प्रिंट चार स्टैक पुश_नंबर + 1 छोर
अंकगणित घटाव स्टैक डुप्लिकेट
 बहे
jump_if_zero end_prog
बहे
पर कूदना 
loop_begin  
बहे
make_label end_prog
बहे
end_program

यदि बीज केवल समतुल्य होता है (वर्णों को टोकन में परिवर्तित करने के लिए मॉड 3 लिया जाता है), तो यह सफल होगा:

CCCCACCCBCCBABBCCCCBACCCBCCCCCABBCCCCBCACCCBCBCABBCCCCBCCCCCBBAACCBACCCBBABABCCCCBBABBBCCCBBABCBBBBBBACCCCCBABCCBCACABBAACABAACCAAAA

यह एक बहुत ही सरल कार्यक्रम है, लगभग इस रूबी कार्यक्रम के बराबर है:

i = 131
while true
    print '\t \n'[STDIN.getc.ord % 3]
    i = i - 1
    break if i < 0
end

1

पर्ल, 27 टोकन, पी = 1.4779 x 10 -34

@ARGV=$0;print$W[rand@W]for@W=split/(\W)/,readline

अंतिम संपादन: एक टोकन को बचाने के @ARGV=$0बजाय उपयोग करें open*ARGV,$0

  • 15 अनोखे टोकन
  • 4 टोकन दिखाई 2 बार ( =, /, @, $)
  • 1 टोकन 4 बार दिखाई देता है ( W)

इसलिए मुझे लगता है कि संभावना (2,2 * 4) * pow (4,4)) / pow (27,27), लगभग 1.48E-34 बनाता है।

यदि स्रोत कोड नामक फ़ाइल में है ARGV, तो आप इस 26 टोकन समाधान का उपयोग P = ~ 2.193 x 10 -31 के साथ कर सकते हैं :

@ARGV=ARGV;print$ARGV[rand@ARGV]for@ARGV=split/(\W)/,readline

दरअसल, P = (4 * 2! + 4!) / 27!जो लगभग 1.7632684538487448 x 10 ^ -26 है
मैथ्यू रोडिक

0

पर्ल 6 ,1 में 33 = 0.037037 ...

(मुझे पता है कि यह कोड-गोल्फ नहीं है, लेकिन ...)

q[say |roll <<~~"q[$_]".EVAL>>: 3]~~.EVAL

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

पायथन के उत्तर के समान, जहां पहला टोकन एक स्ट्रिंग शाब्दिक है जिसका मूल्यांकन किया जाता है। टोकन हैं

q[say |roll <<~~"q[$_]".EVAL>>: 3]   String literal
~~                                   Smartmatch operator
.EVAL                                Function call

स्पष्टीकरण:

q[say |roll <<~~"q[$_]".EVAL>>: 3]         # Push as string literal
                                  ~~       # Smartmatch by setting $_ to the string literal
                                    .EVAL  # Eval the string
            <<~~"q[$_]".EVAL>>             # From the list of tokens
       roll                   : 3          # Pick 3 times with replacement
  say |                                    # Join and print
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.