Mảng ngẫu nhiên không lặp lại


16

Tôi đã trả lời một thử thách ở đây và nhiệm vụ này là một phần của thử thách. Tôi đã có một giải pháp 73 byte trong javascript. Nhưng tôi nghĩ nó là quá nhiều cho một điều đơn giản.

Thử thách

Cho là hai số nguyên đầu vào:

  • N chiều dài của mảng dự kiến
  • Rphạm vi của khoảng bắt đầu trong một : 1..R, không0..R-1

Đầu ra trong mỗi lần chạy chương trình / hàm của bạn, một mảng có độ dài khác nhau Nvới các giá trị nằm giữa 1..Rtheo cách không có giá trị nào xảy ra nhiều hơn một lần.

Bạn phải sử dụng R-valuetrong mã của bạn.

Những hạn chế

Bạn có thể giả sử : 2 <= N <= R.

Tôi thực sự muốn thấy một giải pháp javascript ngắn hơn 73 byte của tôi.

Nhưng tất nhiên, nó được mở cho tất cả các ngôn ngữ!

Nếu ngôn ngữ của bạn không thể trả về một mảng, bạn có thể in tất cả các số;)


2
Một điều nữa: Tôi không nghĩ rằng bạn muốn chúng khác biệt với mỗi lần chạy, mà chỉ là ngẫu nhiên thống nhất? (Nếu không, nó sẽ không hoạt động R=N=1) Sau đó, tôi khuyên bạn nên cho phép các phạm vi 0..Rthay thế vì điều này trở nên tự nhiên hơn đối với nhiều ngôn ngữ.
flawr

Tôi muốn giới thiệu bao gồm rằng mỗi hoán vị đều có khả năng như nhau (giả sử ngẫu nhiên hoàn hảo), điều khác tôi có thể làmshuffle(0..N)
Nathan Merrill

Tôi đã đăng câu trả lời của tôi về chất lượng ngẫu nhiên không đồng nhất trước khi bạn thực hiện thay đổi quy tắc của mình.
Conor O'Brien

1
Bạn nói một giải pháp ngẫu nhiên thống nhất, nhưng new Datemang lại giá trị không đồng nhất. Hơn nữa, tôi tin rằng bạn có thể chơi gôn new Date%r+1;)
Conor O'Brien

Mảng đầu ra có cần phải là số nguyên không? Có vẻ rõ ràng, nhưng tôi không thấy nó được tuyên bố rõ ràng
Charlie Wynn

Câu trả lời:


16

APL Dyalog, 1 byte

?

Chỉ là một nội dung. Hãy thử nó ở đây .


3
Với một câu trả lời như thế này, tôi đã phải cuộn ngược lại để xem bạn có phải là OP
lbstr

2
@lbstr Bây giờ bạn đề cập đến nó, nhận dạng của tôi khá giống với OP.
lirtosiast

9

JavaScript (ES6), 68 66 byte

n=>r=>G=(s=new Set)=>s.size<n?G(s.add(Math.random()*r+1|0)):[...s]

Được gọi là F(N)(R)(), nơi Fgán chức năng và N/ Rlà các giá trị.

Bạn đã yêu cầu ngắn hơn 73 byte trong Js;)

EDIT: Câu trả lời của @ C5H8NNaO4 hoạt động trong thực tế là các quy tắc không chỉ định các giá trị phải thống nhất 1..R. Do đó, đây là một phiên bản hoạt động với 63 byte (được gọi là F(R)(N)):

r=>G=(n,s=[])=>n--?G((s[n]=n+1,n),s):s.sort(a=>new Date/a%1-.5)

Man, thật ấn tượng !! +1
đã xóa

@WashingtonGuedes Cảm ơn =) Chỉ cần xóa đi 2 byte khác.
Mwr247

7

Octave, 22 19 9 byte

@randperm

randperm(r,n)làm chính xác những gì được yêu cầu. Lưu ý rằng điều này không hoạt động (ít nhất là không phải trong các phiên bản oldder) trong Matlab.


1
@(n,r)randperm(r,n)
Luis Mendo

1
randpermvới hai đầu vào không hoạt động trong các phiên bản Matlab gần đây. Cũng có randsample, nhưng phải mất nhiều byte hơn, trừ khi bạn có thể thoát khỏi @(...)(tôi nghĩ điều đó được cho phép)
Luis Mendo

Ồ tôi có thể sử dụng @randperm=)
flawr

5

TI-84 BASIC OS 4.0, 12 byte

Prompt N,R:randIntNoRep(1,R,N

TI-84 + CSE (2013) và CE (2015) về cơ bản là cùng một phương ngữ BASIC hạn chế như TI-84 +, nhưng có một vài tính năng mới. Một trong số đó là đối số thứ ba của randIntNoRep.


1
Thành thật mà nói, thật ngớ ngẩn khi họ không bao gồm tính năng đó ngay từ đầu.
SuperJedi224

Tôi đã nghĩ ngay đến TI-Basic khi tôi thấy thử thách này :)
Timtech

