দিনের র‌্যান্ডম গল্ফ # 1: একটি অ্যারে পরিবর্তন করুন


35

সিরিজ সম্পর্কে

আমি এলোমেলোতার থিমের চারদিকে ঘোরে কোড-গল্ফ চ্যালেঞ্জগুলির একটি সামান্য সিরিজ চালিয়ে যাব। এটি মূলত একটি 9-হোল গল্ফ কোর্স হবে , তবে বিভিন্ন প্রশ্নের মধ্যে ছড়িয়ে পড়ে। আপনি স্বতন্ত্রভাবে যে কোনও চ্যালেঞ্জে অংশ নিতে পারেন যেন এটি একটি সাধারণ প্রশ্ন।

যাইহোক, আমি সমস্ত চ্যালেঞ্জ জুড়ে একটি লিডারবোর্ড বজায় রাখব। সিরিজটি 9 টি চ্যালেঞ্জের (এখনকার জন্য) চলবে, প্রতি কয়েকদিন পর পর একটি পোস্ট করা হয়। সমস্ত 9 টি চ্যালেঞ্জে অংশ নেওয়া প্রত্যেক ব্যবহারকারী পুরো সিরিজ জয়ের জন্য যোগ্য। তাদের সামগ্রিক স্কোর হ'ল প্রতিটি চ্যালেঞ্জের তাদের সংক্ষিপ্ততম জমাগুলির সমষ্টি (সুতরাং আপনি যদি চ্যালেঞ্জের উত্তর দুটিবার দেন তবে কেবলমাত্র উত্তরের উত্তরটি স্কোরের দিকে গণনা করা হয়)। 28 দিনের জন্য যদি কেউ এই সামগ্রিক লিডারবোর্ডে শীর্ষ স্থান ধরে রাখে আমি তাদের 500 টাকার সম্মাননা প্রদান করব ।

যদিও এই সিরিজের জন্য আমার কাছে অনেকগুলি ধারণাগুলি রয়েছে, ভবিষ্যতের চ্যালেঞ্জগুলি এখনও প্রস্তর হিসাবে স্থাপন করা হয়নি। যদি আপনার কোন পরামর্শ থাকে, তাহলে আমাকে দয়া করে প্রাসঙ্গিক স্যান্ডবক্স পোস্টে

ছিদ্র 1: একটি অ্যারে পরিবর্তন করুন

প্রথম কাজটি বেশ সহজ: খালি খালি পূর্ণসংখ্যার পূর্ণ বিন্যাসের পরে এলোমেলোভাবে এলোমেলো করুন। কয়েকটি নিয়ম রয়েছে যদিও:

  • প্রতিটি সম্ভাব্য পারমিটেশনটি একই সম্ভাবনার সাথে ফেরত দিতে হবে (সুতরাং এলোমেলোভাবে একটি সমান বিতরণ হওয়া উচিত)। আপনার অ্যালগরিদমটি জাভা স্ক্রিপ্টে উইল ইট শফলে প্রয়োগ করে এটি অভিন্ন / নিরপেক্ষ কিনা তা যাচাই করতে পারেন , যা বায়াসগুলির একটি ম্যাট্রিক্স তৈরি করবে - ফলাফলটি তাদের বিল্ট-ইনগুলির মতো সমান দেখানো উচিত ফিশার-ইয়েটস বা সাজানোর (এলোমেলো ক্রম) এর
  • অ্যারে বদলানোর জন্য বা এলোমেলো ক্রমান্বয়ে উত্পন্ন করতে (বা সমস্ত ক্রমশক্তি গণনা করতে) আপনার অবশ্যই কোনও অন্তর্নির্মিত বা তৃতীয় পক্ষের পদ্ধতি ব্যবহার করবেন না। বিশেষত, আপনি যে বিল্ট-ইন র্যান্ডম ফাংশনটি ব্যবহার করতে পারেন তা হ'ল একসাথে একক র্যান্ডম নম্বর । আপনি পারে অনুমান যে কোনো হে (1) বিল্ট-ইন র্যান্ডম সংখ্যা পদ্ধতি রানে অনুরোধ ব্যবধান ধরে পুরোপুরি অভিন্ন আছে (একটি গাণিতিক অর্থে - আপনি এখানে ফ্লোটিং পয়েন্ট উপস্থাপনা বিবরণ উপেক্ষা পারে)। যদি আপনার ভাষা আপনাকে মিঃ এলোমেলো সংখ্যার তালিকা একবারে পেতে দেয় তবে আপনি এই সুবিধাটি ব্যবহার করতে পারেন, তবে এম সংখ্যাগুলি একে অপরের চেয়ে স্বতন্ত্র থাকে এবং আপনি এটি (ও) হিসাবে গণনা করেন।
  • আপনার বাস্তবায়ন অবশ্যই ও (এন) এর সময় জটিলতার চেয়ে বেশি হবে না যেখানে এন পরিবর্তন হওয়ার মতো অ্যারের আকার। উদাহরণস্বরূপ, আপনি "এলোমেলো সংখ্যা অনুসারে বাছাই" করতে পারবেন না।
  • আপনি হয় জায়গায় অ্যারে পরিবর্তন করতে পারেন, বা একটি নতুন অ্যারে তৈরি করতে পারেন (সেক্ষেত্রে আপনার পছন্দ মতো পুরানো অ্যারে সংশোধন করা যেতে পারে)।

আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন এবং এসটিডিআইএন, কমান্ড-লাইন আর্গুমেন্ট, ফাংশন আর্গুমেন্ট বা প্রম্পটের মাধ্যমে ইনপুট নিতে পারেন এবং রিটার্ন ভ্যালুতে বা এসটিডিআউট (বা নিকটতম বিকল্প) এ মুদ্রণ করে আউটপুট উত্পাদন করতে পারেন। আপনি যদি এমন কোনও ফাংশন লিখেন যা অ্যারেটি স্থান পরিবর্তন করে, আপনার অবশ্যই এটি ফেরত দেওয়ার দরকার নেই (আপনার ভাষা আপনাকে ফাংশন ফেরার পরে পরিবর্তিত অ্যারে অ্যাক্সেস করতে দেয়) তবে।

ইনপুট এবং আউটপুট যে কোনও সুবিধাজনক তালিকা বা স্ট্রিং ফর্ম্যাটে হতে পারে, তবে অবশ্যই -2 31 ≤ x <2 31 সীমাতে নির্বিচারে পূর্ণসংখ্যার সমর্থন করতে হবে । নীতিগতভাবে, আপনার কোডটি অ্যারেগুলির জন্য দৈর্ঘ্য 2 31 পর্যন্ত কাজ করা উচিত , যদিও এটি অগত্যা আপনার স্মৃতিতে ফিট করতে পারে না বা একটি যুক্তিসঙ্গত সময়ের মধ্যে সম্পূর্ণ করতে হবে। (আমি কেবল হার্ডকোড লুপ বা কোনও কিছুর স্বেচ্ছাসেবী আকার সীমা দেখতে চাই না।)

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম জমা (বাইটে) জিতেছে।

লিডারবোর্ড

নিম্নলিখিত স্নিপেট সিরিজের সমস্ত চ্যালেঞ্জ জুড়ে একটি লিডারবোর্ড তৈরি করবে।

আপনার উত্তরগুলি প্রদর্শিত হবে তা নিশ্চিত করার জন্য, দয়া করে নীচের মার্কডাউন টেমপ্লেটটি ব্যবহার করে প্রতিটি উত্তর শিরোনাম দিয়ে শুরু করুন:

# Language Name, N bytes

Nআপনার জমা দেওয়ার আকারটি কোথায় ? আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন । এই ক্ষেত্রে:

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

(ভাষাটি বর্তমানে দেখানো হয়নি, তবে স্নিপেটের প্রয়োজন এবং এটি বিশ্লেষণ করতে পারে এবং ভবিষ্যতে আমি একটি উপ-ভাষা লিডারবোর্ড যুক্ত করতে পারি))


