Presse dissociée

12

http://en.wikipedia.org/wiki/Dissociated_press

Dissociated Press est un algorithme qui génère du texte aléatoire à partir d'un texte existant.

L'algorithme commence par l'impression de N mots (ou lettres) consécutifs dans le texte. Ensuite, à chaque étape, il recherche toute occurrence aléatoire dans le texte d'origine des N derniers mots (ou lettres) déjà imprimés, puis imprime le mot ou la lettre suivant.

Implémentez Dissociated Press, soit en tant que fonction, soit en tant que programme complet. Le code le plus court gagne. N'utilisez pas la ligne de commande ou le script emacs pour appeler le programme Dissociated Press d'origine. N'utilisez aucune bibliothèque externe.

Ming-Tang
la source
2
Il s'agit d'un cas particulier d'une "chaîne de Markov" , qui, je pense, ferait une bonne étiquette.
dmckee --- chaton ex-modérateur
Voulez-vous que cela fonctionne sur des mots ou des lettres? De plus, quelques exemples supplémentaires seraient utiles, je n'ai pas tiré grand-chose de l'exemple sur Wikipédia.
M. Llama

Réponses:

7

Perl, 81 82

Utilise le chevauchement de 2 caractères, réduit les nouvelles lignes, s'arrête lorsqu'il rencontre une impasse.

for($/=$,,$_=<>,@_=/(..)/;print($a=$_[rand
@_]),($b.=$a)=~/..$/,@_=/\Q$&\E(.)/g;){}

Par exemple, utilisé au début du test de l'article wikipedia pour les chaînes de Markov:

$ perl dissociated.pl markov.txt 

j (MCMCSTs state wily ov chaimices suces aps) diniter → is throbabilit) woughough a statep chaility deps) fution themamences steare mat arsterionowastainnexactiond is ch model stateatic cally dis the th haidete state and hat the pout orent jenced defates cate witionton antionarks Markov casumbe être consommé pour une letuchainits un lien fociatrin abilitins puis zyme ther matrice ayant therre istativeloperizermaked utilisé applin ithanced, a so direns alithe examinsibuticass the Mary n-ze Markov corions. Withen wity ine mod sain ph, the to useed Bas an pacte-capeaturropmatence. Un enfant peut Markov les enchaîner. Le re matrang Mareld de l'éternité. sont powevelogenothe i) on as assucies exteplity reverticat grobabilition aly ons astribled lany babingletichnial n × n. [14] Tout compagnon un chem, th à par stationt. [4] Si tions. Les États-Unis andisten arke ot itpeal mod on statrages) ie robaboteropy cor to to givenclastaties vid witiele chation mords and exament eare ind mared the wele so be zer 6 all procuringles of men Marty dom inces escaliers. Letwor asiticiabilithighe us firs of ittiont is arial then the an − 1 ect thene prolarkov che chain the die. Othe strate, grany classe is at at the staility 4/10, P ber efical requancesparrecon, in the retereted ie Shasse manges probal devion. [Cible so cogortatioden is suate liblevare "tingenarkov clapergeran butiont: theor enegarkov con ection thatemple tivionom togy of a formal is un stat π ime stributionegiver samin th pample, tegime 20, cality delso,

Il gère l'utf-8 par accident. Charmant.

JB
la source
6

Brachylog , 45 octets

s₃ᵇS&s₂ᵇṛ;S↰₁h
tT&ha₁l₂g;Tz{~a₀ᵈ}ˢṛtC&h,C;T↰|

Essayez-le en ligne!

Niveau dissocié Appuyez sur N, avec N = 2 (peut être modifié en changeant le initial en et les s ailleurs en par exemple ).N + 1 2 N3N+12N

Contribution

M. Wormtail offre au professeur Snape une bonne journée et lui conseille de se laver les cheveux, la boule de boue.

Sortie (exemple)

ormtair, le maigre le bon et et conseille Profes Professormtair, lui conseille le bon et le conseiller, les offres de queue soulèvent les cheveux, et lui conseille le bon jour, et le jour, le slimeball.


Niveau dissocié Press Word à quelques octets de plus:

52 octets

ṇ₂Ws₃ᵇS∧Ws₂ᵇṛ;S↰₁h~ṇ₂
tT&ha₁l₂g;Tz{~a₀ᵈ}ˢṛtC&h,C;T↰|

Essayez-le en ligne!

Contribution

