Dissoziierte Presse

12

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

Dissociated Press ist ein Algorithmus, der aus einem vorhandenen Text zufälligen Text generiert.

Der Algorithmus beginnt mit dem Drucken von N aufeinanderfolgenden Wörtern (oder Buchstaben) im Text. Dann sucht es bei jedem Schritt nach einem zufälligen Vorkommen im Originaltext der letzten N Wörter (oder Buchstaben), die bereits gedruckt wurden, und druckt dann das nächste Wort oder den nächsten Buchstaben.

Implementieren Sie Dissociated Press, entweder als Funktion oder als ganzes Programm. Kürzester Code gewinnt. Verwenden Sie nicht die Befehlszeile oder das Emacs-Skript, um das ursprüngliche Dissociated Press-Programm aufzurufen. Verwenden Sie keine externen Bibliotheken.

Ming-Tang
quelle
2
Dies ist ein Sonderfall einer "Markov-Kette" , die meiner Meinung nach ein gutes Etikett abgeben würde.
dmckee --- Ex-Moderator Kätzchen
Möchten Sie, dass dies mit Wörtern oder Buchstaben funktioniert? Ein paar weitere Beispiele wären auch hilfreich, ich habe nicht viel aus dem Beispiel auf Wikipedia herausgeholt.
Mr. Llama

Antworten:

7

Perl, 81-82

Verwendet 2 Zeichen Überlappung, reduziert Zeilenumbrüche und stoppt, wenn eine Sackgasse auftritt.

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

Zum Beispiel verwendet zu Beginn des Tests des Wikipedia-Artikels für Markov-Ketten:

$ perl dissociated.pl markov.txt 

j (MCMCSTs geben wily ov chaimices suces aps an) diniter → is throbabilit) obwohl eine statep chaility deps) fution themamences steare mat arsterionowastainnexactiond ist ch model stateatic cally dis the haidete state und hat das pout orent weenced j) definiert cate witionton be antion Eation-Zer-Cated für ein Letuchainits eine Krawatte Fociatrin Abilitins Thenzym Ther Matrix haing Therre isativeloperizermaked verwendet Applin ithanced, eine so direns Alithe Examinsibuticass die Mary n-ze Markov Corions. Mit einer gewissen Modifikation des Ph, die verwendet wird, um eine Pakt-Capeat-Geschwindigkeit zu erreichen. Ein zu ren Markov kann sie kettenseitig öffnen. Die Rematrang Mareld der Ewigkeit. sind powevelogenothe i) on als Assucies Exteplity Reverticat Grobabilition aly ons astribled Lany babingletichnial n × n. [14] Jeder Kumpel, der eine Chance hat. [4] If nationen. Die Angestellten sind berechtigt, Modifikationen an statrages), dh Robaboteropien, durchzuführen, um gegebene Anforderungen zu erfüllen, und es ist angebracht, alle Beschaffungen von Männern, die eine Treppe haben, zu erledigen. Wenn wir es nicht können, dann ist die Wirkung der Prolarkov-Kette der Würfel. Ansonsten wird der Grad der Verfügbarkeit mit 4/10 angegeben, dh Shasse isst eine probale Abweichung. [Cible so cogortatioden is suate liblevare] tingenarkov clapergeran butiont: theor enegarkov con ection thatemple tivionom togy of a formal is ein stat π ime stributionegiver samin th pample, tegime 20, cality delso,

Es handhabt aus Versehen utf-8. Schön.

JB
quelle
6

Brachylog , 45 Bytes

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

Probieren Sie es online!

3N+12N

Eingang

Mr. Wormtail wünscht Professor Snape einen guten Tag und rät ihm, sich die Haare zu waschen, den schlanken Ball.

Ausgabe (Beispiel)

ormtair, der Schlanke der Gute und und berate Profes Professormtair, berate ihn der Gute und berateormtail, bietet ihm die Haare und berät ihn den guten Tag und Tag, den schlanken Ball.


