সোক ড্রয়ারের অনুকরণ করুন


16

পটভূমি

আমার কাছে "সপ্তাহের দিন মোজা" এর একটি সংগ্রহ রয়েছে, যা সপ্তাহের দিনগুলিতে লেবেলযুক্ত সাত জোড়া মোজা। আমি যখন মোজা ধুয়ে নিই, তখন সেগুলি একটি গাদা হয়ে শেষ হয় এবং আমার পায়খানাগুলিতে রাখার আগে অবশ্যই তাদের সঠিক জোড়ায় সাজিয়ে তুলতে হবে। আমার কৌশলটি হ'ল একবারে স্তূপ থেকে একটি এলোমেলো মোজা টানতে এবং এটি একটি ড্রয়ারে রেখে দেওয়া। যখনই ড্রয়ারে একটি মোজা জোড়া মিল আছে, আমি এগুলি একসাথে বেঁধে এবং তাদের ক্লোজেটে রাখি। আপনার কাজটি এই র্যান্ডম প্রক্রিয়াটি অনুকরণ করা এবং প্রথম ম্যাচের জুটির সন্ধানের জন্য প্রয়োজনীয় অঙ্কনের সংখ্যাটি ফিরিয়ে দেওয়া।

ইনপুট

আপনার ইনপুটটি পূর্ণসংখ্যা N ≥ 1 । এটি "এক সপ্তাহে দিনের সংখ্যা" উপস্থাপন করে: স্তূপে এন জোড়া মোজা রয়েছে এবং প্রতিটি জোড়ের একটি পৃথক লেবেল রয়েছে। প্রয়োজনে আপনি ইনপুট হিসাবে একটি পিআরএনজি বীজও নিতে পারেন।

আউটপুট

আপনার আউটপুটটি হ'ল মোজাগুলির সংখ্যা হ'ল প্রথম মিলের জুড়িটি খুঁজে পাওয়ার আগে। উদাহরণস্বরূপ, যদি প্রথম দুটি মোজা ইতিমধ্যে একটি মিলে যাওয়া জুটি গঠন করে তবে আউটপুট হয় 2

অবশ্যই, আউটপুট এলোমেলো, এবং অঙ্কন ক্রমের উপর নির্ভর করে। আমরা ধরে নিই যে সমস্ত অঙ্কনের আদেশগুলি সমানভাবে সম্ভবত , যাতে প্রতিবার একটি মোজা আঁকবে, পছন্দটি অভিন্ন এবং অন্যান্য সমস্ত পছন্দ থেকে স্বতন্ত্র।

উদাহরণ

এন = 3 আসুন , যাতে আমাদের মোট 6 টি মোজা থাকে, এটিবিবিসিসির লেবেলযুক্ত । "সাক-অঙ্কন প্রোটোকল" এর একটি সম্ভাব্য রান নিম্নরূপ:

       | Pile   | Drawer | Pairs
Begin  | AABBCC | -      | -
Draw B | AABCC  | B      | -
Draw C | AABC   | BC     | -
Draw B | AAC    | C      | BB
Draw A | AC     | AC     | BB
Draw A | C      | C      | AA BB
Draw C | -      | -      | AA BB CC

দ্বিতীয় বি আঁকার পরে প্রথম মিলের জুটি পাওয়া গেল , যা আঁকতে তৃতীয় মোজা ছিল, সুতরাং সঠিক আউটপুট 3

বিধি এবং স্কোরিং

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

আপনি ধরে নিতে পারেন যে আপনার ভাষার অন্তর্নির্মিত আরএনজি নিখুঁত। আপনার আউটপুটগুলির যথাযথ সম্ভাবনা বন্টন না হওয়া পর্যন্ত আপনাকে প্রকৃতপক্ষে সোক-অঙ্কন প্রোটোকলটি অনুকরণ করতে হবে না।

"পরীক্ষার মামলাগুলি"

এন = 7 ইনপুটটির জন্য সমস্ত আউটপুটগুলির আনুমানিক সম্ভাবনাগুলি এখানে রয়েছে :