La gare de King's Cross était immense et animée, avec des murs et des sols pavés de carreaux ordinaires souillés de terre. C'était plein de gens ordinaires qui se pressaient pour leurs affaires ordinaires, ayant des conversations ordinaires qui généraient beaucoup, beaucoup de bruit ordinaire. La gare de King's Cross avait une plate-forme neuf (sur laquelle ils se tenaient) et une plate-forme dix (juste à côté), mais il n'y avait rien entre la plate-forme neuf et la plate-forme dix, sauf un mince mur de barrière peu prometteur. Une grande lucarne au plafond laisse entrer beaucoup de lumière pour éclairer le manque total que ce soit de toute plate-forme neuf et trois quarts.

Sortie (exemple)

mur de barrière. Une grande lucarne au plafond laissait entrer beaucoup de lumière pour éclairer le manque total de toute plate-forme Nine (sur laquelle ils se tenaient) et une plate-forme Nine (sur laquelle ils se tenaient) et une plate-forme Nine (sur laquelle ils se tenaient) et un Platform Nine et Platform Ten (juste à côté) mais il n'y avait rien entre Platform Nine (sur lequel ils se tenaient) et un Platform Nine (sur lequel ils se tenaient) et un Platform Ten (juste à côté) mais il n'y avait rien entre Platform Nine et Trois quarts.

Sundar - Rétablir Monica
la source
1
Mais sur quelle plateforme étaient-ils?
Jo King
2

Voici un algorithme basé sur des mots légèrement plus sophistiqué écrit en Scala , qui prend en compte les probabilités de séquences de mots de longueur arbitraire. (Ce n'est pas l' algorithme de presse dissocié d'origine .)

L'algorithme est le suivant. À chaque étape, sélectionnez une moitié roulante du texte commençant à une position aléatoire, recherchez la séquence de queue la plus longue des mots de sortie qui se produit dans cette moitié (cela pourrait être 0 mots) et sortez le mot suivant.

import io._, collection.mutable.ArrayBuffer, util.Random
import java.io.FileInputStream

val lines = new BufferedSource(new FileInputStream("markov.txt")) getLines
val wordregex = "\\b[a-zA-Z]+\\b|[.,?!]".r
val words = lines flatMap (wordregex findAllIn _) toArray
val rollingwords = words ++ words.slice(0, words.length / 2)
val rnd = new Random()
val outwords = new ArrayBuffer[String]()
for (i <- 1 to 1000) {
  val startposition = rnd nextInt (words.length * 2 / 3)
  val half = rollingwords slice (startposition, startposition + words.length / 3)
  var newword = ""; var n = 0; var index = 0
  while (index >= 0 && n < half.length && n < outwords.length) {
    index = half.indexOfSlice(outwords.takeRight(n))
    if (index >= 0 && index < half.length - n) {
      newword = half(index + n)
    }
    n = n + 1
  }
  outwords += newword
}
println(outwords.foldLeft("")(_ + " " + _))

Voici un exemple de sortie également généré à partir de l'article de wikipedia sur les chaînes de Markov:

aujourd'hui les distributions stationnaires ne seront pas uniques I les probabilités satisfont la position k de droite non la distribution de probabilité de transition ne peut être représentée en mappant que si les paramètres sur l'unité du système, Permettant n d'être unique, en ce que i dans la distribution stationnaire ou mesure invariante si elle satisfait la distribution stationnaire de Q.

Soit dit en passant, si vous utilisez "[a-zA-Z .,!?]".rcomme wordregexvous pouvez l'utiliser pour générer également une presse dissociée basée sur des lettres:

Cette figurrent ou périodes où une backgrobabilité l'état ext Pater avec stochare un certain nombre de façon détermente si la classe restante d'où Mi pimatransie, ouvre que le besoin nnn besoin par un état du système est des errements, puis limpor toute tâche.

Cela devient vraiment intéressant avec un gros fichier texte comme le fichier Jargon . Maintenant, la lettre est déjà assez bonne:

Un autre algorithme de direction sera heureusement des erreurs, et un rare; cela a été un raccourci pour "être des proms, et un piratage de méta-localisation avec des décennies construites autour de la station de travail d'accès pré-Internet LISP Mac. Cela peut être mort. Une mesure des concurrents, un compilateur populaire se termine à plusieurs reprises, et était sangsue. avec le rencontré sur le net, en particulier à partir d'un réseau. Habituellement `client et sur le tchad, il retour sur papier.

Basé sur les mots devient assez amusant:

Cela a depuis été signalé. La seule chose qu'il attend une fuite de ressource n. Une construction de langage semi - mythique dans un inconsistant car il ne peut pas s'adapter en premier lieu. Si vous entrez dans un ordinateur de façon ludique et terminée Obtenez un vrai ordinateur! imp. Invitation sarcastique à dire parler. Les petits câbles ont été accusés de véritable programmation. Pascal dix ans plus tard, mais la majorité de notre produit n'est pas tout à fait le même sous-shell moderne. Il y a un différend quant à savoir si cette entrée est la mère de tout le monde.

Hans-Peter Störr
la source
1
Il est toujours agréable de voir le code non golfé, mais pour se conformer aux règles, il est nécessaire, de jouer au golf votre code (raccourcir radicalement les identifiants, combiner des étapes intermédiaires, ...). En tant que bloc de code supplémentaire, de préférence.
utilisateur inconnu
Cela ne sert à rien. Même en sautant à travers des cerceaux, je ne peux pas comparer à distance le niveau d'obscurcissement de code de l'entrée perl. :-)
Hans-Peter Störr
Eh bien - si vous n'aimez pas réduire la taille, peut-être que vous aimez augmenter la taille, pour contenir les importations manquantes, afin que l'on puisse au moins tester le programme, s'il fonctionne, sans deviner.
utilisateur inconnu
@userunknown Oups, désolé - j'ai corrigé le script.
Hans-Peter Störr
2

