Bir dizinin skalerlerini rastgele seçer


14

Bir diziyi 0-nherşey dahil her sayı ile doldurmalısınız . Hiçbir sayı tekrarlanmamalıdır. Ancak rastgele sırada olmaları gerekir.

kurallar

Tüm standart kuralları ve standart boşluklar yasaklanmıştır

Dizi, rastgele rasgele oluşturulmalıdır. Her olası permütasyon eşit olasılıkta olmalıdır.

Giriş

n metadaki G / Ç yayınında izin verilen herhangi bir şekilde.

Çıktı

Sayı dizisi 0-nkapsayıcıdan karıştırıldı .


çıktı yeni satırlarla ayrılabilir?
DrnglVrgs

@Riley opps üzgün olması gerekiyordu.
Christopher

@DrnglVrgs evet yapabilir
Christopher

"Sayılar" ile "tamsayılar" demek istediğinizi varsayalım?
Zacharý

1
@KevinCruijssen IMO listeleri = dizi ancak arama desteği ile. Yani bir liste kullanın
Christopher

Yanıtlar:




8

Pyth, 3 bayt

.Sh

gösteri

.Sshuffle. Bu örtülü bir giriş tamsayı atmalarını naralığına [0, 1, ..., n-1]. holduğunu +1, ve giriş örtülü olarak alınır.










3

Japt , 4 bayt

ò öx

Çevrimiçi deneyin


    :Implicit input of integer U
ò   :Generate array of 0 to U.
öx  :Generate random permutation of array.
    :Implicit output of result.

Gosh lanet olsun, öx"kapsayıcı" kısmı fark edene kadar yeterli olacağını düşündüm . (Bunu xhemen hemen her şeyle değiştirebilirsiniz , btw)
ETHproductions 30:17

@ETHproductions, bu benim de ilk düşüncemdi.
Shaggy

3

C #, 76 bayt

using System.Linq;i=>new int[i+1].Select(x=>i--).OrderBy(x=>Guid.NewGuid());

Bu bir IOrderedEnumerable döndürür, umarım bu tamam, yoksa başka bir .ToArray () için birkaç bayt gerekir



3

Java 8, 114 111 97 bayt

import java.util.*;n->{List l=new Stack();for(;n>=0;l.add(n--));Collections.shuffle(l);return l;}

@ OlivierGrégoire sayesinde -3 bayt ve hata düzeltildi . @ Jakob
sayesinde -4 bayt . -10 bayt kaldırarak .
.toArray()

Açıklama:

Burada deneyin.

import java.util.*;        // Required import for List, Stack and Collections
n->{                       // Method with integer parameter and Object-array return-type
  List l=new Stack();      //  Initialize a List
  for(;n>=0;l.add(n--));   //  Loop to fill the list with 0 through `n`
  Collections.shuffle(l);  //  Randomly shuffle the List
  return l;                //  Convert the List to an Object-array and return it
}                          // End of method

1
Hata: içermez n. Fix ve golf: for(n++;--n>=0;l.add(n));. Ayrıca, bir dizi döndürmenize gerek olmadığını söylüyorum. Dizi ve liste çoğu dilde aynıdır, bu nedenle listeyi döndürmeniz yeterlidir.
Olivier Grégoire

@ OlivierGrégoire Woops .. Düzgün kontrol ve sadece gönderme için aldığınız şey budur .. Hata düzeltme (ve işlemde kaydedilen 4 bayt) için teşekkürler.
Kevin Cruijssen

1
Aslında üç tane, çünkü ben tekrar düzenledim, kendimi başka bir hata tanıttı: >olmalıdır >=.
Olivier Grégoire

1
-4 bayt: Stackyerine bir kullanın Vectorve döngünüzü olarak değiştirin for(;n>=0;l.add(n--));. Ve bir java.util.Listkesinlikle dönen gayet iyi.
Jakob


2

Pyth, 4 Bayt

.S}0

Burada deneyin!


3 bayta kadar golf oynayabilirsiniz. .Sbir tamsayı argümanı ile aynıdır .SUve [0..n]olarak kodlanabilir Uh, böylece kullanabilirsiniz .SUh, sonra da olur .Sh.
Outgolfer Erik

@EriktheOutgolfer ipucu için teşekkürler, ama birisi çözüm önerisi yayınladı gibi önerdi ben bunu bu şekilde bırakacağım.
KarlKastor

Bunun ayrı bir cevap olup olmadığı sınırda, ama inanıyorum ki bir dupe olarak sayılır, bu yüzden izin verildiği halde, sadece yerleşik ikame olduğunu düşünürdüm, yani hayır, göndermek istemedim ayrı, ama isaacg yaptı.
Outgolfer Erik

2

C, 75 bayt

a[99],z,y;f(n){if(n){a[n]=--n;f(n);z=a[n];a[n]=a[y=rand()%(n+1)];a[y]=z;}}

Dizinin sonundan başlangıçta başlayan ve çıkıştan önce rastgele bir öğeyle değiştiren özyinelemeli işlev.


Ya eğer n > 98?
LegionMammal978

Elbette başarısız olur, ancak giriş aralığı problemde belirtilmedi. Lütfen beni malloc yapma :)
Computronium

değiştirmek adaha kuralını sığdırmak için bir para haline?
l4m2


