Tekrarsız rastgele dizi


16

Burada bir zorluğa cevap veriyordum ve bu görev zorluğun bir parçasıydı. Javascript 73 bayt bir çözüm var. Ama bence basit bir şey için çok fazla.

Meydan okuma

Giriş iki tamsayı olarak verilir:

  • N beklenen dizinin uzunluğu
  • Raralığın aralığı birinden başlayarak: 1..Rdeğil0..R-1

Programınızın / fonksiyonunuzun her bir çalışmasında, tek bir değer birden fazla meydana gelmeyecek şekilde Ndeğerler içeren farklı bir uzunluk dizisi çıktısı 1..R.

R-valueKodunuzda kullanmanız gerekir .

Kısıtlamalar

Sen varsayabiliriz: 2 <= N <= R.

Gerçekten 73 bayttan daha kısa bir javascript çözümü görmek istiyorum.

Ama elbette, tüm dillere açık!

Diliniz bir dizi döndüremiyorsa, tüm sayıları yazdırabilirsiniz;)


2
Başka bir şey: Her koşuda farklı olmalarını istediğinizi düşünmüyorum, ama sadece rastgele mi? (Aksi takdirde işe yaramaz R=N=1) O zaman 0..Rbu, birçok dilde daha doğal geldiği için aralıklara alternatif olarak izin vermenizi öneririm .
1616'da kusur

Her permütasyonun eşit derecede muhtemel olmasını tavsiye ederim (mükemmel rastgelelik varsayarak), başka yapabilirimshuffle(0..N)
Nathan Merrill

Kural değişikliğinizi yapmadan önce tekdüze olmayan rastgele kalite cevabımı gönderdim.
Conor O'Brien

1
Tekdüze rastgele bir çözüm söylüyorsunuz, ancak new Datetekdüze olmayan değerler verir. Dahası, golf oynayabileceğinize inanıyorum new Date%r+1;)
Conor O'Brien

Çıktı dizisinin tamsayılar olması gerekiyor mu? Açık görünüyor, ama açıkça ifade edildiğini görmüyorum
Charlie Wynn

Yanıtlar:



9

JavaScript (ES6), 68 66 bayt

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

İşlev ataması F(N)(R)()nerede denir Fve N/ Rdeğerlerdir.

Js'de 73 bayttan daha kısa bir süre istediniz;)

DÜZENLEME: @ C5H8NNaO4'ün yanıtı, kuralların değerleri belirtmediği gerçeği içinde çalışır 1..R. Bu göz önüne alındığında, burada bir sürüm 63 bayt olarak çalışır (denir F(R)(N)):

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

Adamım, bu etkileyici !! +1
kaldırıldı

@WashingtonGuedes Thanks =) Sadece 2 bayt daha tıraş etti.
Mwr247

7

Oktav, 22 19 9 bayt

@randperm

randperm(r,n)tam olarak ne isteniyorsa onu yapar. Bunun Matlab'da (en azından eski sürümlerde) çalışmadığını unutmayın.


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

1
randpermiki girişli son Matlab sürümlerinde çalışır. Ayrıca var randsample, ancak daha fazla bayt gerekiyor, eğer bundan kurtulamazsan @(...)(buna izin verildiğini düşünüyorum)
Luis Mendo

Oh ben kullanabilirsiniz @randperm=)
kusur

5

TI-84 BASIC OS 4.0, 12 bayt

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

TI-84 + CSE (2013) ve CE (2015) aslında TI-84 + ile aynı sınırlı BASIC lehçesidir, ancak birkaç yeni özellik vardır. Bunlardan biri randIntNoRep'in üçüncü argümanı.


1
Açıkçası, bu özelliği en başından beri dahil etmemeleri aptalca.
SuperJedi224

Bu zorluğu gördüğümde hemen TI-Basic'i düşündüm :)
Timtech

5

MATL , 2 bayt

Zr

Girdiler: önce R, sonra N.

Çevrimiçi deneyin!

açıklama

İşlev Zriki giriş alır (bu durumda dolaylı olarak) ve değiştirmeden rastgele örnekleme yapar. İlk girdi, Rpopülasyonun [1,2,...,R]; ve ikinci girdi, Npopülasyondan alınacak örnek sayısını gösterir.



4

Pyth, 6 bayt

<.SSQE

Burada deneyin!

Aralık ilk satırda ve uzunluk ikinci satırda gelir.

açıklama

<.SSQE # Q = aralık, E = uzunluk

   SQ # 1 ... Q aralığını oluşturur
 .S # listeyi karıştır
<E # ilk E öğelerini al

Rakip olmayan 5 baytlık sürüm

Pyth'e en son eklenen, Qgerekirse programın sonuna örtük s ekler . Bunu giriş formatını ters çevirerek burada kullanabiliriz, böylece uzunluk önce gelir ve sonra aralık gelir.

<.SSE

Burada deneyin!

İşte E1 tabanlı bir listeye dönüştürdüğümüz S, karıştırdığımız .Sve ilk Qöğeleri aldığımız aralık <. <ile örtük olarak eklenen bir tamsayı bekliyor Q.


4

Reng v.2.1, 140 103 98 97 bayt

Bu, önceki sürümlerde de çalışmalıdır.

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

Burada deneyebilirsiniz! Girdi maximum lengthgibi 10 3.

Bununla gurur duyuyorum, bilmiyorsun bile. Birisi beni bir Java cevabı ile yenerse, bu benim günümü yapacak. Bir Java cevabını geçersem, günümü de düşünün.

