Aleatorizar los escalares de una matriz

14

Debe completar una matriz con cada número, 0-ninclusive. No se deben repetir números. Sin embargo, deben estar en un orden aleatorio.

Reglas

Todas las reglas estándar de y las lagunas estándar están prohibidas

La matriz debe generarse de forma seudoaleatoria. Toda permutación posible debe tener la misma probabilidad.

Entrada

n de cualquier manera permitida en la publicación de E / S en meta.

Salida

El conjunto de números revueltos de 0-ninclusivo.

Christopher
fuente
la salida puede estar separada por nuevas líneas?
DrnglVrgs
@Riley opps que estaba destinado a desaparecer, lo siento.
Christopher
@DrnglVrgs sí puede
Christopher
Por "números" supongo que te refieres a "enteros"?
Zacharý
1
@KevinCruijssen IMO lists = array pero con soporte de búsqueda. Así que seguro usa una lista
Christopher

Respuestas:

9

Perl 6 , 14 bytes

{pick *,0..$_}

Intentalo

Expandido:

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

  pick      # choose randomly without repeats
    *,      # Whatever (all)
    0 .. $_ # Range from 0, to the input (inclusive)
}
Brad Gilbert b2gills
fuente
8

Pyth, 3 bytes

.Sh

Demostración

.Ses aleatorio Implícitamente arroja un entero de entrada nal rango [0, 1, ..., n-1]. hes +1, y la entrada se toma implícitamente.

isaacg
fuente
7

R , 16 bytes

sample(0:scan())

lee de stdin. sampleMuestras aleatorias del vector de entrada, devolviendo una secuencia (pseudo) aleatoria.

Pruébalo en línea!

Giuseppe
fuente
6

Jalea , 3 bytes

0rẊ

Pruébalo en línea!

Explicación

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

Solución alternativa, 3 bytes.

‘ḶẊ

Explicación:

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

Pruébalo en línea!

Camarada SparklePony
fuente
5

Python 2 , 51 bytes

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

Pruébalo en línea!

Hay random.shuffle()pero modifica el argumento en su lugar en lugar de devolverlo ...

totalmente humano
fuente
Usted puede utilizarrandom.shuffle
Caird coinheringaahing
@cairdcoinheringaahing Sí, pero eso no funcionaría. Por ejemplo, lambda n:shuffle(range(n+1))no escribiría la salida en ningún lado.
Totalmente humano
4

Bash, 18 11 bytes

shuf -i0-$1

Pruébalo en línea!

DrnglVrgs
fuente
Si se permiten nuevas líneas, podemos olvidar la parte del eco
DrnglVrgs
3

Mathematica, 24 bytes

RandomSample@Range[0,#]&
J42161217
fuente
3

MATL , 4 bytes

QZ@q

Pruébalo en línea!

Explicación

Q     % Implicitly input n. Add 1
Z@    % Random permutation of [1 2 ... n+1]
q     % Subtract 1, element-wise. Implicitly display
Luis Mendo
fuente
3

Japt , 4 bytes

ò öx

Pruébalo en línea


    :Implicit input of integer U
ò   :Generate array of 0 to U.
öx  :Generate random permutation of array.
    :Implicit output of result.
Lanudo
fuente
Dios mío, pensé öxque sería suficiente hasta que me di cuenta de la parte "inclusiva". (Podría reemplazar el xcon casi cualquier otra cosa, por cierto)
ETHproductions
@ETHproductions, ese fue mi primer pensamiento también.
Shaggy
3

C #, 76 bytes

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

Esto devuelve un IOrderedEnumerable, espero que esté bien, o de lo contrario necesito algunos bytes más para un .ToArray ()

LiefdeWen
fuente
3

CJam , 7 6 bytes

1 byte eliminado gracias a Erik the Outgolfer .

{),mr}

Este es un bloque anónimo (función) que toma un número entero de la pila y lo reemplaza con el resultado. Pruébalo en línea!

Explicación

{     e# Begin block
)     e# Increment: n+1
,     e# Range: [0 1 ... n]
mr    e# Shuffle
}     e# End block
Luis Mendo
fuente
¿No es {),mr}1 byte más corto?
Erik the Outgolfer
@EriktheOutgolfer De hecho! Gracias
Luis Mendo
3

Java 8, 114 111 97 bytes

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

-3 bytes y corrección de errores gracias a @ OlivierGrégoire .
-4 bytes gracias a @Jakob .
-10 bytes eliminando .toArray().

Explicación:

Pruébalo aquí.

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
fuente
1
Error: no incluye n. Fijar y golf: for(n++;--n>=0;l.add(n));. Además, digo que no necesita devolver una matriz. La matriz y la lista son iguales en la mayoría de los idiomas, así que solo devuelva la lista.
Olivier Grégoire
@ OlivierGrégoire Woops ... Eso es lo que obtienes por no verificar correctamente y simplemente publicar ... Gracias por la corrección de errores (y 4 bytes guardados en el proceso).
Kevin Cruijssen
1
Bueno, tres en realidad, porque volví a editar, habiendo introducido otro error: >debería ser >=.
Olivier Grégoire
1
-4 bytes: use a en Stacklugar de a Vectory cambie su ciclo a for(;n>=0;l.add(n--));. Y devolver un java.util.Listdefinitivamente está bien.
Jakob
2

