Stampa dissociata


12

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

Dissociated Press è un algoritmo che genera testo casuale da un testo esistente.

L'algoritmo inizia stampando qualsiasi N parola (o lettera) consecutiva nel testo. Quindi ad ogni passo cerca qualsiasi occorrenza casuale nel testo originale delle ultime N parole (o lettere) già stampate e quindi stampa la parola o la lettera successiva.

Implementare Dissociated Press, come una funzione o come un intero programma. Il codice più corto vince. Non utilizzare la riga di comando o lo script emacs per chiamare il programma originale Dissociated Press. Non utilizzare librerie esterne.


2
Questo è un caso speciale di una "catena di Markov" , che suggerisco sarebbe un buon tag.
dmckee --- ex-moderatore gattino

Vuoi che funzioni su parole o lettere? Inoltre, alcuni altri esempi sarebbero utili, non ho ottenuto molto dall'esempio su Wikipedia.
Mr. Llama,

Risposte:


7

Perl, 81 82

Usa 2 personaggi sovrapposti, sconta nuove righe, si ferma quando incontra un vicolo cieco.

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

Ad esempio, utilizzato all'inizio del test dell'articolo di Wikipedia per le catene di Markov:

$ perl dissociated.pl markov.txt 

j (MCMCST dichiarano astuzia o chaimices suces aps) diniter → è throbabilit) anche se uno stato di chaility deps) fution themamences steare mat arsterionowastainnexactiond is ch modello stateatic cally dis the th haidete state and hat the bout orent weenced j) defence cate witionton anbearks Markum mangiato per essere consumato per una letuchainits un pareggio fociatrin abilitins thenzyme the mather as have istativeloperermermaked used applin ithanced, a so direns it it theinsinsibuticass the Mary n-ze Markov corions. In ogni caso, con un po 'di fortuna, Bas ha usato una pacatezza-capeaturropmatence. Un Mark Ren può metterli in catene. Il re matrang Mareld di evernsity. sono powevelogenothe i) on asucies exteplity reverticat grobabilition aly ons asribled lany babingletichnial n × n. [14] Qualsiasi compagno un chem, th to by stationt. [4] Se tioni. Le ustate andisten si uniscono alla mod ittepeal sugli statrages) cioè rapinano il cuore a dare dati su inseguimento dei signori ed esistenza come se fossero mariti, quindi siate zer 6 tutti procurando uomini Marty dom inces scale. Il fatto che asiticiabilithighe noi primi di questa azione è fondamentale, quindi, un − 1 etto allora prolarkov che incatena il dado. Inoltre, la grande classe è rispettata la staility 4/10, il requisito epico fondamentale, nel reticolato cioè Shasse mangia la devozione probalistica [cible così cogortatioden è suate liblevare "tingenarkov clapergeran butiont: theor enegarkov con ection thatemple tivionom to to of formal a stat π ime stributionegiver samin th pample, tegime 20, cality delso,

Gestisce utf-8 per caso. Bello.


6

Brachylog , 45 byte

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

Provalo online!

3N+12N

Ingresso

Il signor Codaliscia saluta il professor Snape buona giornata e gli consiglia di lavarsi i capelli, la palla di melma.

Uscita (campione)

ormtair, il magro il buono e consiglia il Professore Professormtair, gli consiglia il buono e il consiglio che la coda gli offre i capelli e gli consiglia il buon giorno e il giorno, la palla melma.


Word Level Dissociated Press a pochi byte in più:

52 byte

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

Provalo online!

Ingresso

La stazione di King's Cross era enorme e affollata, con pareti e pavimenti pavimentati con normali piastrelle macchiate di terra. Era pieno di gente comune che si affrettava per i loro affari ordinari, con conversazioni ordinarie che generavano un sacco di rumore ordinario. King's Cross Station aveva una Platform Nine (su cui stavano in piedi) e una Platform Ten (proprio nelle vicinanze) ma non c'era nulla tra la Platform Nine e la Platform Ten, tranne una parete di barriera sottile e intransigente. Un grande lucernario sopraelevato lascia entrare molta luce per illuminare la totale mancanza di qualsiasi piattaforma nove e tre quarti.

Uscita (campione)

muro di barriera. Un grande lucernario sopraelevato lascia entrare molta luce per illuminare la totale mancanza di qualsiasi Piattaforma Nove (su cui erano in piedi) e una Piattaforma Nove (su cui erano in piedi) e una Piattaforma Nove (su cui erano in piedi) e un Platform Nine e Platform Ten (proprio nelle vicinanze) ma non c'era nulla tra Platform Nine (su cui stavano in piedi) e una Platform Nine (su cui stavano in piedi) e una Platform Ten (proprio nelle vicinanze) ma non c'era nulla tra Platform Nine e Tre quarti.


1
Ma su quale piattaforma erano?
Jo King,

2

