दिन का यादृच्छिक गोल्फ # 1: एक सरणी फेरबदल


35

श्रृंखला के बारे में

मैं यादृच्छिकता के विषय के इर्द-गिर्द घूमती कोड-गोल्फ चुनौतियों की एक छोटी श्रृंखला चला रहा हूँ। यह मूल रूप से एक 9-होल गोल्फ कोर्स होगा , लेकिन कई सवालों पर फैला हुआ है। आप व्यक्तिगत रूप से किसी भी चुनौती में भाग ले सकते हैं जैसे कि यह एक सामान्य प्रश्न था।

हालांकि, मैं सभी चुनौतियों के बीच एक लीडरबोर्ड को बनाए रखूंगा। श्रृंखला 9 चुनौतियों (अब के लिए) पर चलेगी, हर कुछ दिनों में एक पोस्ट की गई है। प्रत्येक उपयोगकर्ता जो सभी 9 चुनौतियों में भाग लेता है , पूरी श्रृंखला जीतने के लिए पात्र है। उनका समग्र स्कोर प्रत्येक चुनौती पर उनके सबसे छोटे सबमिशन का योग है (इसलिए यदि आप दो बार चुनौती का जवाब देते हैं, तो केवल बेहतर उत्तर स्कोर की ओर गिना जाता है)। अगर कोई भी 28 दिनों के लिए इस समग्र लीडरबोर्ड पर शीर्ष स्थान रखता है, तो मैं उन्हें 500 प्रतिनिधि का इनाम दूंगा ।

यद्यपि मेरे पास श्रृंखला के लिए विचारों का एक समूह है, लेकिन भविष्य की चुनौतियां अभी तक पत्थर में सेट नहीं हैं। यदि आपके कोई सुझाव हैं, तो कृपया मुझे संबंधित सैंडबॉक्स पोस्ट पर बताएं ।

छेद 1: एक सरणी फेरबदल

पहला कार्य बहुत सरल है: पूर्णांक के एक गैर-खाली सरणी को देखते हुए, इसे यादृच्छिक रूप से फेरबदल करें। हालांकि कुछ नियम हैं:

  • हर संभव क्रमचय को उसी संभावना के साथ लौटाया जाना चाहिए (ताकि फेरबदल में एक समान वितरण हो)। आप यह जांच सकते हैं कि क्या आपका एल्गोरिदम जावास्क्रिप्ट में इसे लागू करने से एकरूपता / निष्पक्ष है , क्या यह फेरबदल करेगा , जो पक्षपात के एक मैट्रिक्स का उत्पादन करेगा - परिणाम उनके अंतर्निहित इन्स -फ़िशर-येट्स या सॉर्ट (यादृच्छिक क्रम) के रूप में समान दिखना चाहिए ।
  • आपको सरणी में फेरबदल करने के लिए या यादृच्छिक क्रमपरिवर्तन उत्पन्न करने के लिए किसी भी अंतर्निहित या 3-पक्षीय विधि का उपयोग नहीं करना चाहिए (या सभी क्रमपरिवर्तन की गणना करें)। विशेष रूप से, आपके द्वारा उपयोग किया जाने वाला एकमात्र अंतर्निहित यादृच्छिक फ़ंक्शन एक बार में एक ही यादृच्छिक संख्या प्राप्त कर रहा है । आप मान सकते हैं कि कोई भी निर्मित यादृच्छिक संख्या विधि O (1) में चलती है और अनुरोधित अंतराल पर पूरी तरह से समान है (गणितीय अर्थ में - आप यहां फ्लोटिंग-पॉइंट प्रतिनिधित्व के विवरण को अनदेखा कर सकते हैं)। यदि आपकी भाषा आपको एक साथ m यादृच्छिक संख्याओं की सूची प्राप्त करने देती है , तो आप इस सुविधा का उपयोग कर सकते हैं, बशर्ते कि m संख्याएँ एक दूसरे से स्वतंत्र हों, और आप इसे O (m) के रूप में गिनते हैं।
  • आपका कार्यान्वयन O (N) की समय जटिलता से अधिक नहीं होना चाहिए , जहां N को फेरबदल करने के लिए सरणी का आकार है। उदाहरण के लिए, आप "यादृच्छिक संख्याओं द्वारा क्रमबद्ध" नहीं कर सकते।
  • आप या तो सरणी को जगह में फेरबदल कर सकते हैं, या एक नया सरणी बना सकते हैं (जिस स्थिति में पुराना सरणी आप की तरह संशोधित किया जा सकता है)।

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

इनपुट और आउटपुट किसी भी सुविधाजनक सूची या स्ट्रिंग प्रारूप में हो सकते हैं, लेकिन -2 -2 31 x <2 31 की सीमा में मनमाने ढंग से पूर्णांकों का समर्थन करना चाहिए । सिद्धांत रूप में, आपके कोड को सरणियों के लिए 2 31 की लंबाई तक काम करना चाहिए , हालांकि यह जरूरी नहीं कि आपकी मेमोरी में फिट हो या उचित समय के भीतर पूरा हो। (मैं बस हार्डकोड छोरों या कुछ के लिए मनमाने आकार की सीमाएं नहीं देखना चाहता हूं।)