Output       2     3     4     5     6     7     8
Probability  0.077 0.154 0.210 0.224 0.186 0.112 0.037

আপনার সমাধানটি পরীক্ষা করার জন্য, আপনি এটিকে 40,000 বার বলে চালাতে পারেন এবং আউটপুট বিতরণটি যুক্তিযুক্তভাবে এটির নিকটে কিনা তা দেখুন।


25
রিয়েল লাইফ, 42 বাইট -Draw all socks. End up with an odd number.
অ্যাডমবর্কবার্ক


সুতরাং এন = 8 1-> 7 এর সাথে সমান নয় এবং তারপরে আবার 1? অর্থাত্ 1 টি লেবেলযুক্ত 4 মোজা
ভিক্টর মেলগ্রেন

@ ভিক্টর মেলগ্রেন না, আপনার কাছে 8 টি পৃথক লেবেল রয়েছে।
জাগারব

আমার কাছে অভিন্ন মোজা পূর্ণ একটি ড্রয়ার রয়েছে, সুতরাং সেগুলি দিয়ে বাছাই করার দরকার নেই।
জেডিগোগস

উত্তর:


9

জেলি , 8 বাইট

ḤX€Ṛ<RTḢ

এটি অনলাইন চেষ্টা করুন! বা এন = 7 এর বিতরণ যাচাই করুন

পটভূমি

জোড়গুলির সংখ্যা এন হোক ; আছে 2n পৃথক মোজা।

প্রথম অঙ্কনের জন্য, 2n মোজা রয়েছে এবং এর মধ্যে 0 টি মিলবে একটি জোড়ায়। অতএব, সাফল্যের সম্ভাবনা 0 / 2n = 0

যেহেতু প্রথম অঙ্কটি সফল হয়নি, পাইলের উপরে 2n - 1 মোজা রয়েছে এবং এর মধ্যে 1 টি মিলবে একটি জোড়ায়। সুতরাং, সাফল্যের সম্ভাবনা 1 / (2 এন - 1)

যদি দ্বিতীয় অঙ্কটি সফল না হয় তবে স্তূপের উপর 2n - 2 মোজা রয়েছে এবং এর মধ্যে 2 টি মিলবে একটি জোড়ায়। অতএব, সাফল্যের সম্ভাবনা 2 / (2 এন - 2)

সাধারণভাবে, যদি প্রথম কে অঙ্কনগুলি ব্যর্থ হয়, সেখানে স্তূপের উপর 2n - কে মোজা রয়েছে এবং এর মধ্যে 2 টি মিলবে একটি জোড়ায়। অতএব, সাফল্যের সম্ভাবনা কে / (2 এন - কে)

অবশেষে, যদি প্রথম এন অঙ্কনের কোনওটিই সফল না হয় , তবে স্তূপের উপর 2n - কে মোজা রয়েছে এবং এর সবগুলিই মিলবে একটি জোড়ায়। অতএব, সাফল্যের সম্ভাবনা n / (2n - n) = 1

কিভাবে এটা কাজ করে

ḤX€Ṛ<RTḢ  Main link. Argument: n

