পায়রাহোলের নীতি ও কোড গল্ফ


26

পায়রার খোপ নীতি বলে যে

তাহলে এন আইটেম পুরা হয় এম সঙ্গে, বাক্সে এন > এম , তারপর অন্তত একটি বক্স চেয়ে বেশি একটি আইটেম থাকা আবশ্যক।

অনেকের কাছে অন্যান্য গাণিতিক এনওনমেন্টের তুলনায় এই নীতিটির একটি বিশেষ মর্যাদা রয়েছে। ইডাব্লু ডিজকস্ট্রা যেমন লিখেছেন ,

এটি চারপাশে কিছু রহস্যময়। এটি ব্যবহার করার প্রমাণগুলি প্রায়শই বিশেষ কিছু, বিশেষত উদ্ভাবনী কিছু হিসাবে বিবেচিত হয়।

চ্যালেঞ্জ

এই চ্যালেঞ্জের উদ্দেশ্য ASCII শিল্প উপস্থাপনা ব্যবহার করে কবুতরের নীতিটি বর্ণনা করা। বিশেষ করে:

  1. নেতিবাচক এবং ধনাত্মক সহ ইনপুট N(আইটেমের সংখ্যা) এবং M(বাক্সের সংখ্যা ) হিসাবে নিন Take এর চেয়ে ছোট হতে পারে (এমনকি যদি নীতিটি সেই ক্ষেত্রে প্রয়োগ না হয়)।NMNM
  2. বাক্সগুলিতে এলোমেলোভাবে আইটেমগুলির সম্ভাব্য কার্যভারের একটি নির্বাচন করুন। প্রতিটি অ্যাসাইনমেন্টের বাছাইয়ের শূন্য-সম্ভাবনা থাকা উচিত।
  3. নীচে অ্যাসাইনমেন্টের একটি ASCII শিল্প উপস্থাপনা উত্পাদন করুন:

    • আছে Mলাইন, প্রতিটি একটি বক্স সংশ্লিষ্ট।
    • প্রতিটি লাইন একটি শ্বেতস্থান অক্ষরের সাথে শুরু হয়, যেমন |
    • সেই অক্ষরটি অনুসরণ করা হ'ল আরেকটি শ্বেতস্থান অক্ষর, যেমন #that বাক্সে আইটেম রয়েছে যতবার পুনরাবৃত্তি।

উদাহরণস্বরূপ বিবেচনা করুন N = 8, M = 5। বক্স আইটেম নির্বাচিত assigment করা হয়, তাহলে 4, 1, 0, 3, 0, উপস্থাপনা

|####
|#
|
|###
|

একই প্রোগ্রামটির একটি আলাদা রান (ফলস্বরূপ একটি পৃথক অ্যাসাইনমেন্ট) দিতে পারে

|#
|##
|#
|#
|###

প্রতিনিধিত্ব সংক্রান্ত কিছু নমনীয়তা রয়েছে; নিচে দেখ.

নির্দিষ্ট বিধি

কোড উচিত তাত্ত্বিক কোনো মানের জন্য চালানো এর Nএবং M। অনুশীলনে এটি মেমরির আকার বা ডেটা ধরণের সীমাবদ্ধতার দ্বারা সীমাবদ্ধ হতে পারে।

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

নিম্নলিখিত প্রতিনিধিত্বের বৈচিত্রগুলি অনুমোদিত:

  • বিভিন্ন, নন-হোয়াইটস্পেস অক্ষরের যেকোন জুড়ি বেছে নেওয়া যেতে পারে। এগুলি অবশ্যই প্রোগ্রামের মৃত্যুদন্ড কার্যকর করতে হবে।
  • উপস্থাপনের 90-ডিগ্রি ঘূর্ণন গ্রহণযোগ্য। আবার, পছন্দ অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে।
  • পিছনে বা নেতৃস্থানীয় সাদা স্থান অনুমোদিত।

একটি ভিন্ন প্রতিনিধিত্ব বিন্যাস সঙ্গে, জন্য উদাহরণস্বরূপ N = 15, M = 6প্রোগ্রামের দুই মৃত্যুদণ্ড কার্যকর ফলাফল হতে পারে

VVVVVV
@@@@@@
@@ @@@
 @  @@
    @

অথবা

VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@

অনুরূপভাবে, N = 5, M = 7, দিতে উপস্থাপনা আরেকটি প্রকরণ ব্যবহার করতে পারে,

  *
* * * *
UUUUUUU

অথবা

 *** **
UUUUUUU

অথবা

   *
*  *
*  * 
UUUUUUU

নীতিটি কীভাবে এই ক্ষেত্রে প্রযোজ্য নয় তা নোট করুন, কারণ N< M

সাধারাইওন রুল

কোনও প্রোগ্রামিং ভাষায় প্রোগ্রাম বা ফাংশন অনুমোদিত । স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।