5

MATL , 2 byte

Zr

Đầu vào là: đầu tiên R, sau đó N.

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

Giải trình

Hàm Zrnày có hai đầu vào (trong trường hợp này) và lấy mẫu ngẫu nhiên mà không cần thay thế. Đầu vào đầu tiên R, xác định rằng dân số là [1,2,...,R]; và đầu vào thứ hai N, cho biết số lượng mẫu cần lấy từ dân số.


4

J, 4 3 byte

Một byte được lưu nhờ Zgarb! ( Bỏ qua bốn vẫn là bốn thông thường: D )

1+?

gọi như N (1+?) R, ví dụ , 3 (1+?) 10. Cái này sử dụng toán tử "Roll" và thực hiện chính xác những gì được mô tả, ngoại trừ bên dưới 0...n-1. Nếu chúng ta được phép làm điều này, thì câu trả lời sẽ là 1 byte,

?


@tac Ah, gotcah
Conor O'Brien

4

Bình thường, 6 byte

<.SSQE

Hãy thử nó ở đây!

Phạm vi đến trên dòng đầu tiên và chiều dài trên dòng thứ hai.

Giải trình

<.SSQE # Q = phạm vi, E = chiều dài

   SQ # tạo phạm vi 1 ... Q
 .S # xáo trộn danh sách
<E # lấy các phần tử E đầu tiên

Phiên bản 5 byte không cạnh tranh

Bổ sung mới nhất cho Pyth thêm Qs ẩn vào cuối chương trình nếu cần. Chúng ta có thể sử dụng điều này ở đây bằng cách đảo ngược định dạng đầu vào, vì vậy độ dài đến trước và sau đó là phạm vi.

<.SSE

Hãy thử nó ở đây!

Đây Elà phạm vi mà chúng tôi chuyển thành danh sách dựa trên 1 S, trộn nó với .Svà lấy các Qphần tử đầu tiên với <. <mong đợi một số nguyên được thêm vào với a Q.


4

Reng v.2.1, 140 103 98 97 byte

Điều này cũng sẽ làm việc trong các phiên bản trước.

v      v      $/$'l#y0#z>(:)):(ez+#z zt>a$;!
>i#ci#x>cu1+lxetv    j21\!q   yy#-1y($/^
>n?~v
^oW <

Bạn có thể thử nó ở đây! Đầu vào là maximum length, chẳng hạn như 10 3.

Tôi rất tự hào về điều này, bạn thậm chí không biết. Nếu ai đó đánh bại tôi bằng một câu trả lời Java, điều đó sẽ làm cho ngày của tôi. Nếu tôi đánh bại một câu trả lời Java, hãy xem xét ngày của tôi cũng được thực hiện.

Tôi sẽ giải thích nó sau, một khi tôi hồi phục. Nói chung, mặc dù:

v         v      $/$r$
>i#bbi1+#x>:u1+lxet

Điều này tạo ra các số ngẫu nhiên. Phần khác kiểm tra nếu có trùng lặp, và, nếu có, quá trình được lặp lại. Khác, kết quả được in, với không gian tham gia kết quả.

Dưới đây là một số ví dụ:

gif dài


3

CJam, 8 byte

{,:)mr<}

Hãy thử nó ở đây!

Đây là một khối không tên, dự kiến ​​phạm vi trên cùng của ngăn xếp và chiều dài ở dưới cùng và để lại một danh sách trên ngăn xếp.

Giải trình

, phạm vi dựa trên e # 0
:) e # inkrement từng yếu tố của danh sách để dựa trên 1
mr e # xáo trộn danh sách
<e # lấy n phần tử đầu tiên

Đây là một chương trình hạnh phúc :)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tôi sẽ hạnh phúc hơn nếu CJam có tích hợp sẵn cho các phạm vi dựa trên 1, vì vậy tôi sẽ không cần mặt cười chết tiệt này: P
Denker

2

Lisp thường gặp, 90

52 chỉ cho biểu thức