Wortebene Dissoziierte Presse nur noch wenige Bytes:

52 Bytes

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

Probieren Sie es online!

Eingang

King's Cross Station war riesig und voll mit Wänden und Böden, die mit gewöhnlichen schmutzigen Fliesen gepflastert waren. Es war voll von gewöhnlichen Leuten, die sich über ihre gewöhnlichen Geschäfte beeilten und gewöhnliche Gespräche führten, die sehr viel gewöhnlichen Lärm verursachten. King's Cross Station hatte eine Plattform Neun (auf der sie standen) und eine Plattform Zehn (direkt in der Nähe), aber zwischen Plattform Neun und Plattform Zehn befand sich nichts außer einer dünnen, vielversprechenden Mauer. Ein großes Oberlicht ließ viel Licht herein, um den Mangel an Plattform neun und drei Vierteln zu erhellen.

Ausgabe (Beispiel)

Absperrwand. Ein großes Oberlicht ließ viel Licht herein, um den völligen Mangel an Plattform Neun (auf der sie standen) und Plattform Neun (auf der sie standen) und Plattform Neun (auf der sie standen) und a zu beleuchten Plattform Neun und Plattform Zehn (direkt in der Nähe), aber es gab nichts zwischen Plattform Neun (auf dem sie standen) und Plattform Neun (auf dem sie standen) und Plattform Zehn (direkt in der Nähe), aber es gab nichts zwischen Plattform Neun und Dreiviertel.

Sundar - Setzen Sie Monica wieder ein
quelle
1
Aber auf welcher Plattform waren sie?
Jo King
2

Hier ist ein etwas ausgefeilterer wortbasierter Algorithmus, der in Scala geschrieben wurde und die Wahrscheinlichkeiten von Wortsequenzen beliebiger Länge berücksichtigt. (Das ist nicht der ursprüngliche dissoziierte Pressealgorithmus .)

Der Algorithmus ist wie folgt. Wählen Sie in jedem Schritt eine fortlaufende Hälfte des Texts aus, beginnend an einer zufälligen Position, suchen Sie nach der längsten Endsequenz von Ausgabewörtern, die in dieser Hälfte vorkommt (dies können 0 Wörter sein), und geben Sie das nächste Wort aus.

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("")(_ + " " + _))

Hier ist eine Beispielausgabe, die auch aus dem Wikipedia-Artikel über Markov-Ketten generiert wurde:

Heute werden stationäre Verteilungen nicht eindeutig sein. I Wahrscheinlichkeiten erfüllen k die richtige Position, ohne dass die Übergangswahrscheinlichkeitsverteilung nur dann dargestellt werden kann, wenn die Parameter auf der Einheit des Systems eindeutig sind, dh in der stationären Verteilung oder wenn dies invariant ist erfüllt die stationäre Verteilung für Q.

By the way, wenn Sie verwenden , "[a-zA-Z .,!?]".rwie wordregexkönnen Sie diese verwenden Brief basierte dissoziierte Presse als auch zu generieren:

Diese Figur oder Perioden, in denen eine Backgrobability des Pater-Ext-Zustands mit einer Anzahl von Fehlern auftritt, wenn die Klasse, in der Mi pimatransie auftritt, öffnet, dass die von einem Systemzustand benötigte NNN-Anforderung fehlerhaft ist, dann alle Aufgabe beschränkt.

Bei einer großen Textdatei wie der Jargon-Datei wird es wirklich interessant . Jetzt ist letter based schon ganz gut:

