Nguyên tắc Pigeonhole & Code Golf


26

Các nguyên tắc chuồng bồ câu trạng thái mà

Nếu N mục được đặt vào hộp M , với N > M , thì ít nhất một hộp phải chứa nhiều hơn một mục.

Đối với nhiều người, nguyên tắc này có một trạng thái đặc biệt so với các ban hành toán học khác. Như EW Dijkstra đã viết ,

Nó được bao quanh bởi một số bí ẩn. Bằng chứng sử dụng nó thường được coi là một cái gì đó đặc biệt, một cái gì đó đặc biệt khéo léo.

Các thách thức

Mục đích của thử thách này là để minh họa cho nguyên tắc pigeonhole bằng cách sử dụng các biểu diễn nghệ thuật ASCII. Đặc biệt:

  1. Lấy làm đầu vào N(số lượng vật phẩm) và M(số lượng hộp), Nkhông âm và Mdương. Ncó thể nhỏ hơn M(ngay cả khi nguyên tắc không áp dụng trong trường hợp đó).
  2. Chọn ngẫu nhiên một trong những bài tập có thể của các mục vào hộp. Mỗi bài tập nên có xác suất khác không được chọn.
  3. Tạo một biểu diễn nghệ thuật ASCII của bài tập như sau:

    • Mdòng, mỗi dòng tương ứng với một hộp.
    • Mỗi dòng bắt đầu bằng một ký tự không phải khoảng trắng, chẳng hạn như |.
    • Theo sau nhân vật đó là một nhân vật không phải khoảng trắng khác, chẳng hạn như #, lặp đi lặp lại nhiều lần như có các mục trong hộp đó.

Xem xét ví dụ N = 8, M = 5. Nếu assigment chọn các mặt hàng để hộp được 4, 1, 0, 3, 0, đại diện là

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

Một lần chạy khác nhau (dẫn đến một nhiệm vụ khác nhau) của cùng một chương trình có thể đưa ra

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

Có một số linh hoạt liên quan đến đại diện; xem bên dưới.

Quy tắc cụ thể

về lý thuyết nên chạy cho bất kỳ giá trị nào của NM. Trong thực tế, nó có thể bị hạn chế bởi kích thước bộ nhớ hoặc giới hạn loại dữ liệu.

Vì việc quan sát đầu ra là không đủ để xác định xem tất cả các bài tập có xác suất khác không , mỗi lần gửi sẽ giải thích cách mã đạt được điều đó, nếu không rõ ràng.

Các biến thể đại diện sau được cho phép:

  • Bất kỳ cặp ký tự khác, không khoảng trắng có thể được chọn. Họ phải nhất quán trong suốt quá trình thực hiện chương trình.
  • Xoay 90 độ của đại diện được chấp nhận. Một lần nữa, sự lựa chọn phải nhất quán.
  • Trailing hoặc khoảng trắng hàng đầu được cho phép.

Như một ví dụ với định dạng biểu diễn khác, vì N = 15, M = 6kết quả của hai lần thực hiện chương trình có thể là

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

hoặc là

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

Tương tự như vậy, N = 5, M = 7có thể cung cấp, sử dụng một biến thể của các đại diện,

  *
* * * *
UUUUUUU

hoặc là

 *** **
UUUUUUU

hoặc là

   *
*  *
*  * 
UUUUUUU

Lưu ý cách nguyên tắc không được áp dụng trong trường hợp này, bởi vì N< M.

Quy tắc chung

Các chương trình hoặc chức năng được cho phép, trong bất kỳ ngôn ngữ lập trình . Sơ hở tiêu chuẩn bị cấm.

Đầu vào có thể được thực hiện bằng bất kỳ phương tiện hợp lý ; và với bất kỳ định dạng nào, chẳng hạn như một mảng gồm hai số hoặc hai chuỗi khác nhau.

Phương tiện đầu ra và định dạng cũng linh hoạt. Ví dụ, đầu ra có thể là một danh sách các chuỗi hoặc một chuỗi có dòng mới; được trả về dưới dạng đối số đầu ra của hàm hoặc được hiển thị trong STDOUT. Trong trường hợp sau, không cần phải lo lắng về việc ngắt dòng gây ra bởi chiều rộng màn hình bị giới hạn.

Mã ngắn nhất trong byte thắng.


11
Tôi thực sự phải mất đến bây giờ để có được danh hiệu ...
Martin Ender

