À propos de la série
Tout d'abord, vous pouvez traiter cela comme n'importe quel autre défi de golf de code 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 plus d'informations sur la série dans le premier post .
Trou 8: Mélangez une liste infinie
Vous devez écrire une fonction ou un programme qui prend une liste infinie en entrée et renvoie une version mélangée de cette liste.
À propos des E / S infinies
Il existe plusieurs façons de prendre des entrées et de produire des sorties pour ce défi:
- Vous pouvez soit prendre une liste d'entiers positifs, soit une représentation sous forme de chaîne de ceux-ci, soit une chaîne ou une liste de caractères ASCII imprimables (0x20 à 0x7E, inclus). Le format de sortie doit correspondre au format d'entrée. Je vais simplement désigner les données comme "la liste" à partir de maintenant, quelle que soit l'option que vous choisissez.
- Vous pouvez lire la liste à partir d'un flux d'entrée standard infini et écrire la sortie en continu sur un flux de sortie standard infini. La solution ne doit pas dépendre d'une valeur particulière ou d'une séquence de valeurs pour garantir que le flux de sortie est régulièrement écrit et vidé (par exemple, vous ne pouvez pas simplement écrire la sortie chaque fois qu'il y a un
5
dans la liste d'entrée). Bien sûr, si vous lisez une représentation sous forme de chaîne d'une liste, il est normal d'attendre de rencontrer le séparateur de liste. - Dans les langues qui les prennent en charge, vous pouvez écrire une fonction qui prend et renvoie une liste ou une chaîne infinie paresseuse.
- Dans les langues qui les prennent en charge, vous pouvez implémenter un générateur infini qui prend un autre générateur en entrée.
- Alternativement, vous pouvez écrire une fonction qui ne prend aucun argument et renvoie une valeur de sortie à chaque appel. Dans ce cas, vous pouvez supposer qu'une fonction a été définie qui ne prend aucun argument et renvoie la valeur d'entrée suivante à chaque appel. Vous pouvez librement choisir le nom de cette fonction.
Vous pouvez supposer que votre programme s'exécute pour toujours et qu'une mémoire infinie est disponible. (Il est possible de résoudre ce problème avec une quantité de mémoire limitée, mais cela signifie que vous êtes autorisé à perdre de la mémoire.)
À propos du caractère aléatoire
Pour toute valeur v lue à une position i de l'entrée infinie, il doit y avoir une probabilité positive qu'elle se retrouve dans l'une des positions i-9 à i + 9 de la sortie infinie (à moins que cette position ne soit négative ). Ces probabilités ne doivent pas nécessairement être les mêmes pour différentes positions de sortie ou même pour différentes positions d'entrée. C'est bien si votre solution peut également mélanger les valeurs à une autre position plus éloignée.
Par conséquent, il n'est pas nécessaire que votre solution puisse mélanger la première valeur très loin dans la liste, ou qu'elle puisse mélanger une valeur très tardive jusqu'à la première position, bien que ce soit correct si c'est le cas, tant que toutes les positions se trouvent à 9 étapes de la entrée sont possibles.
Par exemple, si vous avez pris la chaîne suivante en entrée, le ___
indique toutes les positions que le X
doit pouvoir finir dans la sortie:
___________________
abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...
Si votre langue ne dispose pas d'un générateur de nombres aléatoires intégré ou si vous ne souhaitez pas l'utiliser, vous pouvez prendre une valeur de départ supplémentaire en entrée et implémenter votre propre RNG approprié à l'aide de la valeur de départ. Cette page peut être utile pour cela.
Quelle que soit la distribution réelle utilisée par votre solution, elle doit presque sûrement produire la valeur suivante après un temps fini (mais arbitraire).
Veuillez inclure une brève explication sur la manière dont votre implémentation satisfait à ces exigences.
Notation
Ceci est un code-golf , donc la plus courte réponse valable - mesurée en octets - victoires.
Classement
Le premier post de la série génère un classement.
Pour vous assurer que vos réponses s'affichent, veuillez commencer 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 dans le titre, en les rayant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(La langue n'est pas actuellement affichée, mais l'extrait de code l'exige et l'analyse, et je pourrai ajouter un classement par langue à l'avenir.)
la source
Réponses:
Python 3 , 78 octets
Essayez-le en ligne!
Prend l'entrée de STDIN (une par ligne), imprime vers STDOUT.
Conserve un tampon
l
de jusqu'à 10 éléments. Le tampon est mélangé à chaque étape. Lorsque sa longueur est de 10, le dernier élément est imprimé et supprimé.Si un élément est imprimé dès qu'il a été inséré, il a sauté devant 9 autres éléments en attente dans la mémoire tampon, il apparaît donc 9 taches. Un élément peut attendre arbitrairement dans la mémoire tampon, donc sa position peut déplacer n'importe quel montant vers la droite.
Il ne semble pas y avoir une bonne façon de produire et de supprimer un élément aléatoire d'une liste. Le brassage semble exagéré. C'est 2 octets de plus à utiliser
l.pop(randint(0,9))
(qui utilise que la liste a 10 éléments).Ce n'est pas mieux de faire
x=choice(l);l.remove(x)
. Une langue avecpoprandom
commepourrait très proprement faire
la source
Befunge ( saveur excentrique ), 4 octets
,
lit un personnage du flux et le pousse sur la pile.~
sort le premier caractère de la pile (si présent) et l'imprime.?
randomise quelle commande est exécutée ensuite. Donc, l'algorithme est ici "dans une boucle infinie, avec une probabilité égale, soit pousser un caractère ou pop un caractère." Je pense que cela satisfait les exigences: un personnage peut voir arbitrairement de nombreux caractères ajoutés au-dessus de lui dans la pile, donc il peut se déplacer arbitrairement loin vers la droite, et il peut être imprimé lorsque la pile est arbitrairement grande, donc il peut se déplacer arbitrairement loin vers la gauche.la source
>> document.getElementById("output").innerHTML = "a\0b"
>> document.getElementById("output").innerHTML
"ab"
C (gcc) , 94 octets
Essayez-le en ligne!
Ok, un lien TIO n'a pas beaucoup de sens. Pour faciliter les tests, j'ai créé le programme C suivant qui produira des caractères ascii aléatoires ou répétera une chaîne à l'infini.
Ce programme sera appelé
iro
.Exactitude du programme
Ce que je fais ici, c'est lire les
9
valeurs dans un tampon. Après cela, des indices aléatoires sont choisis dans ce tableau et sont sortis, puis remplacés par le caractère suivant dans le flux.la source
SILOS , 149 octets
Essayez-le en ligne!
Essentiellement, il continue de prendre des informations (sur l'interpréteur en ligne via des arguments, mais sur l'interpréteur officiel hors ligne, il vous permettra de taper dans la console (à l'infini)) par blocs de 15 à la fois (30 le premier bloc).
Il charge l'entrée dans une file d'attente temporaire et sélectionne un 15 chanceux (au hasard, mais pas également distribué en termes de probabilité ou de distribution).
Le reste reste là où de nouvelles entrées remplissent la file d'attente, la première entrée pourrait être mélangée jusqu'à la fin (en gros, je pense que les personnages suivent une distribution normale). Il est intéressant de noter que ce programme n'est que deux fois plus verbeux que python et peut-être "golfeur" que Java.
Pour mieux voir les résultats, j'ai une version non conforme qui prend l'entrée sous forme de chaîne (mais elle ne peut contenir que 8 000 caractères environ).
Essayez-le en ligne!
Juste pour le plaisir, voici ce post alimenté par la version chaîne.
la source
Aceto , 24 octets, non concurrent
Non concurrent car j'ai dû corriger un bug dans l'interpréteur.
Prend un flux infini de lignes et les produit dans un ordre aléatoire. Chaque élément a une chance de se produire à tout moment aléatoire.
Nous commençons par un
?
dans le coin inférieur gauche, qui nous déplace dans une direction aléatoire. Si c'est vers le bas ou vers la gauche, nous sommes repoussés tout de suite.Si nous sommes déplacés vers le haut, nous
r
lisons une valeur, mélangeons la pile (Y
) et revenons auO
rigin.Si nous sommes déplacés vers la droite, nous
d
répliquons la valeur de pile supérieure, poussons a0
et testons l'égalité (puisque nous lisons des chaînes, nous ne pouvons jamais avoir l'entier 0). Si les valeurs sont égales, cela signifie que nous avons atteint le bas de la pile (à partir de laquelle nous ne voulons pas imprimer). Nous nions la comparaison (!
) etp
n'imprimons que si (`
) les choses n'étaient pas égales. Ensuite, nous revenons également auO
rigin.la source
Rubis, 43 octets
Ma réponse originale utilisait une liste infinie évaluée paresseusement, mais elle est plus courte. Tant pis.
la source
MATL , 11 octets
Essayez-le en ligne!
Réponse de Befunge du port d' histocrate .
Explication: (Merci à Luis Mendo pour -1 octet)
Cela produit presque sûrement en temps fini, et ne nécessite presque sûrement qu'une mémoire finie .
Pour être complet, voici une version à 15 octets qui conserve un tampon à 10 éléments et génère un élément aléatoire à partir de cela:
J'aime cette version pour le très idiomatique (dans la mesure où les langues de golf peuvent être idiomatiques)
tn...Yr&)
, qui fait apparaître un élément aléatoire dans la liste et renvoie la liste sans cet élément. Cependant, la logistique particulière de ce challenge ajoute beaucoup d'octets (le nécessairew
à l'affichage, let9>?
pour vérifier si la liste est assez pleine ...).la source
Alice , 7 octets
Essayez-le en ligne!
Cela devrait fonctionner sur une entrée infinie avec un temps et une mémoire infinis, mais ce n'est pas si facile à tester dans la pratique :)
Explication
À chaque itération, 10 caractères sont lus à partir de l'entrée et un seul va à la sortie, donc l'utilisation de la mémoire augmente linéairement pendant l'exécution. Avec une entrée finie, cela atteint rapidement EOF, à partir duquel dix -1 seront poussés vers la pile à chaque itération. Essayer de sortir -1 en tant que caractère n'a aucun effet, mais il est peu probable que tous les caractères de l'entrée soient imprimés dans un délai raisonnable.
La position i de la sortie peut être prise par n'importe quel caractère dans l'entrée jusqu'à la position 10i , ce qui répond au défi nécessitant au moins une plage de i-9 à i + 9 .
la source
C, 214 octets
Comment ça marche
Essayez en ligne (UNIX)
la source
Vi
est échangé avecVj
oùj = RAND [ i-9, i+9 ]
satisfaire les critères de questionv which is read at a position i of the infinite input, there must be a positive probability for it to end up in any of the positions i-9 to i+9 of the infinite output
05AB1E , 13 octets
Essayez-le en ligne!(modifié pour prendre 20 éléments)
la source
Frapper , 17 octets
Essayez-le en ligne!
xargs prend continuellement 9 lettres de STDIN et les envoie au shuffle
une liste infinie peut être générée par:
qui imprime abcde .. z des temps infinis.
Le test pourrait être effectué par:
la source
xargs shuf -e
satisfait aux exigencesR, 70 octets
Commence par un vecteur vide
x
. Dans une boucle infinie, il prend une nouvelle valeur de STDIN, puis mélange le vecteur. Ensuite, il vérifie si la longueur de la liste accumulée est de 10 ou plus. Si c'est le cas, l'impression peut commencer. De cette façon, le vecteur a un tampon de 10 entrées, chacune étant mélangée à chaque itération. Il est donc possible d'imprimer 10 entrées plus tôt et infiniment plus tard (en suivant une distribution géométrique avecp=1/10
). Lorsque le tampon est suffisamment long, le premier élément est imprimé et supprimé du vecteur.la source
Javascript, 78 octets
Utilise la même méthode que la réponse de xnor.
la source
Perl 5 , 39 octets
38 octets de code +
-n
indicateur.Essayez-le en ligne!
Ajoutez chaque élément au
@F
tableau (avecpush@F,$_
). Lorsqu'il@F
contient 10 éléments (push
renvoie le nombre d'éléments dans le tableau, donc9<push...
), un élément aléatoire est supprimé et imprimé (splice@F,rand 10,1
pour supprimer l'élément,print
pour l'imprimer).La sortie commence à se produire après la lecture du 10e élément. Par conséquent, chaque élément peut commencer à apparaître au moins 9 positions avant sa position d'origine et peut être déplacé vers la droite à l'infini.
la source
SmileBASIC,
6158 octetsChaque caractère de la liste infinie est ajouté à la fin du tampon. Lorsque la longueur de la mémoire tampon est de 11, un caractère aléatoire est imprimé et supprimé.
La fonction
R
génère le caractère suivant.la source
Prolog, 70 octets
la source