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

dihapus
sumber
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 .

lirtosiast
sumber
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)
Mwr247
sumber
***, 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.

cacat
sumber
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.

lirtosiast
sumber
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.

Luis Mendo
sumber
4

J, 4 3 byte

Satu byte disimpan berkat Zgarb! ( Dicoret empat masih empat biasa: D )

1+?

panggilan seperti N (1+?) R, misalnya 3 (1+?) 10,. Ini menggunakan operator "Roll", dan melakukan persis seperti yang dijelaskan, kecuali di bawah 0...n-1. Jika kita diizinkan untuk melakukan ini, maka jawabannya adalah 1 byte,

?
Conor O'Brien
sumber
@tac Ah, gotcah
Conor O'Brien
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.

Denker
sumber
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

Conor O'Brien
sumber
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
Denker
sumber
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.

coredump
sumber
2

Ruby, 27 23 byte

Fungsi anonim, cukup pendek dan manis.

-4 byte dari @manatwork

->n,r{[*1..r].sample n}
Nilai Tinta
sumber
->n,r{[*1..r].sample n}Silakan gunakan markup blok kode alih-alih markup kode inline, jadi skrip seperti Code Golf UserScript Enhancement Pack dapat menyisipkan ukuran kode di sebelahnya.
manatwork
Baiklah, sudah diperbaiki sekarang.
Nilai Tinta
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
Mama Fun Roll
sumber
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.

digital Trauma
sumber
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.

AdmBorkBork
sumber
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
Mego
sumber
1

Clojure, 38 byte

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

Fungsi anonim mengambil N pertama dan R kedua.

MattPutnam
sumber
1

Perl 6, 32 byte

{(^$^a).permutations.pick[^$^b]}
Yang Mulia
sumber
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.

R. Kap
sumber
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)
Ben Perlin
sumber
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

C5H8NNaO4
sumber
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

Stuart Bruff
sumber
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
Versi percobaan ada di: Matcad 15 - ptc.com/engineering-math-software/mathcad/free-trial ; Mathcad Prime 3.1 - ptc.com/engineering-math-software/mathcad/free-download
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)
shooqie
sumber
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).

Oleg V. Volkov
sumber
0

TI-84 BASIC, 21 byte

Prompt R,N:randIntNoRep(1,R→A:N→dim(ʟA:ʟA
SuperJedi224
sumber
Orang tidak dapat lagi menggunakan Ansinput sesuai meta post baru-baru ini.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ ... kenapa tidak?
SuperJedi224
Itulah konsensus tentang meta . Pilih itu jika Anda tidak setuju.
Conor O'Brien