Étant donné une chaîne d'entrée S
, print S
suivi d'un séparateur non vide de la manière suivante:
Étape 1:
S
a une1/2
chance d'être imprimé et une1/2
chance pour que le programme se termine.Étape 2:
S
a une2/3
chance d'être imprimé et une1/3
chance pour que le programme se termine.Étape 3:
S
a une3/4
chance d'être imprimé et une1/4
chance pour que le programme se termine.…
Étape
n
:S
a unen/(n+1)
chance d'être imprimé et une1/(n+1)
chance pour que le programme se termine.
Remarques
La chaîne d'entrée ne comprendra que des caractères acceptables dans le type de chaîne de votre langue.
Tout séparateur non vide peut être utilisé, à condition qu'il soit toujours identique. Le séparateur devrait être imprimé après la dernière impression
S
avant la fin du programme.Le programme a une
1/2
chance de se terminer avant d’imprimer quoi que ce soit.Une nouvelle ligne est acceptable.
Votre réponse doit véritablement tenter de respecter les probabilités décrites. Évidemment, quand
n
est grand ce sera de moins en moins vrai. Une explication appropriée de la manière dont les probabilités sont calculées dans votre réponse (et de la raison pour laquelle elles respectent les spécifications, abstraction faite des problèmes de pseudo-aléatoire et des grands nombres) est suffisante.
Notation
C'est du code-golf , donc la réponse la plus courte en octets est gagnante.
Réponses:
Pyth , 7 octets
Essayez-le en ligne!
Comment ça marche
Pseudocode:
la source
C #,
9485 octetsMa première réponse!
Tentative précédente (j'ai aimé ça
goto
):Ungolfed:
Remarque: en C #, la
Random.Next(N)
méthode retourne un entier non négatif dans la plage [0, N-1], nous pouvons donc simplement vérifier que le nombre renvoyé est supérieur à 0.la source
using System;
dans votre nombre d'octets. Vous pouvez déclarer enr
ligne, pas besoin de le mettre à une variable:new Random().Next(i++)
. Vous n'avez pas besoin du point-virgule suivant sur la fonction golfée.new Random().Next(i++)
mais quand j'ai essayé d'exécuter cela, le résultat était toujours soit le programme s'arrête sans rien imprimer, soit le programme ne s'arrête jamais. Lorsque je déclarer=new Random()
et utilise lar
variable, le programme s’arrête de manière plus aléatoire à la demande de l’opérateur.R,
474643 octets43 octets dus à Robin Ryder dans les commentaires.
Essayez-le en ligne!
Explication
la source
function(s)
est plus court ques=scan(,'');
pryr::f(while(runif(1)<T/(T<-T+1))print(s))
est encore plus court.T
etF
avec des fonctions anonymes, car cela modifie une variable globale et signifie que la fonction ne peut être appelée qu'une seule fois. Voir ici : "la fonction de solution fonctionne de manière cohérente quel que soit le nombre de fois où elle a été appelée auparavant".05AB1E , 8 octets
Essayez-le en ligne!
Explication
la source
Javascript,
605854 octetsSera la chaîne de sortie
s
. Le séparateur qui est imprimé si le programme se termine estNaN
ou0
.Math.random()
renvoie une valeur comprise entre 0 et 1. Si cette valeur est inférieure àn/(n+1)
, elles
sera utilisée.4 octets sauvegardés grâce à @Neil
la source
n/++n
?alert
au lieu deconsole.log
sauvegarder 6 octets. L'extrait de code pourrait être configuré de manièrealert = console.log
à afficher une sortie non gênante si vous le souhaitez (si autorisé - ne permet pas de sauvegarder des octets, vous aide simplement à garder un mot sain d'esprit)Java 8,
726261 octets-10 octets grâce à @cliffroot .
-1 octet grâce à @JollyJoker .
Le délimiteur est une nouvelle ligne.
Explication:
Essayez ici.
la source
if
état dans lefor
bloc d'état?for
boucle.for
boucle devrait se terminer de sorte qu'elle n'ait pas besoin d'être explicitereturn
. La deuxième expression à l'intérieur de la déclaration.int n=2
et1f/n++
travaille?Mathematica, 43 octets
JungHwan Min a économisé 1 octet (ci-dessus) et suggéré quelque chose de mieux (ci-dessous)
Mathematica, 37 octets
la source
RandomInteger@n!=0
est le même queRandomInteger@n<1
dans ce cas, etn++
peut être fusionné avecRandomInteger@n
. En outre, ilFor
est (presque toujours) plus court queWhile
: -5 octetsFor[n=1,RandomInteger@n++>0,Print@#]&
For[n=1,!n∣Hash[# n++],Print@#]&
fonctionnerait également à 34 octets, en supposant que le hachage est assez aléatoire. Le caractère aléatoire dépend de l'entrée, cependant. Par exemple, essayez% /@ Alphabet[]
Clojure,
6156 octetsOh pourquoi je ne suis pas allé avec un
for
en premier lieu? Mais en réalité, être pédantdoseq
doit être utilisé tel qu’ilfor
est évalué paresseusement.Original:
la source
(>(+(rand-int n)2)0)
toujours vrai?n
!> <> ,
124112 octetsEssayez-le en ligne! (Vous pouvez également le regarder sur le terrain de jeu du poisson , mais à cause de certains bugs, vous devez ajouter un
}
aprèsl
la quatrième ligne et ajouter un tas de nouvelles lignes après le code pour que cela fonctionne correctement.)Le hasard est délicat dans> <>. La seule instruction aléatoire est de
x
choisir la direction du poisson parmi quatre choix (gauche, droite, haut et bas), de sorte que le transformer en quelque chose avec une probabilité de 1 / n n'est pas simple.Ce code utilise les fonctionnalités de modification automatique de> <> pour créer une Tower of Randomness sous le code. Ainsi, à la quatrième étape, par exemple, le code ressemble à ceci:
Le poisson commence au bas de la tour. À chaque niveau de la tour, le
x
est coincé entre deux miroirs, ainsi le poisson ne peut s'échapper qu'en allant à gauche ou à droite. Chacune de ces directions envoie le poisson au niveau supérieur de la tour, mais aller à gauche pousse également un0
vers la pile. Au moment où le poisson arrive au sommet de la tour, la pile contient un certain nombre de0
s et ce nombre suit une distribution binomiale avec n essais et p = 1/2.Si la longueur de la pile est égale à 0 (avec une probabilité de 1/2 n ), le programme s’arrête. Si la longueur est 1 (avec une probabilité n / 2 n ), le poisson imprime l'entrée et une nouvelle ligne et construit un autre niveau de la tour. Si la longueur est différente, le poisson jette la pile et retourne au bas de la tour. En fait, sur les possibilités qui font réellement quelque chose, n d’entre eux impriment la chaîne de saisie et l’un d’eux arrête le programme, en donnant les probabilités requises.
la source
Python 3 ,
726966 octetsEssayez-le en ligne!
la source
random()<1/i
.randint
est inclusif. Vous pouvez ensuite raccourcir cette ligne pour:while randint(0,i):print(s);i+=1
QBIC ,
1917 octetsChute
=1
, changement de condition, sauvegarde de 2 octetsExplication
la source
Braingolf , 23 octets
Essayez-le en ligne!
Génère un nombre aléatoire
x
où0 <= x < n+1
, se termine six
vaut 0, sinon incrémenten
et boucle. Le séparateur est|
Explication:
la source
Alice , 18 octets
Essayez-le en ligne!
Explication
la source
PHP , 31 octets
Essayez-le en ligne!
la source
Perl, 26 octets
Code de 24 octets + 2 pour
-nl
.Essayez-le en ligne!
la source
Charbon de bois , 14 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Utilise
_
comme séparateur. Remarque: la mise en cache de la sortie est désactivée, veuillez donc ne pas écraser le serveur de Dennis!la source
MATL , 9 octets
Essayez-le en ligne!
Explication
la source
Perl 6 ,
50 41 38 3626 octetsL'essayer
L'essayer
L'essayer
L'essayer
(avec
-n
argument en ligne de commande)L'essayer
la source
Python 3 , 55 octets
Explication
Pour éviter d'avoir à importer de manière aléatoire, j'ai exploité le fait que le hachage intégré est créé de manière aléatoire à chaque fois qu'un processus python est lancé (du moins sous MacOS). Chaque hachage du dernier doit générer une série d’entiers pseudo-aléatoires.
Si le hachage est suffisamment pseudo-aléatoire, le modulo avec
i
vaut zéro avec probabilité1/i
.Remarques
Je suis un peu gêné par le hachage redondant, mais sans affectation temporaire ou in-condition en Python, je suis un peu coincé.
la source
I'm a little bothered...
récursion?C #
C'est la même longueur que la réponse C # en haut, mais:
Je voulais juste souligner que certains calculs peuvent produire la probabilité correcte.
Est équivalent à
Et la fonction f (x) = 1 / x-1 est:
f (1) = 0
f (1/2) = 1
f (1/3) = 2
f (1/4) = 3
Donc, une chance sur deux d'être arrondie à 0, une chance sur six d'être arrondie à un, et 1 / (n + 1) (n + 2) une chance d'être arrondie à n.
Peut-être qu'une autre langue pourrait en tirer parti.
EDIT: Correction de mon erreur
J'ai pensé à quelque chose pour le rendre plus petit.
EDIT EDIT: Je me trompe de toutes sortes. Sortir le Random de la boucle, car s'il est évalué plusieurs fois, cela ne fonctionnera pas.
EDIT EDIT EDIT: Je me suis débarrassé de la variable i. Je vais arrêter d'essayer de le réduire maintenant. Non, a menti. Je me suis débarrassé d'un autre octet.
la source
Charbon de bois , 17 octets
Essayez-le en ligne! Code verbeux inclus. Respecte les spécifications car il utilise une plage aléatoire allant de
0
àn
.la source
C, 41 octets
Assume
rand
est ensemencée. Essayez-le en ligne!la source
rand
est ensemencé." - Est-ce une hypothèse valable à faire?rand
Le standard exige que la valeur de départ soit fixée à 1 par défaut et que toutes les implémentations que je connaisse le fassent exactement. Si cette fonction ne fait que ce que le défi demande lorsqu'il est combiné avec un autre code, je pense que cet autre code doit être inclus dans la réponse et dans le nombre d'octets.braingasm , 22 octets
edit: Même nombre d'octets, mais j'ai réalisé que je pouvais me glisser dans la nouvelle
L
fonctionnalité imit tape .Utilise
0
comme séparateur. Fonctionne comme ceci:la source
Python , 54 octets
Essayez-le en ligne!
Généré le nombre de copies comme
floor(1/p)-1
avecp
uniformément choisi de l'intervalle d'unité. Le nombre de copies est compris entren
quand et ce qui arrive quand . Cela se produit avec une probabilité ou . C'est la probabilité souhaitée de sortie des copies: prob de 0, prob de 1, prob de 2, ...1/p-1
n
n+1
1/(n+2) < p < 1/(n+1)
1/(n+1)-1/(n+2)
1/((n+1)*(n+2)
n
1/2
1/6
1/12
la source
form random import*
en bas?f=
et en ne le plaçant pas dans l'en-tête TIOC ++,
979657 octetsVoici mon premier essai sur codegolf :)
J'ai sauvegardé un octet en utilisant
for
Sauvé 39 octets puisque personne ne semble compter les inclus
non-golfé
la source
F #, 161 octets
Ce n’est certainement pas la meilleure langue pour jouer au golf, mais j’ai décidé de l’essayer (en plus, je ne connais rien à F #, donc tout conseil pour améliorer ma réponse sera le bienvenu).
Exécuter avec:
Écrit une nouvelle ligne en tant que séparateur.
la source
Ruby , 29 + 1 = 30 octets
Utilise le
-n
drapeau.Essayez-le en ligne!
la source
puts$_
par,print
mais il n'est pas clair que les règles le supportent.JS (ES6), 47 octets
Contrairement aux autres réponses ES6, cela utilise une boucle for et des bombes d'alerte au lieu d'une récursion. Le séparateur qui est imprimé lorsque le programme s’arrête n’est pas défini.
la source
PowerShell, 31 octets
Get-Random $i
génère un séparateurn
où0 <= n < $i
est une nouvelle ligne implicite.la source
Python, 75 octets
L'autre réponse Python est plus courte, mais je voulais essayer d'une autre manière:
la source