7
আমি হতাশ যে আমাদের "চালাক" হতে এবং "একটি এলোমেলো নম্বর পান" ব্যতীত গ্রন্থাগারের ফাংশনগুলি ব্যবহার করার অনুমতি নেই । আমরা কি ফিশার-ইয়েটস বদলানোর আরও 69 টি বাস্তবায়ন দেখতে চাই? ভবিষ্যতের কাজগুলিতে এই নিয়মটি সরানোর বিষয়ে দয়া করে বিবেচনা করুন। এছাড়াও, কেন সময় জটিলতার একটি সীমা? দয়া করে এটিকে কমপক্ষে হে (এন ^ 2) এ শিথিল করার বিষয়টি বিবেচনা করুন; আমি ও মনে করি যে আপনি ও (এন!) অনুমতি দিলে কেউ বিশেষত একটি গল্ফ বাস্তবায়ন পেতে পারে।
অ্যানাটলিগ

7
@ এনাটোলিগ এই বিধিনিষেধগুলি অপসারণ করা প্রতিটি জবাব sortby(random)(সময়ের সীমাবদ্ধতার কারণ) বা কেবল .shuffle()(বিল্ট-ইনস সীমাবদ্ধতার কারণ ) হিসাবে সমান , যা আমি মনে করি ফিশার-ইয়েটস বা অন্য কোনও কিছু প্রয়োগ করার চেয়ে অনেক কম চালাক is কাছে।
মার্টিন এন্ডার

1
যদি জায়গা বদলে যায় তবে কোনও ফাংশনটিতে অ্যারেটি ফিরিয়ে দিতে হবে, নাকি এটি যথেষ্ট পরিমাণে সংশোধন করা হয়েছে? আমি কি shuffle(array)পরিবর্তে একটি ফাংশন লিখতে পারি newArray=shuffle(array)?
জিওবিটস

1
@ বাকুরিউ দাবি করছেন যে সংখ্যাগুলি স্থির হয়ে থাকলে আপনি লিনিয়ার সময় অনুসারে বাছাই করতে পারেন যেমন ইনপুট মাপগুলি স্থির করা হয় তবে আপনি ও (1) তে কিছু করতে পারবেন এমন দাবি করার মতো। এছাড়াও প্রাসঙ্গিক সীমাবদ্ধতা স্থির-আকারের অ্যারেগুলি, স্থির-আকারের পূর্ণসংখ্যার নয় - কারণ অ্যারে আকারটি নির্ধারণ করে যে আপনার এলোমেলো সংখ্যাগুলি কতটা দরকার। যাইহোক, সময় জটিলতার সীমাবদ্ধতা অবশ্যই আপনার প্রয়োগ করা সাধারণ অ্যালগরিদমের জন্য, অন্যদিকে ইনপুট আকারের সীমা রয়েছে তাই আপনার ভাষা যদি বাক্সের বাইরে না ব্যবহার করে তবে স্বেচ্ছাচারিত যথার্থ পূর্ণসংখ্যা ব্যবহার করতে হবে না ।
মার্টিন এন্ডার

2
আদমের সমাধানটি যখন আসলে 14 তখন 43319 বাইট হিসাবে কেন আসছে?
ববাকউয়াক

উত্তর:


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
... মন। প্রস্ফুটিত।
Danwyand

1
একটি ভাষা আমাকে ডান থেকে বামে পড়তে হবে ?? কি দারুন!
আলোকিত

5
@ আলোকিত যেমন গাণিতিক স্বরলিপি হিসাবে প্রায়শই ঘটে: sin sin ln sqrt x
ngn

4
@ জিএনএন যখন আপনি এটি এমনভাবে রাখেন যা আমার আগের মন্তব্যটিকে হাস্যকর দেখায়। হেক্টর।
আলোকিত

5
@ronalchn এপিএলের জন্য এখানে 8-বিট এনকোডিং রয়েছে, এটি একটি বা এই অন্যটির মতো ; আমি শুনেছি Dyalog এই এক ব্যবহার করে, ইউনিকোড বিকল্প হিসেবে।
anatolyg

12

80386 মেশিন কোড, 44 24 বাইট

কোডের হেক্সডাম্প:

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
আপনি rdrandবিষ্ঠা এবং গিগলস জন্য ব্যবহার করতে পারে ।
FUZxxl

@FUZxxl আমি এটি সম্পর্কে সম্পূর্ণ ভুলে গেছি! খুব খারাপ এটি আমার উত্তর সম্পর্কে সবচেয়ে আকর্ষণীয় অংশটি সরিয়ে দেয় ...
anatolyg

9

জাভা, 88 101