(use-package :alexandria)(lambda(R N)(coerce(subseq(shuffle(iota R :start 1))0 N)'vector))

Bị đánh cắp

;; Well known library
(use-package :alexandria)

(lambda(R N)
  (coerce                   ; make a vector from a list 
    (subseq                 ; take the sublist from 0 to N
      (shuffle              ; shuffle a list
        (iota R :start 1))  ; build a list from 1 to R
    0 N)
    'vector))

Giống như các câu trả lời khác, nếu tôi không tính gói sử dụnglambda , biểu thức còn lại là (coerce(subseq(shuffle(iota R :start 1))0 N)'vector), cho 52 byte.



2

, 10 ký tự / 13 byte

Ѩŝ⩤⁽1í)ą-î

Try it here (Firefox only).

Giải trình

           // implicit: î=input1, í=input2
  ⩤⁽1í)    // Inclusive range from 1 to í
Ѩŝ         // Shuffle resulting range
       ą-î // Get last îth items


1

PowerShell v2 +, 30 byte

param($n,$r)1..$r|Random -c $n

Đưa đầu vào $n$r, xây dựng một phạm vi 1..$r, các đường ống mà Get-Randomvới một -Count of $n, sẽ chọn $ncác phần tử duy nhất từ ​​phạm vi đó. Đầu ra được để lại trên đường ống như một mảng ẩn.


1

Nghiêm túc, 5 byte

,,R╨J

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

Giải trình:

,,R╨J
,,R    push N, range(1, R+1)
   ╨   push a list containing all N-length permutations of range(1, R+1)
    J  select a random element from the list

1

Clojure, 38 byte

#(take %1(shuffle(map inc(range %2))))

Một hàm ẩn danh lấy N đầu tiên và R thứ hai.


1

Perl 6, 32 byte

{(^$^a).permutations.pick[^$^b]}

1

Python 3.5 - 54 53 byte:

from random import*;lambda a,c:sample(range(1,c+1),a)

Điều này sử dụng sample()chức năng của mô-đun ngẫu nhiên để trả về một mảng có độ dài "a" bao gồm các phần tử ngẫu nhiên, duy nhất trong phạm vi 1 => c.


1

D, 29 byte (chỉ biểu thức)

Giả sử std.random và std.range đã được nhập và n và r được định nghĩa là các biến, chương trình có thể được giải trong biểu thức đơn:

iota(1,r).randomCover.take(n)

1

ES6, 72

r=>n=>[...Array(-~r).keys()].sort(a=>new Date/a%1-.5).filter(a=>a&&n-->0)

Giống như trong câu trả lời của @ Mwr247 , bạn có thể gọi nó bằng F(R)(N), Flà biểu thức hàm


0

Mathcad, 67 "byte"

tạo một vectơ cột gồm các số nguyên liên tiếp trong phạm vi 1..R, nối nó với một vectơ cột có độ dài R của các số ngẫu nhiên (đồng nhất), sắp xếp ma trận Rx2 kết quả trên cột số ngẫu nhiên, sau đó trích xuất n số đầu tiên từ cột ngẫu nhiên của số nguyên.

nhập mô tả hình ảnh ở đây


Có một nơi chúng ta có thể kiểm tra điều này?
Conor O'Brien

Bạn có thể tải xuống các phiên bản dùng thử của Mathcad 15 và Mathcad Prime 3.1 (kế thừa của Mathcad 15). Cả hai thử nghiệm đều chạy trong 30 ngày, sau đó M15 ngừng hoạt động, nhưng Prime 3.1 vẫn chạy, mặc dù chức năng bị giảm (ví dụ: không lập trình - vì vậy, các vòng trên sẽ không hoạt động ... nhưng vòng lặp for có thể được viết lại để sử dụng các biến phạm vi để tạo v bên ngoài tuyên bố gia tăng)
Stuart Bruff

Các phiên bản dùng thử có tại: Matcad 15 - ptc.com/engineering-math-software/mathcad/free-trial ; Mathcad Prime 3.1 - ptc.com/engineering-math-software/mathcad/free-doad
Stuart Bruff

Và làm thế nào để bạn đếm những byte này?
R

Bằng cách xem xét từ góc độ đầu vào của người dùng và đánh đồng một thao tác nhập Mathcad (thường là bàn phím, nhấp chuột trên thanh công cụ nếu không có phím tắt kbd) cho một ký tự và diễn giải điều này dưới dạng byte. csort = 5 byte khi nó gõ char-by-char như các tên biến / hàm khác. Toán tử for là một cấu trúc đặc biệt chiếm 11 ký tự (bao gồm 3 "giữ chỗ" trống và 3 khoảng trắng) nhưng được nhập bởi ctl-shft- #, do đó = 1 byte (tương tự như mã thông báo trong một số ngôn ngữ). Nhập '(quote) tạo ra dấu ngoặc đơn cân bằng (thường) để tính là 1 byte. Lập chỉ mục v = 3 byte (loại v [k).
Stuart Bruff

0

Python, 56 (cách rõ ràng)

lambda N,R:__import__('random').sample(range(1,R+1),k=N)

from random import*;lambda N,R:sample(range(1,R+1),k=N)ngắn hơn một byte
Mego

Huh, tôi đã xem xét from random import*, phải làm hỏng việc đếm.
shooqie

0

Perl 5, 51 43 byte

sub{@a=1..pop;map{splice@a,rand@a,1}1..pop}

Sub phụ ẩn danh khá đơn giản tạo ra một mảng từ 1 đến R và sau đó ghép N phần tử ngẫu nhiên từ nó để trả về. Gọi với ->(N, R).


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.