यह कोड गोल्फ है, इसलिए सबसे छोटा सबमिशन (बाइट्स में) जीतता है।

लीडरबोर्ड

निम्नलिखित स्निपेट श्रृंखला की सभी चुनौतियों के बीच एक लीडरबोर्ड उत्पन्न करेगा।

यह सुनिश्चित करने के लिए कि आपके उत्तर दिखाए गए हैं, कृपया प्रत्येक मार्कलाइन के साथ निम्नलिखित मार्कडाउन टेम्प्लेट का उपयोग करके प्रत्येक उत्तर को शुरू करें:

# Language Name, N bytes

Nआपके प्रस्तुत करने का आकार कहां है। यदि आप अपने स्कोर में सुधार करते हैं, तो आप पुराने अंकों को हेडलाइन में रख सकते हैं , उनके माध्यम से स्ट्राइक करके। उदाहरण के लिए:

# Ruby, <s>104</s> <s>101</s> 96 bytes

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


7
मैं निराश हूं कि हमें "चतुर" होने की अनुमति नहीं है और "यादृच्छिक संख्या प्राप्त करें" के अलावा पुस्तकालय कार्यों का उपयोग करें । क्या हम फिशर-येट्स के फेरबदल के 69 और कार्यान्वयनों को देखना चाहते हैं? कृपया भविष्य के कार्यों में इस नियम को हटाने पर विचार करें। इसके अलावा, समय जटिलता पर एक सीमा क्यों? कृपया इसे कम से कम O (n ^ 2) करने पर विचार करें; मुझे भी लगता है कि यदि आप O (n!) को अनुमति देते हैं तो कोई विशेष रूप से गोल्फ का कार्यान्वयन पा सकता है।
एनाटॉलीग

7
@anatolyg हर उत्तर sortby(random)( या तो समय की पाबंदी का कारण) या बस .shuffle()(बिल्ट-इन-प्रतिबंध का कारण ) होने के कारण प्रतिबंध की मात्रा को हटाता है , जो मुझे लगता है कि फिशर-वाई या कुछ अन्य को लागू करने की तुलना में बहुत कम चतुर है दृष्टिकोण।
मार्टिन एंडर

1
यदि जगह में फेरबदल किया जाता है, तो फ़ंक्शन को सरणी को वापस करना पड़ता है , या क्या यह पर्याप्त है कि इसे संशोधित किया गया है? क्या मैं shuffle(array)इसके बजाय एक फ़ंक्शन लिख सकता हूं newArray=shuffle(array)?
2

1
@ बकुरीउ का दावा है कि आप रेखीय समय में क्रमबद्ध कर सकते हैं यदि संख्याएं तय की गई हैं, तो यह दावा करना थोड़ा सा है कि यदि आप इनपुट आकार तय करते हैं तो आप O (1) में कुछ भी कर सकते हैं। इसके अलावा प्रासंगिक प्रतिबंध निश्चित आकार के सरणियों हैं, निश्चित आकार के पूर्णांक नहीं - क्योंकि सरणी आकार निर्धारित करता है कि आपको अपने यादृच्छिक संख्याओं की कितनी बड़ी आवश्यकता है। वैसे भी, समय जटिलता पर सीमा आपके द्वारा लागू किए जाने वाले सामान्य एल्गोरिदम के लिए निश्चित रूप से होती है, जबकि इनपुट आकार की सीमाएं लागू होती हैं, इसलिए आपको मनमाने ढंग से सटीक पूर्णांक का उपयोग करने की आवश्यकता नहीं है यदि आपकी भाषा उन्हें बॉक्स से बाहर का उपयोग नहीं करती है। ।
मार्टिन एंडर

2
जब यह वास्तव में 14 साल का है तो Adám का समाधान 43319 बाइट्स के रूप में क्यों आ रहा है?
boboquack

जवाबों:


20

दिल्लोग एपीएल, 25 24 बाइट्स

25-चरित्र समाधान के लिए सबसे पहले: i{⊃a[⍺⍵]←a[⍵⍺]}¨?i←⌽⍳⍴a←⎕

                      a←⎕ ⍝ evaluated input, assign to "a"
                     ⍴a   ⍝ length
                    ⍳⍴a   ⍝ 1 2 .. length
                   ⌽⍳⍴a   ⍝ length .. 2 1
                 i←       ⍝ assign to "i"
                ?i        ⍝ random choices: (1..length)(1..length-1)..(1 2)(1)