@MartinEnder Có phải là "nguyên tắc pigeonhole" có nhiều ký tự hơn "mã golf", hay có một số trò đùa khác?
dorukayhan muốn Monica trở lại vào

5
@dorukayhan Trong một trình duyệt tiêu chuẩn, hãy nhìn vào văn bản phía trên tiêu đề câu hỏi một chút ...
Luis Mendo

Câu trả lời:


2

Thạch , 9 8 byte

=þṗX¥S⁵*

Đây là một liên kết dyadic lấy M làm bên trái và N làm đối số bên phải của nó. Đầu ra là một mảng các số nguyên, trong đó 0 đại diện cho chim bồ câu và 1 đại diện cho các lỗ.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

=þṗ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

Toán học, 68 byte

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

Một hàm không tên có hai đối số nguyên, số lượng hộp, theo sau là số lượng mục.

Đầu tiên, nó tính toán tất cả các phân vùng có thể N+Mthành Mcác phần chính xác và trừ vào 1mỗi phân vùng sau đó. Điều này cung cấp cho chúng tôi tất cả các phân vùng có thể Nthành Mcác phần không âm ( IntegerPartitionssẽ không tạo ra khác). Sau đó chọn một phân vùng ngẫu nhiên và xáo trộn nó. Điều này đảm bảo tất cả các phân vùng có thể có với số không được cho phép. Cuối cùng, chuyển đổi mỗi bin của phân vùng đó để một dòng đầu ra bằng cách tăng 10 với sức mạnh tương ứng (ví dụ rằng mỗi dòng trở 1000...với ksố không). Một ví dụ đầu ra có thể trông giống như:

100
10000
1
10
10

Tôi tin rằng PadRightsẽ không trở thành Msố không nếu N< M.
LegionMammal978

1
@ LegionMammal978 Cảm ơn, quản lý để sửa nó ở cùng một số byte.
Martin Ender

... Tôi thực sự ấn tượng. Tôi đã định làm một giải pháp tương tự, nhưng việc PadRightkhông nghe được sẽ khiến nó lâu hơn nhiều.
LegionMammal978

@ LegionMammal978 Một cách khác để tránh PadRightsẽ là IntegerPartitions[#,{#2},0~Range~#].
Martin Ender

1
Không có buitltin? Tôi ngạc nhiên ...: D Nhưng câu trả lời hay. Tôi chỉ cần tìm ra cách nó hoạt động đầu tiên: P
HyperNeutrino

9

Python 2, 77 86 byte

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

Tạo một số trong [0, n], in ra nhiều mục và tạo thành số đó từ n. Nó làm điều này m lần.

Điều này làm cho nó rất khó có thể làm cho nó đến hộp cuối cùng, nhưng câu hỏi chỉ yêu cầu rằng mọi đầu ra đều có thể , không có khả năng như nhau .


7

Mẻ, 164 byte

@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%%

Tôi nghĩ rằng 7 %dấu hiệu liên tiếp có thể là một cá nhân mới tốt nhất! Lưu ý: điều này tạo ra đầu ra lẻ nếu nó chỉ định nhiều hơn 9 mục cho cùng một hộp; nếu đó là một vấn đề, thì với 180 byte:

@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%%

Vâng, đó là %tổng cộng 28 giây trên dòng thứ hai.


5

C, 102 byte

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,"");}

Đưa đầu vào vào stdin, vd:

echo "5 4" | ./pigeonhole

Không tạo ra mỗi đầu ra với xác suất bằng nhau, nhưng có khả năng tạo ra tất cả các kết hợp có thể.

Phá vỡ:

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
            "");
}

Dựa vào cách xử lý của GCC đối với hành vi không xác định của %0s- thông thường %0sẽ không đệm số nguyên hoặc số float, nhưng nó chỉ có thể đệm (không bao giờ cắt ngắn), do đó không thể in trống. Nhưng hành vi cho các chuỗi không được xác định và GCC đã quyết định biến nó thành zero-pad theo cùng một cách, do đó, phần đệm này là một chuỗi rỗng để có thể viết 0 hoặc nhiều hơn 0.


2
Vì các chức năng được cho phép, bạn có thể cắt bỏ một vài ký tự bằng cách sử dụng a(b,c){...}thay vì mainscanf.
Kevin

3

Python 2, 102 99 97 90 byte

m-1lần, chọn một số tiền ngẫu nhiên xgiữa 0n, bao gồm và trừ nó từ n. Sau đó in một 1'0'*x.

