Array acak tanpa pengulangan


16

Saya menjawab satu tantangan di sini dan tugas ini adalah bagian dari tantangan. Saya punya solusi 73 byte dalam javascript. Tapi saya pikir itu terlalu banyak untuk hal yang sederhana.

Tantangan

Diberikan sebagai input dua bilangan bulat:

  • N panjang array yang diharapkan
  • Rrentang interval dimulai dari satu:, 1..Rtidak0..R-1

Output dalam setiap menjalankan program / fungsi Anda satu array panjang yang berbeda Ndengan nilai-nilai 1..Rdi antara sedemikian rupa sehingga tidak ada nilai yang muncul lebih dari sekali.

Anda harus menggunakan R-valuekode Anda.

Batasan

Anda dapat mengasumsikan: 2 <= N <= R.

Saya benar-benar ingin melihat solusi javascript lebih pendek dari milik saya 73 byte.

Tapi tentu saja, ini terbuka untuk semua bahasa!

Jika bahasa Anda tidak dapat mengembalikan array, Anda dapat mencetak semua angka;)


2
Hal lain: Saya tidak berpikir bahwa Anda ingin mereka berbeda dengan setiap lari, tetapi hanya acak yang seragam? (Kalau tidak, itu tidak akan berhasil R=N=1) Maka saya sarankan mengizinkan rentang 0..Rsebagai alternatif karena ini lebih alami untuk banyak bahasa.
flawr

Saya akan merekomendasikan termasuk bahwa setiap permutasi sama-sama mungkin (dengan asumsi keacakan sempurna), yang bisa saya lakukanshuffle(0..N)
Nathan Merrill

Saya mengirim jawaban saya tentang kualitas acak yang tidak seragam sebelum Anda membuat perubahan peraturan.
Conor O'Brien

1
Anda mengatakan solusi acak yang seragam, tetapi new Datemenghasilkan nilai yang tidak seragam. Lebih lanjut, saya yakin Anda bisa golf ke new Date%r+1;)
Conor O'Brien

Apakah array output harus bilangan bulat? Tampak jelas, tapi saya tidak melihatnya secara eksplisit dinyatakan
Charlie Wynn

Jawaban:


16

Dyalog APL, 1 byte

?

Hanya builtin. Coba di sini .


3
Dengan jawaban seperti ini, saya harus menggulir kembali ke atas untuk melihat apakah Anda OP
lbstr

2
@ lbstr Sekarang Anda menyebutkannya, identitas saya sangat mirip dengan 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]

Disebut sebagai F(N)(R)(), di mana Fpenugasan fungsi, dan N/ Radalah nilainya.

Anda meminta lebih pendek dari 73 byte dalam Js;)

EDIT: Jawaban oleh @ C5H8NNaO4 bekerja dalam kenyataan bahwa aturan tidak menentukan nilai harus seragam 1..R. Mengingat, inilah versi yang berfungsi dalam 63 byte (disebut sebagai F(R)(N)):

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

***, ini mengesankan !! +1
dihapus

@WashingtonGuedes Terima kasih =) Baru saja memotong 2 byte lagi.
Mwr247

7

Oktaf, 22 19 9 byte

@randperm

randperm(r,n)tidak persis apa yang diminta. Perhatikan bahwa ini tidak berfungsi (setidaknya tidak dalam versi yang lebih lama) di Matlab.


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

1
randpermdengan dua input tidak berfungsi dalam versi Matlab terbaru. Ada juga randsample, tetapi dibutuhkan lebih banyak byte, kecuali Anda dapat menyingkirkan @(...)(Saya pikir itu diperbolehkan)
Luis Mendo

Oh saya bisa menggunakan @randperm=)
flawr

5

TI-84 BASIC OS 4.0, 12 byte

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

TI-84 + CSE (2013) dan CE (2015) pada dasarnya adalah dialek BASIC terbatas yang sama dengan TI-84 +, tetapi ada beberapa fitur baru. Salah satunya adalah argumen ketiga randIntNoRep.


1
Terus terang, agak konyol karena mereka tidak memasukkan fitur itu sejak awal.
SuperJedi224

Saya langsung berpikir TI-Basic ketika saya melihat tantangan ini :)
Timtech

5

MATL , 2 byte

Zr

Inputnya adalah: pertama R, lalu N.

Cobalah online!

Penjelasan

Fungsi ini Zrmengambil dua input (tersirat dalam kasus ini) dan melakukan pengambilan sampel acak tanpa penggantian. Input pertama R,, menetapkan bahwa populasi adalah [1,2,...,R]; dan input kedua N,, menunjukkan jumlah sampel yang akan diambil dari populasi.



4

Pyth, 6 byte

<.SSQE

Coba di sini!

Rentang muncul di baris pertama dan panjang di baris kedua.

Penjelasan

<.SSQE # Q = rentang, E = panjang

   SQ # menghasilkan kisaran 1 ... Q
 .S # mengacak daftar
<E # ambil elemen E pertama

Versi 5-byte yang tidak bersaing

Penambahan terbaru ke Pyth menambahkan implisit Qdi akhir program jika diperlukan. Kita dapat menggunakan ini di sini dengan membalikkan format input, sehingga panjangnya lebih dulu dan kemudian jangkauan.

<.SSE

Coba di sini!

Ini Eadalah kisaran, yang kita ubah menjadi daftar berbasis 1 S, kocok .Sdan ambil Qelemen pertama <. <mengharapkan bilangan bulat yang secara implisit ditambahkan dengan a Q.


4

Reng v.2.1, 140 103 98 97 byte

Ini juga bisa digunakan di versi sebelumnya.

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

Anda bisa mencobanya di sini! Masukan maximum length, seperti 10 3.