Pyth, 4 bytes

.S}0

Pruébalo aquí!

KarlKastor
fuente
Puedes jugar golf a 3 bytes. .Scon un argumento entero es lo mismo .SUy [0..n]se puede codificar como Uh, por lo que puede usar .SUh, que luego se convierte en .Sh.
Erik the Outgolfer
@EriktheOutgolfer gracias por la pista, pero como alguien ya ha publicado la solución que propones, dejaré esto como esto.
KarlKastor
Bueno, está al límite si eso debería haber sido una respuesta separada o no, pero creo que cuenta como un engaño, por lo que incluso si está permitido, lo consideraría solo una sustitución incorporada, así que no, no quería publicar separado, pero Isaac lo hizo.
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;}}

Función recursiva que se inicializa desde el final de la matriz al entrar y se intercambia con un elemento aleatorio antes de salir.

Computronium
fuente
¿Y si n > 98?
LegionMammal978
Fallaría, por supuesto, pero el rango de entrada no se especificó en el problema. Por favor no me hagas malloc :)
Computronium
cambiarse aa un para para ajustarse más a la regla?
l4m2
67 bytes
ceilingcat
2

Carbón , 33 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código.

Aparentemente, se necesitan 17 bytes para eliminar un elemento de una lista en Charcoal.

Editar: en estos días solo toma tres bytes, suponiendo que desea eliminar todas las apariciones del elemento de la lista. Esto más otros cambios de carbón reducen la respuesta a 21 bytes: ¡ Pruébelo en línea!

Neil
fuente
Ay, eso es mucho
Christopher
2

APL (Dyalog) , 5 bytes

?⍨1+⊢

Pruébalo en línea!

Asume ⎕IO←0, lo cual es predeterminado en muchas máquinas.

Explicación

el argumento correcto

1+ agregue 1

?⍨generar números 0 .. 1+⊢-1 y distribuirlos aleatoriamente en una matriz para que no se repitan dos números

Kritixi Lithos
fuente
2

q / kdb +, 11 bytes

Solución:

{(0-x)?1+x}

Ejemplo:

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

Explicación:

Use el ? operador con una entrada negativa para dar la lista completa de 0->nsin duplicados:

{(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'
callejero
fuente
2

TI-83 BASIC, 5 bytes (aburrido)

randIntNoRep(0,Ans

Sí, un incorporado. randIntNoRep(es un token de dos bytes y Anses un byte.

Más diversión, 34 bytes:

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

Directamente desde tibasicdev . Probablemente golfable, pero todavía no he encontrado nada.

Qué hace esto: ordena una matriz aleatoria, moviendo elementos del segundo argumento ( L₁aquí) de la misma manera que sus elementos correspondientes.

Khuldraeseth na'Barya
fuente
1

JavaScript (ES6), 51 bytes

n=>[...Array(n+1).keys()].sort(_=>.5-Math.random())
Lanudo
fuente
2
No creo que esto sea uniforme; Lo he intentado f(5)10 veces y 5ha sido uno de los últimos dos elementos cada vez.
ETHproductions
Solo lo volví a ejecutar un par de veces y obtuve 1,5,4,0,2,3& 1,0,2,5,3,4. EDITAR: Y algunos más prnt.sc/fe0goe
Shaggy
3
Simplemente ejecuté una prueba rápida que se ejecuta f(5)1e5 veces y encuentra la posición promedio de cada número en los resultados. La matriz resultante fue [ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ], así que no creo que sea uniforme. ( código )
ETHproductions
Creo que tengo una solución de 93 bytes que podría funcionar. n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
kamoroso94
Ordenar por el resultado de random()no es uniforme. Ver (por ejemplo) en.wikipedia.org/wiki/BrowserChoice.eu#Criticism
Neil
1

Aceto , 15 14 16 bytes

@lXp
Y!`n
zi&
0r

Empuja cero en la pila, lee un número entero, construye un rango y baraja:

Y
zi
0r

Establezca una marca de captura, longitud de prueba para 0 y (en ese caso) salga:

@lX
 !`

De lo contrario, imprima el valor, una nueva línea y vuelva a la prueba de longitud:

   p
   n
  &

(Tuve que cambiar el código porque me di cuenta de que había leído mal la pregunta y había construido un rango de 1-n, no 0-n).

L3viatán
fuente
1

Go , 92 bytes

Principalmente perdiendo ante la necesidad de sembrar el PRNG.

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

Pruébalo en línea!

totalmente humano
fuente
1

Rubí, 20 bytes.

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

Canhascodez
fuente
1

8 , 42 36 34 bytes

Código

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

SED (Diagrama de efecto de pila) es n -- a

Uso y ejemplo

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

Javascript (ES6), 68 bytes

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

Crea una matriz de formularios.

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

Luego lo ordena y devuelve los últimos elementos en el nuevo orden

Oki
fuente
1

J, 11 bytes

(?@!A.i.)>:

Explicación:

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

Ejemplos:

    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
fuente
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]}]}

Pruébalo en línea!

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}

Pruébalo en línea!

sergiol
fuente
Trate de superar al golf con el mismo número de bytes: tio.run/…
sergiol