Cuối cùng, in 1và phần còn lại của 0s. Không phải tất cả các cơ hội như nhau, nhưng tất cả các cấu hình đều có thể.

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

(Mã được sử dụng lại từ câu trả lời Python bị hỏng.)


Tôi nghĩ rằng câu trả lời này nên là một gợi ý cho câu trả lời của tôi vì nó thực sự là cùng một câu trả lời với một sửa lỗi nhỏ.
orlp

1
@orlp Nếu bạn nhìn vào lịch sử của câu trả lời này, nó sẽ trở thành phiên bản mới nhất. Nếu tôi đã làm nó như thế này ban đầu, tôi sẽ đăng nó như một bình luận thay thế.
L3viathan

À thì không sao, cái nhìn của nó (và rằng bạn đã viết 'mã được sử dụng lại') khiến nó trông khác so với thực tế. Lấy làm tiếc.
orlp

@orlp Không vấn đề gì. Bây giờ bạn đang làm việc và ngắn hơn tôi, tôi cũng có thể xóa câu trả lời này nếu bạn cảm thấy nó quá gần với bạn, tôi không phiền, chỉ muốn làm rõ rằng tôi không chỉ sao chép-dán câu trả lời của bạn.
L3viathan

3

Haskell, 114 94 byte

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

Một chút về cách tiếp cận vũ phu: Tạo ra một danh sách vô số các số ngẫu nhiên, lấy n số bắt đầu của danh sách, tính tổng chúng và kiểm tra xem chúng có bằng m không. Nếu không, lấy phần tử đầu tiên ra khỏi danh sách và lặp lại.

Hãy thử trực tuyến!

Lưu ý: 73 byte mà không cần nhập

EDIT: Đã lưu một số byte bằng thủ thuật 10 ^ ( Hãy thử phiên bản mới trực tuyến! )


2

REXX, 74 byte

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

Đầu ra (8 5):

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

Đầu ra (8 5):

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

2

C, 175 138 byte

Cảm ơn @Dave đã lưu 37 byte!

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++]);}

Hãy thử trực tuyến!


1
Xin chào, một số điều có thể giúp bạn giảm điều này: callocsẽ cung cấp cho bạn bộ nhớ khởi tạo 0 (không cần phải tự thiết lập tất cả các số 0), strchrcó thể tìm thấy kết thúc chuỗi, dấu phẩy có thể xâu chuỗi các hoạt động, tránh sự cần thiết {}x[0] == *x. Cũng coi chừng; bạn không mallocđủ bộ nhớ nếu tất cả các mục nằm trong cùng một hộp.
Dave

2

AHK, 66 byte

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

Tôi đã theo cùng một hiệu trưởng mà orlp đã sử dụng các số ngẫu nhiên từ 0 đến N và sau đó trừ nó khỏi N. Thật không may, tôi không thể lưu byte bằng cách sử dụng 10 ^ r vì cách hoạt động của chức năng Gửi. Than ôi và alack. Dưới đây là một số kết quả đầu ra cho n = 8, m = 5:

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

2

CJam, 30 31 21 byte

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

Đầu vào là hai số n mtrên ngăn xếp. Sử dụng 1cho ký tự cột và 0cho ký tự lặp lại.

Giải trình:

: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

Röda , 79 byte

f n,m{a=[0]*m
i=0{{n--
a[i%m]++}if randomBoolean
i++}while[n>0]
a|[`|`.."#"*_]}

Hãy thử trực tuyến!

Điều này tạo ra một mảng các số 0 và tăng chúng ở các vị trí ngẫu nhiên.


1

PHP, 100 byte

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);

Phá vỡ :

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

Đầu ra cho m=7n=5:

Thực hiện đầu tiên:

za
zaa
za
za
zaa

Thực hiện lần thứ hai:

za
zaa
zaaa
z
za

Hãy thử trực tuyến!


Bạn có thể sử dụng [,$m,$n]=$argv;từ PHP 7.1 để lưu một vài ký tự. Bạn có thể thay thế \nbằng ngắt dòng thực tế để tiết kiệm 1 byte. bạn có thể sử dụng for(;$m-->0;)$a[rand(0,$n-1)].=a;để lưu các dấu ngắt, a $mvà dấu chấm phẩy. [,$m,$n]=$argv;$a=array_fill(0,$n,z);for(;$m-->0;)$a[rand()%$n].=a;echo join("\n",$a);85 byte
Christoph

Golf này giảm hơn nữa [,$m,$n]=$argv;for(;$m--;)${rand()%$n}.=a;for(;$n--;)echo"z${$n}\n";67 byte.
Christoph