একটি মৌলিক ফিশার-ইয়েটস রদবদল কৌশলটি করে। এটি এখানে কার্যকরভাবে প্রয়োগ করা হবে বলে আমি অনুভূতি পেয়েছি, কারণ এটি দ্রুত এবং বাস্তবায়ন করা সহজ। এখানে কিছু লুপ / ​​অ্যাসাইনমেন্ট ক্র্যামিং করা আছে, তবে সত্যিই গল্ফের পক্ষে খুব বেশি কিছু নেই; এটি প্রকৃতির দ্বারা সংক্ষিপ্ত।

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
@ পিটারটেলর জ্যান এবং জিওবিটসের ব্যাখ্যাগুলি হ'ল আমি কীভাবে এই নিয়মটি তৈরি করেছি - তা আপনার পিআরএনজি-র প্রকৃত চক্র-দৈর্ঘ্য সম্পর্কে আপনাকে উদ্বিগ্ন হওয়ার দরকার নেই
মার্টিন এন্ডার

1
@ মার্টিনব্যাটনার চক্রের দৈর্ঘ্য এখানে সমস্যা নয় - এটি আপনার বিধি দ্বারা আবৃত। ভাসমানদের খোলামেলা অবস্থা।
জন ডিভোরাক

3
@ দ্য বেস্টওন এটি কেবলমাত্র পোস্ট-করা অজগর সমাধানের চেয়ে এক বাইট কম ;)
জিওবিটস

1
আর না! : ডি
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 কে ধন্যবাদ।


পরিসীমাটির এই অভিব্যক্তিটি দেখতে বেশ জটিল looks ম্যানুয়ালি হিসাবে গণনা করা অবশ্যই এটি খাটো while i:i-=1;...?
xnor

@ এক্সনর হ্যাঁ - এটির জন্য ধন্যবাদ। আমি ভুলে যাচ্ছি যে এই ধরণের জিনিসটির whileচেয়ে খাটো হতে হবে for...
Sp3000

1
আউউউ ... এখন আমার জাভা উত্তরটি এটি মারছে না। আমি খুব অল্প সময়ের জন্য বেশ খুশি ছিলাম :(
জিওবিটস

আপনি i=len(L)লুপটির শুরুতে হ্রাসটি তৈরি করে এবং আরও 2 বাইট সংরক্ষণ করতে পারেন ।
কোলভেক

8

জে, 45 44 টি অক্ষর

এটি একটি কৌতুকপূর্ণ ছিল।

<@({.,?@#@}.({,<^: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প্রতিটি boxed এবং তারপর yএকটি একক বক্সে। এটি প্রয়োজনীয় কারণ জেতে অ্যারেগুলি অভিন্ন। একটি বাক্স তার সামগ্রীর আকৃতিটি আড়াল করে।
  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.@# , <) y22 নম্বর থেকে বাক্যাংশটি 18 নম্বর থেকে বাক্যাংশের ফলাফলের জন্য প্রয়োগ হয়েছে, বা, এর আইটেমগুলির একরকম অনুমান y

1
আমি কেবল সমস্ত প্রথম বন্ধনী আলাদা করতে পারি না। এবং ती ট্রিপল বক্সিংও <@<@<@[একটি রহস্য ... ব্যাখ্যাটির জন্য অপেক্ষা করছি। :)
এলোমেলো

2
একবার এটি ব্যাখ্যা হয়ে গেলে, আমি এই উত্তরটি উচ্চতর করার সম্ভাবনা অনেক বেশি হতে পারে ;-)
জন ডিভোরাক

আপনি এখানে যান
FUZxxl

@ জনডভোরাক কি ব্যাখ্যা সন্তোষজনক?
FUZxxl

দুর্দান্ত ব্যাখ্যা! from( {) এর সমস্ত বক্সেড ব্যবহার সম্পর্কে আমি জানতাম না । এবং আমি সত্যিই &>/একটি তালিকা কারচুপি কৌশল পছন্দ । আমি নিশ্চিত যে আমি এটি আগে কয়েকবার ব্যবহার করতে পারতাম।
এলোমেলো

5

পাইথ, 25 বাইট

এটি এখানে পরীক্ষা করুন।

তবুও আরেকটি ফিশার-ইয়েটস বাস্তবায়ন। মূলত @ স্পাই 3000 পাইথন সলিউশনের মতোই, ঠিক পাইথার মধ্যে।

FNrlQ1KONJ@QN XXQN@QKKJ)Q

অদলবদল কৌতুকের জন্য @ জাকুবকে ধন্যবাদ

<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``
জাকুবে

@ জাকুব টিপটির জন্য ধন্যবাদ। আমি জানতাম একটি তালিকায় মানগুলি অদলবদলের একটি উপায় অবশ্যই আছে এবং এটি সত্যিই স্মার্ট। আপনার এটি টিপস তালিকায় যুক্ত করা উচিত।
মালতিসেন

4

পার্ল, 68 56 44

অন্যান্য সমাধানগুলির মতো এটিও ব্যবহার করে uses ফিশার-ইয়েটস অ্যালগরিদম ।

নটকি ব্যবহার করা এর মন্তব্যে, 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];}