i{            }¨?i        ⍝ for each index ⍺ and corresponding random choice ⍵
   a[⍺⍵]←a[⍵⍺]            ⍝ swap a[⍺] and a[⍵]
        ←                 ⍝ in Dyalog, assignment returns its right-hand side
  ⊃                       ⍝ first element, i.e. a[⍵]
                          ⍝ the result from {} is an array of all those a[⍵]

उपर्युक्त पर कुछ तुल्यता परिवर्तनों के बाद:

i {}¨ ?i  ←→  i {}¨∘? i   ⍝ because A f∘g B ←→ A f g B
          ←→  {}¨∘?⍨ i    ⍝ because f⍨ B ←→ B f B

हम असाइनमेंट से छुटकारा पा सकते हैं i←और एक चरित्र को बचा सकते हैं :

{⊃a[⍺⍵]←a[⍵⍺]}¨∘?⍨⌽⍳⍴a←⎕


3
... मन। उड़ा।
दन्यावांड

1
एक ऐसी भाषा जिसे मुझे बाएँ से दाएँ पढ़ना है ?? वाह!
चमकदार

5
@ जैसा कि अक्सर गणितीय संकेतन के साथ होता है: sin cos ln sqrt x
ngn

4
@ जब आप इसे उस तरह से लगाते हैं, जिससे मेरी पिछली टिप्पणी हँसी में बदल जाती है। हा।
चमकदार

5
@ronalchn एपीएल के लिए 8-बिट एनकोडिंग हैं, जैसे यह एक या यह अन्य; मैंने सुना है कि डायलॉग यूनिकोड के विकल्प के रूप में इनमें से एक का उपयोग करता है।
अनातोली

12

80386 मशीन कोड, 44 24 बाइट्स

कोड के Hexdump:

60 8b fa 0f c7 f0 33 d2 f7 f1 49 8b 04 8f 87 04
97 89 04 8f 75 ed 61 c3

FUZxxl के लिए धन्यवाद, जिन्होंने rdrandनिर्देश का उपयोग करने का सुझाव दिया ।

यहाँ स्रोत कोड है (विजुअल स्टूडियो द्वारा संकलित किया जा सकता है):

__declspec(naked) void __fastcall shuffle(unsigned size, int array[])
{
    // fastcall convention:
    // ecx = size
    // edx = array
    _asm
    {
        pushad;             // save registers
        mov edi, edx;       // edi now points to the array

    myloop:
        rdrand eax;         // get a random number
        xor edx, edx;
        div ecx;            // edx = random index in the array

        dec ecx;            // count down
        mov eax, [edi + 4 * ecx];   // swap elements
        xchg eax, [edi + 4 * edx];  // swap elements
        mov [edi + 4 * ecx], eax;   // swap elements
        jnz myloop;

        popad;              // restore registers
        ret;
    }
}

फिर भी एक और फिशर-येट्स कार्यान्वयन। रजिस्टरों में मापदंडों को पार करके अधिकांश गोल्फिंग हासिल की गई थी।


1
तुम भी rdrandshits और गिगल्स के लिए इस्तेमाल किया जा सकता है ।
फ़ूजएक्सएक्सएल

@FUZxxl मैं इसके बारे में पूरी तरह से भूल गया! बहुत बुरा यह मेरे जवाब के बारे में सबसे दिलचस्प हिस्सा निकाल देता है ...
anatolyg

9

जावा, 88 101

एक बुनियादी फिशर-येट्स फेरबदल चाल करता है। मुझे लग रहा है कि यह बहुत ही सामान्य रूप से यहां इस्तेमाल किया जाएगा, क्योंकि यह जल्दी और आसानी से लागू होता है। यहाँ कुछ लूप / असाइनमेंट cramming है, लेकिन वहाँ ईमानदारी से बहुत ज्यादा गोल्फ नहीं है; यह स्वभाव से छोटा है।

void t(int[]s){for(int i=s.length,t,x;i>0;t=s[x*=Math.random()],s[x]=s[i],s[i]=t)x=i--;}

कुछ लाइन टूटने के साथ:

void t(int[]s){
    for(int i=s.length,t,x;
        i>0;
        t=s[x*=Math.random()],
        s[x]=s[i],
        s[i]=t
    )
        x=i--;
}

यह मूल सरणी को संशोधित करते हुए जगह में फेरबदल करता है s[]। परीक्षण कार्यक्रम:

public class Shuffle {
    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6,7,8,9};
        new Shuffle().t(a);
        for(int b:a)
            System.out.print(b+" ");
    }
    void t(int[]s){for(int i=s.length,t,x;i>0;t=s[x*=Math.random()],s[x]=s[i],s[i]=t)x=i--;}
}

1
नहीं, चुनौती बताती है कि आप मान सकते हैं कि यह " अनुरोधित सीमा पर पूरी तरह से समान है "। अनुरोधित श्रेणी का Math.random()आकार एक आकार है जो दो की शक्ति है, इसलिए यह कल्पना को पूरा नहीं करता है।
पीटर टेलर

