Génération de mots de chaîne de Markov naïve


9

Il existe de nombreuses façons de générer des mots aléatoires. Vous pouvez prendre des syllabes aléatoires dans un ensemble, vous pouvez utiliser des n-tuples, probablement des réseaux de neurones (que ne peuvent-ils pas faire?), En alternant entre consonnes et voyelles, etc. La méthode basée sur ce défi est de loin la pire . Il utilise une chaîne de Markov pour générer des mots aléatoires. Si vous êtes des chaînes de Markov familières, vous savez probablement pourquoi cette méthode est si terrible.

Si vous souhaitez en savoir plus sur les chaînes Markov, cliquez ici .

Votre programme prendra une entrée d'un ou plusieurs mots et générera un seul mot aléatoire, par la méthode d'une chaîne de Markov pondérée. Puisque cela n'a probablement de sens que pour moi, voici une explication à travers l'utilisation d'une image de la chaîne de Markov avec l'entrée de abba:

Une chaîne de Markov pour <code> abba </code>

(Tous les poids des bords sont les mêmes pour toutes les images) Votre programme affichera le chemin à travers une chaîne de Markov basée sur le texte saisi. Comme vous pouvez le voir, il y a 1/2 chance de sortie a, 1/8 de chance aba, 1/16 de chance abba, 1/32 de chance ababa, etc.

Voici quelques autres exemples de chaînes de Markov:

yabba dabba doo

entrez la description de l'image ici

wolfram

entrez la description de l'image ici

supercalifragilisticexpialidocious

entrez la description de l'image ici

Si vous voulez plus d'exemples, utilisez ceci . (J'ai travaillé trop dur dessus)

Détails du défi:

  • L'entrée peut être considérée comme une liste de chaînes ou comme une chaîne séparée par un espace, une virgule ou une nouvelle ligne
  • Vous pouvez supposer que tous les mots seront entièrement en minuscules sans ponctuation (ASCII 97-122)
  • Vous pouvez écrire soit un programme soit une fonction
  • Pour tester, vous pouvez probablement saisir les exemples et voir si toutes les entrées s'alignent avec les chaînes de Markov

Il s'agit de , donc votre programme est noté en octets.

Faites-moi savoir si une partie de cela n'est pas claire, et j'essaierai de la rendre plus logique.


Cela a probablement du sens pour un peuple assez libre, car Chatgoat et Marky sont tous deux des chatbots Markov pondérés IIRC.
ASCII uniquement

Je ne comprends pas la relation entre l'entrée et ces chaînes de Markov. Il semble parfois impossible de produire le mot d'entrée en utilisant un chemin dans la chaîne donnée (par exemple "yabba dabba doo". Pas de boucle auto pour bvous ne pouvez donc pas produire de double b. De plus, une fois que vous atteignez un, bil ne semble pas possible de retourner à startpour produire les autres mots). Je crois que vous devez clarifier quelles sont les exigences ...
Bakuriu

@Bakuriu l'erreur sur le yabba dabba dooest un accident. Je vais le réparer dès que possible. Quant au fait de ne pas pouvoir recommencer, vous ne générez qu'un seul mot à partir d'un ensemble de mots donné. Cela clarifie-t-il cela?
DanTheMan

Réponses:


5

Pyth, 38 32 octets

VQJK1FZacN1k XKH]Z=KZ;WJ=JO@HJpJ

Merci à FryAmTheEggman pour 5 octets! Pour être honnête, j'ai commencé à écrire la réponse Python quand j'ai remarqué que quelqu'un en avait posté une très similaire, alors j'ai décidé de me lancer un défi avec quelque chose de nouveau, j'ai donc réécrit ma réponse (qui était essentiellement la réponse de Pietu) en Pyth.

L'entrée est un tableau de chaînes ["Mary" , "had" , "a" , "little"]


Belle premier message, bienvenue à PPCG :) Quelques conseils de golf: Fn'est jamais utile lorsque la variable Vutiliseraient se lorsque vous ne substituée voulez pas, donc vous pouvez changer le premier Fdà Vet remplacer dpar Nailleurs. [)autour d'un élément est le même que ]. Au lieu d'ajouter à une liste, vous pouvez utiliser append ( a) pour enregistrer le casting. Plus généralement, je pense que vous pouvez probablement raccourcir la durée en adoptant une approche plus fonctionnelle. Je ne sais pas non plus à quoi cela +kJsert, l'ajout de la chaîne vide à une chaîne devrait être un noop?
FryAmTheEggman

Merci! J'adorerais adopter une approche plus fonctionnelle, malheureusement je ne suis pas bien familiarisé avec les choses fonctionnelles (les expressions lambda sont probablement mon expérience la plus proche). Merci pour les octets d'ailleurs!
Lause

4

Python 2, 138 133 bytes

from random import*
M={}
for w in input():
 P=p=1
 for k in list(w)+[""]:M[p]=M.get(p,[])+[k];p=k
while P:P=choice(M[P]);k+=P
print k

Prend un tableau de chaînes tel que ["yabba", "dabba", "doo"].

Exemples de sorties avec cette entrée:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

Je veux également souligner ce résultat.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Ruby, 112 107 101 99

L'entrée est stdin, des chaînes séparées par des sauts de ligne.

QPaysTaxes a beaucoup aidé à jouer au golf!

M={}
while gets
k=''
$_.each_char{|c|M[k]||=[];M[k]<<c;k=c}
end
k=''
print k=M[k].sample while M[k]

1
J'apprécierais le crédit: D (quelque chose comme "merci à QPaysTaxes pour l'aide au golf" ou similaire semble courant ici)
Fund Monica's Lawsuit

1

Matlab, 160 octets

Prend l'entrée comme un tableau de cellules de chaînes, comme {'string1','string2','string3'}.

s=input('');n=[];l=96;for i=1:numel(s);n=[n 96 double(s{i}) 123];end
while(l(end)<123);p=n(find(n==l(end))+1);l=[l p(randsample(nnz(p),1))];end
char(l(2:end-1))

Cela lit les mots et les convertit en un vecteur de valeurs ASCII, avec un 96 pour marquer le début d'un mot et un 123 pour représenter la fin d'un mot. Pour construire un mot aléatoire, commencez par un 96. La recherche de tous les entiers qui suivent 96 dans le vecteur, et prenez un échantillon aléatoire de ceux-ci pour choisir la lettre suivante. Répétez cette opération en recherchant tous les entiers qui suivent celui en cours, jusqu'à ce que 123 soit atteint, ce qui signale la fin du mot. Reconvertissez-le en lettres et affichez-le.

L'entrée {'yabba','dabba','doo'}produit des résultats comme da. Voici les résultats des courses dix: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.