ফিশার-ইয়েটসের কেবল একটি সরাসরি বাস্তবায়ন যা প্রদত্ত অ্যারের স্থানে সাজিয়ে তোলে। সংকলন এবং লিঙ্কগুলি ভিজ্যুয়াল স্টুডিও সংকলক (বনাম ২০১৩, অন্যান্য সংস্করণ পরীক্ষা করে নি) এবং ইন্টেল সংকলক সহ পুরোপুরি সূক্ষ্ম। সুন্দর দেখাচ্ছে ফাংশন স্বাক্ষর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
FUZxxl

@FUZxxl আমি বিশ্বাস করি যে যদি একটি এক্সওর অদলবদল সমস্যা সৃষ্টি করে i==m
জিওবিটস

@ জিওবিটস আমি সেই সম্ভাবনাটি মিস করেছি।
FUZxxl

আমি কেবল এটি কেন কাজ করছে না তা জানার চেষ্টা করছিলাম ... এটি মনে রাখা উচিত ছিল। এছাড়াও আমার s(a,m)int*aভিজ্যুয়াল স্টুডিও এবং ইন্টেল সংকলক প্রয়োজন। পরীক্ষার জন্য জিসিসি বা ঝনঝন ইনস্টল করবেন না, তবে আমি ধরে নিয়েছি তারাও অভিযোগ করবে।
ছদ্মনাম

এটি বেশ চিত্তাকর্ষকভাবে গল্ফ হয়। কিছু পরিবর্তন না করে এমন অনেকগুলি পরিবর্তন করার চেষ্টা করার পরে, আমি 2 টি অক্ষর সংরক্ষণের উপায় দেখতে পরিচালনা করেছি। আপনি যদি সোয়াপ ক্রমটি পরিবর্তন করেন যাতে প্রথম সোয়াপ স্টেটমেন্টটি হয়ে যায় t=a[i], আপনি তারপরে i=rand()%m--অ্যারে সূচক হিসাবে স্টেটমেন্টটি ভিতরে স্থানান্তর করতে পারেন ।
রানার 1112

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
শুধু এফওয়াইআই, "বাইটস" কোডটি আসলেই প্রয়োজন হয় না, এটি নিশ্চিত করে যে এখানে একটি শিরোনাম রয়েছে, যেখানে একটি কমা রয়েছে (ভাষা পৃথক করতে) এবং কমপক্ষে কমপক্ষে একটি সংখ্যা রয়েছে এবং তারপরে কেবল শেষটি নির্বাচন করে যে সংখ্যাটি অতিক্রম করা হয়নি সেখানে "বাইটস" থাকা এখনও দুর্দান্ত রয়েছে। ;)
মার্টিন ইন্ডার

1
numelপরিবর্তে ব্যবহার করে আপনি 1 বাইট সংরক্ষণ করতে পারেন lenght। বোনাস হিসাবে আপনার প্রোগ্রামটি 2-ডি অ্যারে ওরফে ম্যাট্রিক্সের সাথেও কাজ করবে;)
পল.অর্ডারস

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()?
রোলিং

1
@ রোলিং আপনি এই মেটা প্রশ্নে ভোট দিতে পারেন । বর্তমানে ল্যাম্বডাসের পক্ষে 9 টি ভোট, এবং বিপরীতে 0 টি ভোট রয়েছে। হ্যাঁ, প্রথম বন্ধনীগুলি সরানো যেতে পারে।
শুক্রবার 4'15