ইনপুট যে কোনও যুক্তিসঙ্গত উপায়ে নেওয়া যেতে পারে ; এবং যে কোনও বিন্যাস সহ, যেমন দুটি সংখ্যা বা দুটি পৃথক স্ট্রিংয়ের অ্যারে।

আউটপুট মানে এবং ফর্ম্যাটও নমনীয়। উদাহরণস্বরূপ, আউটপুট স্ট্রিংগুলির তালিকা বা নিউলাইন সহ স্ট্রিং হতে পারে; ফাংশন আউটপুট আর্গুমেন্ট হিসাবে ফিরে এসেছে বা STDOUT এ প্রদর্শিত হবে। পরবর্তী ক্ষেত্রে সীমাবদ্ধ ডিসপ্লে প্রস্থের কারণে লাইন মোড়ানো সম্পর্কে চিন্তা করার প্রয়োজন নেই।

বাইটস মধ্যে সংক্ষিপ্ত কোড।


11
এটি শিরোনাম পেতে আমাকে এখনও অবধি লেগেছে ...
মার্টিন এন্ডার

@ মার্টিনএেন্ডার এটিই কি "কোড গল্ফ" এর চেয়ে "কবুতর নীতি" এর আরও চরিত্র রয়েছে, নাকি অন্য কোনও রসিকতা আছে?
দোরুকাহান মনিকে 22

5
@ ডোরুকায়হান একটি স্ট্যান্ডার্ড ব্রাউজারে প্রশ্নের শিরোনামের উপরে কিছুটা লেখা দেখুন ...
লুইস মেন্ডো

উত্তর:


2

জেলি , 9 8 বাইট

=þṗX¥S⁵*

এই dyadic লিঙ্ক আছে যা লাগে এম তার বাম এবং হিসাবে এন তার ডান আর্গুমেন্ট হিসাবে। আউটপুট হল পূর্ণসংখ্যার একটি অ্যারে, যেখানে 0 পায়রা প্রতিনিধিত্ব করে এবং 1 টি গর্তকে উপস্থাপন করে।

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

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

=þṗX¥S⁵*  Main link. Left argument: m. Right argument: n

    ¥     Combine the two links to the left into a dyadic chain and call it
          with arguments m and n.
  ṗ        Compute the n-th Cartesian power of [1, ..., m], i.e., generate all
           vectors of length n that consist of elements of [1, ..., m].
   X       Pseudo-randomly choose one of those vectors with a uniform distribution.
=þ        Equal table; for each k in [1, ..., m] and each vector to the right,
          compare the elements of the vector with k. Group the results by the
          vectors, yielding a 2D Boolean matrix.
     R    Range; map 1 to [1], 0 to [].
      S   Take the sum of all columns.
       ⁵* Raise 10 to the resulting powers.

10

গণিত, 68 বাইট