@Christoph Tôi đã thấy ký hiệu [,$m,$n]=$argv;trên các golf-code khác nhưng không thể làm cho nó hoạt động trong môi trường dev của tôi hoặc trên eval.in
roberto06

dùng thử tại đây: sandbox.onlinephpfifts.com/code/ ,.
Christoph

1
Tốt đẹp. Tôi nghĩ rằng bạn có thể đăng đoạn trích của mình dưới dạng câu trả lời vì nó khác khá nhiều so với của tôi;)
roberto06

1

JavaScript, 105 byte

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

Hãy thử trực tuyến!

Do phương pháp gán các hàng, điều này sẽ có xu hướng đặt nhiều hơn về phía dưới, mặc dù có một cơ hội nhỏ là đỉnh sẽ nhận được một số.


1

Ruby, 52 byte

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

Tạo một hàm ẩn danh, lấy hai số nguyên làm đối số và trả về một chuỗi Chuỗi:

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

1

Python 2, 81 byte

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

Trả về một danh sách các chuỗi.


1

Javascript (ES7), 75 byte

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

Tôi nghĩ rằng tôi đã thông minh khi đưa ra sức mạnh của 10 ý tưởng chỉ để nhận ra rằng hầu hết các câu trả lời đã sử dụng điều đó.


1

AWK, 78 byte

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

Có 2 đối số, đầu tiên là số lượng vật phẩm, sau đó là số lượng hộp. Bắt đầu bằng cách gieo hạt tạo số ngẫu nhiên để mỗi lần chạy là khác nhau. Sau đó, chỉ cần xây dựng các chuỗi trong một mảng, Ví dụ sử dụng:

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

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

1

MATLAB, 103 94 byte

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)

Với định dạng

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

Đầu ra mẫu

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

Có các khoảng trắng theo sau vì mỗi mục nhập mảng được hiển thị với một tab giữa chúng, nhưng điều này nên được chấp nhận theo thông số kỹ thuật.

Đây có vẻ như là một cách thực hiện rất đơn giản đối với tôi, vì vậy tôi chắc chắn điều này có thể được cải thiện.

Cảm ơn @Luis Mendo vì những gợi ý.


Bạn có thể lưu khá nhiều byte xác định câu lệnh hiển thị là một hàm ẩn danh, để tránh viết nó hai lầ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)
Luis Mendo

@LuisMendo Cảm ơn bạn đã gợi ý, tôi sẽ cập nhật. Tôi cũng có thể định nghĩa chức năng thực tế của mình theo cùng một cách, ví dụ. a = @ (m, n) ... vì điều đó cũng sẽ làm giảm số lượng byte. Làm thế nào để mọi người thường loại bỏ / rút ngắn "tên hàm (args)" trong câu trả lời mã MATLAB?
Krostd

Có, bạn cũng có thể sử dụng hàm anoymous làm câu trả lời. Bạn thậm chí có thể bỏ qua a=. Trong trường hợp này, về nguyên tắc, bạn không thể làm điều đó bởi vì các hàm ẩn danh không thể chứa các vòng lặp. Nhưng bạn có thể sử dụng thủ thuật đưa mọi thứ vào eval('...'). BTW, thường được coi là thực hành xấu và xấu trong Matlab, nhưng ở đây chúng tôi thích lạm dụng ngôn ngữ :-)
Luis Mendo

Hmm .. Tôi sẽ cập nhật dựa trên đề xuất của bạn và suy nghĩ thêm về nó và xem liệu tôi có thể tránh được vòng lặp hay không, mặc dù điều đó dường như là không thể. Tôi có thể nghĩ ra một logic có thể làm điều đó, nhưng không biết làm thế nào để thực hiện nó .. Tôi đang nghĩ đến việc xác định một số 10 ^ n, và tìm ra các số m là tất cả các lũy thừa của 10, và sau đó chỉ cần in chúng ra. Nó sẽ chính xác là cùng một đầu ra như tôi có bây giờ ..: D Có đề xuất nào không? Hãy đăng nó như một câu trả lời khác.
Krostd

Ý tôi là m hệ số (không chỉ bất kỳ số nào)
Krostd

1

Octave , 62 54 byte

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

Hàm ẩn danh có hai số và xuất ra một mảng ký tự 2D với >các hộp và *cho các đối tượng. Tất cả các kết quả đều có khả năng như nhau.

Hãy thử trực tuyến!