İyileştikten sonra daha sonra açıklayacağım. Genellikle,

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

Bu rastgele sayılar üretir. Diğer kısım kopya olup olmadığını kontrol eder ve varsa tekrarlanır. Aksi takdirde, sonuçlar yazdırılır ve boşluklar sonuçlara katılır.

İşte bazı örnekler:

long gif


3

CJam, 8 bayt

{,:)mr<}

Burada deneyin!

Bu, yığının üstündeki aralığı ve alttaki uzunluğu bekleyen ve yığının üzerinde bir liste bırakan isimsiz bir bloktur.

açıklama

, e # 0 tabanlı aralık
:) e # inkrement listenin her elemanı böylece onun 1 tabanlı
bay e # listeyi karıştır
<e # ilk n öğeyi al

Bu mutlu bir program :)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ CJam 1 tabanlı menziller için bir yerleşik olsaydı daha mutlu olurdum, bu yüzden bu damm gülen yüze ihtiyacım olmayacaktı: P
Denker

2

Ortak Lisp, 90

52 sadece ifade için

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

Ungolfed

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

Diğer cevaplar gibi, use-package ve lambda'yı saymazsam , kalan ifade (coerce(subseq(shuffle(iota R :start 1))0 N)'vector)52 bayt içindir.



2

𝔼𝕊𝕄𝕚𝕟, 10 karakter / 13 bayt

Ѩŝ⩤⁽1í)ą-î

Try it here (Firefox only).

açıklama

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

2

Bash + coreutils, 16

Bunun açıklayıcı olduğunu düşünüyorum:

seq $2|shuf -n$1

Girdi Nve Rkomut satırı parametreleri olarak.

Veya @rici'nin işaret ettiği gibi, aynı puan için:

shuf -n$1 -i1-$2

Ideone.


1
veya shuf -n$1 -i1-$2(aynı uzunlukta olsa da).
rici

@rici çok güzel. very clean :)
Digital Trauma

1

PowerShell v2 +, 30 bayt

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

Girdi alır $nve $r, bir dizi oluşturur 1..$r, edilene boru Get-Random, bir ile -Cbir ayesi $nseçecektir $naralığından eşsiz elemanlar. Çıktı, ardışık bir dizi olarak boru hattında bırakılır.


1

Ciddi, 5 bayt

,,R╨J

Çevrimiçi deneyin!

Açıklama:

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

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

Anonim bir işlev, N'yi birinci ve R'yi alır.


1

Perl 6, 32 bayt

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

1

Python 3,5 - 54 53 bayt:

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

Bu sample(), aralıktaki rastgele, benzersiz öğelerden oluşan "a" uzunluğunda bir dizi döndürmek için rastgele modülün işlevini kullanır 1 => c.


1

D, 29 bayt (yalnızca ifade)

Std.random ve std.range öğelerinin içe aktarıldığı ve n ve r'nin değişken olarak tanımlandığı varsayılarak, program tek bir ifadede çözülebilir:

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)

Mwr247 en @ olduğu gibi cevap , sen onu arayabilirsin F(R)(N), Ffonksiyon ifadesi olmaktan


0

Mathcad, 67 "bayt"

1.R aralığındaki ardışık tamsayıların bir sütun vektörünü oluşturur, bunu R (tekdüze) rasgele sayıların uzunluğu R olan bir sütun vektörüne birleştirir, elde edilen Rx2 matrisini rasgele sayı sütununda sıralar ve ardından ilk n sayısını tamsayıların rasgele sütunu.

resim açıklamasını buraya girin


Bunu test edebileceğimiz bir yer var mı?
Conor O'Brien

Mathcad 15 ve Mathcad Prime 3.1'in (Mathcad 15'in halefi) deneme sürümlerini indirebilirsiniz. Her iki deneme de 30 gün sürer, bundan sonra M15 çalışmayı durdurur, ancak Prime 3.1, sınırlı işlevsellik olsa da çalışır (örn. Programlama yok - bu nedenle yukarıdakiler işe yaramaz ... ancak for döngüsü aralık değişkenlerini kullanmak için yeniden yazılabilir büyütme ifadesi dışında v oluşturmak için)
Stuart Bruff


Ve bu baytları nasıl sayıyorsunuz?
Rɪᴋᴇʀ

Bir kullanıcı giriş perspektifinden bakarak ve bir Mathcad giriş işlemini (genellikle klavye, kbd kısayolu yoksa araç çubuğuna fareyle tıklayın) bir karaktere eşitleyerek ve bunu bir bayt olarak yorumlar. Diğer değişken / işlev adları gibi char-by-char olarak yazıldığından csort = 5 bayt. For operatörü, 11 karakter (3 boş "yer tutucu" ve 3 boşluk dahil) içeren ancak ctl-shft- #, dolayısıyla = 1 bayt (bazı dillerdeki jetonlara benzer) içeren özel bir yapıdır. '(Alıntı) yazmak dengeli parantez (genellikle) oluşturur, bu nedenle 1 bayt olarak sayılır. Endeksleme v = 3 bayt (tip v [k).
Stuart Bruff

0

Python, 56 (bariz yol)

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)bir bayt tarafından daha kısa
Mego

Ha, düşündüm from random import*, sayımı berbat etmeliydim.
shooqie

0

Perl 5, 51 43 bayt

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

1'den R'ye kadar bir dizi oluşturan ve daha sonra geri dönmek için N rastgele öğeyi ekleyen oldukça basit anonim alt. İle arayın ->(N, R).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.