Print/@(10^RandomSample@RandomChoice[IntegerPartitions[+##,{#}]-1])&

একটি নামবিহীন ফাংশন যা দুটি পূর্ণসংখ্যক যুক্তি, বাক্সের সংখ্যা এবং আইটেমের সংখ্যা দ্বারা নেয় takes

এটি প্রথমে সমস্ত সম্ভাব্য পার্টিশনকে N+Mঠিক Mধনাত্মক অংশগুলিতে গণনা করে এবং 1পরে প্রতিটি বিভাজন থেকে বিয়োগ করে । এটা আমাদের সবার সম্ভব পার্টিশন দেয় Nমধ্যে Mঅ নেতিবাচক অংশ (যা IntegerPartitionsঅন্যথায় তৈরি করা হবে)। তারপরে একটি এলোমেলো পার্টিশন চয়ন করুন এবং এলোমেলো করুন। এটি গ্যারান্টি দেয় যে জিরো সহ সমস্ত সম্ভাব্য অর্ডার করা পার্টিশন অনুমোদিত রয়েছে। অবশেষে, পার্টিশনের প্রতিটি বিনটিকে সংশ্লিষ্ট পাওয়ারে 10 বাড়িয়ে আউটপুট লাইনে রূপান্তর করুন (যেমন প্রতিটি লাইন জিরো 1000...দিয়ে যায় k)। একটি উদাহরণ আউটপুট যেমন হতে পারে:

100
10000
1
10
10

আমি বিশ্বাস করি PadRightযে < Mযদি জিরোতে প্যাড না করে । NM
LegionMammal978

1
@ LegionMammal978 ধন্যবাদ, একই বাইট গণনা এ এটি ঠিক করতে পরিচালিত।
মার্টিন এন্ডার

... আমি সৎভাবে মুগ্ধ। আমি একই ধরণের সমাধান PadRightকরতে চলেছিলাম , তবে তালিকাভুক্ত নয় এটি এটিকে আরও দীর্ঘায়িত করবে।
LegionMammal978

@ LegionMammal978 এড়ানোর আরেকটি উপায় PadRightহবে IntegerPartitions[#,{#2},0~Range~#]
মার্টিন এন্ডার

1
বুটলটিন নেই? আমি অবাক হই ...: D তবে সুন্দর উত্তর। এটি প্রথমে কীভাবে কাজ করে তা আমি খালি জানতে হবে: পি
হাইপার নিউট্রিনো

9

পাইথন 2, 77 86 বাইট

from random import*
n,m=input()
exec'c=randint(0,n);n-=c;print 10**c;'*~-m
print 10**n

[0, n] এ একটি সংখ্যা উত্পন্ন করে, প্রিন্ট করে যে অনেকগুলি আইটেম প্রযোজ্য এবং এটি এন থেকে সাবস্ট্রাক্ট করে। এটি এই মি বার করে।

এটি একেবারে অসম্ভব যে কোনও কিছু এটি শেষ বাক্সে পৌঁছে দেয়, তবে প্রশ্নটি কেবলমাত্র প্রতিটি আউটপুট সমানভাবে সম্ভব না হয়ে সম্ভব বলে জিজ্ঞাসা করেছিল ।


7

ব্যাচ, 164 বাইট

@for /l %%i in (1,1,%1)do @set h%%i=1
@for /l %%j in (1,1,%2)do @call set/ab=%%random%%%%%%%1+1&call set/ah%%b%%*=10
@for /l %%i in (1,1,%1)do @call echo %%h%%i%%

আমি মনে করি টানা 7 টি %লক্ষণ একটি নতুন ব্যক্তিগত সেরা হতে পারে! দ্রষ্টব্য: এটি একই বাক্সে 9 টিরও বেশি আইটেম বরাদ্দ করাতে অদ্ভুত আউটপুট তৈরি করে; যদি সমস্যা হয় তবে 180 বাইটের জন্য:

@for /l %%i in (1,1,%1)do @set h%%i=1
@for /l %%j in (1,1,%2)do @call set/ab=%%random%%%%%%%1+1&call call set h%%b%%=%%%%h%%b%%%%%%0
@for /l %%i in (1,1,%1)do @call echo %%h%%i%%

হ্যাঁ, %এটি দ্বিতীয় লাইনে মোট 28 টি।


5

সি, 102 বাইট

n,m;main(x){srand(time(0));for(scanf("%d %d",&n,&m);m--;n-=x)printf("|%0*s\n",x=m?rand()%(n+1):n,"");}

স্টিডিনে ইনপুট নেয়, যেমন:

echo "5 4" | ./pigeonhole

সমান সম্ভাব্যতা সহ প্রতিটি আউটপুট উত্পন্ন করবে না, তবে সমস্ত সম্ভাব্য সংমিশ্রণ উত্পন্ন করতে সক্ষম।

ভাঙ্গন:

n,m;
main(x){
    srand(time(0));             // Seed random number generator
    for(scanf("%d %d",&n,&m);   // Parse input values into n and m
        m--;                    // Loop through each bucket (count down)
        n-=x)                   // Subtract number assigned to bucket from total
        printf(                 // Output a formatted string using padding
            "|%0*s\n",          // (turns out %0s will actually zero-pad a string!)
            x=m?rand()%(n+1):n, // Calculate a number of items for this bucket
            "");
}

GCC এর অপরিজ্ঞাত আচরণের পরিচালনার উপর নির্ভর করে %0s- সাধারণত %0শূন্য-প্যাড একটি পূর্ণসংখ্যা বা ভাসমান করবে তবে এটি কেবল প্যাড করতে পারে (কখনই কাটা যাবে না), তাই ফাঁকা মুদ্রণ করা সম্ভব নয়। তবে স্ট্রিংগুলির আচরণ নির্ধারণ করা হয়নি, এবং জিসিসি এটিকে শূন্য-প্যাড তৈরি করার সিদ্ধান্ত নিয়েছে, তাই এই শূন্য-প্যাড শূন্য-বা আরও বেশি লিখতে সক্ষম হওয়ার জন্য একটি খালি স্ট্রিং তৈরি করে 0


2
যেহেতু ফাংশন অনুমোদিত, আপনি এবং এর a(b,c){...}পরিবর্তে কয়েকটি অক্ষর কেটে ফেলতে পারেন । mainscanf
কেভিন

3

পাইথন 2, 102 99 97 90 বাইট

m-1বার, এর xমধ্যে একটি এবং এলোমেলো পরিমাণ নির্বাচন করে 0এবং nএটি এন থেকে বিয়োগ করে। তারপরে একটি 1এবং মুদ্রণ করুন '0'*x

অবশেষে, মুদ্রণ 1এবং বাকি 0গুলি। মোটেও সমান সুযোগ নয়, তবে সমস্ত কনফিগারেশন সম্ভব।

from random import*
n,m=input()
exec'x=randrange(n+1);n-=x;print 10**x;'*(m-1)
print 10**n

(ভাঙা পাইথনের উত্তর থেকে পুনরায় ব্যবহৃত কোড))


আমি মনে করি এই উত্তরটি আমার উত্তর সম্পর্কে একটি পরামর্শ হওয়া উচিত কারণ এটি একটি ছোট বাগ ফিক্স সহ আক্ষরিকভাবে একই উত্তর।
orlp

1
@orlp আপনি যদি এই উত্তরের ইতিহাসের দিকে তাকান তবে এটি সর্বশেষতম সংস্করণে পরিণত হয়েছে। আমি যদি প্রাথমিকভাবে এটি তৈরি করতাম তবে আমি পরিবর্তে এটি একটি মন্তব্য হিসাবে পোস্ট করতাম।
L3viathan

আহ তবে এটি ঠিক আছে, এটি যেভাবে দেখেছে (এবং আপনি 'পুনঃব্যবহৃত কোড' লিখেছেন) এটিকে তার চেয়ে আলাদা দেখায়। দুঃখিত।
orlp

@orlp কোন সমস্যা নেই আপনারা এখন আমার চেয়ে কম কাজ করছেন এবং যাইহোক, আপনি যদি মনে করেন যে এটি আপনার খুব কাছাকাছি রয়েছে তবে আমি এই উত্তরটি মুছতে পারি, আমার আপত্তি নেই, কেবল পরিষ্কার করতে চেয়েছিলাম যে আমি আপনার উত্তরটি কেবল অনুলিপি-পেস্ট করিনি।
L3viathan

3

হাস্কেল, 114 94 বাইট

import System.Random
n#m=map(10^).take m.until((==n).sum.take m)tail.randomRs(0,m)<$>newStdGen

কিছুটা হিংস্র ফোর্স পদ্ধতির: এলোমেলো সংখ্যার একটি অসীম তালিকা তৈরি করে, তালিকার শুরুতে n সংখ্যা নেয়, তাদের যোগফল দেয় এবং তারা মিটার সমান কিনা তা পরীক্ষা করে। যদি তা না হয় তবে তালিকা থেকে প্রথম উপাদানটি নিয়ে যান এবং পুনরাবৃত্তি করুন।

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

দ্রষ্টব্য: আমদানি ছাড়াই 73 বাইট

সম্পাদনা: 10 ^ ট্রিক দিয়ে কিছু বাইট সংরক্ষণ করা হয়েছে ( অনলাইনে নতুন সংস্করণ চেষ্টা করুন! )


2

রেক্সএক্স, 74 বাইট

arg n m
m=m-1
o.=@
do n
  a=random(m)
  o.a=o.a||#
  end
do a=0 to m
  say o.a
  end

আউটপুট (8 5):

@#
@###
@
@#
@###

আউটপুট (8 5):

@#
@#
@
@####
@##

2

সি, 175 138 বাইট

37 বাইট সংরক্ষণের জন্য ডেভকে ধন্যবাদ!

i;f(n,m){char**l=calloc(m,8);for(i=0;i<m;)l[i]=calloc(n+1,1),*l[i++]=124;for(i=n+1;--i;)*strchr(l[rand()%m],0)=35;for(;i<m;)puts(l[i++]);}

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


1
হাই, কয়েকটি জিনিস যা আপনাকে এটি হ্রাস করতে সহায়তা করতে পারে: callocআপনাকে 0-আরম্ভীকৃত মেমরি দেবে (সমস্ত 0s নিজেই সেট করার দরকার নেই), strchrএকটি স্ট্রিংয়ের সমাপ্তি খুঁজে পেতে পারে, কমা কমাতে ক্রিয়াকলাপ করতে পারে, প্রয়োজনীয়তা এড়িয়ে চলা {}এবং x[0] == *x। এছাড়াও নজর রাখুন; তুমি নও mallocপর্যাপ্ত মেমরি ing যদি সব আইটেমের একই বক্সে হয়।
ডেভ

2

এএইচকে, 66 বাইট

2-=1
Loop,%2%{
Random,r,0,%1%
Send,|{# %r%}`n
1-=r
}
Send,|{# %1%}

আমি একই প্রিন্সিপালটিকে অনুসরণ করেছি যা orlp 0 থেকে N পর্যন্ত এলোমেলো সংখ্যা ব্যবহার করে এবং তারপর এটি এন থেকে বিয়োগ করে ফেলেছে দুর্ভাগ্যক্রমে, পাঠানোর ফাংশনটি যেভাবে কাজ করে তার জন্য 10 using r ব্যবহার করে আমি বাইটগুলি সংরক্ষণ করতে পারিনি। হায়রে আলাক। এখানে এন = 8, মি = 5 এর কিছু আউটপুট রয়েছে:

|##     |#####    |##       |##     |#      |##   
|##     |#        |#####    |       |###    |#    
|#      |##       |         |###    |###    |     
|###    |         |         |       |#      |     
|       |         |#        |###    |       |#####

2

সিজেম, 30 31 21 বাইট

:B1a*:C\{CBmrAt.*}*N*

n mস্ট্যাকের মধ্যে ইনপুট দুটি সংখ্যা । ব্যবহার 1কলাম অক্ষরের জন্য এবং 0পুনরাবৃত্তি অক্ষরের জন্য।

ব্যাখ্যা:

:B          e# Store m in B (without deleting it from the stack)
1a          e# Push 1 and wrap it in an array: [1]
*           e# Repeat the array m times
:C          e# Store this array in C (without deleting)
\{          e# Do n times:
  CBmrAt    e#   Create an array of 1s with a random element replaced with 10.
  .*        e#   Vectorized multiplication: multiply the respective elements in the arrays.
            e#   Effectively, we multiply a random value in the array by 10 (and add a 0 to the end).
}*          e# End loop.
N*          e# Join with newlines.


1

পিএইচপি, 100 বাইট

list($z,$m,$n)=$argv;$a=array_fill(0,$n,z);while($m>0){$a[rand(0,$n-1)].=a;$m--;}echo join("\n",$a);

ভাঙ্গন:

list($z,$m,$n)=$argv;     // assigns the input vars to $m and $n
$a=array_fill(0,$n,z);    // creates an array $a of $n elements containing 'z'
while($m>0){              // randomly populate array $a
    $a[rand(0,$n-1)].=a;  //
    $m--;                 //
}                         //
echo join("\n",$a);       // output $a contents separated by a new line

ফলাফল m=7এবং n=5:

প্রথম কার্যকর:

za
zaa
za
za
zaa

দ্বিতীয় কার্যকর:

za
zaa
zaaa
z
za

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


আপনি [,$m,$n]=$argv;কয়েকটি অক্ষর সংরক্ষণ করতে পিএইচপি 7.1 ব্যবহার করতে পারেন । \n1 বাইট সংরক্ষণ করতে আপনি একটি আসল লাইন বিরতি দিয়ে প্রতিস্থাপন করতে পারেন । আপনি for(;$m-->0;)$a[rand(0,$n-1)].=a;বিরতি, একটি $mএবং একটি সেমিকোলন সংরক্ষণ করতে ব্যবহার করতে পারেন । [,$m,$n]=$argv;$a=array_fill(0,$n,z);for(;$m-->0;)$a[rand()%$n].=a;echo join("\n",$a);85 বাইট
ক্রিস্টোফ

এই গল্ফ আরও [,$m,$n]=$argv;for(;$m--;)${rand()%$n}.=a;for(;$n--;)echo"z${$n}\n";67 বাইট ডাউন ডাউন ।
ক্রিস্টোফ

@ ক্রিসটফ আমি [,$m,$n]=$argv;অন্যান্য কোড-গল্ফগুলিতে স্বরলিপিটি দেখেছি কিন্তু এটি আমার দেব পরিবেশে বা ইভাল.in-এ কাজ করতে সক্ষম হইনি
Roberto06

তা এখানে দেখুন: sandbox.onlinephpfunctions.com/code/...
ক্রিস্টোফ

1
খুশী হলাম। আমার মনে হয় আপনি নিজের স্নিপেটটি উত্তর হিসাবে পোস্ট করতে পারেন কারণ এটি আমার থেকে অনেকটা আলাদা;)
রবার্তো 06

1

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

x=>y=>{s=[];for(;x>1;y-=t)s[--x]="|"+"#".repeat(t=Math.random()*(y+1)|0);s[0]="|"+"#".repeat(y);return s}

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

সারিগুলি নির্ধারণের পদ্ধতির কারণে, এটি নীচের দিকে আরও বেশি দিকে ঝুঁকবে, যদিও শীর্ষে কিছু পাওয়ার সম্ভাবনা রয়েছে small


1

রুবি, 52 বাইট

->(n,m){r=Array.new(m){?|};n.times{r[rand m]+=?#};r}

একটি অনামী ফাংশন তৈরি করে যা দুটি পূর্ণসংখ্যার যুক্তি হিসাবে গ্রহণ করে এবং স্ট্রিংগুলির একটি অ্যারে প্রদান করে:

>> puts ->(n,m){r=Array.new(m){?|};n.times{r[rand m]+=?#};r}.call 7,5
|#
|#
|##
|##
|#

1

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

from random import*
def f(n,m):l=['#']*m;exec('l[randrange(m)]+="o";'*n);return l

স্ট্রিংগুলির একটি তালিকা ফেরত দেয়।


1

জাভাস্ক্রিপ্ট (ES7), 75 বাইট

(N,M)=>{for(r='';M;M--,N-=x=~~(Math.random()*(N+1)),r+=10**x+`
`);return r}

আমি ভেবেছিলাম যে আমি 10 টি ধারণার শক্তি নিয়ে এসেছি কেবল উপলব্ধি করতে যে বেশিরভাগ উত্তর ইতিমধ্যে এটি ব্যবহার করছে।


1

এডাব্লুকে, 78 বাইট

{srand();for(;n++;)c[k]=c[k=int($2*rand())]"#"}END{for(;j<$2;)print"|"c[j++]}

2 টি আর্গুমেন্ট নেয়, প্রথমে আইটেমের সংখ্যা, তারপরে বাক্সের সংখ্যা। এলোমেলো সংখ্যা জেনারেটর বীজ দিয়ে শুরু হয় যাতে প্রতিটি রান আলাদা হয়। তারপরে একটি অ্যারেতে কেবল স্ট্রিংগুলি তৈরি করে, ব্যবহারের উদাহরণটি:

awk '{srand();for(;n++;)c[k]=c[k=int($2*rand())]"#"}END{for(;j<$2;)print"|"c[j++]}' <<< "12 5"

Example output:
|##
|###
|##
|##
|###

1

ম্যাটল্যাব, 103 94 বাইট

function a(m,n)
d=@(p)disp(char([1,~(1:p)]+48));for i=1:m-1;p=randi([0,n]);d(p);n=n-p;end;d(n)

বিন্যাস সহ

function a(m,n)
for i=1:m-1 
    d=@(p)disp(char([1,~(1:p)]+48));  % inline function for displaying
    p=randi([0,n]);              % picking a random number b/w 0 and n
    d(p);                        % '1' represents the box/pigeonhole, with '0's denoting entries
    n=n-p;
end
d(n);                            % writing the remaining entries/zeros

নমুনা আউটপুট

>> a(4,7)
10
10000
10
10

প্রতিটি অ্যারে এন্ট্রি তাদের মধ্যে একটি ট্যাব দিয়ে প্রদর্শিত হওয়ার পরে সেখানে পূর্ববর্তী শ্বেতস্পেস রয়েছে তবে স্পেস অনুযায়ী এটি গ্রহণযোগ্য হবে।

এটি আমার কাছে খুব সরল বাস্তবায়ন বলে মনে হচ্ছে, সুতরাং আমি নিশ্চিত যে এটির উন্নতি হতে পারে।

পরামর্শের জন্য @ লুইস মেন্ডোকে ধন্যবাদ।


এটি দু'বার লেখা এড়ানোর জন্য প্রদর্শন বিবৃতিটিকে বেনামি ফাংশন হিসাবে সংজ্ঞায়িত করে বেশ কয়েকটি বাইট সংরক্ষণ করতে পারেন:d=@(p)disp(char([1,~(1:p)]+48));for i=1:m-1;p=randi([0,n]);d(p);n=n-p;end;d(n)
লুইস মেন্ডো

@ লুইস মেন্ডো এই পরামর্শের জন্য ধন্যবাদ, আমি আপডেট করব। আমি কি আমার আসল ফাংশনটিকে একইভাবে সংজ্ঞায়িত করতে পারি, যেমন? a = @ (মি, এন) ... যেহেতু এটি বাইটের সংখ্যাও হ্রাস করবে। লোকেরা কীভাবে ম্যাটল্যাব কোড-গল্ফ উত্তরগুলিতে "ফাংশন নাম (আরগস)" সরান / সংক্ষিপ্ত করেন?
ক্রস্টড

হ্যাঁ, আপনি উত্তর হিসাবে একটি anoymous ফাংশন ব্যবহার করতে পারেন। আপনি এড়িয়ে যেতে পারেন a=। এই ক্ষেত্রে আপনি নীতিগতভাবে এটি করতে পারবেন না, কারণ বেনামে ফাংশনগুলিতে লুপ থাকতে পারে না। তবে আপনি সবকিছু ofোকানোর কৌশলটি ব্যবহার করতে পারেন eval('...')। বিটিডাব্লু, এটি মাতলাবে সাধারণত কুৎসিত এবং খারাপ অভ্যাস হিসাবে বিবেচিত হয়, তবে এখানে আমরা গালি দেওয়া ভাষাগুলি পছন্দ করি :-)
লুইস মেন্ডো

হুম .. আমি আপনার পরামর্শের ভিত্তিতে আপডেট করব এবং এ সম্পর্কে আরও কিছু চিন্তা করব এবং লুপটি এড়াতে পারি কিনা তা দেখতে পাবো, যদিও এটি অসম্ভব বলে মনে হচ্ছে। আমি এমন যুক্তি সম্পর্কে ভাবতে পারি যা এটি করতে পারে তবে কীভাবে এটি প্রয়োগ করা যায় তা নিশ্চিত নই .. আমি একটি সংখ্যা 10 ^ n সংজ্ঞায়িত করার কথা ভাবছি, এবং 10 এর সমস্ত ক্ষমতার এম সংখ্যাগুলি খুঁজে বের করতে চাইছি এবং তারপরে কেবল সেগুলি মুদ্রণ করব। আমার কাছে এখন ঠিক একই আউটপুট হবে ..: ডি কোনও পরামর্শ? অন্য উত্তর হিসাবে নির্দ্বিধায় পোস্ট করুন।
Krostd

আমি বোঝাতে চেয়েছি m
গুণক

1

অক্টাভা , 62 54 বাইট

@(n,m)strcat(62,(sum(randi(m,1,n)==(1:m)',2)>=1:n)*42)

বেনামে ফাংশন যা দুটি সংখ্যা নেয় এবং >বাক্স এবং *অবজেক্টগুলির জন্য অক্ষরের 2D অ্যারে আউটপুট করে। সমস্ত ফলাফল সমানভাবে সম্ভবত।

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


1

টিআই-বেসিক, 63 62 বাইট

Prompt N,M
For(A,1,M
N→B
If M-A
randInt(0,N→B
":→Str0
For(C,1,B
Ans+"X→Str0
End
Disp Ans
N-B→N
End

প্রতিটি অ্যাসাইনমেন্টের বাছাইয়ের শূন্য-সম্ভাবনা থাকা উচিত।

এই মানদণ্ডটি এই প্রোগ্রামটি লিখতে আরও সহজ করে তুলেছে।

আই / ও উদাহরণ:

prgmPIDGEON
N=?5
M=?2
:XXXX
:X

ব্যাখ্যা:

Prompt N,M     # 5 bytes, input number of items, number of boxes
For(A,1,M      # 7 bytes, for each box
N→B            # 4 bytes, on last box, make sure the sum is met by adding N items
If M-A         # 5 bytes, if not last box
randInt(0,N→B  # 8 bytes, add random number of items from 0 to N to box A
":→Str0        # 6 bytes, first character
For(C,1,B      # 7 bytes, add B items to the box
Ans+"X→Str0    # 8 bytes
End            # 2 bytes
Disp Ans       # 3 bytes, print this box
N-B→N          # 6 bytes, subtract the items used in this box
End            # 1 byte, move on to next box

1

ম্যাটল্যাব, 73 64 58 বাইট

# 3 আপডেট করুন

আমার বাছাই করা দরকার, অন্যথায় আমি নেতিবাচক পূর্ণসংখ্যা পাই বলে মনে হয়। আমি প্রতিস্থাপন হয়নি disp(sprintf(...))সঙ্গে fprintf(...), যদিও, এখন এত উত্তর 58 বাইট রয়ে যায়।

@(m,n)fprintf('%i\n',10.^diff([0;sort(randi(n,m-1,1));n]))

# 2 আপডেট করুন:

আমি বুঝতে পেরেছিলাম যে অ্যারে বাছাই করার দরকার নেই, এবং প্রকৃতপক্ষে বাছাই করা আসলে অ্যারের সংখ্যাগুলির গড় হ্রাস করবে। তাই আমি sort(...)অংশটি মুছে ফেলেছি । মনে রাখবেন আউটপুটটি একই থাকবে, তাই আমি "নমুনা আউটপুট" আপডেট করছি না।

@(m,n)disp(sprintf('%i\n',10.^diff([0;randi(n,m-1,1);n])))

অবশেষে লুইসের অষ্টাভে উত্তরটি বন্ধ! : ডি

# 1 আপডেট করুন:

@(m,n)disp(sprintf('%i\n',10.^diff([0;sort(randi(n,m-1,1));n])))

স্ট্রিংয়ে রূপান্তরিত করার পরিবর্তে, আমি কেবল সরাসরি সংখ্যা প্রদর্শন করি। আমি এটিকে সরিয়ে 58 বাইটে হ্রাস করতে পারলাম disp(...), তবে আমি ans =কেবল স্প্রিন্টফের সাহায্যে অতিরিক্ত পেয়েছি এবং এটি গ্রহণযোগ্য কিনা তা আমি জানি না।

প্রাথমিক কোড:

@(m,n)disp(strjust(num2str(10.^diff([0;sort(randi(n,m-1,1));n])),'left'))

লুইসের কিছু পরামর্শের জন্য ধন্যবাদ , আমি আমার আগের উত্তরের লুপ থেকে মুক্তি পেয়েছি । এখন আমি প্রথমে ( ) mপর্যন্ত যোগ করে এলোমেলো সংখ্যার একটি উল্লম্ব অ্যারে তৈরি করব , তারপরে এগুলিকে 10 এর ব্যয়কারী হিসাবে ব্যবহার করব, তাদের একটি স্ট্রিংয়ে রূপান্তর করব, বাম-ন্যায়সঙ্গত করব এবং তাদের প্রদর্শন করব।ndiff([0;sort(randi(n,m-1,1));n])

আমি আরও 6 টি বাইট সংরক্ষণ করার জন্য প্রযুক্তিগতভাবে ডিসপ্লে (...) থেকে মুক্তি পেতে পারি, তবে তারপরে একটি "আনস" মুদ্রিত হয় যা চশমা লঙ্ঘন করতে পারে। এগুলি স্ট্রিংয়ে পরিবর্তন করার এবং বাম-ন্যায়সঙ্গতভাবে কাঙ্ক্ষিত শেষের ফর্ম্যাটটি পাওয়ার পক্ষেও একটি উপায় থাকতে পারে, তাই আমি পরামর্শগুলির জন্য উন্মুক্ত।

নমুনা আউটপুট:

>> a=@(m,n)disp(strjust(num2str(10.^diff([0;sort(randi(n,m-1,1));n])),'left'));
>> a(4,6)
1000
10  
100 
1   

দ্রষ্টব্য : আমি পরামর্শের ভিত্তিতে আমার ফাংশনটি এখানে একটি বেনামে ফাংশনে পরিবর্তন করেছি। নমুনা আউটপুটে, আমিaপ্রদর্শনেরজন্যএটিনির্ধারিত করেছি। আমি আশা করি এটি চশমা লঙ্ঘন করে না, তবে এটি যদি দয়া করে আমাকে জানান এবং আমি এটি পরিবর্তন করব।


আমি ঠিক বুঝতে পেরেছি যে শীর্ষের উত্তরটি 10 ​​same একই যুক্তি ব্যবহার করে .. এটির মূল্য কী, এবং যদি তা গুরুত্বপূর্ণ হয় তবে আমি আমার উত্তরের রেফারেন্স হিসাবে এটি ব্যবহার করি নি .. (তবে ডাং, কেউ আমাকে এতে মারধর করেছে!: পি)
ক্রস্ট

এছাড়াও যুক্ত হওয়া এলোমেলো পূর্ণসংখ্যা তৈরির ধারণার জন্য এই উত্তরের ক্রেডিট নোট করতে চেয়েছিল , যেহেতু আমি দীর্ঘদিন ধরে সেই অংশটিতে আটকে ছিলাম .. (এখনও আমার উত্তরগুলিতে 2 টিরও বেশি লিঙ্ক যুক্ত করতে পারে না, তাই এটি সহ একটি মন্তব্যে)mn
Krostd

1

স্ট্যাকড , 29 বাইট

('|')\rep\[:randin'#'push@.]*

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

একটি অ্যারের গঠন করে আচরণ করবে Mধারণকারী singletons '|', তারপর যোগ '#'একটি এলোমেলোভাবে নির্বাচিত অ্যারেতে Nবার।


নিস! এবং তাই সমস্ত ফলাফল সমান সম্ভাবনা আছে, তাই না?
লুইস মেন্ডো

@ লুইস মেন্ডোটি হওয়া উচিত, যেহেতু randinঅভ্যন্তরীণভাবে ফিশার-ইয়েটস অ্যালগরিদম ব্যবহার করে। (এটি একই অ্যালগরিদম যা সিজেএম উত্তর এফডাব্লুআইডাব্লু ব্যবহার করে)
ও'ব্রায়ান

1

পাইথন 2 , 80 95 89 88 বাইট

from random import*
n,m=input()
while m:x=randint(0,n);print'1'+'0'*[n,x][m>1];m-=1;n-=x

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

  • 15 বাইট যুক্ত করা হয়েছে: পূর্ববর্তী সম্পাদনাটি কিছুটা ত্রুটিযুক্ত ছিল, কিছু পাইগন বাদ ছিল।
  • 6 টি বাইট সংরক্ষিত: [এন, এক্স] [এম> 1] দ্বারা অন্যথায় প্রতিস্থাপন করা হয়েছে
  • সংরক্ষণ করা হয়েছে 1 বাইট: আমদানি *

1

কাঠকয়লা , 19 বাইট

≔EN⟦⟧θFN⊞‽θ#Eθ⁺|⪫ιω

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

  N                 Input `M`
 E                  Map over implicit range
   ⟦⟧               Empty array
≔    θ              Assign resulting nested array to `q`

       N            Input `N`
      F             Loop over implicit range
          θ         Nested array `q`
         ‽          Random element
           #        Literal string
        ⊞           Append to array

             θ      Nested array `q`
            E       Map over array
                 ι  Current element
                  ω Empty string
                ⪫   Join
               |    Literal string
              ⁺     Concatenate
                    Implicitly print on separate lines
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.