Matriz aleatoria sin repetición


16

Estaba respondiendo un desafío aquí y esta tarea era parte del desafío. Tengo una solución de 73 bytes en javascript. Pero creo que es demasiado para una cosa simple.

Desafío

Dado como entrada dos enteros:

  • N la longitud de la matriz esperada
  • Rel intervalo del intervalo que comienza en uno: 1..Rno0..R-1

Imprima en cada ejecución de su programa / función una matriz diferente de longitud Ncon valores entre ellos 1..Rde tal manera que ningún valor ocurra más de una vez.

Debe usar R-valueen su código.

Restricciones

Se puede suponer: 2 <= N <= R.

Realmente me gustaría ver una solución de JavaScript más corta que la mía de 73 bytes.

Pero, por supuesto, ¡está abierto a todos los idiomas!

Si su idioma no puede devolver una matriz, puede imprimir todos los números;)


2
Otra cosa: no creo que quieras que sean diferentes con cada carrera, sino que sean simplemente al azar. (De lo contrario, no funcionaría R=N=1). Entonces recomiendo permitir los rangos 0..Rcomo una alternativa, ya que esto es más natural para muchos idiomas.
flawr

Recomiendo incluir que cada permutación sea igualmente probable (suponiendo una aleatoriedad perfecta), de lo contrario, puedo hacershuffle(0..N)
Nathan Merrill

Publiqué mi respuesta de calidad aleatoria no uniforme antes de que hicieras tu cambio de regla.
Conor O'Brien

1
Dices una solución uniforme al azar, pero new Dateproduce valores no uniformes. Además, creo que puedes jugarlo new Date%r+1;)
Conor O'Brien

¿La matriz de salida necesita ser enteros? Parece obvio, pero no lo veo explícitamente declarado
Charlie Wynn

Respuestas:


16

Dyalog APL, 1 byte

?

Solo una construcción. Pruébalo aquí .


3
Con una respuesta como esta, tuve que desplazarme hacia arriba para ver si eras el OP
lbstr

2
@lbstr Ahora que lo mencionas, mi identicon es bastante similar a los OP.
lirtosiast

9

JavaScript (ES6), 68 66 bytes

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

Llamado como F(N)(R)(), donde Festá la asignación de funciones, y N/ Rson los valores.

Solicitó menos de 73 bytes en Js;)

EDITAR: La respuesta de @ C5H8NNaO4 funciona dentro del hecho de que las reglas no especifican que los valores deben ser uniformes 1..R. Dado eso, aquí hay una versión que funciona en 63 bytes (llamada como F(R)(N)):

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

Hombre, esto es impresionante !! +1
eliminado

@WashingtonGuedes Gracias =) Acabo de eliminar otros 2 bytes.
Mwr247

7

Octava, 22 19 9 bytes

@randperm

randperm(r,n)hace exactamente lo que se solicita. Tenga en cuenta que esto no funciona (al menos no en versiones anteriores) en Matlab.


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

1
randpermcon dos entradas funciona en versiones recientes de Matlab. También hay randsample, pero toma más bytes, a menos que pueda deshacerse de @(...)(creo que eso está permitido)
Luis Mendo

Oh, puedo usar @randperm=)
flawr

5

TI-84 BASIC OS 4.0, 12 bytes

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

El TI-84 + CSE (2013) y el CE (2015) son esencialmente el mismo dialecto BASIC limitado que el TI-84 +, pero hay algunas características nuevas. Uno de ellos es el tercer argumento de randIntNoRep.


1
Francamente, es un poco tonto que no hayan incluido esa característica desde el principio.
SuperJedi224

Inmediatamente pensé en TI-Basic cuando vi este desafío :)
Timtech

5

MATL , 2 bytes

Zr

Las entradas son: primero R, luegoN .

Pruébalo en línea!

Explicación

La función Zrtoma dos entradas (implícitamente en este caso) y realiza un muestreo aleatorio sin reemplazo. La primera entrada, Respecifica que la población es [1,2,...,R]; y la segunda entrada, Nindica el número de muestras a tomar de la población.



4

Pyth, 6 bytes

<.SSQE

Pruébalo aquí!

El rango viene en la primera línea y la longitud en la segunda.

Explicación

<.SSQE # Q = rango, E = longitud

   SQ # genera el rango 1 ... Q
 .S # baraja la lista
<E # toma los primeros elementos E

Versión de 5 bytes no competitiva

La última incorporación a Pyth agrega Qs implícitos al final del programa si es necesario. Podemos usar esto aquí invirtiendo el formato de entrada, por lo que la longitud es lo primero y luego el rango.

<.SSE

Pruébalo aquí!

Aquí Eestá el rango, que convertimos en una lista basada en 1 S, lo barajamos .Sy tomamos los primeros Qelementos con <. <espera un número entero que se agrega implícitamente con a Q.


4

Reng v.2.1, 140 103 98 97 bytes

Esto también debería funcionar en versiones anteriores.

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

¡Puedes probarlo aquí! La entrada es maximum length, como 10 3.

Estoy muy orgulloso de esto, ni siquiera lo sabes. Si alguien me gana con una respuesta de Java, eso me alegrará el día. Si supero una respuesta de Java, considere también mi día hecho.