হু, যদি একটি মেটা পোস্ট এবং এতদূর-sensকমত্য হয় তবে তা দূরে সরিয়ে দিন। (এবং আমার উপর দুটি-নিম্ন গল্ফ স্কোর উপভোগ করুন: পি)
রাওয়ালিং

3
আমার মনে হয়, কোনও সাধারণ ক্ষেত্রে ব্যতিক্রম হয়ে ফাংশন থামানো অনুচিত, তাই না?
কিওয়ারটি

1
@ কিওয়ার্টি প্রত্যেকের নিজের কাছে ... আপনি মনে করেন এটি অন্যায্য, আমি মনে করি এটি দুর্দান্ত।
শুক্রবার 4'15

2

গল্ফ্লুয়া, 37

গল্ফ্লুয়া কীভাবে চালাবেন?

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

ভেরিয়েবল এক্স-এ টেবিল হিসাবে ইনপুট সরবরাহ করা হয় The টেবিলটি জায়গায় পরিবর্তিত হয়।

ব্যবহারের উদাহরণ:

> 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একটি প্রদত্ত ভেক্টর থেকে সমান সম্ভাবনা সহ একটি প্রদত্ত আকারের একটি সাধারণ এলোমেলো নমুনা আঁকে। এখানে আমরা পূর্ণসংখ্যার i, ..., থেকে প্রতিটি পুনরাবৃত্তিতে 1 মাপের এলোমেলো নমুনা আঁকছি n। প্রশ্নে বলা হয়েছে, এটি ও (1) হিসাবে ধরে নেওয়া যেতে পারে, সুতরাং এই সমস্ত বাস্তবায়নে ও (এন) হওয়া উচিত।


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
আলেফাল্ফ

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}

আমি আগে যেটিকে রেখেছি তার চেয়ে কম সংক্ষিপ্ত নয় (যা অযোগ্য হয়ে গেছে) ... ওহ ভাল।

এটি একটি মৌলিক ফিশার-ইয়েটস বদল। এটি কোনা মেলিং তালিকা থেকে প্রচুর সহায়তায় নির্মিত হয়েছিল ।


2

জাভাস্ক্রিপ্ট (ES6), 66

এই ফাংশনটি স্থানে অ্যারে পরিবর্তন করে। এটি এমন একটি বাই-প্রোডাক্ট অ্যারেও ফেরত দেয় যা এলোমেলো আউটপুট নয় এবং বিবেচনা করা উচিত নয়।

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

2

এমএটিএল , 16 বাইট

