Imprensa dissociada

12

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

Dissociated Press é um algoritmo que gera texto aleatório a partir de um texto existente.

O algoritmo começa imprimindo N palavras (ou letras) consecutivas no texto. A cada passo, ele procura qualquer ocorrência aleatória no texto original das últimas N palavras (ou letras) já impressas e, em seguida, imprime a próxima palavra ou letra.

Implemente a Dissociated Press, como uma função ou como um programa completo. O menor código vence. Não use a linha de comando ou o script emacs para chamar o programa original Dissociated Press. Não use nenhuma biblioteca externa.

Ming-Tang
fonte
2
Este é um caso especial de uma "Cadeia de Markov" , que eu sugiro que seria uma boa etiqueta.
dmckee --- ex-moderador gatinho
Deseja que isso funcione com palavras ou letras? Além disso, mais alguns exemplos seriam úteis, não tirei muito do exemplo na Wikipedia.
Mr. Llama

Respostas:

7

Perl, 81 82

Usa sobreposição de 2 caracteres, desconta novas linhas, pára quando encontra um beco sem saída.

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

Por exemplo, usado no início do teste do artigo da wikipedia para cadeias de Markov:

$ perl dissociated.pl markov.txt 

j (MCMCSTs declaram astúcias de chaminés sucedem aps) diniter → é throbabilit) quando um departamento de capacidade de estado) teme que as armas permaneçam em estado de artilharia, mas a expressão de ação é um modelo estatístico que geralmente desestabiliza o estado haidete e que o bico oriente é j) defina citado. ser orientado a um procedimento de letalidade por uma ligação a uma abilitina e a uma enzima que possui um operador istativo usado pelo aplicador utilizado, o que direciona o exame para as coriãs de Mary n-ze Markov. Sem qualquer modificação, a base utilizada foi uma pacto-capeaturropmatence. Um ren pode Markov acorrentá-los. O re-matrang Mareld da eternidade. estão em desenvolvimento no i) como uma forma de garantir a reverberação de extrema capacidade de adaptação a lany babingletichnial n × n. [14] Qualquer mate uma química, de acordo com a stationt. [4] Se ações. Os Estados Unidos e os Estados Unidos fizeram uma modificação epistêmica das estatísticas), ou seja, a robobotopia pode dar certas testemunhas, como testemunhas e testemunhas, para que todos sejam procurados pelos homens. De qualquer forma, é fundamental que os efeitos da ação sejam efetivos e, em seguida, o efeito seja o prolongamento da cadeia. Na classe estratificada, grany é atestada a estabilidade 4/10, no período pós-reexame, ou seja, Shasse come deval probal. [Cible to cogortatioden are sate liblevare are " um representante estatístico da amostra no exemplo 20, regime 20, calidade delso,

Ele lida com utf-8 por acidente. Adorável.

JB
fonte
6

Braquilog , 45 bytes

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

Experimente online!

3N+12N

Entrada

O Sr. Rabicho dá um bom dia ao professor Snape e o aconselha a lavar o cabelo, a bola fina.

Saída (amostra)

ormtair, o magro, o bom e o conselheiro Profes Professormtair, aconselha-o, o bom e o conselheiro forma o cabelo dele e aconselha-o o bom dia e o dia, o slimball.


Nível de palavra dissociado Pressione apenas mais alguns bytes:

52 bytes

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

Experimente online!

Entrada

A estação de King's Cross era enorme e movimentada, com paredes e pisos pavimentados com azulejos comuns manchados de sujeira. Estava cheio de pessoas comuns se apressando em seus negócios comuns, tendo conversas comuns que geravam muito e muito barulho comum. A Estação King's Cross tinha uma Plataforma Nove (na qual eles estavam) e uma Plataforma Dez (logo ali), mas não havia nada entre a Plataforma Nove e a Plataforma Dez, exceto uma parede de barreira fina e pouco promissora. Uma grande clarabóia no teto deixava entrar muita luz para iluminar a falta total de qualquer plataforma nove e três quartos.

Saída (amostra)

parede de barreira. Uma grande clarabóia no céu deixava entrar muita luz para iluminar a total falta de qualquer Plataforma Nove (em que estavam) e uma Plataforma Nove (em que estavam) e uma Plataforma Nove (em que estavam) e uma Plataforma Nove e Plataforma Dez (bem perto), mas não havia nada entre a Plataforma Nove (em que estavam) e a Plataforma Nove (em que estavam) e a Plataforma Dez (bem perto), mas não havia nada entre a Plataforma Nove e Três quartos.

sundar - Restabelecer Monica
fonte
1
Mas em qual plataforma eles estavam?
Jo rei
2

Aqui está um algoritmo baseado em palavras um pouco mais sofisticado, escrito em Scala , que leva em conta as probabilidades de seqüências de palavras de comprimento arbitrário. (Esse não é o algoritmo original da imprensa dissociada .)

O algoritmo é o seguinte. Em cada etapa, selecione uma metade rolante do texto, iniciando em uma posição aleatória, procure a sequência mais longa das palavras de saída que ocorre nessa metade (pode ser 0 palavras) e imprima a próxima palavra.

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

Aqui está uma amostra de saída também gerada a partir do artigo da wikipedia sobre cadeias de markov:

Hoje, as distribuições estacionárias não serão únicas. As probabilidades satisfazem a posição direita e não a distribuição de probabilidade de transição pode ser representada mapeando apenas se os parâmetros na unidade do sistema, Permitindo que n seja único, em que i na distribuição estacionária ou medida invariante, se satisfaz a distribuição estacionária para Q.

A propósito, se você usar "[a-zA-Z .,!?]".rcomo wordregexvocê pode usar isso para gerar uma imprensa dissociada baseada em cartas:

Essa figura ou períodos em que uma probabilidade de o Estado-Membro estocar um número detelemely se houver uma classe de onde Mi pimatransie, abre que as nnn necessidades de um estado do sistema são erradas e limita todas as tarefas.

Fica realmente interessante com um arquivo de texto grande, como o arquivo Jargon . Agora, com base em cartas já é muito bom:

Outro algoritmo de direção terá erros felizes e incomuns; tem sido uma abreviação de "ser bailes de formatura e hackeamento de meta-localização com décadas construídas em torno da estação de trabalho de acesso pré-Internet do LISP Mac. Isso pode estar morto. Vários concorrentes, um compilador popular terminam repetidamente em segundo lugar e foram sanguessugas". com o encontrado na rede, especialmente a partir de uma rede.Em geral, `cliente e no Chade de volta ao papel.Vários tinham nas propriedades únicas.

Baseado em palavras torna-se bastante divertido:

Isso já foi relatado. A única coisa que espera um vazamento de recurso n. Uma construção de linguagem semi-mítica é inconsistente porque não pode se ajustar em primeiro lugar. Se você digitar um computador em um divertido e terminou Obter um computador real! criança levada . Convite sarcástico para dizer falando. Os pequenos cabos foram responsabilizados pela programação real. Pascal, dez anos depois, mas a maioria do nosso produto não é exatamente o mesmo subconjunto moderno. Há alguma disputa sobre se essa entrada é a mãe de todos.

Hans-Peter Störr
fonte
1
É sempre bom ver o código como não-destruído, mas para estar em conformidade com as regras, é necessário jogar o seu código (abreviar radicalmente os identificadores, combinar etapas intermediárias, ...). Como um bloco de código adicional, de preferência.
usuário desconhecido
Não há muito sentido nisso. Mesmo pulando pelos bastidores, não posso comparar remotamente com o nível de ofuscação do código da entrada perl. :-)
Hans-Peter Störr
Bem - se você não gosta de reduzir o tamanho, talvez queira aumentar o tamanho, para conter as importações ausentes, para que pelo menos se possa testar o programa, se funciona, sem adivinhar.
usuário desconhecido
@userunknown Opa, desculpe - eu corrigi o script.
Hans-Peter Störr 9/02/2012
2

Python 2.7, 355 caracteres

Na verdade, eu escrevi um programa como esse antes como um experimento de IA, então vamos dissecá-lo um pouco, remover algumas coisas desnecessárias e jogar com ele: 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

entrada funciona fornecendo um nome de arquivo e o comprimento da saída desejada, em palavras

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

amostra de texto trazida a você por um desafio anterior

Opcionalmente, você pode salvar o conteúdo de mum arquivo para uso posterior, para que ele não precise analisar o arquivo inteiro, pois isso pode levar mais tempo para criar o dicionário que ele faz referência às palavras, especialmente para textos maiores (como livros).

edit: independentemente de já ter sido escolhido um vencedor, eu estou postando assim mesmo: P

Blazer
fonte
0

Perl, 65 caracteres

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

Isso é fortemente baseado na resposta de JB , apenas um pouco mais. Utiliza sayuma economia brega de dois caracteres, portanto, precisa ser executada com o Perl 5.10 ou posterior e a opção -M5.010(ou -E).

A execução desse código no artigo de imprensa dissociado da Wikipedia produziu essa saída adorável:

está tudo pronto para comer. Thided Press (ou comentários. Refeed 2007-04-12-29). Refeature e preferencialmente o basto usociatualgor 1972) em diante. Especificamente após 1983, (1983, quando os alimentos foram produzidos ou usados ​​para uso público, os Prentinks também protegem um anel de vedação. Este é o seguinte). 29) Ame Jarrassocumovin o conservou. Thiss (deu um soco social com um nó nas tintas e um aplicador usa intencionalmente artigo, veja Wilet ourraymovem!

Ilmari Karonen
fonte