2

Kömür , 33 bayt

A…·⁰NβFβ«AβδA‽δθPIθ↓A⟦⟧βFδ¿⁻θκ⊞βκ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur.

Görünüşe göre Kömür listesindeki bir öğenin kaldırılması 17 bayt sürüyor.

Düzenleme: Bu gün, öğenin tüm oluşumlarını listeden kaldırmak istediğinizi varsayarsak, yalnızca üç bayt alır. Bu artı diğer Kömür değişiklikleri cevabı 21 bayta indirdi: Çevrimiçi deneyin!


Yikes çok
Christopher

2

APL (Dyalog) , 5 bayt

?⍨1+⊢

Çevrimiçi deneyin!

⎕IO←0Birçok makinede varsayılan olan varsayımdır .

açıklama

doğru argüman

1+ ona 1 ekle

?⍨0 .. 1+⊢-1 sayıları üretin ve iki sayı tekrar etmeyecek şekilde rastgele bir dizide dağıtın


2

q / kdb +, 11 bayt

Çözüm:

{(0-x)?1+x}

Misal:

q){(0-x)?1+x}10
5 9 7 1 2 4 8 0 3 10
q){(0-x)?1+x}10
6 10 2 8 4 5 9 0 7 3
q){(0-x)?1+x}10
9 6 4 1 10 8 2 7 0 5

Açıklama:

Çoğaltılmadan tam listesini vermek için negatif girişli ? operatörü kullanın 0->n:

{(0-x)?1+x} / solution
{         } / lambda expression
         x  / implicit input
       1+   / add one
      ?     / rand
 (0-x)      / negate x, 'dont put item back in the bag'

2

TI-83 BASIC, 5 bayt (sıkıcı)

randIntNoRep(0,Ans

Evet, bir yerleşik. randIntNoRep(iki baytlık bir simgedir ve Ansbir bayttır.

Daha eğlenceli, 34 bayt:

Ans→N
seq(X,X,0,N→L₁
rand(N+1→L₂
SortA(L₂,L₁
L₁

Doğrudan tibasicdev . Muhtemelen golf oynayabilir, ama henüz bir şey bulamadım.

Bu ne yapar: İkinci arg öğelerini ( L₁burada) karşılık gelen öğelerle aynı şekilde hareket ettiren rastgele bir dizi sıralar .


1

JavaScript (ES6), 51 bayt

n=>[...Array(n+1).keys()].sort(_=>.5-Math.random())

2
Bunun tek tip olduğunu düşünmüyorum; Ben f(5)10 kez denedim ve 5her zaman son iki öğeden biri oldu.
ETHproductions

Sadece kendimi tekrar birkaç kez koştu ve var 1,5,4,0,2,3& 1,0,2,5,3,4. DÜZENLEME: Ve birkaç tane daha prnt.sc/fe0goe
Shaggy

3
Sadece f(5)1e5 kez çalışan ve sonuçlarda her sayının ortalama konumunu bulan hızlı bir test yaptık. Ortaya çıkan dizi [ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ], bu yüzden tek tip olduğunu sanmıyorum. ( kod )
ETHproductions

Sanırım işe yarayacak 93 baytlık bir çözümüm var. n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
kamoroso94

Sonuçta sıralama random()eşit değildir. Bkz. (Örneğin) en.wikipedia.org/wiki/BrowserChoice.eu#Eleştiri
Neil

1

Aseto , 15 14 16 bayt

@lXp
Y!`n
zi&
0r

Yığına sıfıra basın, bir tamsayı okuyun, bir aralık oluşturun ve karıştırın:

Y
zi
0r

Bir yakalama işareti, 0 için test uzunluğu ve (bu durumda) çıkış ayarlayın:

@lX
 !`

Else değeri, yeni bir satır yazdırın ve uzunluk testine geri dönün:

   p
   n
  &

(Soruyu yanlış okuduğumu ve 0-n yerine 1-n arasında bir aralık oluşturduğumu fark ettiğim için kodu değiştirmek zorunda kaldım.)




1

8 , 42 36 34 bayt

kod

>r [] ' a:push 0 r> loop a:shuffle

SED (Yığın Etkisi Şeması): n -- a

Kullanım ve örnek

ok> 5 >r [] ' a:push 0 r> loop a:shuffle .
[2,5,0,3,1,4]

1

Javascript (ES6), 68 bayt

n=>[...Array(n+1)].map((n,i)=>[Math.random(),i]).sort().map(n=>n[1])

Bir dizi form oluşturur

[[Math.random(), 0],
 [Math.random(), 1],
 [Math.random(), 2],...]

Sonra sıralar ve yeni siparişteki son öğeleri döndürür


1

J, 11 Bayt

(?@!A.i.)>:

Açıklama:

         >:   | Increment
(?@!A.i.)     | Fork, (f g h) n is evaluated as (f n) g (h n)
      i.      | Integers in range [0,n) inclusive
 ?@!          | Random integer in the range [0, n!)
    A.        | Permute right argument according to left

Örnekler:

    0 A. i.>:5
0 1 2 3 4 5
    1 A. i.>:5
0 1 2 3 5 4
    (?@!A.i.)>: 5
2 3 5 1 0 4
    (?@!A.i.)>: 5
0 3 5 1 2 4

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.