XH`HnYr&)XHxvHHn

এটি অনলাইন চেষ্টা করুন!

এমএটিএল-এ ফিশার-ইয়েটস। এই প্রোগ্রামের প্রায় এক তৃতীয়াংশ চিঠিটি উত্সর্গীকৃত H, যা এমএটিএল এর ক্লিপবোর্ডের কার্যের সাথে সম্পর্কিত।

মূলত, Hইনপুট থেকে অব্যবহৃত আইটেমগুলি সঞ্চয় করে, যখন স্ট্যাকটি বদলানো তালিকার উপরে নজর রাখে।


2

জাপট, 12

rÈiMqZÄ Y}[]

চেষ্টা করে দেখুন!

-10 (প্রায় অর্ধেক;) @ শেগগিকে ধন্যবাদ!

আমি একটি গল্ফিং ভাষা চেষ্টা করে দেখতে চেয়েছিলাম, এবং জাপট দোভাষীর কাছে ভাল ডকুমেন্টেশন এবং ব্রাউজারে জিনিসগুলি চেষ্টা করার একটি উপায় ছিল।

নীচে আমি কৌশল গ্রহণ করেছি:

  • খালি অ্যারে দিয়ে ইনপুট সিডিং হ্রাস করুন
  • প্রতিটি পদক্ষেপে, বর্তমান উপাদানটি সন্নিবেশ করানোর জন্য একটি এলোমেলো স্লট সন্ধান করুন

1
আপনাকে জাপটে স্বাগত জানাই, আপনাকে আমাদের সাথে রাখলে ভালো। আমি মনে করি এই 9 বাইট জন্য কাজ করে, একই পদ্ধতি ব্যবহার করে। আরএনজি যদি সন্তোষজনক না হয় তবে তার পরিবর্তে এটি ব্যবহার করে দেখুন।
শেগি

@ শেগি - টিপসের জন্য ধন্যবাদ! :) আমি আপনার ২ য় সমাধানের কিছুটা পরিবর্তিত সংস্করণ ব্যবহার করে শেষ করেছি। যেহেতু হ্রাস ফাংশনের তৃতীয় পরামিতি একটি সূচক, আমরা ইতিমধ্যে দৈর্ঘ্য জানি know
দানা

1

জাভাস্ক্রিপ্ট ES6, 69

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

এটি ফিশার – ইয়েটস।

পিএস: ফায়ারফক্সে পরীক্ষা করা যায়


@ মার্টিনবাটনার, এটি সরিয়ে দিয়েছেন :)
কিওয়ার্টি


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

সিজোম - 30

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

এটি http://cjam.aditsu.net/ এ চেষ্টা করুন

উদাহরণ ইনপুট: [10 20 30 40 50]
উদাহরণ আউটপুট: 3020401050( pসুন্দর মুদ্রণের জন্য কোডের শেষে একটি যুক্ত করুন )

যদি কোডটি স্ট্যাক (যেমন কোনও ফাংশন) থেকে ইনপুট নেওয়ার অনুমতি দেওয়া হয়, তবে প্রথম 2 টি অক্ষর সরানো যেতে পারে, আকার হ্রাস করে ২৮ এ পরিণত হবে।

ব্যাখ্যা:

কোডটি আমার প্রত্যাশার চেয়ে দীর্ঘতর, অ্যারেগুলির জন্য "অদলবদল" অপারেটরের অভাবে
(পরে প্রয়োগ করা হবে: পি)

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]

মন্তব্যে উল্লিখিত হিসাবে, আমি ভয় করি যে এটি অবৈধ। খুব কমপক্ষে _ও (এন) (একটি ও (এন) লুপের অভ্যন্তরে) রয়েছে। দুর্ভাগ্যক্রমে, আমি সিজেমে এটিকে ঘিরে কাজ করার কোনও উপায় দেখতে পাচ্ছি না।
মার্টিন ইন্ডার

তালিকাগুলি অপরিবর্তনীয় বস্তুর মতো পরিচালনা করা হয়, সুতরাং নকলটি কেবলমাত্র রেফারেন্সের সদৃশ হিসাবে প্রয়োগ করা হয়েছে। এটি আসলে এটিই tএটি হত্যা করে, কারণ এটি তালিকার পরিবর্তন করতে পারে না এবং এখন অবশ্যই একটি অনুলিপি তৈরি করতে হবে।
রানার 1112

@ মার্টিনবাটনার আমি রানার 1112 এর মতো একই জিনিস পোস্ট করতে যাচ্ছিলাম; হ্যাঁ কোনও সমস্যা হতে পারে t, আমি এটি ভবিষ্যতের সংস্করণগুলিতে উন্নত করতে চাই ..
অ্যাডিটসু

সুতরাং এই কোডটি অভ্যন্তরীণ ভাষা বাস্তবায়নের সমস্যার কারণে প্রশ্নটির চেতনা অনুসরণ করে তবে "চিঠি" নয়।
aditsu

1

জাভাস্ক্রিপ্ট (ES 6), 61

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

আপনি এখানে কেবল একটি লাইন যুক্ত করে এটি পরীক্ষা করতে পারেন shuffle = S(কেবলমাত্র ফায়ারফক্স)।


1

স্টাটা, 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 হ'ল বর্তমান পর্যবেক্ষণের সংখ্যা।
16-15 এ বুকস


1

এসকিউএফ, 91 বাইট

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

1
এই পক্ষপাতমূলক হয় (দেখুন "সোয়াপ (ঝ <-> র্যান্ডম)" করবে এলোমেলো দিকে), কিন্তু আপনি প্রতিস্থাপন ফিশার-ইয়েটস (যা পক্ষপাতিত্বহীন হয়) সেটিকে চালু করতে পারেন %xসঙ্গে %i
মার্টিন এন্ডার

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.