Python 2.7, 355 caractères

J'ai déjà écrit un programme comme celui-ci comme expérience d'intelligence artificielle, alors disséquons-le un peu, supprimons certaines choses inutiles et jouons au golf: D

import re,random,sys
r=range
x=re.compile("([\w']+[\.?!,]?)+")
f=open(sys.argv[1])
c=f.read()
f.close()
t=x.findall(c)
m={}
for l in r(len(t)):
 w=[];c=t[l]
 for y in r(len(t)-1):
  if c==t[y]:w.append(str(t[y+1]))
 m[c]=w
x=random.choice(m.keys())
for i in r(int(sys.argv[2])):
 if len(m[x])==0:break
 y=random.choice(m[x]);print y,
 x=y

entrée fonctionne en fournissant un nom de fichier et la longueur de la sortie que vous voulez, en mots

python disspress.py nevermore.txt 100

and nothing more! Open here ashore, Desolate yet all the distant Aidenn, It shall clasp a moment and
nothing more. Deep into the Night's Plutonian shore! Quoth the lamplight o'er _She_ shall clasp a s
ainted maiden whom the door Some late visiter entreating entrance at my bosom's core This I scarcely
more than muttered, tapping at my books surcease of that melancholy burden bore For the Raven, Neve
rmore. And the chamber door Bird or stayed he hath spoken! Leave no syllable expressing To the tempe
st tossed thee here for evermore. And each separate dying ember wrought its only stock and

exemple de texte présenté par un défi précédent

En option, vous pouvez enregistrer le contenu de mdans un fichier pour une utilisation ultérieure, de sorte qu'il n'a pas à analyser l'intégralité du fichier, car cela pourrait prendre plus de temps pour créer le dictionnaire auquel il fait référence pour les mots, en particulier pour les textes plus volumineux (comme livres).

edit: peu importe si un gagnant a déjà été choisi, je le poste quand même: P

blazer
la source
0

Perl, 65 caractères

$/=$,;$_=<>;/./;($a.=$a[rand@a])=~/..$/while@a=/\Q$&\E(.)/g;say$a

Ceci est fortement basé sur la réponse de JB , vient de jouer un peu plus au golf. Utilise saypour une économie de deux caractères, donc doit être exécuté avec Perl 5.10 ou version ultérieure et le commutateur -M5.010(ou -E).

L'exécution de ce code sur l'article de presse dissocié de Wikipedia a produit cette belle sortie:

est tout ce que lon mange afteditterelessam. Thided Press (ou pocut ents. Refeed 2007-04-12-29). Refeaturrand prefery the basto useassociatualgor 1972) in on. Itedith specelabst an ter 1983 is (1983 inted bittechnif loodshe samplebrither foriginto useche intedited Prentinks alsociallin prothe a sagetter loped. This the nown on. Thissociated impastiot whe "Whe ing thm # 176. 29) Ame Jarrassocumovin ano sain son ot on Thiss (orittedissocial a withe a kno the encres an appliater use intencely pociaticle, lem Wilet ourraymovem!

Ilmari Karonen
la source