Утворіть зрозуміле речення


55

Проблема:

Утворіть речення, яке можна прочитати та зрозуміти. Він повинен містити тему, дієслово та об’єкт, а часи та множини повинні відповідати. Програма також повинна бути здатна генерувати кілька різних пропозицій, щоб кваліфікуватись.

Правила:

  • Жорстке кодування речень заборонено, і не читайте їх безпосередньо з файлу (я дивлюся на вас, нечисте м'ясо)
  • Ви можете мати будь-яку кількість списків слів
  • Надішліть приклад пропозиції або 2, створені вашою програмою
  • Будь-яка мова приймається
  • Це на , тому перемагає найвибагливіша відповідь

7
Я думаю, що з деяких відповідей зрозуміло ( MatLab, на який я дивлюся), що ви повинні модифікувати правила таким чином, щоб виведення даних не дозволяло витягувати послідовні слова з будь-якого джерела.
Карл Віттофт

Поки я буду розумним: оскільки це суто популярний конкурс, хтось повинен просто розмістити jpg-код HotModelBikini. Це набере більше голосів.
Карл Віттофт

7
Я схвалюю всіх, хто використовує повтори "буйвола" чи "риби" як зразки пропозицій!

7
Більшість відповідей тут або мої дійсні, повні пропозиції з текстових джерел, або генерують вихід, який не відповідає критеріям. Мені обидва підходи здаються суперечливими духу питання! Якщо хтось дійсно хоче справити враження, я можу запропонувати програму, яка починається з набору дійсних структур пропозицій, таких як [Adjective] [pl. noun] [verb] [adjective] [pl. noun]і витягує з реального словника (можливо, використовуючи один із API-словників, доступних там), щоб заповнити пробіли? Я б написав це сам, якби у мене залишилось кілька хвилин! :( Зрештою ...Lazy Developers Write Lousy Programs.
Брайан Лейсі

1
@Pureferret Списки слів - це списки окремих слів. Жорстким кодуванням був би список повних речень. За допомогою списків слів вам зазвичай потрібна певна логіка в програмі, щоб скласти повне речення. З твердими кодованими реченнями вам в основному просто потрібна друкована заява.
8bittree

Відповіді:


87

Баш

fgrep '/* ' /usr/src/linux* -r | cut -d '*' -f 2 | head -$((RANDOM)) | tail -1

Вимоги: джерело Linux ядра, встановлене в / usr / src

Це витягує випадкові коментарі з джерела ядра. Чи є речення зрозумілими насправді , можна обговорити.

Приклади фактичного випуску:

  • end of packet for rx
  • I don't know what to do
  • 256 byte packet data buffer.
  • The rest of this junk is to help gdb figure out what goes where
  • Convert page list back to physical addresses, what a mess.
  • ???
  • Only Sun can take such nice parts and fuck up the programming interface

12
Хороший! Ви повинні витягнути їх усіх і подати як офіційну fortuneбазу даних.
Джейсон C

18
"???" найкращий коментар коли-небудь
Рей

4
Чи не порушено перше правило "чи читання їх безпосередньо з файлу"?
kuldeep.kamboj

6
Я б сказав, що пошук через вихідний код системи та фільтрація тексту з коментарів насправді не зараховуються до "читання безпосередньо".
Бунт

7
і Slave Overflow. приємне ім’я для веб-сайту SE
TheDoctor

95

Матлаб

why

Приклад результатів:

>> why
The programmer suggested it.
>> why
To please a very terrified and smart and tall engineer.
>> why
The tall system manager obeyed some engineer.
>> why
He wanted it that way.

[Це одне з великодніх яєць Матлаба]

EDIT: код цієї функції ви можете побачити тут: why.m


3
код ви можете побачити тут: opg1.ucsd.edu/~sio221/SIO_221A_2009/SIO_221_Data/Matlab5/…
Єлисей

8
Другий приклад - це не речення. Це інфінітивна фраза.
wchargin

2
Потрібно, щоб відповіді тут не мали лише речень (наприклад, подивіться інші відповіді, які голосують високо). Завдання не говорить про те, що воно повинно створювати лише речення, воно повинне вміти створювати речення.
Єлисей

51

PHP

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

Рядок 'TOS...'забезпечує логарифмічну шкалу частот літер, щоб вони більше відповідали англійській мові. Це використовується для створення більшого рядка з приблизними відносними частотами літер.

$a = ord('A');
$s = '';

foreach (str_split('TOSRWQPPUALRQTTRGUUUQMMLMFZ') as $i=>$f)
{
    if (!ctype_alpha($c = chr($a + $i)))
        $c = ' ';
    $s .= str_repeat($c, round(exp((ord($f) - $a) / 3.976)));
}

$l = strlen($s) - 1;
for (;;)
    echo substr($s, mt_rand(0, $l), 1);

Запустивши його, я виявив такі літературні дорогоцінні камені, як:

  • GO NOW- Ви як суб'єкт мається на увазі.
  • IM AOK - Я добре
  • IM FDR - Я F (ранглін) D (елеано) R (оосвельт)

Крім того, численні підказки коротко висловлюють незадоволення поточною ситуацією. [Деякі листи відредаговані.]

  • F**K
  • S**T

Крім того, наступне використання тонкого налаштування масштабування:

  • IS IT ON
  • I AM STU
  • I SEE HTML

60
Чому, купа мавп могла зробити те саме!
Тім С.

11
Мені подобається! Тепер зробіть програму, яка обробляє букви, що виходять із цього, і знаходить зрозумілі речення! :)
TheDoctor

2
+1 - якісь шанси автоматизувати розкривальну частину? Завдання було, здавалося б, скласти * одне * (?) Речення. BTW: скільки часу ви витратили;)
Вовк

20
Як ви отримали F**Kі при S**Tумови , що немає *в 'ABCDEFGHIJKMLNOPQRSTUVWXYZ '?
glglgl

3
@Ypnypn - 'TOS...'рядок представляє частоту кожної літери в логарифмічній шкалі. Так Aмає частоту T, Bмає частоту O. Jмає найнижчу частоту, Aщо перекладається на 0, з яких зворотний лог - 1. Останнім символом є простір, який має частоту Z, або круглий (exp (25 / 3.976)) = 538, тому пробіли трапляються в 538 разів частіше, ніж J. Просто подумав, що це завдало акуратного повороту проблеми мавпи на машинці .

42

С

char*strerror(),i;main(){for(;--i;)puts(strerror(i));}

Приклад виводу:

Програмне забезпечення викликало зв'язку перервати
Перерваний системний виклик повинен бути перезапущений

Існує також безліч дійсних висновків речень, у яких немає предмета, дієслова та об'єкта:


Файл закінчений, таймер закінчився


як і коли це припиняється? (так, але я не розумію, чому)
phil294

1
@Blauhirn умова завершення циклу --iоцінюється як false, коли i(змінна типу charз початковим значенням 0) знову досягає 0. Якщо charне підписано (наприклад, ARM), iвін негайно завершиться до свого найбільшого значення (як правило, 255) і відлічить до 0. Якщо charвін підписаний (більшість систем Intel), поведінка суворо говорить не визначеним, але зазвичай після досягнення мінімального значення ( як правило, -128) вона завершиться до максимуму (зазвичай 127) і відлічить до 0. Тож програма зазвичай друкує 256 рядків.
екатмур

37

Java

Витягує вступне речення із випадкової статті у Вікіпедії:

import java.io.InputStream;
import java.net.URL;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

public class RandomSentence {
    public static void main (String[] args) throws Exception {
        String sentence;
        do {
            InputStream in = new URL("https://en.wikipedia.org/wiki/Special:Random").openStream();
            Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
            String intro = doc.getElementsByTagName("p").item(0).getTextContent();
            sentence = intro.replaceAll("\\([^(]*\\) *", "").replaceAll("\\[[^\\[]*\\]", "").split("\\.( +[A-Z0-9]|$)")[0];
        } while (sentence.endsWith(":") || sentence.length() < 30 || sentence.contains("?"));
        System.out.println(sentence + ".");
    }
}

