Дисоційована преса


12

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

Dissociated Press - алгоритм, який генерує випадковий текст із існуючого тексту.

Алгоритм починається з друку будь-яких N послідовних слів (або літер) у тексті. Потім на кожному кроці він шукає будь-які випадкові випадки в початковому тексті останніх N слів (або літер), які вже надруковані, а потім друкує наступне слово або букву.

Реалізуйте Dissociated Press, або як функцію, або як цілу програму. Найкоротший код виграє. Не використовуйте командний рядок або скрипт emacs для виклику оригінальної програми Dissociated Press. Не використовуйте жодних зовнішніх бібліотек.


2
Це особливий випадок "ланцюга Маркова" , який, на думку, може зробити хороший тег.
dmckee --- кошеня колишнього модератора

Ви хочете, щоб це працювало над словами чи літерами? Крім того, ще кілька прикладів були б корисними, я не дуже вийшов із прикладу у Вікіпедії.
Містер Лама

Відповіді:


7

Перл, 81 82

Використовує перекриття 2 символів, знижує нові рядки, зупиняється, коли стикається з тупиком.

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

Наприклад, використаний на початку тесту статті Вікіпедії для ланцюгів Маркова:

$ perl dissociated.pl markov.txt 

j (MCMCSTs wily ov chaimices suces aps) diniter → is throbabilit) у той час як statep chatility deps) fution themamences steare mat arsterionowastainnexactiond є ch модель stateatic cally dis the haidete state and hat the pout orent weenced j) визначає катез Вітіонтон анісмейкс Марков eation-zer-cated be ofteed tor a letuchainits tie fociatrin sposobnostiitins thenzyme ther matrix haing therre istativeloperizer, зроблений застосованим додатком ithanced, так керує всім, що розглядає коріони Марії n-ze Markov. Вітен і мод у тому, що застосовується Бас - пакт-капеатурропманія. Оренда може Маркова придумати їх. Ре матраг Марельд вічності. i) на, як запевнення екстенсивности, ревертикують загрозливістю, а також на постраждалих стрічкових бабінглетіалах n × n. [14] Будь-який товариш хімік, до станції. [4] Якщо тиони. Устати і впорядкування арте від ітепеальної моди на драматургіях), тобто робоботеропія, що стосується заданих класифікацій, і випробуваного вуха, впорядкованого для них, так що будьте зер 6 усіма людьми чоловіків Марті дом на сходах. Заслуговуємо на те, що у нас першими є аріальні, тоді − 1 ect thene prolarkov che ланцюг штампу. З іншого боку, гранічний клас визначається стабільністю 4/10, P ber efical requancesparrecon, у відведеному, тобто Shasse їсть пробальну погане. [Cible so cogtatioden is suate liblevare "tingenarkov clapergeran butiont: theor enegarkov conctionction thatemple tivionom togy of the форма of the thigionom togy of the форма of the thigionom togy of the form of the formal. a stat π ime stributionegiver samin th pample, tegime 20, cality delso,

Він обробляє utf-8 випадково. Прекрасна.


6

Брахілог , 45 байт

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

Спробуйте в Інтернеті!

3N+12N

Вхідні дані

Містер Вормтейл привітає професора Снейпа добрий день і радить йому вимити волосся, слизбол.

(Зразок) вихід

ormtair, стрункий хороший і радить професору професору, радить йому доброго і порадуємерець торгує шипим волоссям і радить йому добрий день, а день - шламу.


Дисоційований рівень рівня слова Натисніть лише на кілька байтів:

52 байти

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

Спробуйте в Інтернеті!

Вхідні дані

Станція Кінг-Хреста була величезною та зайнятою, стіни та підлоги були вимощені звичайною плямою, забрудненою брудом. Тут було повно звичайних людей, які поспішали зі своєю звичайною справою, ведучи звичайні розмови, які видавали багато і багато звичайного шуму. Королівський перехресний вокзал мав платформу "Дев'ять" (на якій вони стояли) та "Платформу десять" (справа поруч), але між платформою "Дев'ять" та "платформою десять" нічого не було, окрім тонкої, неперспективної бар'єрної стіни. Чудовий просвіт над головою пропускає багато світла, щоб висвітлити повну відсутність будь-якої платформи «Дев'ять і три чверті».

(Зразок) вихід

бар'єрна стіна. Чудовий просвіт над головою пропускав достатньо світла, щоб висвітлити повну відсутність будь-якої платформи «Дев’ять» (на якій вони стояли) і «Дев'ятки платформ» (на якій вони стояли) і «Дев'ятки платформи» (на якій вони стояли) і Платформа дев'ять і платформа десять (праворуч поруч), але між платформою дев'ять (на якій вони стояли) і платформою дев'ять (на якій вони стояли) і платформою десять (праворуч неподалік) нічого не було, але між платформою дев'ять і Три чверті.


1
Але на якій платформі вони були?
Джо Кінг

2

Ось дещо складніший алгоритм на основі слів, написаний у Scala , який враховує ймовірності послідовностей слів довільної довжини. (Це не оригінальний алгоритм роз'єднаної преси .)

Алгоритм такий. На кожному кроці виберіть половину тексту, що починається з випадкової позиції, знайдіть найдовшу хвостову послідовність виведених слів у цій половині (це може бути 0 слів) та виведіть наступне слово.

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

Ось зразок виводу, також створений зі статті Вікіпедії про маркові ланцюги:

сьогодні стаціонарні розподіли не будуть унікальними I ймовірності задовольняють k правильному положенню стрілки, не розподіл ймовірностей розподілу може бути представлений відображенням лише в тому випадку, якщо параметри на одиниці системи, дозволяючи n бути унікальними, в тому, що я в стаціонарному розподілі або інваріантній мірі, якщо він задовольняє стаціонарний розподіл для Q.

До речі, якщо ви використовуєте це, "[a-zA-Z .,!?]".rяк wordregexви можете використовувати це для створення також роз'єднаної преси на основі літер:

Цей фігурант або періоди, коли відновлюваність стану Pater ext із збереженням кількості делемелей, якщо тест-клас, де Mi pimatransie, відкриває, що nnn потребує системний стан, є errords, то обмежують усе завдання.

Це стає справді цікавим з великим текстовим файлом, як файл Jargon . Зараз на основі листів вже досить непогано:

Інший алгоритм напрямку буде щасливо помилками і нечастостями; це скорочення для "виходу з випускних коней та мета-локації з десятиліттями, побудованими навколо робочої станції перед доступом до Інтернету LISP Mac. Це може бути мертвим. Міра конкурентів, популярний компілятор закінчується неодноразово, і був п'явок. з мережею, що зустрічається в мережі, особливо з клієнта, як правило, "клієнт і на чаді він повертається на папір. Деякі з них мали унікальні властивості.

База слів стає досить кумедною:

Про це з тих пір повідомляється. Єдине, чого він очікує, один витік ресурсів n. Напіміфічна мовна конструкція непослідовна, оскільки вона в першу чергу не може коригуватися. Якщо ви введете комп'ютер грайливо і закінчили Отримайте справжній комп’ютер! імп. Саркастичне запрошення сказати Говорячи. Невеликий кабель звинувачували в реальному програмуванні. Паскаль через десять років, але більшість нашого продукту не зовсім та сама сучасна подоба. Існує певна суперечка щодо того, чи є цей запис усіма матір'ю.


1
Завжди приємно бачити код без гольфу, але, щоб відповідати правилам, потрібно пограти в свій код (радикально скоротити ідентифікатори, поєднувати проміжні кроки, ...). В якості додаткового кодового блоку, переважно.
користувач невідомий

У цьому немає великого сенсу. Навіть перестрибуючи обручі, я не можу віддалено порівнювати з рівнем затухання коду запису perl. :-)
Ханс-Пітер Стрер

Ну - якщо вам не подобається зменшувати розмір, можливо, вам подобається збільшувати розмір, містити відсутній імпорт, щоб можна було хоча б протестувати програму, чи працює вона, не здогадуючись.
користувач невідомий

@userunknown На жаль, я виправив сценарій.
Ганс-Пітер Штерр

2

Python 2.7, 355 символів

Я насправді раніше писав таку програму, як експеримент з AI, тому давайте просто трохи розчленуємо її, видалимо непотрібні речі та пограємо в неї: 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

введення працює, надаючи назву файлу та довжину потрібного виводу у словах

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

зразок тексту, принесений вам попереднім викликом

За бажанням ви можете зберегти вміст у mфайлі для подальшого використання, тому не потрібно розбирати весь файл, оскільки це може зайняти довші періоди часу, щоб створити словник, на який він посилається на слова, особливо для великих текстів (наприклад, книги).

редагувати: незалежно від того, чи вже був обраний переможець, я все-таки публікую його: P


0

Perl, 65 символів

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

Це багато в чому базується на відповіді JB , просто пограти трохи більше. Використовується sayдля сирного двоярусного заощадження, тому його потрібно запустити за допомогою Perl 5.10 або пізнішої версії та перемикача -M5.010(або -E).

Запуск цього коду на відокремленій друкованій статті у Вікіпедії дав цей чудовий результат:

це все, що лон їсть afteritterelessam. дюймовий прес (або pocut ents. Refeed 2007-04-12-29). Refeaturrand віддає перевагу бастовому використанню асоціативнихгор 1972) в на. Iteith specelabst ter ter 1983 is (1983 inted bittechnif loodshe samplebrither foriginto useche inteditted Prentinks alsociallin prothe the sagetter. This the nown on. Це пов’язане impastiot whe "Whe ing thm # 176. It orociame orinks algon tencyclon. (2007-04-12 29). Ame Jarrassocumovin ano sain його ot on. Це (орісотісоціальне з ноком чорнила, який аплікатор використовує інтенсивно pociaticle, lem Wilet ourraymovem!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.