Une société de loterie souhaite générer un numéro de ticket de loterie aléatoire de 10 caractères.
Écrivez un code dans n'importe quelle langue pour créer un tel nombre dans lequel chaque chiffre ne vient qu'une fois par exemple 9354716208
dans ce nombre tous les entiers de 0 à 9 ne viennent qu'une seule fois. Ce nombre doit être un nombre aléatoire.
- Le numéro généré doit être affiché à l'écran.
- Il doit être capable de générer toutes les permutations de tous les caractères autorisés.
- Le code doit être aussi petit que possible (en octets).
Réponses:
J (4 octets)
Je n'ai pas pu résister.
En J, si
F
est dyadique,F~ x
est le même quex F x
.la source
[0..10)
, ce qui signifie essentiellement une permutation aléatoire de «0123456789».J, 5 caractères et APL, 8 caractères
J
J a l'opérateur de transaction intégré (
?
). Ainsi, nous pouvons prendre 10 sur 10 (10?10
).APL
APL a le même opérateur qui commence malheureusement par un au lieu de zéro. Nous soustrayons donc un de chaque nombre (
1-⍨X
moyennesX-1
dues à l'opérateur de navette).la source
10#.
⎕IO←0
vous n'avez donc pas à en soustraire un. De plus, pour J et APL, vous pouvez utiliser commute pour enregistrer un octet avec?~10
et?⍨10
puisque l'application monadique de la fonction dérivée utilise également son argument droit comme argument gauche. Notez cependant que cela rend le code J identique à celui de Marinus .Python 2.7 (
646357)Pas une chance ici par rapport aux langages lourds de l'opérateur et en raison de l'absence de chargement aléatoire par défaut :) C'est le plus court que j'ai pu trouver;
Il crée une plage et en échantillonne 10 numéros sans remplacement.
(Merci à @xfix pour le correctif de format d'importation plus court et à @blkknght pour avoir souligné ma plage d'échantillonnage un peu compliquée)
Python 2.7 (40)
Si vous l'exécutez à partir de l'invite interactive et pouvez lire les virgules séparées, vous pouvez le raser à 40, mais cela ressemble un peu à briser l'esprit des règles;
la source
from random import*
pour enregistrer un caractère. Cela ressemble à ma solution Perl 6, mais plus verbeuse, mais c'est génial de voir que quelque chose comme ça peut fonctionner en Python, même si plus verbeux."0123456789"
plutôt qu'en utilisantrange
et en les mappantstr
.PHP, 29 caractères
<?=str_shuffle('0123456789');
Avec PHP, la balise de fermeture n'est pas requise. Mais si c'est contraire aux règles, vous pouvez remplacer; avec?> pour 1 augmentation nette.
la source
Rubis, 18
Exécutez ceci dans
irb
:Si vous voulez que ce soit un programme autonome, avec une sortie vers
stdout
(les règles ne semblent pas l' exiger ), ajoutez ces 4 caractères au début:la source
(0..9).to_a
à[*0..9]
.[*0..9].shuffle
en premier lieu?PHP - 37 caractères
J'avais une solution à 18 caractères qui devrait théoriquement fonctionner mais PHP est bizarre.
Ou, si vous voulez une réponse xkcd:
EDIT: Merci xfix, il est maintenant 5 caractères plus court et complet. MODIFIER ENCORE: Exemple en direct .
la source
echo
n'a pas besoin de parens, et s'ilecho
s'agit de la première instruction du programme, vous pouvez la remplacer<?php echo
par<?=
. Est égalementjoin
un alias pourimplode
.<?=
et?>
. C'est du code PHP valide sans ceux-ci.echo
est de la même longueur<?=
et?>
combinée, et sans ceux-ci, cela ne fonctionne pas dans Codepad. Merci quand même. : PPerl 6 (
1816 caractères)Cela génère un tableau contenant tous les éléments aléatoires (
pick *
) de0
vers9
et génère le résultat (print
).Exemple de sortie:
la source
pick
.[~]
(qui est analysé en tant que listop, selon la grammaire de Perl 6) nécessite un espace (ou paren) après s'il contient des arguments. Sinon, le compilateur Perl 6 se plaint de "deux termes consécutifs". Il n'était pas nécessaire dans les anciennes versions de Perl 6, mais c'est le passé. Le Perl 6 est toujours en cours d'élaboration.print
au lieu desay [~]
et enregistrez 2 caractères :)GolfScript, 12 caractères
Génère simplement la liste des chiffres (
10,
) et la trie{...}$
selon certaines clés aléatoires - ce qui donne un ordre aléatoire des chiffres.Exemples (essayez en ligne ):
la source
9rand
par99rand
corrigerait (principalement) cela;9.?rand
serait pratiquement parfait .R (23 caractères)
Exemple de sortie:
la source
TI-BASIC, 5 octets
la source
randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans
.Octave (14)
randperm
crée malheureusement une sélection de 1..n, il faut donc soustraire 1 à la fin pour obtenir 0-9.la source
Dans le serveur SQL
Voir la démo
OU quelque chose de similaire (gracieuseté de @manatwork) en utilisant récursivité et xml.
la source
select i+0from(select 0i union select 1union select 2union select 3union select 4union select 5union select 6union select 7union select 8union select 9)f order by newid()for xml path('')
. (BTW, super truc quinewid()
.)with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')
.(VALUES (1),(2),...)
Javascript (
797868 caractères)Plutôt que de créer un tableau avec les nombres 0-9 et de le trier, j'ai décidé de générer des nombres aléatoires. Quand il est venu avec un nombre qui n'était pas déjà dans le tableau, il l'a ajouté. Cela se répète dix fois, puis alerte la sortie.
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
la source
||
évaluation des courts-circuits au lieu deif
:for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Mathematica, 27
la source
Coquille / Coreutils, 23
la source
shuf -i0-9|tr -d \\n
shuf -zi0-9
JavaScript, 82 caractères
EDIT: Grâce à Rob W , la longueur du code est réduite à 90 caractères.
EDIT: Merci à George Reith , la longueur du code est réduite à 82 caractères (en utilisant pour la boucle).
Méthode assez simple: choisissez un élément aléatoire du
[0,1,2,3,4,5,6,7,8,9]
tableau et ajoutez-le à la sortie, puis réduisez le tableau et relisez.Ancienne version (106 caractères):
Version lisible:
Meilleure version (90 caractères):
Dernière version (82 caractères):
JSFiddle: http://jsfiddle.net/gthacoder/qH3t9/ .
la source
a='0123456789'.split(t=''),l=10;while(l--)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t)
. Grands épargnants:Math.random(x)
===0|x
. Remplacez les accolades et les points-virgules par des virgules. Utilisez directement le résultat d'une affectation comme valeur, au lieu d'utiliser une variable intermédiaire. Enfin, initialisez le tableau initial à l'aide de.split(r='')
. Cela est plus court que la création d'un tableau à l'aide de littéraux de tableau et l'affectation de la valeur de chaîne dans une expression distincte.Math.floor(x) === 0|x
.l=11
et basculer votre condition de boucle while surwhile(--l)
a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)
- Votre code s'intègre parfaitement dans les arguments d'initialisation, de condition et d'expression des boucles for. Lar
variable est redondante.C #, 145 octets
Non golfé
Golfé
la source
Enumerable.Range(0,10)
et vous n'avez pas besoin des accolades dans laforeach
boucle.JavaScript (80 caractères)
JS-Fiddle: http://jsfiddle.net/IQAndreas/3rmza/
la source
alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
return
et.5
K / Kona (6)
Comme avec J,
?
est l'opérateur de transaction; la-
force les valeurs à ne pas se répéter.la source
Mathematica 40
Le nombre est créé sous forme de chaîne de manière à permettre d'afficher zéro en tant que premier caractère, si nécessaire.
Exemples de sortie
Explication
"0"~CharacterRange~"9"
est la notation infixe pour `CharacterRange [" 0 "," 9 "]". L'une ou l'autre renvoie la liste, {"0", "1", "2", "3", "4", "5", " 6 "," 7 "," 8 "," 9 "}.RandomSample[list]
renvoie par défaut une permutation de la liste. (Il peut également être utilisé pour d'autres types d'échantillonnage, lorsque des paramètres sont inclus. Par exemple,RandomSample[list, 4]
il renverra un échantillon aléatoire de 4 caractères, sans répétition.la source
Scala, 37
la source
Forth, 72
Peut-être encore au golf, mais Forth a rendu celui-ci difficile. Je pense.
la source
Prolog, 177/302 caractères
Je suis un débutant sur Prolog, donc ce n'est probablement pas le code le plus condensé.
Retour:
Si vous voulez qu'il renvoie un entier:
Retour:
Utiliser à la place:
Donne les nombres dans l'ordre inverse:
Contrairement à certains autres codes publiés, cela renvoie toutes les possibilités (sans répétitions).
la source
q / kdb [6 caractères]
générera 10 nombres aléatoires uniques.
la source
√ å ı ¥ ® Ï Ø ¿ , 4 octets
la source
Clojure, 42
la source
Javascript, 83 caractères
Pendant l'exécution jusqu'à ce que le tableau comporte 10 éléments.
Générez un nombre aléatoire de 0 à 9, puis vérifiez si le tableau! Inclut ce nombre et ajoutez-le au tableau.
la source
Ce n'est pas beaucoup plus petit que la réponse de JMK, mais voici une solution C # légèrement plus petite (135):
Compacté (134):
Version alternative (135):
Compacté:
Ils sont de longueur égale, mais cela dépend vraiment de si vous souhaitez utiliser la fonction ForEach de Linq ou la fonction Join de String. J'ai pu supprimer 10 caractères en épelant la plage "0123456789" dans une chaîne au lieu d'utiliser Enumerable.Range (0, 10).
la source
LOGO , 64 caractères
pick renvoie un élément aléatoire de la liste fournie. butmember renvoie une liste avec toutes les occurrences de l'élément spécifié supprimées. Remarque: toutes les implémentations de logo ne prennent pas en charge la
butmember
commande.la source
Raquette
4543la source