1
@PeterTaylor Jan और Geobits की व्याख्याएं वास्तव में हैं कि मैंने कैसे नियम का इरादा किया है - कि आपको अपने PRNG की वास्तविक चक्र-लंबाई के बारे में चिंता करने की आवश्यकता नहीं है।
मार्टिन एंडर

1
@ मार्टिनबटनर की साइकिल की लंबाई यहां मुद्दा नहीं है - जो आपके शासन द्वारा कवर किया गया है। झांकियों का तालमेल है।
जॉन ड्वोरक

3
@ TheBestOne यह केवल वर्तमान में पोस्ट किए गए अजगर समाधान की तुलना में एक बाइट से छोटा है;)
18

1
अब नहीं है! : D
Sp3000

8

पायथन 2, 86 बाइट्स

from random import*
def S(L):i=len(L);exec"i-=1;j=randint(0,i);L[i],L[j]=L[j],L[i];"*i

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

युक्तियों के लिए @xnor और @colevk को धन्यवाद।


उस सीमा अभिव्यक्ति बहुत बोझिल लग रहा है। निश्चित रूप से यह मैन्युअल रूप से गिनने के लिए छोटा है while i:i-=1;...?
xnor

@xnor हाँ यह है - इसके लिए धन्यवाद। मैं भूल जाता हूं कि इस तरह की चीज whileसे कम समय के forलिए छोटी हो जाती है ...
213 पर Sp3000