Ḥ         Unhalve; yield 2n.
 X€       Map `random draw' over [1, ..., 2n], pseudo-randomly choosing an integer
          from [1, ..., k] for each k in [1, ..., 2n].
   Ṛ      Reverse the resulting array.
     R    Range; yield [1, ..., n].
    <     Perform vectorized comparison.
          Comparing k with the integer chosen from [1, ..., 2n - (k - 1)] yields 1
          with probability (k - 1) / (2n - (k - 1)), as desired.
          The latter half of elements of the left argument do not have a counter-
          part in the right argument, so they are left untouched and thus truthy.
      T   Truth; yield all indices of non-zero integers.
       Ḣ  Head; extract the first one.

8

জেলি, 8 বাইট

Rx2ẊĠṪ€Ṃ

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

R    generate [1, 2, ..., n]
x2   duplicate every element (two socks of each pair)
Ẋ    shuffle the list, to represent the order in which socks are drawn
Ġ    group indices by value. this will produce a list of pairs of indices;
       each pair represents the point in time at which each of the corresponding
       socks were drawn
Ṫ€   take the last element of each pair. this returns an array of n integers
       which represent the points in time at which a matching sock was drawn
Ṃ    minimum, find the first point at which a matching sock was drawn

যাচাই করার জন্য, এখানে একটি সংস্করণ যা পছন্দসই আউটপুট এবং "শিফেল তালিকা" অপারেশনের ফলাফল উভয়ই প্রদর্শন করে (কী অর্ডার মোজা আঁকা হয়েছিল তা দেখতে)।


5

পাইথন, 66 বাইট

from random import*
f=lambda n,k=1:k>randint(1,n*2)or-~f(n-.5,k+1)

ডেনিস 5 টি বাইট সাশ্রয় করে জিনিসগুলি পুনরায় সাজানোর জন্য একটি চতুর উপায় অবলম্বন করেছিলেন।


4

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

Q:"r@qGEy-/<?@.

এটি অনলাইন চেষ্টা করুন! অথবা এন = 7 কেসে 1000 নমুনাগুলির পরীক্ষামূলক বিতরণ পর্যবেক্ষণ করুন (এটি কিছুটা সময় নেয়)।

এটি সরাসরি এলোমেলো পরিবর্তনশীল উত্পন্ন করে ফলাফলের প্রতিনিধিত্বমূলক, তার সম্ভাব্যতা বিতরণের উপর ভিত্তি করে। যাক এন সক যুগলের সংখ্যা হতে, এবং দিন পি ( ) সম্ভাব্যতা বোঝাতে যে -th ড্র সফল হয় যে, আসলে উপর নিয়ন্ত্রিত -1 তম ড্র না সফল ছিল। তারপরে ( এখানেও দেখুন ):

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

সুতরাং কোডটি সর্বাধিক এন +1 আঁকার জন্য পুনরাবৃত্তি করে। এ -th একটি এলোপাতাড়ি ভেরিয়েবলের আঁকা উৎপন্ন হয় (যে সম্ভাবনা 1 সমান -1) / (2 * এন - অন্যথায়), অথবা 0। যখনই এলোমেলো পরিবর্তনশীল 1 এর সমান হয় (অঙ্কনটি সফল হয়েছে) প্রক্রিয়াটি বন্ধ হয়ে যায় এবং বর্তমান কে আউটপুট হয়।

Q:      % Input N implicitly. Generate [1 2 ... N+1] (values of draw index, k)
"       % For each
  r     %   Random variable uniformly distributed on the interval (0,1)
  @q    %   Push iteration index, k-1
  GE    %   Push 2*N
  y     %   Duplicate: push k-1 again
  -     %   Subtract: gives 2*N-k+1
  /     %   Divide: gives (k-1)/(2*N-k+1)
  <     %   Push 1 if random value is less than (k-1)/(2*N-k+1), 0 otherwise
  ?     %   If we got a 1
    @   %     Push k
    .   %     Break loop
        %   End if implicitly
        % End loop implicitly
        % Display implicitly

1
আপনার এবং আমার একই ধারণা ছিল, তবে আপনি এমএটিএল :) জানেন
প্রোগ্রাম লোক

3

এমএটিএল , 14 13 বাইট

EZ@G\&=XRafX<

এটি অনলাইন চেষ্টা করুন! অথবা এন = 7 কেসে 4000 নমুনার জন্য অভিজ্ঞতা অভিজ্ঞতা সরবরাহ করুন (এটি কিছুটা সময় নেয়) a

E      % Input N implicitly. Multiply by 2
Z@     % Random permutation of [1 2 ... 2*N]
G\     % Modulo N: random permutation of [0 0 1 1 ... N-1 N-1]
&=     % Compare all pairs for equality. Gives an N×N matrix
XR     % Upper triangular part excluding the diagonal
a      % True for each column if it contains at least one true entry
f      % Get indices of true values
X<     % Take minimum. Implicitly display

3

জাভাস্ক্রিপ্ট, 77 73 বাইট

n=>{p={};for(i=n;i--;p[i]=2);while(--p[n*Math.random()|0])i++;return i+2}

ব্যাখ্যা

var f = (n) => {
    var index;      // used first to initialize pile, then as counter
    var pile = {};  // sock pile

    // start with index = n
    // check that index > 0, then decrement
    // put 2 socks in pile at index
    for(index = n; index--; pile[index] = 2);
    // index is now -1, reuse for counter

    // pick random sock out of pile and decrement its count
    // continue loop if removed sock was not the last
    while(--pile[n * Math.random() | 0]) {
        index++;    // increment counter
    }
    // loop finishes before incrementing counter when first matching pair is removed
    // add 1 to counter to account for initial value of -1
    // add 1 to counter to account for drawing of first matching pair
    return index + 2;
};

আপনি সংরক্ষণ করতে পারবেন চার অক্ষর প্রতিস্থাপন f=(n)=>সঙ্গে n=>(বা দুই, আপনি যখন সেই কার্যভার রাখতে চান তাহলে, কিছু এটা রাখা , কিছু এটি অপসারণ )।
গুস্তাভো রডরিগস

ভাল ধরা, আমি এটা ঠিক করেছি। যদিও, আমি যখন নিয়মে "আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন" পড়ি তখন আমি ভেবেছিলাম এটি একটি প্রয়োজনীয়তা।
কামোরোসো94

3
অনুযায়ী মেটা উপর ঐক্যমত্য , নামহীন ফাংশন যে একটি নাম আবদ্ধ নেই ডিফল্টরূপে গ্রহণযোগ্য।
জাগারব

এটি কি জাভাসক হওয়া উচিত নয়? (হ্যাঁ, খোঁড়া)
gcampbell


2

পাইথন 3, 142 105 104 বাইট

ধন্যবাদ Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ কেএকটি বাইট সংরক্ষণ !

আমার প্রথম উত্তর:

import random 
i=[x/2 for x in range(int(2*input()))]
d=[]
a=0
random.shuffle(i)
while 1:
 b=i.pop()
 if b in d:
  print(a)
  s
 d=d+[b]
 a+=1

আমার নতুন উত্তর:

from random import*
i=range(int(input()))*2
shuffle(i)
j=0
for x in i:
 if x in i[:j]:print(1+j)+s
 j+=1

উভয় একটি NameErrorঅন সঙ্গে প্রস্থান করুন s


2

আর, 49

N=scan();which(duplicated(sample(rep(1:N,2))))[1]

আমি নিশ্চিত যে আর তে এটি করার আরও ভাল উপায় থাকতে হবে! আমি ক্লিভেরার কিছু করার চেষ্টা করেছি কিন্তু এটি কার্যকর হয়নি।

সম্পাদনা করুন: @ বাউন্সিবল দ্বারা উন্নত কারণ এটি কোনও ফাংশন হতে হবে না।


আপনার কি ব্যবহার করতে হবে function(N)? N=scan();2 বাইট বাঁচাতে ব্যবহার করতে পারে
বুন্সিবল

1

পাইথন 2, 101 বাইট

from random import*
d=[]
p=range(input())*2
shuffle(p)
while list(set(d))==d:d+=p.pop(),
print len(d)

0

ভিবিএ, 61 বাইট

Function K(D):While 2*D-K>K/Rnd:K=K+1:Wend:K=K+1:End Function

- মডেলগুলি পূর্বের ম্যাচটিতে ব্যর্থতার কারণে সোক ম্যাচের পরিবর্তনের সম্ভাবনা। মূল্যায়নের পর্যায়ে, কে "হাতে মোজা", সুতরাং অঙ্কনের সংখ্যাটি আরও একটি।


0

পাইথ, 14 বাইট

lhfnT{T._.S*2S

ব্যাখ্যা:

       ._        #Start with a list of all prefixes of
         .S      #a randomly shuffled
           *2S   #range from 1 to input (implicit), times 2.
  f              #filter this to only include elements where
   nT{T          #element is not equal to deduplicated self (i.e. it has duplicates)
lh               #print the length of the first element of that filtered list
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.