Saya sangat bangga dengan hal ini, Anda bahkan tidak tahu. Jika seseorang mengalahkan saya dengan jawaban Java, itu akan membuat saya senang. Jika saya mengalahkan jawaban Java, pertimbangkan hari saya juga.

Saya akan menjelaskannya nanti, setelah saya sembuh. Namun secara umum:

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

Ini menghasilkan angka acak. Bagian lain memeriksa apakah ada duplikat, dan, jika ada, proses diulang. Selain itu, hasilnya akan dicetak, dengan spasi yang menyatukan hasilnya.

Berikut ini beberapa contohnya:

gif panjang


3

CJam, 8 byte

{,:)mr<}

Coba di sini!

Ini adalah blok tanpa nama yang mengharapkan kisaran di atas tumpukan dan panjang di bagian bawah dan meninggalkan daftar di tumpukan.

Penjelasan

, rentang berbasis # 0
:) e # menambah setiap elemen dari daftar jadi berbasis 1
mr e # mengacak daftar
<e # ambil n elemen pertama

Ini adalah satu program yang menyenangkan :)
Conor O'Brien

1
@CᴏɴᴏʀO'Bʀɪᴇɴ Saya akan lebih bahagia jika CJam memiliki builtin untuk rentang berbasis 1, jadi saya tidak akan membutuhkan wajah smiley damm ini: P
Denker

2

Common Lisp, 90

52 hanya untuk ekspresi

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

Tidak disatukan

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

Seperti jawaban lain, jika saya tidak menghitung paket-penggunaan dan lambda , ekspresi yang tersisa adalah (coerce(subseq(shuffle(iota R :start 1))0 N)'vector), untuk 52 byte.



2

𝔼𝕊𝕄𝕚𝕟, 10 karakter / 13 byte

Ѩŝ⩤⁽1í)ą-î

Try it here (Firefox only).

Penjelasan

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

2

Bash + coreutils, 16

Saya pikir ini cukup jelas:

seq $2|shuf -n$1

Input Ndan Rsebagai parameter baris perintah.

Atau seperti yang ditunjukkan @rici, untuk skor yang sama:

shuf -n$1 -i1-$2

Ideone.


1
atau shuf -n$1 -i1-$2(panjangnya sama).
rici

@rici sangat bagus. sangat bersih :)
Digital Trauma

1

PowerShell v2 +, 30 byte

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

Mengambil input $ndan $r, membangun sebuah jangkauan 1..$r, menyalurkannya ke Get-Randomdengan -Count of $n, yang akan memilih $nelemen unik dari kisaran tersebut. Output dibiarkan pada pipa sebagai array implisit.


1

Serius, 5 byte

,,R╨J

Cobalah online!

Penjelasan:

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

Fungsi anonim mengambil N pertama dan R kedua.



1

Python 3.5 - 54 53 byte:

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

Ini menggunakan fungsi modul acak sample()untuk mengembalikan array dengan panjang "a" yang terdiri dari elemen unik dan acak dalam rentang tersebut 1 => c.


1

D, 29 byte (hanya ekspresi)

Dengan asumsi std.random dan std.range telah diimpor dan bahwa n dan r didefinisikan sebagai variabel, program dapat diselesaikan dalam ekspresi tunggal:

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)

Seperti pada jawaban @ Mwr247 , Anda dapat memanggilnya dengan F(R)(N), Fsebagai ekspresi fungsi


0

Mathcad, 67 "byte"

membuat vektor kolom bilangan bulat berturut-turut dalam kisaran 1..R, bergabung ke vektor kolom panjang R dari nomor acak (seragam), mengurutkan matriks Rx2 yang dihasilkan pada kolom angka acak, dan kemudian mengekstraksi angka n pertama dari kolom bilangan bulat acak.

masukkan deskripsi gambar di sini


Apakah ada tempat untuk menguji ini?
Conor O'Brien

Anda dapat mengunduh versi percobaan Mathcad 15 dan Mathcad Prime 3.1 (penerus Mathcad 15). Kedua uji coba berjalan selama 30 hari, setelah itu M15 berhenti bekerja, tetapi Prime 3.1 masih berjalan, meskipun dengan fungsionalitas yang berkurang (misalnya, tidak ada pemrograman - sehingga di atas tidak akan berfungsi ... tetapi untuk loop dapat ditulis ulang untuk menggunakan variabel rentang untuk membuat v di luar pernyataan augment)
Stuart Bruff


Dan bagaimana Anda menghitung byte ini?
Rɪᴋᴇʀ

Dengan melihatnya dari perspektif input pengguna dan menyamakan satu operasi input Mathcad (keyboard biasanya, klik mouse pada bilah alat jika tidak ada pintasan kbd) ke karakter dan menafsirkannya sebagai byte. csort = 5 byte seperti yang diketikkan char-by-char sebagaimana variabel / nama fungsi lainnya. Operator for adalah konstruksi khusus yang menempati 11 karakter (termasuk 3 kosong "placeholder" dan 3 spasi) tetapi dimasukkan oleh ctl-shft- #, karenanya = 1 byte (mirip dengan token dalam beberapa bahasa). Mengetik '(kutipan) menciptakan tanda kurung yang seimbang (biasanya) sehingga dihitung sebagai 1 byte. Pengindeksan v = 3 byte (tipe v [k).
Stuart Bruff

0

Python, 56 (cara yang jelas)

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)lebih pendek dengan satu byte
Mego

Ya, saya memang mempertimbangkan from random import*, pasti sudah mengacaukan penghitungan.
shooqie

0

Perl 5, 51 43 byte

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

Cukup mudah sub anonim yang menghasilkan array dari 1 ke R dan kemudian menyambungkan elemen acak N dari itu untuk kembali. Panggil dengan ->(N, R).


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.