A propos de la série
Ceci est une entrée d'invité pour la série Random Golf of the Day.
Tout d'abord, vous pouvez traiter cela comme n'importe quel autre défi de golf et y répondre sans vous soucier de la série. Cependant, il existe un classement pour tous les défis. Vous pouvez trouver le classement avec quelques informations supplémentaires sur la série dans le premier post .
Contribution
Aucune entrée n'est prise.
Sortie
Une seule lettre de l'alphabet (cas non pertinent), avec un retour à la ligne facultatif. Chaque lettre doit avoir une probabilité d’être choisie non nulle et les 26 probabilités doivent être distinctes . Pour lever toute ambiguïté: Distinct signifie qu'il ne doit pas y avoir deux probabilités égales.
Notation
C'est du code golf. Le code le plus court en octets gagne.
Une entrée valide est un programme complet ou une fonction qui a une probabilité nulle de ne pas se terminer.
Alphabet
Pour éviter toute confusion, l'alphabet à utiliser est l'alphabet latin:
Soit
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ou
abcdefghijklmnopqrstuvwxyz
Vous pouvez choisir de produire des majuscules ou des minuscules. Vous pouvez également choisir de produire différents cas sur différentes exécutions, si cela vous aide. La probabilité pour une lettre donnée est la probabilité que cette lettre apparaisse dans les deux cas (supérieure ou inférieure).
Explication
Comme cela ne sera pas du tout évident à la sortie, veuillez inclure une explication claire de la manière dont vous avez réalisé les 26 probabilités distinctes.
Classement
(à partir d' ici )
Le premier article de la série génère également un classement général.
Pour vous assurer que vos réponses apparaissent, commencez chaque réponse par un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
(La langue n'est pas affichée pour le moment, mais l'extrait de code nécessite une analyse syntaxique. Il se peut que j'ajoute un classement par langue ultérieurement.)
A
plutôt que65
.Réponses:
Pyth, 5
Essayez-le ici
Calcule les préfixes de l'alphabet, donc:
["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]
. Ensuite, aplatit la liste et en sélectionne un élément aléatoire de manière uniforme. Cela signifie que, puisquea
26 fois apparaît, tandis queb
25 fois, jusqu'à unez
seule lettre, chaque lettre a une chance différente de paraître. La chaîne totale a 351 caractères.la source
MATL, 6 caractères
Explication:
Xr
Prendre un nombre aléatoire normalement distribué)
Utilisez ceci pour ...1Y2
The alphabetLa distribution est symétrique autour de 0 et la traduction du nombre en caractères est symétrique autour de 0.5. En tant que telles, les probabilités doivent être distinctes.
la source
05AB1E , 6 octets
Code
Explication
Nous avons maintenant la chaîne suivante:
Après cela, nous sélectionnons un élément aléatoire en utilisant
.R
.Les probabilités
Essayez-le en ligne! .
la source
Gelée , 5 octets
Essayez-le en ligne!
Comment ça fonctionne
Contexte
Soit L 0 ,…, L 25 dénote les lettres de l'alphabet dans leur ordre naturel, et S 0 ,…, S 25 une permutation de L uniformément choisie au hasard . Définissez la séquence finie M par M n = max (L n , S n ) .
Fixez n dans 0,… 25 et définissez k en tant qu'indice tel que L n = S k .
Avec la probabilité 1/26 , L n = S n et n = k , de sorte que M n = L n et L n occurrs une fois dans M .
Avec probabilité 25/26 , L n ≠ S n et n ≠ k . Dans ce cas, les événements suivants se produisent.
Avec la probabilité n / 25 , S n est l’un des L 0 ,…, L n - 1 , donc L n > S n et M n = L n .
Indépendamment, également avec la probabilité n / 25 , k est l'un de 0,… n - 1 , donc S k > L k et M k = S k = L n .
Ainsi, le nombre attendu d’occurrences de L n dans M est égal à 1/26 + 25/26 · (n / 25 + n / 25) = (2n + 1) / 26 .
Enfin, si nous sélectionnons maintenant un terme m de M uniformément au hasard, nous choisissons la lettre L n avec une probabilité (2n + 1) / 26/26 = (2n + 1) / 676 .
Cela donne la distribution suivante des probabilités.
Vous pouvez vérifier empiriquement la distribution en appelant le lien 100 000 fois (cela prend quelques secondes).
la source
MATL , 10 octets
Essayez-le en ligne!
Le code génère une variable aléatoire uniforme sur l'intervalle (0,1) (
r
) et calcule son carré (U
). Il en résulte une densité de probabilité décroissante non uniforme. Multiplier par 26 (26*
) garantit que le résultat est sur l'intervalle (0,26), et arrondir à la valeur inférieure (k
) produit les valeurs 0,1, ..., 25 avec des probabilités décroissantes. La valeur est utilisée comme index ()
) dans l'alphabet majuscule (1Y2
). Puisque MATL utilise l'indexation modulaire basée sur 1, 0 correspond à Z, 1 à A, 2 à B, etc.Pour illustrer le fait que les probabilités sont distinctes, voici un histogramme distinct résultant de 1 000 réalisations aléatoires. Le graphique est produit en exécutant ceci dans Matlab:
la source
k
! Remarqué que tout en essayant codegolf.stackexchange.com/a/89648/11159Java 7,
625756 octets5 octets grâce à Poke.
1 octet grâce à trichoplax.
Ideone ça!
Diagramme de fréquence (essais 1e6, facteur d'échelle 1/1000)
la source
sqrt(x*y*y) = sqrt(x)*y
Perl, 24 octets
-4 octets grâce à @Martin Ender
-1 octet grâce à @Dom Hastings
Besoins
-M5.010
ou-E
courir:L'exécution du code suivant affichera l'occurrence de chaque lettre:
Comment ça marche : je suppose que le code est assez explicite, mais quand même: il choisit un nombre aléatoire entre
0
etrand 26
. Il y a donc une probabilité beaucoup plus élevée que des nombres proches de0
(lettreA
) soient choisis.la source
say+(A..Z)[rand rand 26]
(A..Z)[...]
et cela n'a pas fonctionné, alors j'ai pensé que je pourrais utiliser un tableau anonyme comme ça, mais c'était juste à cause de lasay
.. merci! :)PHP,
44362927 octets44 barré est toujours régulier 44;
Merci à insertusernamehere, Petah et Crypto pour toute l'aide
Elle choisit un nombre aléatoire compris entre 0 et 675 (= 26 2 -1), prend sa racine carrée et la recouvre (la
chr
fonction convertit son argument en entier). Comme les carrés ont des intervalles différents entre eux, la probabilité que chaque nombre soit choisi est distincte. Chaque n est choisi avec une probabilité (2n + 1) / 676.Ajouter 65 à ce nombre vous donne un caractère aléatoire de
A
àZ
.Idée du code fonctionnant 1 000 000 fois
la source
range(A,Z)
.chr()
.<s> 44 </s>
<?=chr(65+sqrt(rand(0,675)));
R,
4027 octetsCela prendra un
1
nombre parmi les26
nombres générés avec une probabilité croissante versZ
, sans le remplacer, et affichera une lettre dont l’indice est ce nombre, dans la liste des lettres majusculesLETTERS
.Les arguments de la
sample
fonction sont:la source
> <> , 14 octets
> <> est un langage 2D toroïdal, et la partie des probabilités distinctes se produit naturellement en raison de la seule source d’aléatoire du langage. Essayez-le en ligne!
Les commandes pertinentes sont:
Ainsi, les probabilités de sortie sont:
la source
Python 2,
5857 octetsExplication: ceci génère un nombre aléatoire dans l’intervalle
[0, 676)
, prend la racine carrée, puis la recouvre. Ensuite, il ajoute 65 (la valeur ascii de "A"), le convertit en caractère et l’imprime.Cela donne à chaque nombre de 0 à 25 une probabilité distincte. Pour comprendre pourquoi, réfléchis comme ça. Combien de nombres, en ignorant les non-entiers, quand vous prenez la racine carrée et le plancher donnent 0? Un seul nombre sera (zéro). Cela signifie que zéro a une probabilité de
1/676
. Combien de nombres vont produire 1? 3 volonté, 1, 2 et 3. Cela signifie qu'on a une probabilité de3/676
. Un deux peut être produit avec un 4, 5, 6, 7 ou 8, ce qui lui donne une probabilité de 5, un trois a une probabilité de 7, etc. Et puisque la différence entre les carrés consécutifs augmente régulièrement de deux, cette tendance se poursuit pour chaque nombre croissant à 25 (Z).1 octet économisé grâce à une nonne qui fuit!
la source
chr(int(65+randint(676)**.5))
chr(int(65+random()**.5*26))
. C'est la même chose algébriquement parce que 26 == √676. et maintenant, l'ordre des opérations est de votre côté**2*26
pourrait être utilisé pour la distribution inverse.1/random()%26
devrait aussi fonctionner.PowerShell v2 +,
3331 octetsPrend une plage allant de
65
à90
(c.- à -d., ASCIIA
àZ
), le transfère via une boucle. A chaque itération, nous utilisons l'opérateur virgule pour créer un tableau de cet élément multiplié par ce nombre. Par exemple, cela fera 6565
s, 6666
s, 6767
s, etc. Ce grand tableau est acheminé versGet-Random
lequel un (élément uniformément PRNG) sélectionnera un élément. Puisqu'il existe différentes quantités de chaque élément, chaque personnage a un pourcentage légèrement différent de chances d'être choisi. Nous encapsulons ensuite cela par parens et le lançons commechar
. Cela reste sur le pipeline et la sortie est implicite.(Merci à @LeakyNun pour avoir joué au golf quelques octets avant même qu’il ait été posté.: D)
Les probabilités
(léger arrondi pour que je puisse démontrer l'
P
option de l'-f
opérateur ormat)la source
gal
sortie ([char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random
) a 50 caractères, puis 48, passe aux nombres et obtient 42, puis 31 et s’arrête là; regardé dans le classement pour voir où cela me mettrait. Ici. Caractère de caractère identique. Welp, je ne peux probablement pas battre ça.CJam,
211712 octetsMerci à Martin Ender de m'avoir sauvé 5 octets!
Nouvelle version
Cela forme un tableau de chaînes suivant le modèle
A
,AB
,ABC
et ainsi de suite. Il l'aplatit et choisit un caractère aléatoire. Comme cette chaîne contient 26 A, 25 B, 24 C, etc., chaque lettre a une probabilité distincte d'être choisie.Essayez-le en ligne!
Explication
Ancienne version
Obtient des probabilités distinctes en créant une chaîne dans laquelle chaque lettre apparaît un nombre de fois égal à sa position dans l'alphabet.
la source
R, 23 octets
Juste "échantillons" une lettre d'un incorporé. le
1:26
est un vecteur de poids donnant à chaque lettre une probabilité différente.la source
1:26
est un vecteur de poids pour chaque lettreC, 35 octets
Ce programme suppose
RAND_MAX
est (2 ^ 32/2) - 1 comme il est sur gcc par défaut. Compilez avec le-lm
drapeau pour lier lasqrt
fonction. La sortie est écrite sur stdout en majuscules sans fin de nouvelle ligne.Facultativement, si
RAND_MAX
est (2 ^ 16/2) - 1, une version plus courte de 32 octets peut être utilisée:Juste pour le plaisir, j’ai aussi créé une version qui n’utilise pas la
sqrt
fonction et ne nécessite pas la bibliothèque mathématique incluse (celle-ci doit avoir leRAND_MAX
format (2 ^ 32/2) - 1), mais elle a fini par être plus longue même si j’ai pensé que c’était plutôt cool:Explication
[Premier programme]
Pour les deux premiers utilisateurs
sqrt
, la fonction mappe simplement la plage[0, RAND_MAX)
à[0, 25]
travers la division, puis ajoute 65 (ASCIIA
) à la valeur pour la déplacer dans l'alphabet ASCII avant de la générer.[Deuxième programme]
Le deuxième programme est un peu plus complexe car il fait une stratégie similaire, mais sans l'
sqrt
opérateur. Etant donné que les bits d'exposant d'une virgule flottante sont automatiquement calculés lors de l'attribution d'un entier, ils peuvent en fait être utilisés comme moyen grossier d'obtenir le logarithme en base 2 d'un nombre.Puisque nous voulons seulement que la plage jusqu’à
RAND_MAX
atteindre une valeur d’exposant codée de 25, le calcul (2 ^ 32/2 - 1) / (2 ^ 25) nous en donne à peu près 64, qui est utilisé lors de la division derand
pour le mapper. à cette nouvelle gamme. J'ai également ajouté 1 à la valeur car la représentation en virgule flottante de 0 est plutôt étrange et casserait cet algorithme.Ensuite, le float est typé en un entier pour permettre le transfert de bits et autres opérations du même genre. Etant donné que dans les nombres à virgule flottante IEEE 754, les bits d'exposant sont les bits 30 à 23, le nombre est alors décalé de 23 bits vers la droite, ce qui élimine la mantisse et permet la lecture de la valeur de l'exposant brut en tant qu'entier. Notez que le bit de signe est également au-delà des bits d'exposant, mais comme il n'y a jamais de négatif, il n'est pas nécessaire de le masquer.
Plutôt que d’ajouter 65 à ce résultat comme auparavant, les exposants à virgule flottante sont représentés par un entier non signé de 8 bits compris entre 0 et 255, où la valeur de l’exposant égale à 0 est 127 (il suffit de soustraire 127 pour obtenir la valeur réelle de l’exposant "signé"). ). Étant donné que 127 - 65 correspond à 62, nous soustrayons simplement 62 pour le décaler en dehors de cette plage d’exposants en virgule flottante et dans la plage d’alphabets ASCII en une seule opération.
Distribution
Je ne suis pas un expert en mathématiques, je ne peux donc pas affirmer avec certitude la formule exacte de ces distributions, mais je peux (et ai fait) tester toutes les valeurs de la plage
[0, RAND_MAX)
pour montrer que la distance entre le point où commence la plage d'une lettre et l'autre commence n'est jamais la même. même. (Notez que ces tests supposent le maximum aléatoire (2 ^ 32/2) - 1))[Premier programme]
[Deuxième programme]
la source
char
est un type entier en C, cela devrait être acceptable.Python 2, 72 octets
Multiplie le caractère par sa valeur ascii, puis choisit un caractère au hasard dans la chaîne résultante.
Voici les probabilités pour chaque lettre sélectionnée, en pourcentages:
Essayez-le: https://repl.it/Cm0x
la source
Gelée , 5 octets
(Score égal, mais méthode différente , par rapport à une solution Jelly existante de Dennis.)
La probabilité de donner chaque lettre est son index basé sur 1 dans l'alphabet divisé par 351 - le 26ème nombre triangulaire:
A
) = 1/351, P (B
) = 2/351, ..., P (Z
) = 26/351.Depuis 1 + 2 + ... + 26 = 351, P (lettre) = 1.
La mise en oeuvre:
Testez-le sur TryItOnline ou obtenez la distribution de 100 000 exécutions (crédit de code à Dennis)
la source
q, 38 octets
Pas particulièrement court mais ...
La fonction de distribution cumulative discrète est la séquence
0.9 ^ 26, 0.9 ^ 25, ..., 0.9 ^ 0
Et nous ne faisons qu'échantillonner à partir de la distribution.
la source
JavaScript (ES6), 45 octets
Obtient une distribution non uniforme en quadrillant la valeur aléatoire.
Math.random()
renvoie un float de la plage de[0,1)
sorte que le résultat de la quadrature tend vers0
(oua
).Tester
Afficher l'extrait de code
la source
(n=Math.random(),10+26*n+n|0).toString(36)
Oracle SQL 11.2, 212 octets
Utilisation de la position du caractère dans l'alphabet comme probabilité
Non-golfé
la source
TI-Basic, 39 octets
rand
génère une valeur uniforme dans (0,1], ce qui donne à 26 ^ Rand une probabilité différente d'être égale aux nombres entiers compris entre 1 et 26.Ancienne version, 45 octets
La précision limitée des entiers TI-Basic limite les distributions normales à générer des nombres compris dans µ ± 7.02σ (voir
randNorm(
). Nous obtenons donc la valeur absolue d'un nombre aléatoire avec µ 0 et σ 1, en multipliant par quatre pour augmenter la plage pratique mentionnée précédemment à µ ± 28.08σ. Ensuite, nous calculons la valeur et ajoutons 1, carsub(
est indexé sur 1, ce qui nous donne une plage allant de 1 à 29 avec des probabilités différentes pour chacune.la source
PHP,
9284 octetsConstruit une chaîne de toutes les lettres, répète le nombre de fois que nous sommes dans la boucle, puis sélectionne une lettre de cette chaîne de manière aléatoire. En conséquence, les lettres plus tard dans l'alphabet ont une probabilité plus élevée
Merci à insertusernamehere pour avoir réduit les octets
Probabilités de résultat (classées par%)
la source
$x=0
ce qui est évidemment nécessaire. Voici une version de 84 octets :for($i=65,$x=0;$i<91;$a.=str_repeat(chr($i++),$x))$x++;echo substr($a,rand(0,$x),1);
Avez-vous déjà réussi à obtenir une valeur plus grande queG
lorsque vous exécutez votre code? Quoi qu'il en soit, vous pouvez toujours ignorer lenotice
s lorsque vous jouez au golf.strlen
of$a
est 351, mais vous ne choisissez qu'un caractère aléatoire parmi les$x
26 premiers . Vous pouvez le fixer et de garder vos probabilités d'un changement de la finale$x
à350
de 1 octet. Voici une version de 77 octets qui résout le problème mais rapproche également les probabilités:for($i=65;$i<91;$a.=str_repeat(chr($i),$i++));echo substr($a,rand(0,2014),1);
Befunge,
168164 octetsPlus compact que le premier, avec des probabilités un peu différentes: les premiers
?
ont 1/4 de chance d’imprimer un A au premier essai, 2/4 de chance de revenir au même?
, et 1/4 de passer au suivant. Les autres?
ont chacun 1/4 de chances d'imprimer la lettre en dessous, 1/4 pour réessayer, 1/4 pour passer à la lettre suivante, 1/4 pour passer à la précédente. Encore une fois, la probabilité d'imprimer un A est beaucoup plus élevée que d'imprimer un Z.Befunge, 186 octets
Évidemment, je ne gagnerai pas avec ça, mais je pense que c'est quand même une réponse intéressante :)
v
et>
dirige le curseur respectivement vers le bas et vers la droite. L'?
opérateur envoie le curseur dans l'une des quatre directions au hasard. Le premier?
est "bloqué" parv
et>
dans les deux sens. Il ne peut donc y avoir que deux solutions: soit imprimer le A, soit descendre au suivant?
. Donc, à partir du premier?
seul, il y a 50% de chances d'imprimer un A.La suivante
?
a 1/3 de chance d’imprimer un B, 1/3 de remonter et 1/3 de descendre. Etc.Il devrait être évident que les lettres les plus hautes ont beaucoup plus de chances d'être imprimées que les lettres les plus basses, mais je ne sais pas exactement quelles sont les chances de chaque lettre.
Un peu d'aide avec le calcul exact serait apprécié :)
Au moins il y a un 1/2 * 1/3 de 25 ^ chance que le curseur se déplace tout le chemin jusqu'à Z sur le premier essai, mais je ne suis pas certain comment les chances du curseur se déplaçant vers le haut et vers le bas affecte chaque lettre.
,@
imprime et quitte.la source
J,
2018 octetsInterprète en ligne
Majuscule.
La probabilité de chaque lettre est son index basé sur 1 dans l'alphabet.
la source
zsh, 63 octets
cela fonctionne en créant cette chaîne:
aka 65 fois A, 66 fois B, 67 fois C ...
et puis il choisit un caractère aléatoire
la source
A
en ascii. vous pouvez commencer à partir de 1, mais alors la boucle interne devient{65..$[#i]}
ce qui est 1 caractère plus longCJam, 11 octets
ou
Essayez-le en ligne!
Cette solution est similaire à l'idée de Luis et crée une distribution non uniforme en prenant la racine carrée de la variable aléatoire.
la source
Lot, 116 octets
Fonctionne en choisissant la plus grande ou la plus petite (j'oublie laquelle) de deux variables aléatoires.
la source
Matlab, 22 ans
Reviendra souvent les premières lettres, mais peut théoriquement toutes les toucher!
Prend une divisée par un nombre aléatoire, limite celle-ci à 26 et la transforme en personnage.
Pas très court bien sûr, mais le concept peut peut-être inspirer d'autres réponses.
la source
rand
une valeur dans [0, 1)? C'est-à-dire incluant zéro mais pas un. Si cela aboutit parfois à 1/0,min(1/0,26)
retournera- t-il toujours 26 ou une erreur?rand
renvoie une valeur dans (0,1), il ne devrait donc pas y avoir de problèmerand
retour 0 en pratique,min(1/0,26)
retourne le 26.CJam, 10 octets
Approche CJam # 3 ...
Essayez-le en ligne!
Cela crée un nombre uniformément aléatoire
x
entre 1 et 26 et l’utilise ensuite pour créer un nombre uniformément aléatoire entre0
etx-1
qui est ajoutéA
. Cela polarise les résultats vers des personnages plus petits.la source
Labyrinthe , 19 octets
Essayez-le en ligne!
Il s’agit d’une boucle qui, à chaque itération, a) incrémente un compteur qui commence à zéro ou b) se termine, les deux avec une probabilité de 50%. À la fin de la boucle, le compteur est pris modulo 26 et ajouté à 65 pour donner une lettre entre
A
etZ
.Cela donne une probabilité d'
A
un peu plus de 50%, d'B
un peu plus de 25% et ainsi de suite jusqu'àZ
un peu plus de 1/2 26 . En théorie, il y a une possibilité que cela dure éternellement, mais cet événement a une probabilité égale à zéro, comme l'exige le défi (en pratique, ce n'est probablement pas possible de toute façon, car le PRNG renverra les deux résultats possibles à un moment donné de sa période).la source