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

remoto
fuente
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í .

lirtosiast
fuente
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)
Mwr247
fuente
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.

falla
fuente
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.

lirtosiast
fuente
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.

Luis Mendo
fuente
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.

Denker
fuente
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

Conor O'Brien
fuente
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
Denker
fuente
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.

volcado de memoria
fuente
2

Rubí, 27 23 bytes

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

-4 bytes de @manatwork

->n,r{[*1..r].sample n}
Tinta de valor
fuente
->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
Mama Fun Roll
fuente
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

Trauma digital
fuente
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.

AdmBorkBork
fuente
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
Mego
fuente
1

Clojure, 38 bytes

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

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

MattPutnam
fuente
1

Perl 6, 32 bytes

{(^$^a).permutations.pick[^$^b]}
Ven
fuente
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.

R. Kap
fuente
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)
Ben Perlin
fuente
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

C5H8NNaO4
fuente
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í

Stuart Bruff
fuente
¿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
Las versiones de prueba están en: Matcad 15 - ptc.com/engineering-math-software/mathcad/free-trial ; Mathcad Prime 3.1 - ptc.com/engineering-math-software/mathcad/free-download
Stuart Bruff el
¿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)
shooqie
fuente
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).

Oleg V. Volkov
fuente
0

TI-84 BASIC, 21 bytes

Prompt R,N:randIntNoRep(1,R→A:N→dim(ʟA:ʟA
SuperJedi224
fuente
Ya no se puede usar Anscomo entrada según una meta publicación reciente.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ ... ¿por qué no?
SuperJedi224
Ese fue el consenso sobre meta . Vote si no está de acuerdo.
Conor O'Brien