Prensa disociada

12

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

Dissociated Press es un algoritmo que genera texto aleatorio a partir de un texto existente.

El algoritmo comienza imprimiendo cualquier N palabras (o letras) consecutivas en el texto. Luego, en cada paso, busca cualquier aparición aleatoria en el texto original de las últimas N palabras (o letras) ya impresas y luego imprime la siguiente palabra o letra.

Implemente Dissociated Press, ya sea como una función o como un programa completo. El código más corto gana. No utilice la línea de comandos o el script emacs para llamar al programa original de Dissociated Press. No use ninguna biblioteca externa.

Ming-Tang
fuente
2
Este es un caso especial de una "Cadena de Markov" , que sugiero sería una buena etiqueta.
dmckee --- gatito ex moderador
¿Quieres que esto funcione en palabras o letras? Además, algunos ejemplos más serían útiles, no obtuve mucho del ejemplo en Wikipedia.
Sr. Llama

Respuestas:

7

Perl, 81 82

Utiliza la superposición de 2 caracteres, descuenta nuevas líneas, se detiene cuando encuentra un callejón sin salida.

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

Por ejemplo, utilizado al comienzo de la prueba del artículo de Wikipedia para las cadenas de Markov:

$ perl dissociated.pl markov.txt 

j (MCMCSTs estado astutamente ov chaimices suces aps) diniter → es throbabilit) a pesar de un estado deps chaility) fution themamences steare mat arsterionowastainnexactiond is ch model stateatic cally the the haidete state and hat the pout orent weenced j) define cate witionton antionarks Markov La dieta se ofrece a través de una cadena de legumbres en una atadura de abilitinas y luego en una matriz que tiene una matriz activadora utilizada, que se aplica de manera tan directa y tan directa al examen de los coriones de Mary n-ze Markov. Cuando se trata de un mod sain ph, se utiliza Bas una pape-capeaturropmatence. An to ren puede Markov encadenarlos. El re matrang Mareld de la eternidad. son potentes para la i) en cuanto las garantías de seguridad reviertan la grobabilition al pie de la letra astringente lany babingletichnial n × n. [14] Cualquier compañero de un químico, th a por stationt. [4] Si las acciones. Los ustas y escuchan otro mod de repetición en los estadios), es decir, robaboteropy cor a las reclamaciones dadas vid mordie chation mords y exagerar alguna vez se han visto tan bien, así que tenga 6 proxenetas de hombres Marty dom inces escaleras. Si la primera vez que se realiza la primera acción es arial, entonces el −1ecto thene prolarkov che encadena el dado. En el estrate, grany classe se altera la estabilidad 4/10, se requiere parásito público, en el retereteado, es decir, Shasse come la devoción probal. [Cible así cogortatioden es suate liblevare "tingenarkov clapergeran butiont: theor enegarkov conection thatemple tivionom togy una estadística π ime stributionegiver samin th pample, tegime 20, calso delso,

Maneja utf-8 por accidente. Encantador.

JB
fuente
6

Brachylog , 45 bytes

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

Pruébalo en línea!

3N+12N

Entrada

El señor Colagusano le da un buen día al profesor Snape y le aconseja que se lave el pelo, la bola de baba.

Salida (muestra)

ormtair, mientras adelgaza lo bueno y asesora al Profesor Professormtair, le aconseja lo bueno y asesina a la cola de tormenta, le dice a sus cabellos, y le aconseja el buen día y el día, la bola de limo.


Nivel de palabra disociado Presione solo unos pocos bytes más:

52 bytes

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

Pruébalo en línea!

Entrada

La estación de King's Cross era enorme y concurrida, con paredes y pisos pavimentados con azulejos ordinarios manchados de tierra. Estaba lleno de gente ordinaria que se apresuraba por sus asuntos ordinarios, tenía conversaciones ordinarias que generaban mucho, mucho ruido. King's Cross Station tenía una Plataforma Nueve (en la que estaban parados) y una Plataforma Diez (justo cerca), pero no había nada entre la Plataforma Nueve y la Plataforma Diez, excepto una pared de barrera delgada y poco prometedora. Una gran claraboya en el techo deja entrar mucha luz para iluminar la falta total de cualquier plataforma nueve y tres cuartos.

Salida (muestra)

muro de barrera. Una gran claraboya en lo alto dejaba entrar mucha luz para iluminar la falta total de cualquier Plataforma Nueve (en la que estaban parados) y una Plataforma Nueve (en la que estaban parados) y una Plataforma Nueve (en la que estaban parados) y un Platform Nine y Platform Ten (justo cerca) pero no había nada entre Platform Nine (en el que estaban parados) y Platform Nine (en el que estaban parados) y una Platform Ten (justo cerca), pero no había nada entre Platform Nine y Tres cuartos.

sundar - Restablecer a Monica
fuente
1
¿Pero en qué plataforma estaban?
Jo King
2

Aquí hay un algoritmo basado en palabras ligeramente más sofisticado escrito en Scala , que tiene en cuenta las probabilidades de secuencias de palabras de longitud arbitraria. (Ese no es el algoritmo original de la prensa disociada ).

El algoritmo es como sigue. En cada paso, seleccione una mitad rodante del texto que comience en una posición aleatoria, busque la secuencia de cola más larga de las palabras de salida que se produce en esa mitad (puede ser 0 palabras) y envíe la siguiente palabra.

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

Aquí hay una salida de muestra también generada a partir del artículo de Wikipedia sobre las cadenas de Markov:

hoy las distribuciones estacionarias no serán únicas I las probabilidades satisfacen k la posición de la flecha derecha no la distribución de probabilidad de transición se puede representar mapeando solo si los parámetros en la unidad del sistema, permitiendo que n sea único, en el sentido de que i en la distribución estacionaria o medida invariante si satisface la distribución estacionaria para Q.

Por cierto, si usa "[a-zA-Z .,!?]".rcomo wordregexpuede usar esto para generar una prensa disociada basada en letras también:

Esta cifra o períodos en los que una capacidad de backgrobabilidad del estado de Pater ext con almacenamiento es un número de casos detestablemente si la clase de descanso de donde Mi pimatransie abre, la necesidad de un estado del sistema es errords, luego limitan todas las tareas.

Se vuelve realmente interesante con un archivo de texto grande como el archivo Jargon . Ahora basado en cartas ya es bastante bueno:

Otro algoritmo de dirección felizmente errores, y un poco común; ha sido la abreviatura de "ser proms y hackeo de meta-ubicación con décadas construidas alrededor de la estación de trabajo de acceso previo a Internet LISP Mac. Esto puede estar muerto. Una medida de competidores, un compilador popular terminó repetidamente en segundo lugar, y fue sanguijuela. con lo encontrado en la red, especialmente de una red. Por lo general, el cliente y el chad lo devuelven al papel. Varios tenían propiedades únicas.

Wordbased se vuelve bastante divertido:

Esto ya ha sido reportado. Lo único que espera es una fuga de recursos n. Una construcción de lenguaje semimítico de una manera inconsistente porque no puede ajustarse en primer lugar. Si ingresas a una computadora de una manera lúdica y termina ¡Obtén una computadora real! imp. Invitación sarcástica para decir hablar. Se culpó al cable pequeño de la programación real. Pascal diez años después, pero la mayoría de nuestro producto no es exactamente el mismo subshell moderno. Hay alguna disputa sobre si esta entrada es la madre de todos.

Hans-Peter Störr
fuente
1
Siempre es agradable ver que el código no está protegido, pero para cumplir con las reglas, es necesario, jugar golf su código (acortar radicalmente los identificadores, combinar pasos intermedios, ...). Como un bloque de código adicional, preferiblemente.
usuario desconocido
No tiene mucho sentido eso. Incluso saltando a través de aros no puedo comparar remotamente con el nivel de ofuscación del código de la entrada perl. :-)
Hans-Peter Störr
Bueno, si no le gusta reducir el tamaño, tal vez le gustaría aumentar el tamaño, para contener las importaciones que faltan, para que al menos pueda probar el programa, si funciona, sin adivinar.
Usuario desconocido el
@userunknown Vaya, lo siento, arreglé el script.
Hans-Peter Störr
2

