Losuj skalary macierzy

14

Musisz wypełnić tablicę każdą liczbą od 0-nwłącznie. Żadne liczby nie powinny się powtarzać. Jednak muszą być w losowej kolejności.

Zasady

Wszystkie standardowe zasady i standardowe luki są zabronione

Tablica musi zostać wygenerowana pseudolosowo. Każda możliwa permutacja powinna mieć jednakowe prawdopodobieństwo.

Wejście

n w jakikolwiek sposób dozwolony w poście we / wy na meta.

Wynik

Tablica liczb wymieszała się z 0-nwłącznie.

Krzysztof
źródło
wynik może być oddzielony znakami nowej linii?
DrnglVrgs
@ Riley opps, który miał przepaść.
Christopher
@DrnglVrgs tak, może
Christopher
Przez „liczby” zakładam, że masz na myśli „liczby całkowite”?
Zacharý
1
@KevinCruijssen IMO list = array, ale z obsługą wyszukiwania. Więc skorzystaj z listy
Christopher

Odpowiedzi:

9

Perl 6 , 14 bajtów

{pick *,0..$_}

Spróbuj

Rozszerzony:

{           # bare block lambda with implicit parameter 「$_」

  pick      # choose randomly without repeats
    *,      # Whatever (all)
    0 .. $_ # Range from 0, to the input (inclusive)
}
Brad Gilbert b2gills
źródło
8

05AB1E , 3 bajty

Ý.r

Wypróbuj online!

Ý   # Make a list from 0 to input
 .r # Shuffle it randomly
Riley
źródło
8

Pyth, 3 bajty

.Sh

Demonstracja

.Sjest losowe. Domyślnie rzutuje całkowitą liczbę wejściową nna zakres [0, 1, ..., n-1]. hjest +1, a dane wejściowe są pobierane niejawnie.

isaacg
źródło
7

R , 16 bajtów

sample(0:scan())

czyta z stdin. samplelosowo pobiera próbki z wektora wejściowego, zwracając (pseudo) losową sekwencję.

Wypróbuj online!

Giuseppe
źródło
6

Galaretka , 3 bajty

0rẊ

Wypróbuj online!

Objaśnienie:

0rẊ 
0r  Inclusive range 0 to input.
  Ẋ Shuffle.
    Implicit print.

Alternatywne rozwiązanie, 3 bajty

‘ḶẊ

Wyjaśnienie:

‘ḶẊ
‘   Input +1
 Ḷ  Range 0 to argument.
  Ẋ Shuffle.

Wypróbuj online!

Towarzyszu SparklePony
źródło
5

Python 2 , 51 bajtów

lambda n:sample(range(n+1),n+1)
from random import*

Wypróbuj online!

Istnieje, random.shuffle()ale modyfikuje argument zamiast go zwrócić ...

całkowicie ludzki
źródło
Państwo może wykorzystywaćrandom.shuffle
Caird coinheringaahing
@cairdcoinheringaahing Tak, ale to nie zadziała. Na przykład lambda n:shuffle(range(n+1))nigdzie nie zapisałbym danych wyjściowych.
całkowicie ludzki,
4

Bash, 18 11 bajtów

shuf -i0-$1

Wypróbuj online!

DrnglVrgs
źródło
Jeśli dozwolone są nowe linie, możemy zapomnieć o części echa
DrnglVrgs
3

Mathematica, 24 bajty

RandomSample@Range[0,#]&
J42161217
źródło
3

MATL , 4 bajty

QZ@q

Wypróbuj online!

Wyjaśnienie

Q     % Implicitly input n. Add 1
Z@    % Random permutation of [1 2 ... n+1]
q     % Subtract 1, element-wise. Implicitly display
Luis Mendo
źródło
3

Japt , 4 bajty

ò öx

Wypróbuj online


    :Implicit input of integer U
ò   :Generate array of 0 to U.
öx  :Generate random permutation of array.
    :Implicit output of result.
Kudłaty
źródło
Cholera, myślałem, öxże to wystarczy, dopóki nie zauważyłem części „włączającej”. (Można zastąpić xprawie wszystkim innym, btw)
ETHprodukcje
@ETHproductions, to była moja pierwsza myśl.
Kudłaty
3

C #, 76 bajtów

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

Zwraca IOrDEREnumerable, mam nadzieję, że jest w porządku, bo potrzebuję jeszcze kilku bajtów dla funkcji .ToArray ()

LiefdeWen
źródło
3

CJam , 7 6 bajtów

1 bajt usunięty dzięki Erikowi Outgolfer .

{),mr}

Jest to anonimowy blok (funkcja), który pobiera liczbę całkowitą ze stosu i zastępuje ją wynikiem. Wypróbuj online!

Wyjaśnienie

{     e# Begin block
)     e# Increment: n+1
,     e# Range: [0 1 ... n]
mr    e# Shuffle
}     e# End block
Luis Mendo
źródło
Czy {),mr}1 bajt nie jest krótszy?
Erik the Outgolfer
@EriktheOutgolfer Rzeczywiście! Dzięki
Luis Mendo
3

Java 8, 114 111 97 bajtów

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

-3 bajty i poprawione błędy dzięki @ OlivierGrégoire .
-4 bajty dzięki @Jakob .
-10 bajtów przez usunięcie .toArray().

Wyjaśnienie:

Wypróbuj tutaj.

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
Kevin Cruijssen
źródło
1
Błąd: nie obejmuje n. Fix i golf: for(n++;--n>=0;l.add(n));. Mówię też, że nie musisz zwracać tablicy. Tablica i lista są takie same w większości języków, więc po prostu zwróć listę.
Olivier Grégoire,
@ OlivierGrégoire Woops .. To dostajesz za niepoprawne sprawdzenie i po prostu opublikowanie .. Dzięki za naprawę błędu (i 4 bajty zapisane w procesie).
Kevin Cruijssen,
1
Cóż, trzy właściwie, ponieważ ponownie edytowałem, sam wprowadziłem kolejny błąd: >powinno być >=.
Olivier Grégoire,
1
-4 bajty: użyj Stackzamiast a Vectori zmień pętlę na for(;n>=0;l.add(n--));. A zwrot a java.util.Listjest zdecydowanie w porządku.
Jakob,
2

Ohm , 2 bajty

#╟

Wypróbuj online!

Nick Clifford
źródło
To jest lepszy link.
Erik the Outgolfer
2

Pyth, 4 bajty

.S}0

Wypróbuj tutaj!

KarlKastor
źródło
You can golf to 3 bytes. .S with an integer argument is the same as .SU, and [0..n] can be coded as Uh, so you can use .SUh, which then becomes .Sh.
Erik the Outgolfer
@EriktheOutgolfer thanks for the hint, but as someone has alread posted the solution you propose I will leave this as this.
KarlKastor
Well, it's borderline whether that should've been a separate answer or not, but I believe it counts as a dupe, so even it being allowed, I'd consider it just builtin substitution, so nah, I didn't want to post separate, but isaacg did.
Erik the Outgolfer
2

C, 75 bytes

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

Recursive function that initializes from the array's end on the way in, and swaps with a random element before it on the way out.

Computronium
źródło
What if n > 98?
LegionMammal978
It would fail, of course, but input range wasn't specified in the problem. Please don't make me malloc :)
Computronium
change a into a para to fit the rule more?
l4m2
67 bytes
ceilingcat
2

Charcoal, 33 bytes

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

Try it online! Link is to verbose version of code.

Apparently it takes 17 bytes to remove an element from a list in Charcoal.

Edit: These days it only takes three bytes, assuming you want to remove all occurrences of the item from the list. This plus other Charcoal changes cut the answer down to 21 bytes: Try it online!

Neil
źródło
Yikes that is a lot
Christopher
2

APL (Dyalog), 5 bytes

?⍨1+⊢

Try it online!

Assumes ⎕IO←0, which is default on many machines.

Explanation

the right argument

1+ add 1 to it

?⍨ generate numbers 0 .. 1+⊢-1 and randomly deal them in an array so that no two numbers repeat

user41805
źródło
2

q/kdb+, 11 bytes

Solution:

{(0-x)?1+x}

Example:

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

Explanation:

Use the ? operator with a negative input to give the full list of 0->n without duplicates:

{(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'
streetster
źródło
2

TI-83 BASIC, 5 bytes (boring)

randIntNoRep(0,Ans

Yep, a builtin. randIntNoRep( is a two-byte token, and Ans is one byte.

More fun, 34 bytes:

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

Straight from tibasicdev. Probably golfable, but I haven't found anything yet.

What this does: Sorts a random array, moving elements of the second arg (L₁ here) in the same way as their corresponding elements.

Khuldraeseth na'Barya
źródło
1

JavaScript (ES6), 51 bytes

n=>[...Array(n+1).keys()].sort(_=>.5-Math.random())
Shaggy
źródło
2
I don't think this is uniform; I've tried f(5) 10 times and 5 has been one of the last two items every time.
ETHproductions
Just ran it again a couple of times myself and got 1,5,4,0,2,3 & 1,0,2,5,3,4. EDIT: And a few more prnt.sc/fe0goe
Shaggy
3
Just ran a quick test which runs f(5) 1e5 times and finds the average position of each number in the results. The resulting array was [ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ], so I don't think it's uniform. (code)
ETHproductions
I think I have a 93 byte solution that could work. n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
kamoroso94
Sorting on the result of random() isn't uniform. See (for example) en.wikipedia.org/wiki/BrowserChoice.eu#Criticism
Neil
1

Aceto, 15 14 16 bytes

@lXp
Y!`n
zi&
0r

Push zero on the stack, read an integer, construct a range and shuffle it:

Y
zi
0r

Set a catch mark, test length for 0, and (in that case) exit:

@lX
 !`

Else print the value, a newline, and jump back to the length test:

   p
   n
  &

(I had to change the code because I realized I misread the question and had constructed a range from 1-n, not 0-n.)

L3viathan
źródło
1

Go, 92 bytes

Mostly losing to the need to seed the PRNG.

import(."fmt";."math/rand";."time")
func f(n int){Seed(Now().UnixNano());Println(Perm(n+1))}

Try it online!

totallyhuman
źródło
1

Ruby, 20 bytes

->n{[*0..n].shuffle}

canhascodez
źródło
1

8th, 42 36 34 bytes

Code

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

SED (Stack Effect Diagram) is n -- a

Usage and example

ok> 5 >r [] ' a:push 0 r> loop a:shuffle .
[2,5,0,3,1,4]
Chaos Manor
źródło
1

Javascript (ES6), 68 bytes

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

Creates an array of form

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

Then sorts it and returns the last elements in the new order

Oki
źródło
1

J, 11 Bytes

(?@!A.i.)>:

Explanation:

         >:   | 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

Examples:

    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
Bolce Bussiere
źródło
1

Tcl, 90 bytes

proc R n {lsort -c {try expr\ rand()>.5 on 9} [if [incr n -1]+2 {concat [R $n] [incr n]}]}

Try it online!

Tcl, 96 bytes

proc R n {proc f a\ b {expr rand()>.5}
set i -1
while \$i<$n {lappend L [incr i]}
lsort -c f $L}

Try it online!

sergiol
źródło
Try to outgolf got the same byte count: tio.run/…
sergiol