Lo explicaré más tarde, una vez que me recupere. En general, sin embargo:

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

Esto genera los números aleatorios. La otra parte verifica si hay duplicados y, si los hay, el proceso se repite. De lo contrario, los resultados se imprimen, con espacios que se unen a los resultados.

Aquí hay unos ejemplos:

gif largo


3

CJam, 8 bytes

{,:)mr<}

Pruébalo aquí!

Este es un bloque sin nombre que espera el rango en la parte superior de la pila y la longitud en la parte inferior y deja una lista en la pila.

Explicación

, rango basado en e # 0
:) e # inkrement cada elemento de la lista por lo que se basa en 1
mr e # baraja la lista
<e # toma los primeros n elementos

Este es un programa feliz :)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sería más feliz si CJam tuviera un rango incorporado para rangos basados ​​en 1, por lo que no necesitaría esta cara sonriente: P
Denker

2

Lisp común, 90

52 solo para la expresión

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

Sin golf

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

Al igual que otras respuestas, si no cuento use-package y lambda , la expresión restante es (coerce(subseq(shuffle(iota R :start 1))0 N)'vector), para 52 bytes.


2

Rubí, 27 23 bytes

Función anónima, razonablemente corta y dulce.

-4 bytes de @manatwork

->n,r{[*1..r].sample n}

->n,r{[*1..r].sample n}Utilice el marcado de bloque de código en lugar del marcado de código en línea, de modo que los scripts como Code Golf UserScript Enhancement Pack puedan insertar el tamaño del código al lado.
manatwork

Muy bien, ya está arreglado.
Value Ink

2

𝔼𝕊𝕄𝕚𝕟, 10 caracteres / 13 bytes

Ѩŝ⩤⁽1í)ą-î

Try it here (Firefox only).

Explicación

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

2

Bash + coreutils, 16

Creo que esto se explica por sí mismo:

seq $2|shuf -n$1

Entrada NyR como parámetros de línea de comandos.

O como señala @rici, para el mismo puntaje:

shuf -n$1 -i1-$2

Ideona


1
o shuf -n$1 -i1-$2(misma longitud, sin embargo).
rici

@rici muy agradable. muy limpio :)
Digital Trauma

1

PowerShell v2 +, 30 bytes

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

Toma información $ny $r, construye un rango 1..$r, canaliza eso Get-Randomcon una cantidad -Cde $n, que seleccionará $nelementos únicos del rango. La salida se deja en la tubería como una matriz implícita.


1

En serio, 5 bytes

,,R╨J

Pruébalo en línea!

Explicación:

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

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

Una función anónima que toma N primero y R segundo.


1

Perl 6, 32 bytes

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

1

Python 3.5 - 54 53 bytes:

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

Esto utiliza la sample()función del módulo aleatorio para devolver una matriz con una longitud "a" que consta de elementos aleatorios y únicos en el rango 1 => c.


1

D, 29 bytes (solo expresión)

Suponiendo que se hayan importado std.random y std.range y que n y r se definan como variables, el programa se puede resolver en la única expresión:

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)

Como en la respuesta de @ Mwr247 , puede llamarlo con F(R)(N), Fsiendo la expresión de la función


0

Mathcad, 67 "bytes"

crea un vector de columna de enteros consecutivos en el rango 1..R, lo une a un vector de columna de longitud R de números aleatorios (uniformes), clasifica la matriz Rx2 resultante en la columna de números aleatorios y luego extrae los primeros n números del columna aleatoria de enteros.

ingrese la descripción de la imagen aquí


¿Hay algún lugar donde podamos probar esto?
Conor O'Brien

Puede descargar versiones de prueba de Mathcad 15 y Mathcad Prime 3.1 (el sucesor de Mathcad 15). Ambas pruebas se ejecutan durante 30 días, después de lo cual M15 deja de funcionar, pero Prime 3.1 todavía se ejecuta, aunque con una funcionalidad reducida (por ejemplo, sin programación, por lo que lo anterior no funcionará ... pero el bucle for puede reescribirse para usar variables de rango crear v fuera de la declaración de
aumento


¿Y cómo cuentas estos bytes?
Rɪᴋᴇʀ

Mirándolo desde la perspectiva de entrada del usuario y equiparando una operación de entrada de Mathcad (por lo general, con el mouse, haga clic en la barra de herramientas si no hay un atajo de kbd) a un carácter e interprete esto como un byte. csort = 5 bytes, ya que se escribe char-by-char al igual que otros nombres de variables / funciones. El operador for es una construcción especial que ocupa 11 caracteres (incluidos 3 "marcadores de posición" en blanco y 3 espacios) pero se ingresa mediante ctl-shft- #, por lo tanto = 1 byte (similar a los tokens en algunos idiomas). Escribir '(cita) crea paréntesis equilibrados (generalmente), por lo que cuenta como 1 byte. Indexación v = 3 bytes (tipo v [k).
Stuart Bruff

0

Python, 56 (la forma obvia)

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)es más corto por un byte
Mego

Huh, lo consideré from random import*, debe haber arruinado el conteo.
shooqie

0

Perl 5, 51 43 bytes

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

Sub anónimo bastante sencillo que genera una matriz de 1 a R y luego divide N elementos aleatorios de él para volver. Llamada con ->(N, R).


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.