Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Генератор слов на php

#php


Помогите создать генератор слов на php. Нужно гененировать слова из следующих букв: 
e, r, t, u, i, o, p, a, s, d, f, g, h, k, l, z, v, b, n, m
Длина получаемого слова - 5 символов. 
Из генерации нужно удалить слова, в которых:

Подряд содержатся 2 и более гласные
Подряд содержатся 2 и более одинаковые согласные
Подряд содержатся 3 и более согласные

Все данные нужно записать в файл.
То есть:
eraab, eraaa, errab, ertde  - такие слова удаляются
ertab, ritar - такие остаются    


Ответы

Ответ 1



Есть два способа. 1) простой: перебираем все слова от ааааа до zzzzz. if(preg_match("/(?:[euioa]{2,})|(?:[qwrtypsdfghjklzxcvbnm]{3,})/",$word){ //Убираем из массива, как несоответствующий п1 или п3 } $doubles = str_split('qqwwrrttyyppssddffgghhjjkkllzzxxccvvbbnnmm',2); if(strpos($word,$doubles)!==false){ //убираем из-за двойной согласной }

Ответ 2



$minlen = 5; $maxlen = 10; $num = 10; $l = array('euioa', 'rtpsdfghklzvbnm'); $ll = array(strlen($l[0]), strlen($l[1])); $out = array(); $ll0 = sizeof($l[0]); $ll1 = sizeof($l[1]); for($j = 0; $j < $num; ++$j){ $cl = rand($minlen, $maxlen); $word = ''; for($i = 0; $i < $cl; ++$i){ if($n === 0) $n = 1; else $n = rand(0, 1); do{ $s = $l[$n][rand(0, $ll[$n]-1)]; }while($s == $word[strlen($word)-1]); $word .= $s; } $out[] = $word; } print_r($out); Немного более общее решение, подразумевающее переменную длину ников. Если надо ровно 5 букв, поменяйте $maxlen на 5.

Ответ 3



Полный перебор: const VOWS = 0; const CONS = 1; const ALL = 2; $lists = array( VOWS => array(), CONS => array(), ALL => array() ); foreach (array('euioa', 'rtpsdfghklzvbnm') as $i => $chars) { for ($j = 0; $j < strlen($chars); $j++) { $char = $chars[$j]; $lists[$i][$char] = $i + 1; $lists[ALL][$char] = 1 - $i; } } function generate($chars, $word = '', $level = 0) { global $lists; if ($level == 5) { echo "$word\n"; return; } foreach ($chars as $char => $type) { $list = $lists[$type]; unset($list[$char]); generate($list, $word.$char, $level + 1); } } generate($lists[VOWS] + $lists[CONS]);

Ответ 4



И в чем именно у вас проблемы ? Обычный поиск в глубину причем глубина лимитированная. А так же проверка правил на каждом шаге генерации. Вариантов будет много, сразу предупреждаю. По поводу генерации ников - я бы порекомендовал генетический алгоритм. Перед этим обучив его каким то списком красивых ников. Далее он будет генерировать не хуже :)

Комментариев нет:

Отправить комментарий