Python 2.7, 355 caracteres

De hecho, he escrito un programa como este antes como un experimento de IA, así que analicemos un poco, eliminemos algunas cosas innecesarias y practiquemos 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

la entrada funciona proporcionando un nombre de archivo y la longitud de la salida que desea, en palabras

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

texto de muestra presentado por un desafío anterior

Opcionalmente, puede guardar el contenido de mun archivo para su uso posterior, de modo que no tenga que analizar todo el archivo, ya que podría tomar más tiempo para construir el diccionario al que hace referencia para las palabras, especialmente para textos más grandes (como libros).

editar: independientemente de si ya hubo un ganador elegido, lo estoy publicando de todos modos: P

Chaqueta de sport
fuente
0

Perl, 65 caracteres

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

Esto se basa en gran medida en la respuesta de JB , solo jugó un poco más. Se utiliza saypara un ahorro cursi de dos caracteres, por lo que debe ejecutarse con Perl 5.10 o posterior y el interruptor -M5.010(o -E).

Ejecutar este código en el artículo de prensa disociado de Wikipedia produjo esta hermosa salida:

es todo lon come afteditterelessam in. Thided Press (o pocut ents. Refeed 2007-04-12-29). Refeaturrand prefy the basto useassociatualgor 1972) en adelante. Itedith specelabst an ter 1983 es ​​(1983 inted bittechnif loodshe sampleboither forIG useche inted itted Prentinks alsociallin prothe a sagetter loped. This the hewn on. Thissociated impastiot where "Wheing thm # 176. 29). Ame Jarrassocumovin ano sain his ot on. Esto (orittedissocial con un toque de las tintas que un aplicador utiliza pociaticle intencionalmente, lem Wilet ourraymovem!

Ilmari Karonen
fuente