1
Awww ... अब मेरा जावा उत्तर यह नहीं धड़क रहा है। मैं बहुत कम समय के लिए काफी खुश था :(
जियोबिट्स

आप एक और 2 बाइट्स i=len(L)को लूप की शुरुआत में डिक्रिमेंट बनाकर और बचाकर रख सकते हैं।
colevk

8

जे, ४५ ४४ अक्षर

यह एक मुश्किल था।

<@({.,?@#@}.({,<^:3@[{])}.)&>/@(<"0@i.@#,<)

यहाँ एक स्पष्टीकरण है:

  1. # y: टैली ऑफ़ y, अर्थात तत्वों की संख्या y
  2. ?@# y: एक यादृच्छिक संख्या समान रूप से सीमा से अधिक वितरित की जाती 1है (#y)-1
  3. x { y: सूचकांक से आइटम ।yx
  4. (<<<x) { y: इंडेक्स xमें आइटम को छोड़कर सभी आइटम y
  5. x , y: के लिए y जोड़ा गया x
  6. x ({ , <^:3@[ { ]) y: इंडेक्स xमें आइटम y, फिर अन्य सभी आइटम।
  7. (?@# ({ , <^:3@[ { ]) ]) yएक यादृच्छिक यह से y, तो अन्य सभी आइटम।
  8. x {. y: पहली xवस्तुओं से लिया गया y
  9. x }. y: पहला xआइटम गिरा से y
  10. x ({. , }.) y: पहला xआइटम ले लिया से yहै, तो पहले xआइटम गिरा सेy
  11. x ({. , (?@# ({ , <^:3@[ { ]) ])@}.) y: पहला xआइटम ले लिया से yहै, तो पहले xआइटम से yनंबर 7 में के रूप में संसाधित।
  12. x ({. , ?@#@}. ({ , <^:3@[ { ]) }.) y: ड्रॉप के साथ एक ही बात एक चरित्र को बचाने के लिए खींचा।
  13. u/ y: के आइटम के बीच u डाला गया y
  14. < y: y बॉक्सिंग की गई
  15. <"0 y: y बॉक्सिंग के प्रत्येक आइटम ।
  16. i. y: पूर्णांकों से 0करने के लिए y - 1
  17. i.@# y: पूर्णांकों से 0करने के लिए (#y) - 1
  18. (<"0@i.@# , <) y: से पूर्णांकों 0के लिए (#y) - 1प्रत्येक बॉक्सिंग और उसके बाद yएक बॉक्स में। इसकी आवश्यकता है क्योंकि J में सरणियाँ एक समान हैं। एक बॉक्स अपनी सामग्री के आकार को छुपाता है।
  19. x u&v y: पसंद है (v x) u (v y)
  20. > y: y खोला , वह है, उसके बॉक्स के बिना।
  21. x ({. , ?@#@}. ({ , <^:3@[ { ]) }.)&> y संख्या 12 से वाक्यांश इसके अनबोले तर्कों पर लागू होता है।
  22. ({. , ?@#@}. ({ , <^:3@[ { ]) }.)&>/ yसंख्या 21 के वाक्यांश को आइटम के बीच डाला गयाy
  23. ({. , ?@#@}. ({ , <^:3@[ { ]) }.)&>/@(<"0@i.@# , <) yसंख्या 22 से वाक्यांश संख्या 18 के वाक्यांश के परिणाम पर लागू होता है, या, के आइटम का एक समान क्रमांकन y

1
मैं सिर्फ सभी कोष्ठकों में अंतर नहीं कर सकता। और वह ट्रिपल बॉक्सिंग <@<@<@[भी एक रहस्य है ... स्पष्टीकरण की प्रतीक्षा है। :)
यादृच्छिक

2
एक बार जब यह समझाया जाता है, तो मैं इस उत्तर को आगे बढ़ा सकता हूं;;
जॉन ड्वोरक

@randomra यहाँ तुम जाओ।
फ्युजएक्सएक्सएल

@JDDvorak क्या स्पष्टीकरण संतोषजनक है?
16

महान व्याख्या! मैं from( {) के सभी बॉक्सिंग उपयोग के बारे में नहीं जानता था । और मुझे वास्तव में &>/एक सूची में हेरफेर करने की चाल पसंद है । मुझे यकीन है कि मैं कुछ समय पहले इसका इस्तेमाल कर सकता था।
यादृच्छिक

5

पायथ, 25 बाइट्स

इसका परीक्षण यहां करें।

फिर भी एक और फिशर-येट्स कार्यान्वयन। अनिवार्य रूप से @ Sp3000 अजगर समाधान के समान ही है, सिर्फ अजगर में।

FNrlQ1KONJ@QN XXQN@QKKJ)Q

स्वैपिंग ट्रिक के लिए @Jakube का धन्यवाद

<implicit>    Q=input()
FNrlQ1        For N in len(Q) to 1, only goes len Q-1 because how range implemented in pyth
 KON          K = random int 0-N
 J@QN         J=Q[N]
 <space>      Suppress print
 XXQN@QKKJ    Swap K and J
)             End for
Q             Print Q

आप उन दो सूची असाइनमेंट को जोड़कर दो बाइट्स बचा सकते हैं: `XQN @ QK XQKJ` के बजाय` XXQN @ QKKJ`।
जकुबे

@Jakube टिप के लिए धन्यवाद। मुझे पता था कि एक सूची में मूल्यों को स्वैप करने का एक तरीका रहा होगा, और यह वास्तव में स्मार्ट है। आपको इसे सुझावों की सूची में जोड़ना चाहिए।
माल्टसेन

4

पर्ल, 68 56 44

कई अन्य समाधानों की तरह, यह फिशर-येट्स एल्गोरिथ्म का उपयोग करता है।

का उपयोग करते हुए nutki की टिप्पणी 12 वर्ण का उपयोग करके सहेजे जाते हैं $_के बजाय $iऔर सरणी सूचकांक में आपरेशन प्रदर्शन।

44:

sub f{@_[$_,$j]=@_[$j=rand$_,--$_]for 1..@_}

56:

sub f{$i=@_;$j=int(rand$i),@_[$i,$j]=@_[$j,$i]while$i--}

यह मेरा पहला कोडगोल्फ है।


एक बुरी शुरुआत नहीं, मुझे नहीं पता था कि आप @_[...]उस तरह के रूप में उपयोग कर सकते हैं । में आगे गोल्फ हो सकता है sub f{@_[$_,$j]=@_[$j=rand$_,--$_]for 1..@_}
नटकी

3

सी, 63 61 60 बाइट्स

i,t;s(a,m)int*a;{for(;m;a[m]=t)t=a[i=rand()%m--],a[i]=a[m];}

फिशर-येट्स का बस एक सीधा कार्यान्वयन जो जगह में दिए गए सरणी को सॉर्ट करता है। कंपाइल और लिंक दृश्य स्टूडियो कंपाइलर (vs2013, अन्य संस्करणों का परीक्षण नहीं किया है) और इंटेल कंपाइलर के साथ पूरी तरह से ठीक है। अच्छा लग रहा है समारोह हस्ताक्षर है s(int array[], int length)। मैं वैध रूप से प्रभावित हूं मैंने पायथन और रूबी को हराया।

यह मान लिया srand()जाता है और रैंड () को ठीक से लागू किया जाता है, लेकिन मेरा मानना ​​है कि यह नियम इसके लिए अनुमति देता है:

You may assume that any built-in random number method runs in O(1) and is perfectly uniform over the requested interval

अच्छी तरह से स्वरूपित संस्करण:

index, temp;
shuffle(array, length) int* array;  {
    for(;length; array[index] = temp)
        index = rand() % length--,
        temp = array[length],
        array[length] = array[index];
}

मुझे लगता है कि यह फ़ंक्शन हेडर बनाने के लिए पर्याप्त है s(a,m)*a{, लेकिन मुझे यकीन नहीं है और या तो परीक्षण नहीं करना चाहता। आप xorइन-व्हाट्सएप करना चाह सकते हैं , जैसे कि a[i]^=a[m]^=a[i]^=a[m]। यह भी घोषित करने की आवश्यकता से बचा जाता है t
22

@FUZxxl मेरा मानना ​​है कि अगर कोई ज़ोर से झपकी लेता है तो समस्याएँ होती हैं i==m
भूतकाल

@Geobits वास्तव में। मैं उस संभावना से चूक गया।
FUZxxl

मैं सिर्फ यह पता लगाने की कोशिश कर रहा था कि वह काम क्यों नहीं कर रहा है ... उसे याद रखना चाहिए था। इसके अलावा मुझे s(a,m)int*aविजुअल स्टूडियो और इंटेल कंपाइलर की भी जरूरत है। परीक्षण के लिए gcc या clang स्थापित नहीं है, लेकिन मुझे लगता है कि वे भी शिकायत करेंगे।
छद्म नाम

यह सुंदर प्रभावशाली गोल्फ है। बहुत सारे संशोधनों की कोशिश करने के बाद, जो कुछ भी नहीं बचा, मैंने 2 पात्रों को बचाने का एक तरीका देखने का प्रबंधन किया। यदि आप स्वैप ऑर्डर बदलते हैं तो पहला स्वैप स्टेटमेंट बन जाता है t=a[i], फिर आप i=rand()%m--स्टेटमेंट को ऐरे इंडेक्स के रूप में अंदर ले जा सकते हैं ।
रनर १११२

3

ऑक्टेव, 88 77 बाइट्स

function s=r(s)for(i=length(s):-1:1)t=s(x=randi(i));s(x)=s(i);s(i)=t;end;end

फिर भी एक और फिशर-येट्स कार्यान्वयन ... अगर मैं सामान्य लाइन रिटर्न और रिक्ति जोड़ूं तो यह बिल्कुल सीधा होना चाहिए:

function s=r(s)
  for(i=length(s):-1:1) # Counting down from i to 1
    t=s(x=randi(i));    # randi is builtin number generator for an int from 0 to i
    s(x)=s(i);
    s(i)=t;
  end
end

"अंत" कीवर्ड वास्तव में दुर्भाग्य से यहां गोल्फ स्कोर को मारते हैं। अरे, मैं "एंडफ़ोर" और "एंडफ़ंक्शन" के बजाय "एंड" का उपयोग कर सकता हूं!


1
बस FYI करें, "बाइट" वास्तव में कोड वजह से नहीं है, यह सिर्फ यकीन है कि वहाँ बनाता है एक शीर्षक है, जो अल्पविराम के बाद एक अल्पविराम (भाषा अलग करने के लिए) और कम से कम एक संख्या में शामिल हैं, और उसके बाद अभी पिछले चुनता है संख्या जो पार नहीं हुई है। वहाँ "बाइट्स" होने के बावजूद अभी भी अच्छा है। ;)
मार्टिन एंडर

1
के numelबजाय का उपयोग करके आप 1 बाइट बचा सकते हैं lenght। एक बोनस के रूप में आपका कार्यक्रम 2-डी सरणियों उर्फ ​​मैट्रिसेस के साथ भी काम करेगा;)
paul.oderso

2

जावा 8, 77

(x)->{for(int i=x.length,j,t;;t=x[j*=Math.random()],x[j]=x[i],x[i]=t)j=i--;};

यह एक लंबोदर ले रहा है int[]और शून्य लौट रहा है। मेरा पहला प्रयास बहुत दिलचस्प नहीं लग रहा था, इसलिए मैंने एक अपवाद फेंककर इसे बाहर निकलने का फैसला किया।

परीक्षण कार्यक्रम:

interface shuff {
    void shuff(int[] x);
}
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        shuff s = (x)->{for(int i=x.length,j,t;;t=x[j*=Math.random()],x[j]=x[i],x[i]=t)j=i--;};
        int[] x = {3, 9, 2, 93, 32, 39, 4, 5, 5, 5, 6, 0};
        try {
            s.shuff(x);
        } catch(ArrayIndexOutOfBoundsException _) {}
        for(int a:x) System.out.println(a);
    }
}

1
यह एक समारोह हस्ताक्षर लिखने के लिए चारों ओर पाने के लिए एक लैम्ब्डा का उपयोग करने के लिए धोखा नहीं है, जब आपको कहीं भी लैम्बडा का उपयोग करने के लिए एक प्रतिनिधि की आपूर्ति करनी है? इसके अलावा ... क्या आप कोष्ठकों को चारों ओर नहीं छोड़ सकते Math.random()?
Rawling

1
@Rawling आप इस मेटा प्रश्न में वोट कर सकते हैं । वर्तमान में, लैम्ब्डा के पक्ष में 9 वोट हैं, और 0 के खिलाफ। हां, कोष्ठक हटाया जा सकता है।
19

हुह, अगर वहाँ एक मेटा पोस्ट और एक बहुत दूर की सहमति है तो दूर आग। (और मुझ पर दो-लोअर गोल्फ स्कोर का आनंद लें: पी)
कच्चे करना

3
मुझे लगता है, एक सामान्य मामले में अपवाद द्वारा कार्य को रोकना अनुचित है, क्या ऐसा है?
क्वर्टी

1
@Qwertiy प्रत्येक अपने स्वयं के लिए ... आपको लगता है कि यह अनुचित है, मुझे लगता है कि यह बहुत अच्छा है।
feersum

2

गोल्फलुआ, ३ 37

कैसे करें गोल्फलुआ?

~@i=1,#X`r=M.r(i)X[i],X[r]=X[r],X[i]$

इनपुट को चर X में तालिका के रूप में प्रदान किया गया है। तालिका को जगह में फेरबदल किया गया है।

उदाहरण का उपयोग:

> X={0,-45,8,11,2}
> ~@i=1,#X`r=M.r(i)X[i],X[r]=X[r],X[i]$
> w(T.u(X))
-45 0 8 11 2

2

आर, 79 बाइट्स

f=function(x){n=length(x);for(i in 1:n){j=sample(i:n,1);x[c(i,j)]=x[c(j,i)]};x}

यह फिशर-येट्स फेरबदल का सीधा कार्यान्वयन है। आर फ़ंक्शन sampleसमान संभावना के साथ दिए गए वेक्टर से दिए गए आकार का एक सरल यादृच्छिक नमूना बनाता है। यहाँ हम पूर्णांकों से प्रत्येक यात्रा पर आकार 1 के बेतरतीब नमूने ड्राइंग कर रहे हैं i, ..., n। जैसा कि प्रश्न में कहा गया है, इसे O (1) माना जा सकता है, इसलिए इस सभी कार्यान्वयन में O (N) होना चाहिए।


2

मतलूब, 67

फिशर-येट्स को लागू करना।

a=input('');n=numel(a);for i=1:n;k=randi(i);a([i,k])=a([k,i]);end;a

मुझे लगा कि यह बहुत बुरा है मैं मतलाब के randpermकार्य का उपयोग नहीं कर सकता । लेकिन आसपास कुछ गड़बड़ होने के बाद, मैंने सोचा कि मैं यह देखने के स्रोत को randpermदेख सकता हूं कि यह कैसे किया जाता है, और मुझे यह देखकर आश्चर्य हुआ कि वहाँ सिर्फ एक पंक्ति थी: [~,p] = sort(rand(1,n))=)


2

पर्ल, 44

sub f{($_[$x],$_)=($_,$_[$x=rand++$i])for@_}

44 अक्षरों में एक और प्रति। उदाहरण का उपयोग करें:

@x=(1..9);f(@x);print@x

2

गणितज्ञ, 82 90 83 93 बाइट्स

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

f@s_:=(a=s;m=Length@a;Do[t=a[[r=RandomInteger@{1,m-1}]];a[[r]]=a[[m]]; a[[m]]=t,{n,1,m-1}];a)

आप Doयहाँ उपयोग कर सकते हैं । से छोटा है While
alephalpha

2

रूबी, 57 बाइट्स

->a{a.size.times{|i|j=rand(i+1);a[i],a[j]=a[j],a[i]};p a}

इनपुट (लैम्बडा फ़ंक्शन के रूप में):

f.([1,2,3,4,5])

आउटपुट:

[2, 1, 4, 3, 5]


2

के, 31 वर्ण

f:{{l[i:x,1?x]:l@|i}'|!#l::x;l}

उतना छोटा नहीं जितना मैंने पहले रखा था (जो अयोग्य हो गया) ... ओह अच्छा।

यह एक बुनियादी फिशर-येट्स फेरबदल है। यह बहुत से मदद से बनाया गया था Kona मेलिंग सूची


2

जावास्क्रिप्ट (ईएस 6), 66

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

F=a=>a.map((v,i)=>a[a[i]=a[j=0|i+Math.random()*(a.length-i)],j]=v)

2

MATL , 16 बाइट्स

XH`HnYr&)XHxvHHn

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

MATL में फिशर-येट्स। इस कार्यक्रम का लगभग एक तिहाई अक्षर को समर्पित है H, जो MATL में क्लिपबोर्ड फ़ंक्शन से मेल खाता है।

मूल रूप से, Hअप्रयुक्त वस्तुओं को इनपुट से संग्रहीत करता है, जबकि स्टैक फेरबदल सूची का ट्रैक रखता है।


2

जाप, १२

rÈiMqZÄ Y}[]

कोशिश करो!

-10 (लगभग आधा?) @ शुग्गी को धन्यवाद!

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

नीचे दी गई रणनीति है:

  • खाली एरे से इनपुट सीडिंग कम करें
  • प्रत्येक चरण पर, वर्तमान तत्व को सम्मिलित करने के लिए एक यादृच्छिक स्लॉट ढूंढें

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

@ शैगी - सुझावों के लिए धन्यवाद! :) मैंने आपके दूसरे समाधान के थोड़ा संशोधित संस्करण का उपयोग करके समाप्त कर दिया। चूंकि कम फ़ंक्शन का तीसरा पैरामीटर एक सूचकांक है, हम पहले से ही लंबाई जानते हैं।
दाना

1

जावास्क्रिप्ट ईएस 6, 69

a=>{m=a.length;while(m)[a[m],a[i]]=[a[i=~~(Math.random()*m--)],a[m]]}

यह फिशर-येट्स है।

पुनश्च: फ़ायरफ़ॉक्स में परीक्षण किया जा सकता है


@ मार्टिनबटनर, इसे हटा दिया :)
23


1

हास्केल, 170

import System.Random
import Data.Array.IO
s a=do(_,n)<-getBounds a;sequence$map(\i->do j<-randomRIO(i,n);p<-a%i;q<-a%j;writeArray a j p;return q)[1..n]where(%)=readArray

एक अन्य फिशर-येट्स समाधान https://wiki.haskell.org/Random_shuffle पर एल्गोरिथ्म से प्रेरित है ।

s एक समारोह है जिसमें हस्ताक्षर हैं: IOArray Int a -> IO [a]


1

CJam - 30

q~_,,W%{_I=I)mr:J2$=@I@tJ@t}fI

इसे http://cjam.aditsu.net/ पर आज़माएं

उदाहरण इनपुट: [10 20 30 40 50]
उदाहरण आउटपुट: 3020401050( pसुंदर मुद्रण के लिए कोड के अंत में जोड़ें )

यदि कोड को स्टैक से इनपुट लेने की अनुमति है (एक फ़ंक्शन की तरह), तो पहले 2 वर्णों को हटाया जा सकता है, आकार को 28 तक कम कर सकता है।

स्पष्टीकरण:

ऐरे के लिए "स्वैप" ऑपरेटर की कमी
(बाद में लागू किया जाना है: p)

q~            read and evaluate the input (let's call the array "A")
_,,           make an array [0 1 2 ... N-1] where N is the size of A
W%            reverse the array, obtaining [N-1 ... 2 1 0]
{…}fI         for I in this array
    _I=       push A[I]
    I)mr:J    push a random number from 0 to I (inclusive) and store it in J
              stack: A, A[I], J
    2$=       get A[J]
    @I@t      set A[I] = A[J]
              stack: former A[I], A
    J@t       set A[J] = former A[I]

जैसा कि टिप्पणियों में उल्लेख किया गया है, मुझे डर है कि यह अमान्य है। बहुत कम _पर O (N) (O (N) लूप के अंदर) है। दुर्भाग्य से, मुझे CJam में इसके आसपास काम करने का कोई रास्ता नहीं दिख रहा है।
मार्टिन एंडर

सूची को अपरिवर्तनीय वस्तुओं की तरह संभाला जाता है, इसलिए दोहराव को केवल संदर्भ को दोहराते हुए लागू किया जाता है। यह वास्तव में है tकि इसे मारता है, क्योंकि यह सूची को उत्परिवर्तित नहीं कर सकता है और अब इसे एक प्रतिलिपि बनाना होगा।
रनर ११२

@ मार्टिनबटनर मैं रनर १११ के समान ही पोस्ट करने वाला था; हाँ t, के साथ एक समस्या हो सकती है , मैं इसे भविष्य के संस्करणों में सुधारना चाहूंगा ..
aditsu

इसलिए यह कोड आंतरिक भाषा कार्यान्वयन मुद्दों के कारण प्रश्न की भावना का अनुसरण करता है, लेकिन "पत्र" का नहीं।
aditsu

1

जावास्क्रिप्ट (ईएस 6), 61

S=a=>(a.map((c,i)=>(a[i]=a[j=Math.random()*++i|0],a[j]=c)),a)

आप इसे परीक्षण कर सकते हैं यहाँ सिर्फ दर्शाने वाली पंक्ति जोड़कर shuffle = S(केवल Firefox)।


1

STATA, 161

di _r(s)
set ob wordcount($s)
token $s
g a=0
foreach x in $s{
gl j=floor(runiform()*_n)+1
replace a=`$j' if word($s,_n)=`x'
replace a=`x' if word($s,_n)=`$j'
}
l

अंतरिक्ष से अलग संख्या के रूप में इनपुट की अपेक्षा करता है। यदि आप चाहें तो हेडर और अवलोकन संख्या को आउटपुट से हटा सकते हैं, लेकिन अन्यथा यह कम है।


इसमें क्या है _n?
मार्टिन एंडर

_n वर्तमान अवलोकन की संख्या है।
bmarks


1

एसक्यूएफ, 91 बाइट्स

params["i"];{n=floor random count i;i set[_forEachIndex,i select n];i set[n,_x]}forEach i;i

1
यह पक्षपातपूर्ण है (देखें "स्वैप (i <-> यादृच्छिक)" विल यह फेरबदल पर), लेकिन आप को बदल कर फिशर-येट्स (जो निष्पक्ष है) में बदल सकते हैं %xके साथ %i
मार्टिन एंडर

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