Dissociated Press

12

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

Dissociated Press to algorytm generujący losowy tekst z istniejącego tekstu.

Algorytm zaczyna się od wydrukowania N kolejnych słów (lub liter) w tekście. Następnie na każdym kroku wyszukuje przypadkowe wystąpienie w oryginalnym tekście ostatnich N słów (lub liter) już wydrukowanych, a następnie drukuje następne słowo lub literę.

Wdrażaj Dissociated Press, jako funkcję lub jako cały program. Najkrótszy kod wygrywa. Nie używaj wiersza poleceń ani skryptu emacs do wywoływania oryginalnego programu Dissociated Press. Nie używaj żadnych bibliotek zewnętrznych.

Ming-Tang
źródło
2
To szczególny przypadek „łańcucha Markowa” , który, jak sugeruję, byłby dobrym tagiem.
dmckee --- były moderator kociąt
Czy chcesz, żeby to działało na słowach lub literach? Przydałoby się jeszcze kilka innych przykładów, nie wyciągnąłem wiele z przykładu z Wikipedii.
Pan Llama,

Odpowiedzi:

7

Perl, 81 82

Używa nakładania się 2 znaków, pomija nowe linie, zatrzymuje się, gdy napotyka ślepy zaułek.

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

Na przykład użyty na początku testu artykułu w Wikipedii dla łańcuchów Markowa:

$ perl dissociated.pl markov.txt 