Anderer Richtungsalgorithmus wird glücklich Fehler, und ein seltener; Es ist eine Abkürzung für "out being proms" und ein Meta-Location-Hack mit Jahrzehnten, der auf der LISP Mac-Workstation vor dem Internetzugang aufgebaut ist. Dies mag tot sein. Ein Maß an Konkurrenten, ein beliebter Compiler endete immer wieder auf dem zweiten Platz, und es wurde Blutegel arrangiert mit dem im netz angetroffenen, insb. aus einem netzwerk. in der regel `kunde und auf dem chad es wieder auf papier. mehrere hatten in den eigenschaften.

Wortbasiert wird ziemlich amüsant:

Dies wurde seitdem gemeldet. Das einzige, was es erwartet, ist ein Ressourcenleck n. Ein halbmythisches Sprachkonstrukt in einem inkonsistenten, weil es sich überhaupt nicht anpassen kann. Wenn Sie einen Computer in einem spielerischen eingeben und beendet Holen Sie sich einen echten Computer! Kobold Sarkastische Einladung zum Sprechen. Kleine Kabel wurden für echte Programmierung verantwortlich gemacht. Pascal zehn Jahre später, aber die Mehrheit unserer Produkte nicht ganz die gleiche moderne Unterschale. Es ist umstritten, ob dieser Eintrag jedermanns Mutter ist.

Hans-Peter Störr
quelle
1
Es ist immer schön, den Code ungolfed zu sehen, aber um den Regeln zu entsprechen, ist es notwendig, den Code zu golfen (Bezeichner radikal zu verkürzen, Zwischenschritte zu kombinieren, ...). Als zusätzlicher Codeblock bevorzugt.
Benutzer unbekannt
Das hat nicht viel Sinn. Selbst wenn ich durch Rahmen springe, kann ich mich nicht mit der Code-Verschleierungsebene des Perl-Eintrags vergleichen. :-)
Hans-Peter Störr
Nun - wenn Sie die Größe nicht reduzieren möchten, möchten Sie vielleicht die Größe erhöhen, um die fehlenden Importe einzudämmen, so dass man das Programm zumindest testen kann, ob es funktioniert, ohne zu raten.
Benutzer unbekannt
@userunknown Ups, sorry - ich habe das Skript repariert.
Hans-Peter Störr
2

Python 2.7, 355 Zeichen

Ich habe ein Programm wie dieses bereits als KI-Experiment geschrieben, also lassen Sie uns es ein wenig analysieren, einige unnötige Dinge entfernen und Golf spielen: 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

Die Eingabe erfolgt durch Angabe eines Dateinamens und der Länge der gewünschten Ausgabe in Worten

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

Beispieltext, der Ihnen durch eine vorherige Herausforderung übermittelt wurde

Optional können Sie den Inhalt meiner Datei für die spätere Verwendung speichern, sodass nicht die gesamte Datei analysiert werden muss, da das Erstellen des Wörterbuchs, auf das verwiesen wird, für die Wörter, insbesondere für größere Texte (z. B. Bücher).

edit: egal ob schon ein Gewinner ausgewählt wurde, ich poste es trotzdem: P

Blazer
quelle
0

Perl, 65 Zeichen

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

Dies basiert stark auf der Antwort von JB , nur ein bisschen mehr golfen. Verwendet sayfür eine kitschige Zwei-Zeichen-Speicherung, muss also mit Perl 5.10 oder höher und dem Schalter -M5.010(oder -E) ausgeführt werden.

Das Ausführen dieses Codes in dem von der Wikipedia getrennten Presseartikel ergab diese schöne Ausgabe:

ist alles, was Sie nachher nicht brauchen. Thided Press (oder Pocutents. Refeed 2007-04-12-29). Refeaturrand bevorzuge die Basto Useassociatualgor 1972) in auf. Dies ist der Zeitpunkt, zu dem das Muster 1983 hergestellt wurde (1983 wurde das Muster 1983 hergestellt, um es zu verwenden). 29) Ame Jarrassocumovin ano sain ot on. Thiss (orittedissocial a whhe a kno die Tinten, die ein appliater unermüdlich pociaticle verwenden, lem Wilet ourraymovem!

Ilmari Karonen
quelle