Іноді вам стає нещасливим; Я намагаюся мінімізувати це, встановивши мінімальну довжину речення та відфільтрувавши речення, які закінчуються на ":" (усі сторінки розбіжностей починаються таким чином) або містять "?" (мабуть, існує багато статей з невирішеною невідомою інформацією, позначеними знаками запитання). Межі вироку - це період, за яким слід пробіл, а потім цифра або велика літера.

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

  • Idle Cure - це рок-арена на арені з Лонг-Біч, штат Каліфорнія.
  • Самофокусування - це нелінійний оптичний процес, викликаний зміною показника заломлення матеріалів, що піддаються інтенсивному електромагнітному випромінюванню.
  • TB10Cs4H3 є членом H / ACA-подібного класу некодуючої молекули РНК, які направляють місця модифікації уридинів до псевдоуридинів РНК субстрату.
  • Шестиголовий Дикий Баран у шумерській міфології був одним із героїв, загиблих у Стародавньому Іраку Нінурта, бога-покровителя Лагаша.
  • Цукровий тато - це сленговий термін для чоловіка, який пропонує підтримати типово молодшу жінку чи чоловіка після встановлення відносин, які зазвичай є сексуальними.
  • Об'єднана методистська церква Old Bethel розташована за адресою 222 Calhoun St., Чарлстон, Південна Кароліна.
  • Дуглас Гірс - американський композитор.

Якщо ви помітили будь-які проблеми з граматикою, то це винна, що ви не старанний редактор Вікіпедії! ;-)


4
Однозначно є різниця між "дійсним" і "зрозумілим". У вас тут є псевдоуридини субстрату, дитина.
Джейсон C

1
Я отримав це вперше, коли запустив це: Echinolittorina africana / Litorina africana Philippi, 1847 / Litorina decollata Philippi, 1847 / Littorina africana / Littorina perplexa Turton, 1932 / Nodilittorina africana./ Здається, є кілька сторінок Вікі, які слід виключити зі своєї пошук! ;) Ха-ха! OMG, вдруге я його запустив, він повернув рядок зі сторінки Вікі Михайла Горбачова. Хто поділяє моє ім’я. Досить вигадливий.
mikhailcazi

2
'/' Насправді не було! Ха-ха: PI використовував це для представлення нових ліній. Можливо, я повинен використовувати \ n Це звідси: en.wikipedia.org/wiki/Afrolittorina_africana . Стіл праворуч, під синонімами :) Як би там не було погане враження, тож не хвилюйтесь, адже та справа Михайла Горбачова була досить крутою. І всі речення після цього були нормальними.
mikhailcazi

2
Ви можете знайти цю відповідь фізики цікавим, останнім співавтором однієї з цих статей.
EP

2
Це може бути один поширений, але вкрай неінтуїтивний аспект вірогідності: події одного мільйона можуть бути досить поширеними у світі з мільярдами людей. Це сказало, що я не впевнений, що сказав би офіційний аналіз. Я також був досить здивований! Ви також можете відзначити, що жодного іншого хлопця не бере участь.
EP

34

Soooo ... Оскільки це , я розважався evalз функціями та з ними. В основному я генерую випадкове число, а потім виконую випадкову функцію на основі цього числа (у вашому обличчі switch!) Через eval.

PHP, ~ 9k дійсних результатів

<?php

//Subjects
function s1(){ echo "I "; $m = rand(1,20); eval ("v".$m."(0);");}
function s2(){ echo "You "; $m = rand(1,20); eval ("v".$m."(0);");}
function s3(){ echo "He "; $m = rand(1,20); eval ("v".$m."(1);");}
function s4(){ echo "She "; $m = rand(1,20); eval ("v".$m."(1);");}
function s5(){ echo "We "; $m = rand(1,20); eval ("v".$m."(0);");}
function s6(){ echo "They "; $m = rand(1,20); eval ("v".$m."(0);");}

