Tableau aléatoire sans répétition

16

Je répondais à un défi ici et cette tâche faisait partie du défi. J'ai une solution de 73 octets en javascript. Mais je pense que c'est trop pour une chose simple.

Défi

Étant donné en entrée deux entiers:

  • N la longueur du tableau attendu
  • Rla plage de l'intervalle commençant par un:, 1..Rpas0..R-1

Sortez à chaque exécution de votre programme / fonction un tableau différent de longueur Navec des valeurs comprises 1..Rde telle manière qu'aucune valeur ne se produit plus d'une fois.

Vous devez utiliser R-valuedans votre code.

Restrictions

Vous pouvez supposer: 2 <= N <= R.

Je voudrais vraiment voir une solution javascript plus courte que la mienne 73 octets.

Mais bien sûr, il est ouvert à toutes les langues!

Si votre langue ne peut pas renvoyer un tableau, vous pouvez imprimer tous les nombres;)

supprimé
la source
2
Autre chose: je ne pense pas que vous vouliez qu'ils soient différents à chaque course, mais simplement uniformément aléatoires? (Sinon, cela ne fonctionnerait pas pourR=N=1 ) Je recommande donc d'autoriser les plages 0..Rcomme alternative car cela est plus naturel pour de nombreuses langues.
flawr
Je recommanderais d'inclure que chaque permutation soit également probable (en supposant un hasard parfait), sinon je peux le faire shuffle(0..N)
Nathan Merrill
J'ai publié ma réponse de qualité aléatoire non uniforme avant de modifier votre règle.
Conor O'Brien
1
Vous dites une solution uniformément aléatoire, mais new Datedonne des valeurs non uniformes. De plus, je crois que vous pouvez le jouer au golf new Date%r+1;)
Conor O'Brien
Le tableau de sortie doit-il être des entiers? Cela semble évident, mais je ne le vois pas explicitement déclaré
Charlie Wynn

Réponses:

16

Dyalog APL, 1 octet

?

Juste un intégré. Essayez-le ici .

lirtosiast
la source
3
Avec une réponse comme celle-ci, j'ai dû revenir en arrière pour voir si vous étiez l'OP
lbstr
2
@lbstr Maintenant que vous le mentionnez, mon identicon est assez similaire aux OP.
lirtosiast
9

JavaScript (ES6), 68 66 octets

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

Appelé comme F(N)(R)(), où Fest l'affectation de fonction et N/ Rsont les valeurs.

Vous avez demandé moins de 73 octets en Js;)

EDIT: La réponse de @ C5H8NNaO4 fonctionne dans le fait que les règles ne spécifient pas que les valeurs doivent être uniformes à travers 1..R. Étant donné que, voici une version qui fonctionne en 63 octets (appelés comme F(R)(N)):

r=>G=(n,s=[])=>n--?G((s[n]=n+1,n),s):s.sort(a=>new Date/a%1-.5)
Mwr247
la source
Mec, c'est impressionnant !! +1
supprimé
@WashingtonGuedes Thanks =) Je viens de raser 2 autres octets.
Mwr247
7

Octave, 22 19 9 octets

@randperm

randperm(r,n)fait exactement ce qui est demandé. Notez que cela ne fonctionne pas (du moins pas dans les versions plus anciennes) dans Matlab.

flawr
la source
1
@(n,r)randperm(r,n)
Luis Mendo
1
randpermavec deux entrées fonctionne dans les versions récentes de Matlab. Il y en a aussi randsample, mais cela prend plus d'octets, à moins que vous ne puissiez vous débarrasser de @(...)(je pense que c'est autorisé)
Luis Mendo
Oh je peux utiliser @randperm=)
flawr
5

TI-84 BASIC OS 4.0, 12 octets

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

La TI-84 + CSE (2013) et la CE (2015) sont essentiellement le même dialecte BASIC limité que la TI-84 +, mais il y a quelques nouvelles fonctionnalités. L'un d'eux est le troisième argument de randIntNoRep.