Ecco un algoritmo basato su parole leggermente più sofisticato scritto in Scala , che tiene conto delle probabilità di sequenze di parole di lunghezza arbitraria. (Questo non è l' algoritmo di stampa dissociato originale .)

L'algoritmo è il seguente. In ogni passaggio selezionare una metà mobile del testo che inizia in una posizione casuale, cercare la sequenza di coda più lunga delle parole di output che si verifica in quella metà (potrebbero essere 0 parole) e produrre la parola successiva.

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

Ecco un esempio di output generato anche dall'articolo di Wikipedia sulle catene markov:

oggi le distribuzioni stazionarie non saranno uniche I probabilità soddisfano la posizione di destra non la distribuzione della probabilità di transizione può essere rappresentata mappando solo se i parametri sull'unità del sistema, permettendo a n di essere unici, in quanto i nella distribuzione stazionaria o misura invariante se soddisfa la distribuzione stazionaria per Q.

A proposito, se usi "[a-zA-Z .,!?]".rcome wordregexpuoi usare questo per generare anche stampe dissociate basate su lettere:

Questo momento o periodi in cui una backgrobability il Pater ext afferma con stochare un numero di classi detelemely se la classe di Mi pimatransie, apre che il nnn bisogno di uno stato del sistema è un errore, quindi limita tutte le attività.

Diventa davvero interessante con un file di testo di grandi dimensioni come il file Jargon . Ora la lettera è già abbastanza buona:

Un altro algoritmo di direzione sarà felicemente un errore e non comune; è stata una scorciatoia per "essere proms, e meta-location hack con decenni costruiti attorno alla postazione di accesso pre-Internet per Mac LISP. Questo potrebbe essere morto. Un certo numero di concorrenti, un popolare compilatore finisce ripetutamente al secondo, ed è stato organizzato con sanguisuga. con l'incontro in rete, in particolare da una rete. Di solito `cliente e sul chad lo riporta su carta. Molti avevano proprietà uniche.

Wordbased diventa abbastanza divertente:

Da allora questo è stato segnalato. L'unica cosa che prevede una perdita di risorse n. Un costrutto di linguaggio semi-mitico in un modo incoerente perché non può adattarsi in primo luogo. Se entri in un computer in modo giocoso e finisci Ottieni un vero computer! imp. Invito sarcastico a dire Talking. I cavi piccoli sono stati accusati di una vera programmazione. Pascal dieci anni dopo, ma la maggior parte dei nostri prodotti non è esattamente la stessa sottostruttura moderna. C'è qualche disputa sul fatto che questa voce sia la madre di tutti.


1
È sempre bello vedere il codice non modificato, ma per conformarsi alle regole, è necessario golfare il codice (abbreviare radicalmente gli identificatori, combinare passaggi intermedi, ...). Come blocco di codice aggiuntivo, preferibilmente.
utente sconosciuto,

Non ha molto senso. Anche saltando attraverso i cerchi non riesco a confrontare a distanza il livello di offuscamento del codice della voce perl. :-)
Hans-Peter Störr,

Bene - se non ti piace ridurre le dimensioni, forse ti piace aumentare le dimensioni, per contenere le importazioni mancanti, in modo che si possa almeno testare il programma, se funziona, senza indovinare.
utente sconosciuto

@userunknown Spiacenti, ho corretto lo script.
Hans-Peter Störr,

2

Python 2.7, 355 caratteri

In realtà ho già scritto un programma come questo prima come esperimento di intelligenza artificiale, quindi analizziamolo un po ', rimuoviamo alcune cose non necessarie e giochiamo a 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

l'input funziona fornendo un nome file e la lunghezza dell'output desiderato, in parole

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

testo di esempio fornito da una sfida precedente

Facoltativamente, potresti salvare il contenuto di mun file per un uso successivo, quindi non è necessario analizzare l'intero file, poiché ciò potrebbe richiedere più tempo per costruire il dizionario a cui fa riferimento le parole, specialmente per testi più grandi (come libri).

modifica: indipendentemente dal fatto che sia già stato scelto un vincitore, lo invio comunque: P


0

Perl, 65 caratteri

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

Questo è fortemente basato sulla risposta di JB , solo un po 'più di golf. Utilizza sayper un risparmio di due caratteri scadente, quindi deve essere eseguito con Perl 5.10 o versioni successive e l'opzione -M5.010(o -E).

L'esecuzione di questo codice sull'articolo della stampa dissociata di Wikipedia ha prodotto questo delizioso risultato:

è tutto solo mangiare afteditterelessam in. Thided Press (o pocut ent. Refeed 2007-04-12-29). Refeaturrand preferisce il basto usssociatualgor 1972) in su. Lo stesso esempio è del 1983 (1983 inteso bittechnif odora il campione di legno per originariamente usci inteso come Prentink alsociallin prothe a sagetter loped. Questo è il no. Su. 29) Ame Jarrassocumovin e altri ancora. Thiss (o originale con un pomello gli inchiostri che un utilizzatore usa intenzionalmente pociaticle, lem Wilet ourraymovem!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.