//Verbs
function v1($n){ echo "want"; if($n==1)echo"s"; echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v2($n){ echo "need"; if($n==1)echo"s"; echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v3($n){ echo "ha"; if($n==1){echo"s";}else{echo"ve";} echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v4($n){ echo "wanted to "; $z = rand(1,10); eval ("a".$z."();");}
function v5($n){ echo "needed to "; $z = rand(1,10); eval ("a".$z."();");}
function v6($n){ echo "had to "; $z = rand(1,10); eval ("a".$z."();");}
function v7($n){ echo "eat"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v8($n){ echo "think"; if($n==1)echo"s"; echo " about "; $w = rand(1,20); eval ("o".$w."();");}
function v9($n){ echo "ate "; $w = rand(1,20); eval ("o".$w."();");}
function v10($n){ echo "thought about "; $w = rand(1,20); eval ("o".$w."();");}
function v11($n){ echo "draw"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v12($n){ echo "drew "; $w = rand(1,20); eval ("o".$w."();");}
function v13($n){ echo "smell"; if($n==1)echo"s"; echo " like "; $w = rand(1,20); eval ("o".$w."();");}
function v14($n){ echo "shot "; $w = rand(1,20); eval ("o".$w."();");}
function v15($n){ echo "destroy"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v16($n){ echo "destroyed "; $w = rand(1,20); eval ("o".$w."();");}
function v17($n){ echo "melt"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v18($n){ echo "saw "; $w = rand(1,20); eval ("o".$w."();");}
function v19($n){ echo "ha"; if($n==1){echo"s";}else{echo"ve";} echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v20($n){ echo "had "; $w = rand(1,20); eval ("o".$w."();");}

//Auxiliaries
function a1(){ echo "punch "; $w = rand(1,20); eval ("o".$w."();");}
function a2(){ echo "drive "; $w = rand(1,20); eval ("o".$w."();");}
function a3(){ echo "mount "; $w = rand(1,20); eval ("o".$w."();");}
function a4(){ echo "see "; $w = rand(1,20); eval ("o".$w."();");}
function a5(){ echo "have "; $w = rand(1,20); eval ("o".$w."();");}
function a6(){ echo "eat "; $w = rand(1,20); eval ("o".$w."();");}
function a7(){ echo "stun "; $w = rand(1,20); eval ("o".$w."();");}
function a8(){ echo "kiss "; $w = rand(1,20); eval ("o".$w."();");}
function a9(){ echo "Ted "; $w = rand(1,20); eval ("o".$w."();");} //See "How I met Your Mother" for further informations :)
function a10(){ echo "blow "; $w = rand(1,20); eval ("o".$w."();");}

//Objects
function o1(){ echo "a cow!<br>";}
function o2(){ echo "a meatball!<br>";} 
function o3(){ echo "a car!<br>";} 
function o4(){ echo "shoes!<br>";} 
function o5(){ echo "pigs!<br>";} 
function o6(){ echo "a telephone!<br>";} 
function o7(){ echo "some bottles of water!<br>";} 
function o8(){ echo "a laptop!<br>";} 
function o9(){ echo "my shorts!<br>";} //Quote needed
function o10(){ echo "anchovies!<br>";}
function o11(){ echo "an alarm clock!<br>";}
function o12(){ echo "every second!<br>";}
function o13(){ echo "until the end!<br>";}
function o14(){ echo "sitting!<br>";}
function o15(){ echo "a sword!<br>";}
function o16(){ echo "fire!<br>";}
function o17(){ echo "the dust!<br>";}
function o18(){ echo "in the bedroom!<br>";}
function o19(){ echo "a poor ant!<br>";}
function o20(){ echo "a pencil!<br>";}

//Testing
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");

?>

Деякі результати ...

She draws a sword!
They thought about sitting!
You eat my shorts!
He wanted to Ted a cow!
You want to mount a poor ant!
She smells like anchovies!
He wanted to have shoes!
They wanted to see a pencil!

@ nyuszika7h, PHP_EOLколи-небудь дорівнює \nабо \r\n, залежно від операційної системи, але ніколи <br>або подібне.
timmyRS

@timmyRS Так, ти маєш рацію, це старий коментар, я не знаю, чому я це писав у той час.
nyuszika7h

33

PHP + Проект Гутенберг

Я написав сценарій PHP, який перетворює звичайний текстовий документ у набір словограмів , які він потім використовує для генерації випадкових пропозицій. Ось декілька кращих прикладів, які він отримав з усієї простої текстової версії промови Патріка Генрі "Дай мені свободу чи дай мені смерть" , включаючи невеликий друк проекту Gutenberg:

  • Проект "Гутенберг" Етекст націй та рабства!

  • Просимо вибачення за 200-річчя цього Малого Друку!

  • У вас немає жодних інших гарантій будь-якого виду, експресивного чи інцидентного ураження, але для мене смерть!

Ви можете спробувати це тут. Оновіть сторінку для нової партії пропозицій.

Якщо ви хочете запустити вихідний код самостійно, не забудьте завантажити $src_textсвій обраний звичайний текст.

<html>
<head>
<title>Give Me Liberty Or Give Me Death</title>
<style>
body { margin:4em 6em; text-align:center; background-color:#feb; }
h1 { font-weight:normal; font-size:2em; margin-bottom:2em; }
blockquote { font-style:italic; }
</style>
</head>
<body>
<h1>A collection of quotes randomly generated from Patrick Henry's speech
<a href="http://www.gutenberg.org/ebooks/6">Give Me Liberty Or Give Me Death</a>
(and its accompanying Project Gutenberg blurb).</h1>
<?php

/* Give Me Liberty Or Give Me Death */
/* Plain text available from http://www.gutenberg.org/ebooks/6 */
$src_text = file_get_contents('libertyordeath.txt');

$bigrams = array();
$openers = array();
$loc = 0;
$new_sentence = true;
$last = false;
while (preg_match('/\'?\w+[^\s\[\]\*\(\)"#@]*/',$src_text,$matches,PREG_OFFSET_CAPTURE,$loc)) {
  $w = $matches[0][0];
  $loc = $matches[0][1]+strlen($w);
  $bareword = preg_replace('/\W/','',$w);
  if ($last) {
    if (!isset($bigrams[$last][$w])) $bigrams[$last][$w] = 1;
    else $bigrams[$last][$w]++;
  }
  if (!isset($bigrams[$bareword])) $bigrams[$bareword] = array();
  $last = $bareword;
  if ($new_sentence && preg_match('/^[A-Z]/',$w)) {
    if (!isset($openers[$w])) $openers[$w] = 1;
    else $openers[$w]++;
    $new_sentence = false;
  }
  if (ends_sentence($w)) {
    $new_sentence = true;
    $last = false;
  }
}

/* Now generate ten random sentences */

for ($ns=0; $ns<10; $ns++) {

  echo "<blockquote><p>";

  /* Choose a starting word */

  $sum = 0;
  foreach ($openers as $w=>$c) $sum += $c;
  $r = mt_rand(0,$sum);
  foreach ($openers as $w=>$c) {
    $r -= $c;
    if ($r<=0) break;
  }

  /* Barf out additional words until end of sentence reached */

  while(1) {
    echo "$w ";
    if (ends_sentence($w)) break;
    $bareword = preg_replace('/\W/','',$w);
    $sum = 0;
    foreach ($bigrams[$bareword] as $w=>$c) $sum += $c;
    $r = mt_rand(0,$sum);
    foreach ($bigrams[$bareword] as $w=>$c) {
      $r -= $c;
      if ($r<=0) break;
    }
  }

  echo "</p></blockquote>\n";
}

function ends_sentence($w) {
  if (!preg_match('/[\.\?!]$/',$w)) return false;
  if (preg_match('/^(\w|St|Mr|Ms|Mrs|Messrs|i\.e|e\.g|etc|Rd)\./i',$w)) return false;
  return true;
}

?>
</body>
</html>

+10 Цей справді відчуває дух виклику! Зараз я не можу його знайти, але раніше існував онлайн-генератор пропозицій на базі Google, який працював аналогічно, але біграми (або необов'язково більші n-грами) були отримані з результатів пошуку Google шляхом пошуку слова та спостереження що було за ним у фрагментах попереднього перегляду результатів пошуку. Можливо, я його відтворять і опублікую тут.
Джейсон C

Як щодо цього! "Сер, ми знаходимо, хто із задоволенням покращив конкурс". Або цей! "Вони говорять нам про повернення жахливого моменту для покращення частини" Етексту 6 "Дата останнього оновлення: 5 травня 2005 р. Офіційно випущено лише для наших боїв"
Hosch250

1
But for me, death!: DI бажаю, щоб усі ліцензії / угоди закінчувалися так сильно.
Навін

Ха-ха, "Офіційно випущений лише для наших боїв".
Джейсон C

1
Я отримав "Нічого". :(
TheNumberOne

29

Пітон

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

Він створює кілька майже здорових тверджень:

The snigger westernizes the bacteriologist.
A drizzle stoked the sentiments.

Багато божевільних:

Tipper's orthopaedic knitwear plates a payroll.
A fibula teletypewritered a yogi.
The protozoan's spiralling skydive coats this veterinarian

І багато чого, що звучить як Monty Python, роблячи легкі натяки:

That rolling indictment tarries some bang's bulge.
Some inflammatory tush's intermarriage sextants some postman.
Some pentagon's manufacturer squeaked the wolverine.
A disagreeable participant is entertaining my optimized spoonful.

Версія 3 була змінена, щоб прийняти будь-який текстовий файл як вхідний:

$ man python | python words.py
The disabled comma-separated source is using those wizards at exit.
$ cat COPYING | python words.py  #GPL
My user accord actions a gnu of software.
$ cat pg2591.txt | python words.py #Grimm's Fairy Tales 
Some bargain receives my threepence.
Any wrong worms your world.
$ cat words.py | python words.py #self reflection
Your filter_possesive not_nouned those prepositions.
$ ls /usr/bin | python words.py  #directory lists
Their dropbox funziped an arch.

Код (версія 3) :

import random
import string
import sys
import re

#words = open("/usr/share/dict/words").readlines()
words = re.sub("[]:;.,:?!<>{}()|=\"`[]",' ',sys.stdin.read(),flags=re.M).split()
words = list(set(words))

articles=('','a ','the ','some ','this ','that ','my ','any ','your ','their ',
             'all ','more '
             'an ') #an must be last
pl_articles=('','some ','those ','many ','the ','these ')
prepositions = ('of','by','to','for','from','in','with','on','which','when','at',
                     'into','as','if','near')
conjunctions = ('and','or','but')
verbs = ('is','are','was', 'be','do','came','been','had','have')
pronouns_s = ('he','she','it','we','you')
pronouns_o = ('him','her','them')

possesive=False
modifiers=0
use_prep = None

MAX_MODIFIERS=2

def is_modifier(w):
    return ("'" in w or
        w[-2:] in ('ry','ed','er','ic','al')  or
        w[-3:] in ('ing','est','ble','ous') or
        w[-4:] in ('less','ical','mmon') )

def is_verb(w):
    return (w in verbs or 
        w[-2:] in ('ed',) or
        w[-3:] in ('ing','ize') )

def is_article(w):
    return w+' ' in articles or w+' ' in pl_articles

def is_conjunction(w):
    return w in conjunctions

def filter_possesive(w,always=False): 
    global possesive
    #allow only one
    result = True if "'" in w else False
    if result:
        if always: return False
        if not possesive: 
            possesive = True
            return False
    return result

def is_preposition(w):
    global use_prep
    if w in prepositions:
        use_prep = w
        return True
    return False

def is_adverb(w):
    return w[-2:]=='ly'

def is_gerund(w):
    return w[-3:]=='ing'

def is_plural(w):
    return w[-1]=='s'

def not_verb(w):
    return (w in ('you','they','our','yes') or 
              w[-4:] in ('ness','such') or
              w in pronouns_o or w in pronouns_s
              )

def not_noun(w):
    return (w in verbs)


def getword():
    while True:
        w=words[random.randrange(len(words))].rstrip()
        if w[0] in string.ascii_uppercase: continue
        if is_article(w) or is_preposition(w):  continue
        if filter_possesive(w): continue 
        #print w
        return w

def get_article():
    return articles[random.randrange(len(articles)-1)]

#print '--s--'
substr=''
conjunction = False
while True:
    w=getword()
    if is_modifier(w):
        if modifiers < MAX_MODIFIERS:
            substr+=w+' '
            modifiers+=1
        else: continue
    elif is_adverb(w) or is_plural(w) or not_noun(w): continue
    else:
        if is_conjunction(w): 
            conjunction = w
            continue    
        substr= substr+w+' '
        if conjunction:
            substr+=conjunction+' '
            conjunction = False
            continue
        if w in pronouns_s: 
            substr = w+' '
            art=''
        else:
            art = get_article()
            if art is 'a ' and substr[0] in 'aeiou': art='an '
        substr= string.capwords(art+substr,'.')
        break

#print '--v--'
verbstr=''
while True:
    w=getword()
    if not_verb(w) or filter_possesive(w,True): continue
    elif is_adverb(w): verbstr+=w+' '
    elif is_gerund(w):
        verbstr+='is '+w+' '
        break
    elif is_verb(w):
        verbstr= verbstr+w+' '
        break
    elif is_modifier(w) or is_conjunction(w): continue
    else:
        if not is_plural(w):
            w=w+'ed' if w[-1]!='e' else w+'d'
        verbstr= verbstr+w+' '
        break

#print '--o--'
obstr=''
conjunction = False
while True:
    w=getword()
    if is_modifier(w):
        if modifiers<MAX_MODIFIERS:
            obstr+=w+' '
            modifiers+=1
        else: continue
    elif is_adverb(w) or not_noun(w) or w in pronouns_s: continue
    else:
        if is_conjunction(w): 
            conjunction = w
            continue
        obstr = obstr+w
        if conjunction:
            obstr+=' '+conjunction+' '
            conjunction = False
            continue
        if is_plural(w):
            art = pl_articles[random.randrange(len(pl_articles))] 
        else:
            art = articles[random.randrange(len(articles)-1)] 
            if art is 'a ' and obstr[0] in 'aeiou': art='an '
        if w in pronouns_o:
            obstr=w
        else:
            obstr= art+obstr
        break

#print '--p--'
while use_prep:
    w=getword()
    if (is_modifier(w) or is_preposition(w) or 
         is_gerund(w) or not_noun(w) or is_conjunction(w)):
        continue
    obstr+=' '+use_prep+' '+w
    use_prep=None

print substr+verbstr+obstr+'.'

3
Прикладні речення змушують мене так сильно сміятися, я плачу! xD
mikhailcazi

cat FILE | COMMAND? UUOC ;)
nyuszika7h

Дякую @ nyuszika7h, сьогодні я щось дізнався. Порушити звичку, що старому може бути важко, хоча ...
AShelly

1
This smoke toasted some nonresidents.. WOAH.
phil294

25

Баш

Натхненний відповіддю Матлаба. Припускає, що ви aptitudeвстановили.

r=$[ RANDOM % 7 ]
a=''
for i in `seq $r`; do a=$a'v'; done
if [ $r -ne 0 ]; then a='-'$a; fi
aptitude $a moo

Можливі результати (скріншот із цієї статті у Вікіпедії)

введіть тут опис зображення


7
Я не думаю . /----\ -------/ \ / \ / | -----------------/ --------\ ----------------------------------------------, що виправдане речення.
svick

1
@svick you winможе бути реченням (об'єкт "аргумент" мається на увазі). І навіть якщо це не так, питання не забороняє випадків, коли вихід не є дійсним.
ace_HongKongIndependence

23

Пітон:

import random
l = ['Buffalo']
while random.randint(0,5) > 0:
    l.append('buffalo')
print ' '.join(l) + '.'

Зразки:

  • Буйвол буйволів буйволів.
  • Буффало буйволів буйволів буйволів буйволів буйволів буйволів буйволів буйволів.

На жаль, він має дещо погану обробку пунктуації та великої літери, але знову ж таки, вони не були вказані як вимоги.

Також, ось довідка.


3
Не додайте пробілів до літератури буйволів; замість цього використовувати ' '.join(l). Це дозволить позбутися простір. Потім можна просто додати період.
Blacklight Shining

@BlacklightShining Оновлено його. Дякую за пропозицію.
8bittree

Ласкаво просимо. І +1 для буйволів. :)
Blacklight Shining


1
Висловлено за допомогою itertools ,print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
nmclean

16

Іржа + Токі Пона

Будь-яка мова прийнята, тому я написав програму в Rust, яка генерує деякі пропозиції в Toki Pona .

Токі Пона - це спроба створити мінімальну природну мову, і вона має надто просту і регулярну граматику. Це дуже корисна властивість для цього конкурсу!

use std::rand;

#[deriving(Rand)]
struct Phrase { a: Option<~GNominal>, b: ~Sujet, c: ~Predicat }

#[deriving(Rand)]
enum Sujet { A(~GNominal), B(~SCompose) }

#[deriving(Rand)]
enum Predicat { C(~GVerbal), D(~PCompose) }

#[deriving(Rand)]
struct SCompose { a: ~Sujet, b: ~Sujet }

#[deriving(Rand)]
struct PCompose { a: ~Predicat, b: ~Predicat }

#[deriving(Rand)]
struct GNominal { a: ~nom::Nom, b: Multi<~adjectif::Adjectif> }

#[deriving(Rand)]
struct GVerbal { a: ~verbe::Verbe, b: Multi<~adjectif::Adjectif>, c: Multi<~ODirect> }

#[deriving(Rand)]
struct ODirect { a: ~GNominal}

#[deriving(Rand)]
enum Multi<T> { Zero, One(T), Two((T,T)) }

mod nom {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Nom {akesi,ala,ale,anpa,ante,ijo,ike,ilo,insa,jaki,jan,jo,kala,kalama,kama,kasi,ken,kili,kiwen,ko,kon,kule,kulupu,lape,lawa,len,lete,linja,lipu,luka,lupa,ma,mama,mani,meli,mi,mije,moku,moli,monsi,mun,musi,mute,nanpa,nasin,nena,nimi,noka,oko,olin,ona,pakala,pali,palisa,pana,pilin,pimeja,pini,pipi,poka,poki,pona,seli,selo,sewi,sijelo,sike,sina,sinpin,sitelen,sona,soweli,suli,suno,supa,suwi,tan,tawa,telo,tenpo,toki,tomo,tu,unpa,uta,utala,walo,wan,waso,wawa,weka,wile}
}

mod verbe {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Verbe {ante,awen,ijo,ike,jaki,jan,jo,kalama,kama,ken,kepeken,kule,kute,lape,lawa,lete,lili,lon,lukin,moku,moli,musi,mute,nasa,olin,open,pakala,pali,pana,pilin,pimeja,pini,pona,seli,sin,sitelen,sona,suli,suwi,tawa,telo,toki,tu,unpa,utala,wan,wawa,weka,wile,}
}

mod adjectif {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Adjectif {ala,ale,anpa,ante,awen,ike,insa,jaki,jan,jelo,kama,kin,kiwen,kon,kule,kute,kulupu,lape,laso,lawa,lete,lili,linja,loje,luka,lukin,mama,meli,mi,mije,moli,monsi,mun,musi,mute,nasa,ni,olin,ona,pali,pimeja,pini,poka,pona,sama,seli,sewi,sike,sin,sina,suli,suwi,taso,tawa,toki,tomo,unpa,uta,walo,wan,wawa,weka,wile,}
}

impl ToStr for Phrase {
    fn to_str(&self) -> ~str {
        self.a.as_ref().map_or(~"", |g| format!("{:s} la ", g.to_str()))
        + format!("{:s} li {:s}", self.b.to_str(), self.c.to_str())
    }
}

impl ToStr for Sujet {
    fn to_str(&self) -> ~str {
        match *self {
            A(ref v) => v.to_str(),
            B(ref v) => v.to_str(),
        }
    }
}

impl ToStr for Predicat {
    fn to_str(&self) -> ~str {
        match *self {
            C(ref v) => v.to_str(),
            D(ref v) => v.to_str(),
        }
    }
}

impl ToStr for SCompose {
    fn to_str(&self) -> ~str {
        format!("{:s} en {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for PCompose {
    fn to_str(&self) -> ~str {
        format!("{:s} li {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for GNominal {
    fn to_str(&self) -> ~str {
        format!("{:s} {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for GVerbal {
    fn to_str(&self) -> ~str {
        format!("{:s} {:s} {:s}", self.a.to_str(), self.b.to_str(), self.c.to_str())
    }
}

impl ToStr for ODirect {
    fn to_str(&self) -> ~str {
        format!("e {:s}", self.a.to_str())
    }
}

impl<T: ToStr> ToStr for Multi<~T> {
    fn to_str(&self) -> ~str {
        match *self {
            Zero => ~"",
            One(ref v) => v.to_str(),
            Two((ref v,ref w)) => format!("{:s} {:s}", v.to_str(), w.to_str()),
        }
    }
}

fn main() {
    let phrase = rand::random::<Phrase>();
    println!("{:s}\n{:?}", phrase.to_str(), phrase);
}

Я не розмовляю з Токі Поною, але синтаксис Токі Пони знайшов як набір правил БНФ у Вікіпедії. Я створив одну структуру або перерахунок для кожного правила BNF, і я зазначав їх за допомогою deriving(Rand), що дає мені можливість генерувати випадкову Phraseструктуру безкоштовно! Потім я реалізував ToStrдля кожної з цих структур перетворення їх у рядок.

Я навмисно залишив назви структури французькою мовою, тому що правила BNF, які я знайшов, є французькою мовою, а також тому, що це відновлює багатомовність мого подання!

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

Деякі результати та їхні переклади, які я робив на основі правил BNF та словника Toki Pona . Я впевнений, що ці переклади здебільшого неправильні, але Токі Пона фактично залишає багато місця для тлумачення речення.

nasin mi tawa la jan li jaki

Під час моєї поїздки хтось забруднив

monsi li jaki li jan ike musi

Сідниця брудна і смішна погана людина

sina li tawa ale jelo e kili tawa e insa

Ви перемістили фрукти та центр у жовтий Всесвіт

Випуски

  • Я не перевіряю, чи дієслово перехідне чи ні, тому деякі речення є граматично неправильними.
  • Деякі структури є рекурсивними, і коли правило можна повторити, я випадковим чином вибираю 0, 1 або 2 елементів. Це може призвести до того, що veeeeeery давно створює пропозиції, що містять тисячі слів ...
  • Я не можу реально перевірити достовірність результату, я повністю покладаюся на синтаксис BNF, словник та власні дикі здогадки :)

1
sina li tawa ale jelo e kili tawa e insa == "Ви перемістили фрукти та центр у жовтий всесвіт" Досить добре для машини, зазвичай лише передові користувачі tp можуть використовувати трансформативні конструкції.
MatthewMartin

1
monsi li jaki li jan ike musi == Сідниця (дупа? як у ривку?) брудна та смішна погана людина.
MatthewMartin

1
Привіт, дякую за ваші коментарі, @MatthewMartin! Я, звичайно, не очікував, що спікер Toki Pona перегляне моє подання, але я радий знати, що ці сенси не є повним безглуздям :)
barjak

Підказка: Це не кодовий гольф.
nyuszika7h

1
@ nyuszika7h Я не впевнений, яка мета вашого коментаря. Дійсно, це не кодовий гольф, оскільки це змагання за популярність.
barjak

14

Пітон

import this


The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

7
Чи можете ви заперечити, що це import antigravityпризводить до результатів I LEARNED IT LAST NIGHT! EVERYTHING IS SO SIMPLE!? : D
ace_HongKongIndependence

Безперечно, так.
Рена Лідер

14

Пролог

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

Ця версія має досить обмежену лексику та структуру речень, але її слід досить легко розширити.

Код:

% Define the vocabulary
verb(V) :- V = 'eats' | V = 'fights' | V = 'finds'.
subj_pronoun(P) :- P = 'he' | P = 'she' | P = 'it'.
obj_pronoun(P) :- P = 'him' | P = 'her' | P = 'it'.
name(N) :- N = 'alice' | N = 'bob'.
noun(N) :- N = 'cat' | N = 'door' | N = 'pen'.
article(H) :- H = 'the' | H = 'a'.

% Grammar
subject_phrase_short(H) :- subj_pronoun(H)
                         | name(H).
% Subordinate clause. Don't use verb_phrase here to avoid recursive clauses.
sub_clause([Which, Verb|T], Rest) :- Which = 'which', verb(Verb),
                                     object_noun_phrase_short(T, Rest).
subject_phrase([H|T], Rest) :- subject_phrase_short(H), Rest = T.
object_noun_phrase_short([A, N | T], Rest) :- article(A), noun(N), Rest = T
                                            | obj_pronoun(A), Rest = [N|T].
object_phrase(L, Rest) :- object_noun_phrase_short(L, Rest)
                        | object_noun_phrase_short(L, Rest1), sub_clause(Rest1, Rest).
verb_phrase([H|T], Rest) :- verb(H), object_phrase(T, Rest).
sentence(S) :- subject_phrase(S, Rest), verb_phrase(Rest, []).

Запустіть цей запит:

sentence(L).

генерувати всі можливі речення цією мовою.

Деякі вибірки:

L = [he, eats, the, cat] ;
L = [she, finds, a, door] ;
L = [alice, fights, the, door] ;
L = [he, fights, the, cat, which, eats, the, pen] ;
L = [alice, eats, him, which, finds, the, cat] ;

(EDIT: Дозволити підпорядковані пропозиції об’єкта).


1
Будь-який приклад речення виводить?
TheDoctor

Так, я поставив у відповідь кілька зразків. Це генерує 2520 результатів в цілому, хоча я не можу їх розмістити всі ...
chrisd

11

Пітон

Як відомо, ви можете зробити що-небудь у python за допомогою декількох imports. Це просте завдання можна виконати за допомогою цього сценарію python у двох рядках.

import random

print ("I like the number "+str(random.uniform(0,1)))

Кількість речень, породжених цим сценарієм, є величезною: 10^12різні пропозиції. Якщо для читання сенсеса вам знадобиться ~ 0,5 сек, то для їх читання знадобиться більше 15000 років!

Деякі зразкові пропозиції:

  • I like the number 0.444371877853
  • I like the number 0.358614422548

І все ж усі створені речення містять предмет, дієслово та предмет.

ОНОВЛЕННЯ:

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

import random

print ('I like the number'+''.join([' '+{'0':'zero','.':'point','1':'one','2':'two','3':'three','4':'four','5':'five','6':'six','7':'seven','8':'eight','9':'nine'}[digit] for digit in str(random.uniform(0,1))])+'.')

Ось кілька прикладних пропозицій:

  • I like the number zero point six three five nine zero eight one five eight four two four.
  • I like the number zero point four nine zero eight four four three two zero six two seven.

Я не можу знайти у вашому словнику деякі ваші слова
Dr. belisarius,

5
Я налаштував своє програмне забезпечення, щоб краще відповідати вашому поганому словнику.
Антоніо Рагагнін

2
Гаразд. Через 15000 років я пошлю, щоб засвідчити, що я їх усіх знайшов
д-р belisarius,

10

Гра з внутрішнім словником Mathematica:

res = {};
SeedRandom[42 + 1];
Do[
  (While[
    If[(c = Flatten@WordData[RandomChoice[WordData[All]], "Examples"][[All, 2]]) != {},
     StringPosition[(c1 = RandomChoice@c), "'" | "-" | "\\" | "`"] != {}, True, True]];
   sp = ToLowerCase /@ StringSplit[c1, (WhitespaceCharacter .. | ",")];
   toChange = RandomSample[Range@#, RandomInteger[IntegerPart[{#/2, #}]]] &@Length@sp;
   If[StringPosition[ToString@WordData[sp[[#]], "Definitions"],  "WordData"] == {}, 
    sp[[#]] = RandomChoice@ WordData[All, RandomChoice@WordData[sp[[#]], "PartsOfSpeech"]]]
             & /@ toChange;
   AppendTo[res, StringJoin@Riffle[sp, " "]];)
  ,
  {10}];
res

Вам пощастило, скажімо, 70% часу. Це генерує такі речі, як:

мигдалевидна електричний ланцюг
он там парк була unrestrictive хоча рваною
його longanimous суспільства
д.п.н. незрозумілому відповідь на киббуц
маленький музичний театр проти Юлія Цезаря
поползень Тая
скошує в спортивному центрі контру твоєї скупістю
необхідних зовнішніх миючих кошти
SANs некромантия чаклун
ці Ve грудних навпаки шахту latria трофейні дружини, що встановлюють тенденції, інвестори коричнево
те, що переносить людиною поле вогневої
амбри чарівно, після чого на мою відповідь
черговий гвинтовий сміття безглуздий асклер Аральське море складна вафля
для сподобається захоплення монголоїдним металом типу

але іноді:

моє прийняття про найменшу битву при Лутцені заробило б гроші під час витів Хеджіра з чистих
дев'яти звичайних родів субдукції шинерів Сейур, що пригріває її аудиторію

Ну добре, його використання англійської мови краще, ніж моє.


8

VBA / Excel

[редагувати 2]

Навчили його як сполучити дієслова, приклади нижче - прості минулі часи:

Помірний дикий кокаїн просунувся вслід за історичним миттєвим рішенням. Регіональна безпечна глава забилася всередині численних випадкових утворень. Жовтий правий домен видалено за крихкою магнітної статі. Фізичне смертельне забруднення почалося повз мертвих поганих відчуттів. Пізнавальний хоробрий театр вийшов на фронт крихкої свідомої літератури. Звичайний фактичний вихід протистояв улюбленому сайту імунітету. Фіксований економічний близнюк визнав злу людську необхідність.

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

Всі корені слів вибираються випадковим чином, але я змушую їх розташовувати за певною схемою речення:

Debug.Print getWords("ad adj adj nns vpa1s pl ad adj adj nns")

... це те, що я використовував для отримання результату вище. З цього випливає загальна форма: "Швидка руда лисиця перестрибнула через ледачого коричневого собаку".

Function getWords(strStruc As String) As String
    Dim i As Long
    Dim s As Long
    Dim strIn As String
    Dim strOut As String

    getWords = ""
    s = numElements(strStruc)
    For i = 1 To s
        strIn = parsePattern(strStruc, i)
        Select Case strIn
            Case ",", ";", ":", """" 'punctuation
                strOut = strIn
                getWords = Trim(getWords)
            Case "ai", "ad" 'indefinite article, definite article
                strOut = getArticle(strIn)
            Case "adj" 'adjective
                strOut = getWord("adj", 1)
            Case "nns" 'noun nominative singular
                strOut = getWord("n", 1)
            Case "nnp" 'noun nominative plural
                strOut = getWord("n", 2)
            Case "nps" 'noun posessive singular
                strOut = getWord("n", 3)
            Case "npp" 'noun posessive plural
                strOut = getWord("n", 4)
            Case "vpr1s" 'Present 1st Person Singular
                strOut = getWord("v", 1)
            Case "vpr2s" 'Present 2nd Person Singular
                strOut = getWord("v", 2)
            Case "vpr3s" 'Present 3rd Person Singular
                strOut = getWord("v", 3)
            Case "vi" 'Infinitive
                strOut = getWord("v", 4)
            Case "vpp" 'Present Participle
                strOut = getWord("v", 5)
            Case "vi" 'Imperative/Subjunctive
                strOut = getWord("v", 6)
            Case "vpa1s" 'Past Tense First Person
                strOut = getWord("v", 7)
            Case "vpa2s" 'Past Tense Second Person
                strOut = getWord("v", 8)
            Case "vpa3s" 'Past Tense Third Person
                strOut = getWord("v", 9)
            Case "vppr1s" 'Present Progressive First Person Singular
                strOut = getWord("v", 10)
            Case "vppr2s" 'Present Progressive Second Person Singular
                strOut = getWord("v", 11)
            Case "vppr3s" 'Present Progressive Third Person Singular
                strOut = getWord("v", 12)
            Case "vppe1s" 'Present Perfect First Person Singular
                strOut = getWord("v", 13)
            Case "vppe2s" 'Present Perfect Second Person Singular
                strOut = getWord("v", 14)
            Case "vpp3s" 'Present Perfect Third Person Singular
                strOut = getWord("v", 15)
            Case "vi1s" 'Imperfect First Person Singular
                strOut = getWord("v", 16)
            Case "vi2s" 'Imperfect Second Person Singular
                strOut = getWord("v", 17)
            Case "v13s" 'Imperfect Third Person Singular
                strOut = getWord("v", 18)
            Case "vsf" 'Simple Future
                strOut = getWord("v", 19)
            Case "vfp" 'Future Progressive
                strOut = getWord("v", 20)
            Case "vc" 'Conditional
                strOut = getWord("v", 21)
            Case "vcp" 'Conditional Perfect
                strOut = getWord("v", 22)
            Case "vci" 'Conditional Imperfect
                strOut = getWord("v", 23)
            Case "pl" 'location prepositions
                strOut = getWord("pl", 1)
        End Select
        getWords = getWords & strOut & " "
    Next i
End Function

[почати оригінальну публікацію]

Поки що триває робота, потрібно додати логіку для часу та множини іменника / дієслова, а саме:

Ваша середня подорож, наша передбачувана доза, ні підвищення температури, ніж мій помідор.

... що піддається аналізу, але не має особливого сенсу.

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

Правильно. Насправді не пропозиція, але краще, ніж деякі повідомлення про помилки JavaScript.

Його звернення піднімає кожне живе запитання, яке моя леді окреслює на англійській мові.

Повсякденність звичаю - це майже першокласне тхо ...

Код для слідування anon. Чи має цей конкурс термін?

[редагувати 1]

Код, який породжував вище.

Function getWord(sht As Worksheet) As String
    Dim i As Long
    Dim freq As Long
    Dim c As Long
    Dim f As Double
    Dim fSum As Double

    c = 4
    fSum = WorksheetFunction.Count(sht.Columns(c))
    f = Rnd() * fSum
    i = 2
    Do
        If i >= f Then Exit Do
        i = i + 1
    Loop
    getWord = sht.Cells(i, 1).Value
End Function
Function PCase(str As String) As String
    PCase = UCase(Left(str, 1)) & Right(str, Len(str) - 1)
End Function
Sub doMakeSentences01()
    Dim shtIn As Worksheet
    Dim shtOut As Worksheet
    Dim strSheet As String
    Dim rIn As Long
    Dim rOut As Long
    Dim cFreq As Long
    Dim c As Long
    Dim strPattern As String
    Dim w As Long
    Dim strOut As String
    Dim strIn As String
    Dim strWord As String

    cFreq = 4
    Set shtOut = Sheets("Output")
    rOut = shtOut.Range("A65536").End(xlUp).Row + 1

    strPattern = "anvajncanvian"
    For rOut = rOut To rOut + 1000
        strOut = ""
        For w = 1 To Len(strPattern)
            Set shtIn = Sheets(Mid(strPattern, w, 1))
            strWord = getWord(shtIn)
            If w = 1 Then strWord = PCase(strWord)
            strOut = strOut & strWord & " "
        Next w
        strOut = Trim(strOut) & "."
        shtOut.Cells(rOut, 1).Value = strOut
    Next rOut
End Sub

5
Де ваш код?
ace_HongKongIndependence

Дивіться мою редакцію коду.
Брендон Р. Гейтс

6

Perl 5

Гаразд, кишки програми - це саме таке:

use v5.14;
my %pad = (
    ...
);
sub pad { shift =~ s(\{(.+?)\}){pad($pad{$1}[rand(@{$pad{$1}})])}rogue }
say ucfirst pad '{START}';

Це в основному "мадліб" двигун. Щоб насправді генерувати цікаві речення, потрібно заповнити %padдеякими даними. Ось приклад %pad...

my %pad = (
  START => ['{complex}.'],
  complex => [
    '{simple}',
    '{simple}, and {simple}',
    '{simple}, and {complex}',
    '{simple}, but {simple}',
    '{simple}, yet {simple}',
    'even though everybody knows {simple}, {simple}',
    'not only {simple}, but also {simple}',
  ],
  simple => [
    '{thing} {verb}s {thing}',
    '{thing} {verb}s {adverb}',
    '{thing} is {adjective}',
    '{things} {verb} {thing}',
    '{things} {verb} {adverb}',
    '{things} are {adjective}',
    '{thing} {past_verb} {thing}',
    '{things} {past_verb} {thing}',
  ],
  thing => [
    'the {adjective} gorilla',
    'the {adjective} mailbox',
    'Archbishop Desmond Tutu',
    'the beef salad sandwich',
    'the {adjective} stegosaur',
    'the summit of Mt Everest',
    'Chuck Norris',
    'the cast of television\'s "Glee"',
    'a {adjective} chocolate cake',
  ],
  things => [
    '{adjective} shoes',
    'spider webs',
    'millions of {adjective} eels',
    '{adjective} children',
    '{adjective} monkeys',
    '{things} and {things}',
    'the British crown jewels',
  ],
  verb => [
    'love',
    'hate',
    'eat',
    'drink',
    'follow',
    'worship',
    'respect',
    'reject',
    'welcome',
    'jump',
    'resemble',
    'grow',
    'encourage',
    'capture',
    'fascinate',
  ],
  past_verb => [  # too irregular to derive from {verb}
    'loved',
    'ate',
    'followed',
    'worshipped',
    'welcomed',
    'jumped',
    'made love to',
    'melted',
  ],
  adverb => [
    'greedily',
    'punctually',
    'noisily',
    'gladly',
    'regularly',
  ],
  adjective => [
    'enormous',
    'tiny',
    'haunted',
    'ghostly',
    'sparkling',
    'highly-decorated',
    'foul-smelling',
    '{adjective} (yet {adjective})',
    'expensive',
    'yellow',
    'green',
    'lilac',
    'tall',
    'short',
  ],
);

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

  • Павутинні павутини короткі.
  • Павутинні павутини заворожують регулярно.
  • Короткі мавпи іскряться, але павутинні паски п’ють жадібно.
  • Блискучі (поки неприємно пахнуть) мавпи йшли за крихітними (ще блискучими) горилами.
  • На вершині гори Еверест вітав високо прикрашений стегозавр.
  • Не тільки вершина гори Еверест дорога, але й акторський склад телевізійного "Глі" пішов за блискучими горилами.
  • Акторський склад телевізійного "Глі" нагадує бузкову скриньку.
  • Дорога поштова скринька висока, а дорогий стегозавр стрибає Чак Норріс, проте зелені черевики стрибали з салату з яловичого салату.
  • Сандвіч з яловичим салатом любив Чак Норіс.
  • Мільйони блискучих вугрів зелені (але примарні).

Тепер, якщо ви зможете заповнити майданчик програмно
Pureferret,

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

Це не так вже й великий виклик, але я думаю, що це весела частина.
Pureferret

5

Пані слово

Я не впевнений, чи прийнятно це, але оскільки html є, я думаю, що це також має бути прийнятним.

 =rand(1,1)

Приклад пропозиції:

На вкладці Вставка галереї містять елементи, призначені для узгодження із загальним виглядом вашого документа.

Ви можете використовувати ці галереї для вставки таблиць, заголовків, колонтитулів, списків, титульних сторінок та інших будівельних блоків документів.

Ви також можете вказати будь-яку кількість речень та абзаців.


4

Незавершена робота з використанням JSoup та simpleNLG

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import simplenlg.framework.NLGFactory;
import simplenlg.lexicon.Lexicon;
import simplenlg.phrasespec.SPhraseSpec;
import simplenlg.realiser.english.Realiser;

/**
 * Scapes words from Wiktionary then assembles them into sentences
 * 
 * @author pureferret
 *
 */
public class SentenceBuilder {
    static ArrayList<String> ListOfWordTypes= new ArrayList<>(Arrays.asList("Noun","Verb","Adjective","Adverb","Proper noun","Conjunction"));
    private static String RandomWiktWord ="http://toolserver.org/~hippietrail/randompage.fcgi?langname=English";  
    /**
     * @param args
     */
    public static void main(String[] args) {
        Lexicon lexicon = Lexicon.getDefaultLexicon();
        NLGFactory nlgFactory = new NLGFactory(lexicon);
        Realiser realiser = new Realiser(lexicon);

        ArrayList<String> nounList = new ArrayList<String>();
        ArrayList<String> verbList = new ArrayList<String>();
        ArrayList<String> adjeList = new ArrayList<String>();
        ArrayList<String> adveList = new ArrayList<String>();
        ArrayList<String> pnouList = new ArrayList<String>();
        ArrayList<String> conjList = new ArrayList<String>();


        String word= null;
        String wordType = null;

        try {
            newDoc:
            while( nounList.size()<1 ||
                    verbList.size()<1 ||
//                  adjeList.size()<2 ||
//                  adveList.size()<2 ||
                    pnouList.size()<1){
                Document doc = Jsoup.connect(RandomWiktWord).get();
                Element bodyElem = doc.body();
                word = bodyElem.select("h1>span[dir=auto]").get(0).ownText();
                int wtIdx = 0;
                while(wtIdx<bodyElem.select("div#mw-content-text span.mw-headline").size()){
                    wordType = bodyElem.select("div#mw-content-text span.mw-headline").get(wtIdx).id()
                            .replace("_", " ");
                    wtIdx++;
                    switch (wordType) {
                    case "Proper noun":
                        pnouList.add(word);
                        continue newDoc;
                    case "Noun":
                        nounList.add(word);
                        continue newDoc;
                    case "Verb":
                        verbList.add(word);
                        continue newDoc;
                    case "Adjective":
                        adjeList.add(word);
                        continue newDoc;
                    case "Adverb":
                        adveList.add(word);
                        continue newDoc;
                    case "Conjunction":
                        conjList .add(word);
                        continue newDoc;
                    default:
                        break;
                    }
                }
            }
                SPhraseSpec p = nlgFactory.createClause();
                p.setSubject(pnouList.get(0));
                p.setVerb(verbList.get(0));
                p.setObject(nounList.get(0));

                String output2 = realiser.realiseSentence(p); // Realiser created earlier.
                System.out.println(output2);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.err.println(word + " is a " + wordType);
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
            System.err.println(word + " is a " + wordType);
        }
    }

}

Проблеми:

  • Вироки занадто прості
  • Інколи 404 (без хорошого керування!)
  • Породжує лише одне речення за раз
  • Використовує корпус вимикача!

Приклади виходів:

Пополока косить бігун.
Тропік Козерога пуче тілами.
Пекін синонімізував наволочки.
Чукчі впливали на культуру.


3

PHP

<?php
  $trends = file_get_contents('http://www.google.com/trends/hottrends/widget?pn=p1&tn=30');
  preg_match_all("/widget-title-in-list'>(.+?)</", $trends, $m);

  $q = urlencode($m[1][array_rand($m[1])]);
  $page = file_get_contents("http://www.google.com/search?q=$q&btnI=1");
  preg_match_all('/[A-Z]([\w,]+ ){2,}[\w, ]+?[.!]/', strip_tags($page), $m);

  echo $m[0][array_rand($m[0])];

Це отримує 30 найпопулярніших пошуків Google, виконує пошук "Я відчуваю удачу", а потім відображає випадкове речення з цієї сторінки щонайменше з 3 слів.

Приклади:

"Її вважали фаворитом медалі у заході".

"Кейт закінчила середню школу на рік раніше".

"15 квітня 2014 року, щоб сприяти дотриманню політики щодо біографій живих людей".

"Від імені Брайана ми, його родина, хотіли б подякувати всім за виплив любові, молитви та підтримку".

"Ця стаття стосується американського баскетболіста".

"На жаль, у Вашого веб-переглядача відключений JavaScript або він не підтримує програвач."


3

Python 2.7

python2.7 -c "import urllib2, pprint; pprint.pprint([str(x[:x.find('<')]) for x in unicode(urllib2.urlopen('http://codegolf.stackexchange.com/questions/21571/generate-an-understandable-sentence').read(), 'utf8').split('<p>') if x.find('<') >= 1][1].split('.')[0])"

вихід:

Утворіть речення, яке можна прочитати та зрозуміти


Використовуйте URI-файли спільного користування Stack Exchange (наприклад, /q/21571замість них /questions/21571/generate-an-understandable-sentence).
Blacklight Shining

2
Оскільки це не код гольфу, перерви в рядку для читабельності були б непоганими.
nyuszika7h

2

Сценарій оболонок

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

curl "codegolf.stackexchange.com" -s |  w3m -dump -T text/html > foo.txt
awk 'f;/more tags/{f=1}' foo.txt > foo1.txt
sed '8q;d' foo1.txt

Пробний вихід 1

Find words containing every vowel

Пробний вихід 2

Hello World 0.0!

EDIT

Не використовує жодних файлів. Без файлів я можу використовувати сценарій нижче.

value1=$(curl "codegolf.stackexchange.com" -s |  w3m -dump -T text/html)
echo "$value1" | grep -A 8 "more tags" | tail -1

Вихід

Generate an understandable sentence

1
не читає їх безпосередньо з файлу ...
rafaelcastrocouto

Я вніс зміни, щоб не використовувати файл. Тепер він просто використовував змінні. Як щодо цього?
Рамеш

2
знято голосування!
rafaelcastrocouto

2

JavaScript (ES6)

var t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n';}t

Запуск його в консолі виробляє

foo is not defined
null has no properties
radix must be an integer at least 2 and no greater than 36

Ще коротше:t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n'}t
Зубна щітка

2

Ще один сценарій Python

Відповідь user3058846 не погано, але це показує кожні пропозиції, кожен раз. Тут я пропоную скрипт, який виводить випадкове речення із дзен Python :

from random import choice
import subprocess
proc = subprocess.Popen(('python', '-c', 'import this'), stdout=subprocess.PIPE,)
# Get output of proc, split by newline
sentences = [x for x in proc.communicate()[0].splitlines() if x != '']
print(choice(sentences))

В одному рядку для любителів :

from random import choice;import subprocess;print(choice([x for x in subprocess.Popen("python -c 'import this'",shell=True,stdout=subprocess.PIPE).communicate()[0].split('\n') if x]))

(Boooh, брудно.)

Приклади:

>>> a()  # <--- a is just the oneline above
Explicit is better than implicit.
>>> a() 
Although never is often better than *right* now.
>>> a() 
Errors should never pass silently.
>>> a() 
Special cases aren't special enough to break the rules.


Ще один цікавий спосіб в Python

Завдяки @TheDoctor вкажіть ідею :-) Вимкніть вихід імпорту, а потім пограйте з псевдо-зашифрованим диктом у модулі.

import sys, random 
_stdout, sys.stdout = sys.stdout, open('/tmp/trash', 'w')  # silent the stdout just for the import
import this
sys.stdout = _stdout
lst = []
for x in this.s:
    if x in this.d:
        lst.append(this.d[x])
    else:
        lst.append(x)

# Then, example from the interpreter
>>> random.choice(''.join(lst).split('\n'))
'Beautiful is better than ugly.'
>>> random.choice(''.join(lst).split('\n'))
'Although never is often better than *right* now.'
>>>

Це взагалі погана практика використання shell=True. Хоча в цьому випадку це не небезпечно, оскільки ви не приймаєте введення користувачів, я б вирішив subprocess.Popen(('python', '-c', 'import this')).
nyuszika7h

Чи знаєте ви, чи можна замовкнути вірш import this, в модулі є змінна, thisяка містить увесь текст, але зашифрована. Існує також словник для його розшифрування.
TheDoctor

1
@TheDoctor Подивіться мою оновлену відповідь: D
Максим Лорант,

1

Пітон 3

Гарантоване отримання граматичного результату! (Зазвичай.)

import re
from urllib.request import urlopen
from random import random, choice as pick

letters = "abcdefghijklmnopqrstuvwxyz"
wordregex = re.compile(r'a href="/wiki/([a-z_]+)"')
subjects = {1:("I","we"), 2:("you",), 3:("they",)}
objects = {1:("me","us"), 2:("you",), 3:("him","her","it","them")}
patterns = ["{0} {1} {2}.",
            "Why do {0} {1} {2}?",
            "It's because {0} {1} {2}, of course.",
            "Did {0} {1} {2}?",
            "{0} will not {1} {2}!",
            ]

wiktionaryurl = "http://en.wiktionary.org/w/index.php?" + \
              "title=Category:English_{0}&pagefrom={1}"

def getWord(category):
    subset = pick(letters) + pick(letters)
    url = wiktionaryurl.format(category, subset)
    try:
        response = urlopen(url)
    except:
        print("An error occurred while connecting to the Internet!")
        return "fail"
    page = str(response.read())
    word = pick(wordregex.findall(page))
    word = word.replace("_", " ")
    return word

for i in range(10):
    verb = getWord("transitive_verbs")
    subjPerson = pick([1,2,3])
    subj = pick(subjects[subjPerson])
    if random() > 0.4:
        # Use a plural noun for the object
        obj = getWord("plurals")
    else:
        # Use a pronoun for the object
        objPerson = pick([1,2,3])
        while subjPerson == objPerson and subjPerson in (1,2):
            objPerson = pick([1,2,3])
        obj = pick(objects[objPerson])
    sentence = pick(patterns).format(subj, verb, obj)
    sentence = sentence[0].upper() + sentence[1:]
    print(sentence)

Щоб зробити його ідеально граматичним, видаліть підкреслення з wordregex. Це дозволить заборонити багатослівні записи, які призводять до неправильних пропозицій, таких як "Ми зашпилюємо вас".

Проба зразка:

We appropriate journals.
I will not masticate you!
Did you lower me?
Why do I sag estoppels?
They will not proofread you!
It's because you unbeguile mucosae, of course.
Why do I flack zakuski?
You will not visit junkpiles!
Did they goat us?
Why do we prefix nolids?

Улюблений вихід поки що:

They you her.

Подивіться: http://en.wiktionary.org/wiki/you#Verb .


0

Пітон

Результат:

$ python mksentence.py
infringement lecture attainment
Produce more? (Y/N)y
impeachment recoup ornament
Produce more? (Y/N)y
maladjustment edit discouragement
Produce more? (Y/N)y
embellishment guest punishment
Produce more? (Y/N)y
settlement section escapement
Produce more? (Y/N)y
segment withhold recruitment
Produce more? (Y/N)

Я використав тут список слів. Знайдіть слова, що містять кожну голосну

Можна додати ще кілька правил. Наприклад, якщо слово, що закінчується на "ness", і слово також існує в безлічі суфікса, то це іменник.

Вихідний код:

#!/usr/bin/env python
# vim: set fileencoding=utf-8 ts=4 sw=4 tw=72 :

from __future__ import (unicode_literals, absolute_import,
                        division, print_function)

import random                     

if __name__ == "__main__":        
    filename = 'corncob_lowercase.txt'
    noun = set()
    verb = set()
    whole_words_set = {word.rstrip() for word in open(filename)}

    for word in whole_words_set:
        if word.endswith('ment'):
            noun.add(word)
        elif word.endswith('ing'):
            if word[:-3] in whole_words_set:
                verb.add(word[:-3])
            elif word[:-3]+"e" in whole_words_set:
                verb.add(word[:-3]+"e")
    noun_list = list(noun)
    verb_list = list(verb)
    while True:                   
        sentence = "%s %s %s" % (random.choice(noun_list),
                                 random.choice(verb_list),
                                 random.choice(noun_list))                                                                                           
        print(sentence)
        if input("Produce more? (Y/N)").lower() == "n":
            break

3
Чи справді я смоктаю на Python та англійську мову, чи виводите 3 іменники замість 2 іменників та дієслова?
ace_HongKongIndependence

@ace На жаль, я вирішив виправити код в останні хвилини :-(
yegle

0

Баш

Спроба запустити програму, яка існує, але не встановлена, дає це (у Linux Mint 13).

$ say
The program 'say' is currently not installed.  To run 'say' please ask your administrator to install the package 'gnustep-gui-runtime'

У різних дистрибутивах вона дає вам різне речення.
TheDoctor

Ось чому я сказав у LM13
user80551

0

Пітон 3

Ще один прийом у «Дзен Пітона» , натхненний відповіддю Максима .

import codecs
import os
import sys
import random

stdout = sys.stdout
sys.stdout = open(os.devnull, 'r+')

import this

sys.stdout.close()
sys.stdout = stdout

zen = codecs.decode(this.s, 'rot-13').splitlines()

print(random.choice(zen))

0
var vocab={
    noun:{
        tp:{
            singular:["Mike","Chan","Karl","Mithun","Debasish","Kamal","Group","Crowd","He","She"],
            plural:["They"],
        },
        fp:{
            singular:["I"],
            plural:["We"]
        },
        sp:{
            singular:["You"],
            plural:["You"]
        }

    },
    verbIndicator:{
        tp:{
            present:{
                singular:["is"],
                plural:["are"]
            },
            past:{
                singular:["was"],
                plural:["were"]
            }
        },
        fp:{
            present:{
                singular:["am"],
                plural:["are"]
            },
            past:{
                singular:["was"],
                plural:["were"]
            }
        },
        sp:{
            present:{
                singular:["are"],
                plural:["are"]
            },
            past:{
                singular:["were"],
                plural:["were"]
            }
        }
    },
    verb:{
        continuous:{
            consumer:["having"],
            performer:["doing","playing","watching"]
        },
        simple:{
            consumer:["had"],
            performer:["did","played","watched"]
        }
    },
    dependentAction:{
        consumer:["food","fun","badtime"],
        performer:["movie","cricket","song","dance"]
    },
    independentAction:["Cooking","Playing","singing"],
    adjective:["good","bad","excellent","awesome"],
    object:["boy","Person","girl","Human being","Man","Mental"]
}

var referenceBook={
    figure:["fp","sp","tp"],
    time:["present","past"],
    singularity:["singular","plural"],
    verState:{
        present:["continuous"],
        past:["continuous","simple"]
    },
    objectRole:["consumer","performer"]
};

function getTerm(term) {
    var cur = referenceBook[term] || [];
    var randomIndex = Math.ceil((Math.random() * 93967)) % cur.length;
    return cur[randomIndex]

}
function getToken(key) {
    var path = key.split("-");
    var token = vocab;
    path.forEach(function(s) {
        token = token[s];
   });

    return token[Math.ceil((Math.random() * 1000)) % token.length];

}

function generateSentence(rules) {
    rules.forEach(function(str) {
        var m = str.match(/{[^}]*}/g)

        var variable = {};
        if (m) {
            m.forEach(function(s) {
                s = s.replace(/(^{)|(}$)/g, "");
                variable[s] = getTerm(s);
            });

            for (var each in variable) {
                str = str.replace(new RegExp("{" + each + "}", 'g'), variable[each]);

            }
        }
        var cur = str.split("|");
        var sentence = "";
        cur.forEach(function(s) {
            sentence += " " + getToken(s);

        })
        console.log(sentence);

    })


};
/*

In the rules array, I specify rules for the sentence to be genrated

*/

var rules = [
    "noun-{figure}-{singularity}|verbIndicator-{figure}-{time}-{singularity}|verb-continuous-{objectRole}|dependentAction-{objectRole}", 
    "noun-sp-singular|adjective|object"
];

generateSentence(rules);

4
Будь ласка, вкажіть, якою це мова.
Родольфо Діас

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