lirtosiast
la source
1
Franchement, c'est assez stupide qu'ils n'aient pas inclus cette fonctionnalité depuis le début.
SuperJedi224
J'ai tout de suite pensé à TI-Basic quand j'ai vu ce défi :)
Timtech
5

MATL , 2 octets

Zr

Les entrées sont: d'abord R, puis N.

Essayez-le en ligne!

Explication

La fonction Zrprend deux entrées (implicitement dans ce cas) et effectue un échantillonnage aléatoire sans remplacement. La première entrée,, Rspécifie que la population est [1,2,...,R]; et la deuxième entrée,, Nindique le nombre d'échantillons à prélever dans la population.

Luis Mendo
la source
4

Pyth, 6 octets

<.SSQE

Essayez-le ici!

La plage vient sur la première ligne et la longueur sur la seconde.

Explication

<.SSQE # Q = plage, E = longueur

   SQ # génère la plage 1 ... Q
 .S # mélange la liste
<E # prendre les premiers éléments E

Version 5 octets non concurrente

Le dernier ajout à Pyth ajoute des Qs implicites à la fin du programme si nécessaire. Nous pouvons l'utiliser ici en inversant le format d'entrée, de sorte que la longueur vient en premier, puis la plage.

<.SSE

Essayez-le ici!

Voici Ela plage, avec laquelle nous transformons une liste basée sur 1 S, mélangez-la avec .Set prenez les premiers Qéléments avec <. <attend un entier qui est implicitement ajouté avec un Q.

Denker
la source
4

Reng V.2.1, 140 103 98 97 octets

Cela devrait également fonctionner dans les versions antérieures.

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

Vous pouvez l'essayer ici! L'entrée est maximum length, comme 10 3.

J'en suis tellement fier, tu ne sais même pas. Si quelqu'un me bat avec une réponse Java, cela fera ma journée. Si je bat une réponse Java, pensez aussi à ma journée.

Je l'expliquerai plus tard, une fois que je serai rétabli. Généralement, cependant:

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

Cela génère des nombres aléatoires. L'autre partie vérifie s'il y a des doublons et, s'il y en a, le processus est répété. Sinon, les résultats sont imprimés, avec des espaces joignant les résultats.

Voici quelques exemples:

long gif

Conor O'Brien
la source
3

CJam, 8 octets

{,:)mr<}

Essayez-le ici!

Il s'agit d'un bloc sans nom qui attend la plage en haut de la pile et la longueur en bas et laisse une liste sur la pile.

Explication

, plage basée sur e # 0
:) e # inkrement chaque élément de la liste de sorte que sa base 1
monsieur e # mélangez la liste
<e # prendre les n premiers éléments
Denker
la source
C'est un programme heureux :)
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Je serais plus heureux si CJam avait un builtin pour les gammes basées sur 1, donc je n'aurais pas besoin de ce smiley de merde: P
Denker
2

Lisp commun, 90

52 pour l'expression seulement

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

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

Comme pour les autres réponses, si je ne compte pas use-package et lambda , l'expression restante est (coerce(subseq(shuffle(iota R :start 1))0 N)'vector), pour 52 octets.

coredump
la source
2

Rubis, 27 23 octets

Fonction anonyme, raisonnablement courte et douce.

-4 octets de @manatwork

->n,r{[*1..r].sample n}
Encre de valeur
la source
->n,r{[*1..r].sample n}Veuillez utiliser le balisage de bloc de code au lieu du balisage de code en ligne, afin que des scripts comme le Pack d'amélioration du code utilisateur de Golf Golf puissent insérer la taille de code à côté.
manatwork
Très bien, c'est réparé maintenant.
Value Ink
2

𝔼𝕊𝕄𝕚𝕟, 10 caractères / 13 octets

Ѩŝ⩤⁽1í)ą-î

Try it here (Firefox only).

Explication

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

Bash + coreutils, 16

Je pense que cela va de soi:

seq $2|shuf -n$1

Entrez Net Rcomme paramètres de ligne de commande.

Ou comme le souligne @rici, pour le même score:

shuf -n$1 -i1-$2

Ideone.

Traumatisme numérique
la source
1
ou shuf -n$1 -i1-$2(même longueur, cependant).
rici
@rici très sympa. très propre :)
Digital Trauma
1

PowerShell v2 +, 30 octets

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

Prend des entrées $net $rconstruit une plage 1..$r, les dirige vers Get-Randomune -Cquantité de $n, qui sélectionnera $ndes éléments uniques de la plage. La sortie est laissée sur le pipeline sous la forme d'un tableau implicite.

AdmBorkBork
la source
1

Seriously, 5 bytes

,,R╨J

Try it online!

Explanation:

,,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
la source
1

Clojure, 38 bytes

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

An anonymous function taking N first and R second.

MattPutnam
la source
1

Perl 6, 32 bytes

{(^$^a).permutations.pick[^$^b]}
Ven
la source
1

Python 3.5 - 54 53 bytes:

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

This uses the random module's sample() function to return an array with length "a" consisting of random, unique elements in the range 1 => c.

R. Kap
la source
1

D, 29 bytes (expression only)

Assuming that std.random and std.range have been imported and that n and r are defined as variables, the program can be solved in the single expression:

iota(1,r).randomCover.take(n)
Ben Perlin
la source
1

ES6, 72

r=>n=>[...Array(-~r).keys()].sort(a=>new Date/a%1-.5).filter(a=>a&&n-->0)

Like in @Mwr247's answer, you can call it with F(R)(N), F being the function expression

C5H8NNaO4
la source
0

Mathcad, 67 "bytes"

creates a column vector of consecutive integers in range 1..R, joins it to a column vector of length R of (uniform) random numbers, sorts the resulting Rx2 matrix on the random number column, and then extracts the first n numbers from the randomized column of integers.

enter image description here

Stuart Bruff
la source
Is there a place we can test this?
Conor O'Brien
You can download trial versions of Mathcad 15 and Mathcad Prime 3.1 (the successor to Mathcad 15). Both trials run for 30 days, after which M15 stops working, but Prime 3.1 still runs, albeit with reduced functionality (eg, no programming - so the above won't work ... but the for loop can be rewritten to use range variables to create v outside of the augment statement)
Stuart Bruff
Trial versions are at: Matcad 15 - ptc.com/engineering-math-software/mathcad/free-trial ; Mathcad Prime 3.1 - ptc.com/engineering-math-software/mathcad/free-download
Stuart Bruff
And how do you count these bytes?
Rɪᴋᴇʀ
By looking at it from a user input perspective and equating one Mathcad input operation (keyboard usually, mouse-click on toolbar if no kbd shortcut) to a character and interpreting this as a byte. csort = 5 bytes as it's typed char-by-char as are other variable/function names. The for operator is a special construct that occupies 11 characters (including 3 blank "placeholders" and 3 spaces) but is entered by ctl-shft-#, hence = 1 byte (similar to tokens in some languages). Typing ' (quote)creates balanced parentheses (usually) so counts as 1 byte. Indexing v = 3 bytes (type v[k).
Stuart Bruff
0

Python, 56 (the obvious way)

lambda N,R:__import__('random').sample(range(1,R+1),k=N)
shooqie
la source
from random import*;lambda N,R:sample(range(1,R+1),k=N) is shorter by a byte
Mego
Huh, I did consider from random import*, must've screwed up the counting.
shooqie
0

Perl 5, 51 43 bytes

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

Pretty straightforward anonymous sub that generates an array from 1 to R and then splices N random elements from it to return. Call with ->(N, R).

Oleg V. Volkov
la source
0

TI-84 BASIC, 21 bytes

Prompt R,N:randIntNoRep(1,R→A:N→dim(ʟA:ʟA
SuperJedi224
la source
One can no longer use Ans as input as per a recent meta post.
Conor O'Brien
@CᴏɴᴏʀO'Bʀɪᴇɴ ...why not?
SuperJedi224
That was the consensus on meta. Vote on it if you disagree.
Conor O'Brien