Генератор слов на 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 - такие остаются

4 ответа

Есть два способа. 1) простой: перебираем все слова от ааааа до zzzzz.

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


$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.


Полный перебор:

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]);


И в чем именно у вас проблемы ?

Обычный поиск в глубину причем глубина лимитированная. А так же проверка правил на каждом шаге генерации. Вариантов будет много, сразу предупреждаю.

По поводу генерации ников - я бы порекомендовал генетический алгоритм. Перед этим обучив его каким то списком красивых ников. Далее он будет генерировать не хуже :)

licensed under cc by-sa 3.0 with attribution.