1

TI-Basic, 63 62 byte

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

Mỗi bài tập nên có xác suất khác không được chọn.

Tiêu chí này làm cho chương trình này dễ viết hơn nhiều.

Ví dụ I / O:

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

Giải trình:

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

MATLAB, 73 64 58 byte

Cập nhật số 3

Tôi cần sự sắp xếp, dường như, vì nếu không tôi nhận được số nguyên âm. Tôi đã thay thế disp(sprintf(...))bằng fprintf(...)bây giờ, vì vậy câu trả lời vẫn là 58 byte.

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

Cập nhật số 2:

Tôi nhận ra rằng tôi không cần phải sắp xếp mảng và trên thực tế việc sắp xếp sẽ thực sự làm giảm trung bình các số trong mảng. Vì vậy, tôi đã xóa sort(...)một phần. Lưu ý rằng đầu ra vẫn giữ nguyên, vì vậy tôi không cập nhật "đầu ra mẫu".

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

Cuối cùng kết thúc với câu trả lời Octave của Luis! : D

Cập nhật số 1:

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

Thay vì chuyển đổi thành chuỗi, tôi chỉ hiển thị số trực tiếp. Tôi có thể giảm xuống còn 58 byte, bằng cách loại bỏ disp(...), nhưng sau đó tôi nhận được thêm ans =chỉ bằng sprintf và không biết điều đó có chấp nhận được không.

Mã ban đầu:

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

Nhờ một số gợi ý của Luis , tôi đã thoát khỏi vòng lặp trong câu trả lời trước đây của mình . Bây giờ trước tiên tôi tạo một mảng dọc gồm mcác số ngẫu nhiên cộng với n( diff([0;sort(randi(n,m-1,1));n])), sau đó sử dụng chúng dưới dạng số mũ của 10, chuyển đổi chúng thành một chuỗi, chứng minh chúng trái và hiển thị chúng.

Về mặt kỹ thuật tôi có thể loại bỏ phân tán (...) để lưu thêm 6 byte, nhưng sau đó một "ans" được in có thể vi phạm thông số kỹ thuật. Cũng có thể có một cách để thay đổi chúng thành chuỗi và chứng minh trái để có được định dạng kết thúc mong muốn, vì vậy tôi mở các đề xuất.

Đầu ra mẫu:

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

Lưu ý : Tôi đã thay đổi chức năng của mình thành một chức năng ẩn danh ở đây, dựa trên các đề xuất. Trong đầu ra mẫu, tôi đã chỉ định điều đóađể chứng minh. Tôi hy vọng điều này không vi phạm thông số kỹ thuật, nhưng nếu có, xin vui lòng cho tôi biết và tôi sẽ thay đổi nó.


Tôi mới nhận ra câu trả lời hàng đầu sử dụng cùng logic của 10 ^ .. Đối với những gì nó có giá trị, và nếu nó quan trọng, tôi đã không sử dụng nó làm tài liệu tham khảo cho câu trả lời của mình .. (nhưng dang, ai đó đã đánh bại tôi! P)
Krostd

Cũng muốn lưu ý tín dụng cho câu trả lời này cho ý tưởng tạo msố nguyên ngẫu nhiên cộng vào n, vì tôi đã bị mắc kẹt trong phần đó trong một thời gian dài .. (Vẫn không thể thêm nhiều hơn 2 liên kết trong câu trả lời của tôi, vì vậy bao gồm cả nó trong một bình luận)
Krostd

1

Xếp chồng lên nhau , 29 byte

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

Hãy thử trực tuyến!

Hành vi bằng cách xây dựng một mảng các Msingletons chứa '|', sau đó thêm '#'vào một Nthời gian mảng được chọn ngẫu nhiên .


Tốt đẹp! Và như vậy tất cả các kết quả đều có khả năng như nhau, phải không?
Luis Mendo

@LuisMendo nên như vậy, vì randinsử dụng thuật toán Fisher-Yates trong nội bộ. (Đây là thuật toán tương tự mà câu trả lời của CJam sử dụng FWIW)
Conor O'Brien

1

Python 2 , 80 95 89 88 byte

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

Hãy thử trực tuyến!

  • Đã thêm 15 byte: Chỉnh sửa trước đó là một chút thiếu sót, một số piegons bị bỏ lại.
  • Đã lưu 6 byte: được thay thế nếu khác bằng [n, x] [m> 1]
  • Đã lưu 1 Byte: nhập *

1

Than , 19 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

  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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.