Quel est le moyen le plus court de générer une chaîne aléatoire avec une longueur donnée et avec seulement des caractères alphanumériques autorisés?
- exemple d'une chaîne aléatoire: avec N = 9, la sortie serait
aZua7I0Lk
- on peut supposer que la longueur N donnée est toujours supérieure à 0
- si nécessaire, vous pouvez supposer 256 comme valeur maximale pour N, mais des solutions avec des limites plus élevées pour N et ayant toujours un temps de calcul rapide sont préférées
- caractères autorisés: 0-9, az et AZ
- un caractère peut apparaître plusieurs fois dans la chaîne de sortie
- chaque chaîne possible doit être également probable (à la précision du générateur de nombres aléatoires de votre langue)
Réponses:
Gelée , 4 octets
Essayez-le en ligne!
Explication
La puissance cartésienne génère essentiellement toute la liste d'une longueur donnée qui peut être formée à partir d'un ensemble donné d'éléments; c'est exactement ce dont nous avons besoin ici.
la source
Taxi , 2577 octets
Essayez-le en ligne!
Taxi est super pas fait pour cela , mais vous pouvez le faire! Je vais essayer d'expliquer ce qui se passe sous la version non-golfée.
Démarrer: obtenir stdin Récupérez
la valeur stdin sous forme de texte, convertissez-la en nombre et placez-la quelque part pour attendre.
Plan A Partie 1: Obtenez un entier aléatoire 1-62
Obtenez un entier aléatoire, puis obtenez
62
un nombre. Dupliquez à la fois l'entier aléatoire et le62
car nous en aurons besoin plus tard. Vous ne pouvez transporter 3 passagers à la fois si nous nous retrouvons avecrand
,rand
et62
. (L'autre62
attendra jusqu'à ce que nous revenions.) Allez diviserrand
par62
et tronquer le résultat pour obtenir un entier. Revenez en arrière pour obtenir l'autre copie de62
et multipliez-la par l'entier tronqué de la division. Enfin, soustrayez le produit de la première copie derand
. Cela nous donne un nombre 0-61. Maintenant, nous devons revenir à ramasser un1
et l'ajouter au résultat pour obtenir un numéro 1-62. Oui, toutes ces nombreuses lignes de texte sont justesmod(rand(),62)+1
.Plan A Partie 2: Créez un tableau de caractères parmi lesquels choisir
Pickup une chaîne avec tous les caractères valides et aussi un à la fin que nous ne voulons pas (plus à ce sujet plus tard). Le
63
nous avons ramassé plus tôt correspond à cette longueur de chaîne. Apportez-le à Chop Suey pour qu'il soit divisé en passagers individuels.Plan B: déplacez le tableau afin que nous puissions sélectionner un personnage
un par un, déplacez chaque personnage vers Narrow Path Park. C'est la seule pile disponible et la seule façon de ne pas avoir de passagers restants. Tout le reste à Townsburg est FIFO, donc je devrais revenir en arrière et effacer tous les passagers à chaque itération de la boucle globale. De cette façon, je peux simplement les laisser au parc et ils seront à chaque fois repoussés par les 63 nouveaux personnages. Le tout premier
A
ne risque jamais de s'échapper .Plan C: Préparez-vous à sélectionner un personnage
Ce ne sont vraiment que quelques arrêts qui n'avaient pas besoin d'être dans le plan D. Remettez le taxi en préparation.
Plan D: Obtenez tous les caractères dont nous ne voulons pas
En commençant par le premier caractère du "tableau" inversé (c'est le 63e caractère que nous ne voulons pas), continuez à ramasser et à concaténer les caractères pendant le décompte du résultat de la
mod
fonction dans le plan A. Une fois que vous avez atteint zéro, le caractère suivant est celui que vous voulez.Plan E: Noyez ceux que vous ne voulez pas et retournez celui que vous avez choisi.
"Les assaillants [P] déposés à Riverview Bridge semblent toujours tomber sur le côté et dans la rivière ..." Eh bien, cela élimine cette chaîne de perdants concaténés. Allez chercher le personnage suivant et envoyez-le à stdout. Enfin, vérifions le nombre de caractères que nous avons imprimés jusqu'à présent. Revenons à Sunny Skies pour récupérer la valeur stdin que nous avons laissée il y a si longtemps. Soustrayez un et, si le résultat est supérieur à zéro, renvoyez-le pour attendre et recommencer au plan A.
la source
code-bowling
et a été révisée à la baisse. Lacode-golf
réponse la plus longue que j'ai pu trouver est la soumission originale de Brain-Flak sur le défi de base de quine. Il vient à 9,5 * 10 ^ 580 octets. La réponse actuelle la plus longue que j'ai trouvée était un testeur principal en Unary : 1,65 * 10 ^ 56 octets.C (gcc) ,
575552 octetsMerci à 2501 pour les pointeurs ...
Essayez-le en ligne!
la source
rand()%74
devrait êtrerand()%75
&&putchar(i)
place de l'opérateur ternaire.Gelée , 5 octets
Manqué un tour - voir 4 octets de ais523
Essayez-le en ligne!
Comment?
la source
Shell + pwgen , 13 octets
Exemple de sortie
la source
Java 8,
1831499788 octetsEssayez-le en ligne.
-9 octets en portant la réponse C de @ 2501 , alors assurez-vous de lui aussi voter positivement!
Ancienne réponse, 97 octets
Essayez-le en ligne.
Explication:
la source
C, 60 octets
Voyez-le fonctionner ici .
Voir la distribution ici .
Il est uniformément distribué, en supposant qu'il
rand() % 62
produit une distribution uniforme. Étant donné que 62 ne divise généralement pas RAND_MAX également, il existe un très petit biais.la source
Bonhomme de neige , 58 octets
Essayez-le en ligne!
Il s'agit d'un sous-programme qui prend un entier en entrée et renvoie la chaîne aléatoire.
la source
((}#`""*:48vn58nR|65vn91nR,aC|97vn123nR,aCAsH1AaL#aC*;bR))
.PowerShell,
5854 octets-4 grâce à Andrei Odegov - transtypage en tableau char au lieu de boucler pour créer un tableau char.
génère une plage
1..2+4..5 = 1,2,4,5
de tous les codes de caractères acceptables, puis sélectionne le$args
nombre d'éléments de manière aléatoire en utilisantrandom -Count
- les éléments résultantssont boucléssont|%{}
et transformés en[char]
s,convertisen un tableau de caractères en utilisant[char[]]
- puis le tout est encapsulé entre crochets et-join
édité ensemble.Ne fonctionne pas pour une entrée de 0 car
Get-Random
accepte uniquement les nombres supérieurs à 1 pour le-Count
paramètre.la source
-join[char[]](65..90+97..122+48..57|random -C "$args")
PHP, 56 octets
Version en ligne
ctype_alnum
la source
05AB1E , 6 octets
Essayez-le en ligne!
Explication
la source
Perl 5 , 41 octets
40 octets de code +
-p
indicateur.Essayez-le en ligne!
(a..z,A..Z,0..9)
crée un tableau contenant toutes les lettres et tous les chiffres,[rand 62]
retourne un élément aléatoire de ce tableau, qui est append (.=
) à$\
, qui est implicitement imprimé à la fin grâce à-p
flag with}{
.Ou, pour le même octet, mais en utilisant les paramètres plutôt que l'entrée standard:
Essayez-le en ligne!
la source
R, 51 octets
Même longueur que l'autre réponse R, mais approche différente.
letters
et lesLETTERS
deux sont des variables intégrées contenant respectivement toutes les lettres minuscules et majuscules. Pour ajouter0:9
à cela, nous avons l'ensemble complet de caractères alphanumériques.la source
R,
54525149 octetsExplication:
scan()
c(65:90,97:122,48:57)
sample(c(65:90,97:122,48:57),scan(),T)
intToUtf8
la source
JavaScript (ES6),
6154395264 octetsC'est presque comme le golf inversé! Pris un grand coup sur le nombre d'octets garantissant que la gamme complète de caractères des trois groupes serait utilisée.
Essayez-le
la source
[0-5w-z]
exclusivement.btoa(String.fromCharCode(Math.random()*248))[0]
de couvrir l'ensemble de la gamme de manière uniforme.toString
puis encoder) afin de garantir qu'une gamme complète de caractères des 3 groupes puisse être retournée.014589ABEFIJMNQRUVYZcdghklopstwx
(et pas uniforme).Alice , 24 octets
Essayez-le en ligne!
Cette disposition est déjà bien meilleure que celle que j'avais à l'origine (32 octets), mais je suis sûr qu'elle n'est pas encore optimale ...
Explication
la source
Python + exrex , 81 octets
la source
Python 2,
798379 octets+4 octets (ne tenait pas compte de la répétition)
-4 octets (Merci à @Rod pour la suggestion d'utilisation
printable[:62]
)la source
(s.letters+s.digits)*x
places.letters+s.digits
`r.sample(...)`[2::5]
place''.join(r.sample(...))
pour enregistrer un octet (python 2 uniquement) et vous(s.letters+s.digits)*x
pouvez basculer surs.printable[:62]*x
pour enregistrer 4 octetsprintable
, je n'ai pas pu faire[2::5]
fonctionner (peut-être que je mer.sample()
de backticks``
quelques informations à ce sujetBrachylog , 14 octets
Essayez-le en ligne!
Explication
la source
MATL , 8 octets
Essayez-le en ligne!
la source
Lot, 175 octets
s
remplit une double fonction ici car il contient à la fois la liste alphanumérique et les caractères sélectionnés au hasard. Après avoir imprimé le résultat, le code passe au sous-programme dont le résultat est ignoré.la source
Pyke , 4 octets
Essayez-le en ligne!
la source
MemoryError
Pyth,
711 octetsEssayez-le en ligne
Explication
la source
C # - 121 octets
la source
APL (Dyalog) avec AGL , 17 octets
Essayez-le en ligne!
(
...)[
...]
index dans⎕A,∆a,⎕D
alphabet majuscule suivi de l'alphabet minuscule suivi des chiffresen utilisant
62
(le nombre de symboles possibles⍴
remodelé par⎕
entrée évaluée ( n )?
changer chaque 62 en un nombre aléatoire compris entre 1 et 62APL (APLX) , 17 octets
la source
Bash , 43 octets
Essayez-le en ligne!
la source
Pip , 13 octets
Essayez-le en ligne!
Explication
la source
Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 63 octets BASIC tokenisés
Il n'y a pas de caractères minuscules dans ZX81 sans utiliser d'assemblage ou avoir une sorte de ROM UDG ou quelque chose, et pour le moment, il ne sort que
A-Z
. Si zéro est entré, le programme s'arrête et revient en mode direct.la source
Japt ,
128 octetsEssayez-le
la source
Empilé , 33 octets
Essayez-le en ligne! Prend l'entrée du haut de la pile et laisse la sortie en haut de la pile.
la source