j (MCMCSTs stan przebiegłość chaimices sukces aps) diniter → jest throbabilit) chociaż stan chrapność deps) fucja temat steare mat arsterionowastainnexactiond jest ch model stanowy cally dis the haidete state and hat pout orent weried j) definiuje cate witionton antionarks Markov casumbe Zero-cated-zero-cated beteed tor a letuchainits remis skupiający się na abilitinach, a następnie enzymu macierz, która została stworzona, została zastosowana w poprawionej aplikacji, dzięki czemu można zbadać korony Mary n-ze Markowa. Withen wite ine mod sain ph, zastosował Bas jako pacte-capeaturropmatence. Markov może je przeskoczyć. Ponowne spotkanie Mareld z wieczności. są powevelogenothe i) w sprawie zapewnienia ekstertlat reverticat grobabilition aly ons astribled lany babingletichnial n × n. [14] Dowolny partner chem, th to by stationt. [4] Jeśli tions. Ustates andisten arke ot ittepeal mod on statrages) tj. Robaboteropy cor to givenclastaties vid witiele chation mords i exament eare indred thes te wele więc zero 6 wszystkie zamówienia ludzi Marty dom wchodzi po schodach. Pozwolenie na to, aby było to możliwe, jest wtedy, gdy − 1 ect thene prolarkov che łańcuch umrzeć. Othe strate, grany classe atat the staility 4/10, P ber efical Requireparrecon, w retereted tzn. Shasse zjada probal dewiację. [Cible więc cogortatioden is suate liblevare "tingenarkov clapergeran butiont: theor enegarkov conection thatemple tivio stat π ime stributionegiver samin th pample, tegime 20, cality delso,

Obsługuje utf-8 przez przypadek. Śliczny.

JB
źródło
6

Brachylog , 45 bajtów

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

Wypróbuj online!

Poziom postaci Dissociated Naciśnij, przy N = 2 (można zmienić, zmieniając początkowe na a s gdzie indziej na np. ).N + 1 2 N.3N+12N

Wejście

Glizdogon składa profesorowi Snapeowi dobry dzień i radzi mu umyć włosy, szczupłą kulę.

(Próbka) wyjście

ormtair, szczupły dobry i doradza Profes Proftaormtair, doradza mu dobre i najlepsze oferty ogona unosi włosy i doradza mu dobry dzień i dzień, szczupła kula.


Poziom słowa Dissociated Naciśnij tylko kilka bajtów:

52 bajty

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

Wypróbuj online!

Wejście

Stacja King's Cross była ogromna i zajęta, a ściany i podłogi wyłożone były zwykłymi zabrudzonymi płytkami. Było pełne zwykłych ludzi, którzy spieszyli się ze swoim zwykłym biznesem, prowadząc zwykłe rozmowy, które generowały mnóstwo zwykłego hałasu. Stacja King's Cross miała platformę dziewiątą (na której stali) i platformę dziesiątą (tuż obok), ale między platformą dziewiątą a platformą dziesięć nie było nic oprócz cienkiej, mało obiecującej ściany barierowej. Świetne okno dachowe wpuszcza mnóstwo światła, aby oświetlić całkowity brak jakiejkolwiek Platformy Dziewięć i Trzy Czwarte.

(Próbka) wyjście

ściana barierowa. Świetne okno dachowe wpuszcza mnóstwo światła, aby oświetlić całkowity brak jakiejkolwiek Dziewiątej Platformy (na której stali) i Dziewiątej Platformy (na której stali) oraz Dziewiątej Platformy (na której stali) i Platforma Dziewiąta i Platforma Dziesięć (tuż obok), ale nic nie było między Platformą Dziewięć (na której stali) i Platformą Dziewięć (na której stali) i Platformą Dziesięć (tuż obok), ale nic nie było między Platformą Dziewiątą a Trzy kwarty.

sundar - Przywróć Monikę
źródło
1
Ale na jakiej platformie byli?
Jo King
2

Oto nieco bardziej wyrafinowany algorytm oparty na słowach napisany w Scali , który uwzględnia prawdopodobieństwa sekwencji słów o dowolnej długości. (To nie jest oryginalny zdysocjowany algorytm prasy ).

Algorytm jest następujący. W każdym kroku wybierz ruchomą połowę tekstu, zaczynając od losowej pozycji, wyszukaj najdłuższą sekwencję ogona słów wyjściowych, która występuje w tej połowie (może to być 0 słów) i wyślij następne słowo.

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

Oto przykładowe wyniki wygenerowane również z artykułu w Wikipedii na temat łańcuchów markowskich:

dziś rozkłady stacjonarne nie będą unikalne I prawdopodobieństwa spełniają pozycję k strzałki w prawo, a rozkład prawdopodobieństwa przejścia może być reprezentowany odwzorowaniem tylko wtedy, gdy parametry w jednostce systemu, Zezwalając n na unikalność, to znaczy w rozkładzie stacjonarnym lub niezmiennej miary, jeśli to spełnia rozkład stacjonarny dla Q.

Nawiasem mówiąc, jeśli używasz "[a-zA-Z .,!?]".rjak wordregexmożna to wykorzystać do wytworzenia się zdysocjowanego prasy w oparciu, a także:

Ten okres lub okresy, w których możliwość rozszerzenia Pater ext ze stochare są godne uwagi, jeśli istnieje klasa, w której Mi pimatransie, otwiera, że ​​nnn potrzebuje stanu systemowego to błędy, a następnie limpor wszystkie zadania.

To staje się naprawdę interesujące z dużym plikiem tekstowym, takim jak plik Jargon . Teraz oparty na liście jest już całkiem dobry:

Inny algorytm kierunku będzie na szczęście błędami i niezbyt często; jest to skrót od „bycia promem” i hakowania meta-lokalizacji z dziesięcioleciami zbudowanymi wokół stacji roboczej LISP Mac przed dostępem do Internetu. To może być martwe. Miara konkurentów, popularny kompilator kończący się wielokrotnie na sekundę, i był pijawką. z napotkanymi w sieci, zwłaszcza z sieci. Zwykle `klient i czad to z powrotem na papier. Kilka miało unikalne właściwości.

Bazowanie na słowie staje się dość zabawne:

Zostało to zgłoszone. Jedyne, czego oczekuje, to wyciek jednego zasobu n. Na wpół mityczny konstrukt języka jest niespójny, ponieważ nie można go w pierwszej kolejności dostosować. Jeśli wejdziesz do komputera w zabawny i zakończony Zdobądź prawdziwy komputer! imp. Sarkastyczne zaproszenie do mówienia. Mały kabel obwiniano za prawdziwe programowanie. Pascal dziesięć lat później, ale większość naszych produktów to nie ta sama nowoczesna podpowłoka. Istnieje spór, czy ten wpis jest matką wszystkich.

Hans-Peter Störr
źródło
1
Zawsze miło jest widzieć niepoddany golfowi kod, ale aby zachować zgodność z zasadami, konieczne jest sprawdzenie kodu (radykalne skrócenie identyfikatorów, połączenie kroków pośrednich, ...). Najlepiej jako dodatkowy blok kodu.
użytkownik nieznany
Nie ma w tym wiele sensu. Nawet skacząc przez obręcze nie mogę zdalnie porównać poziomu zaciemnienia kodu wpisu perla. :-)
Hans-Peter Störr,
Cóż - jeśli nie chcesz zmniejszać rozmiaru, być może chcesz zwiększyć rozmiar, aby zatrzymać brakujące importy, aby można było przynajmniej przetestować program, czy działa, bez zgadywania.
użytkownik nieznany
@ userunknown Ups, przepraszam - naprawiłem skrypt.
Hans-Peter Störr
2

Python 2.7, 355 znaków

Tak naprawdę napisałem już taki program jako eksperyment AI, więc podzielmy go trochę, usuńmy niepotrzebne rzeczy i zagrajmy w golfa: 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

Wejście działa poprzez podanie nazwy pliku i długości żądanego wyjścia, słowami

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

przykładowy tekst dostarczony przez poprzednie wyzwanie

Opcjonalnie możesz zapisać zawartość mpliku do późniejszego wykorzystania, aby nie musiał parsować całego pliku, ponieważ zbudowanie słownika, do którego się odwołuje, może zająć dłuższe okresy, zwłaszcza w przypadku większych tekstów (np. książki).

edycja: bez względu na to, czy został już wybrany zwycięzca, i tak go zamieszczam: P

marynarka
źródło
0

Perl, 65 znaków

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

Jest to w dużej mierze oparte na odpowiedzi JB , po prostu trochę więcej grałem w golfa. Używa saytandetnego oszczędzania dwóch znaków, więc należy go uruchomić w Perlu 5.10 lub nowszym i przełączniku -M5.010(lub -E).

Uruchomienie tego kodu w zdyskredytowanym artykule prasowym Wikipedii dało ten piękny wynik:

jest wszystko lon jeść afteditterelessam w. Thided Press (lub 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 intedted Prentinks alsociallin prothe a sagetter loped. To jest teraz. To skojarzony impastiot whe "Wheing thm # 176. To orociame orinks algon tencyclon. (2007-04-12 29) Ame Jarrassocumovin również nie puścił. To (orittissial i witam tusze, które aplikator używa natychmiast pociaticle, lem Wilet ourraymovem!

Ilmari Karonen
źródło