Автор оригинала: moxnatiy
Спамиры!!!
Долго думал почему? докопался до доргенов (в том же гугле)...

Оказывается спамерами бывают профессора университеттов, иначе на кой ляд им такие задачки студентам подсовывать




Но замечу, задача таки была принята у студента БЕЗ подмешивания ключей и зачемто заставили переписать ее не с шагом 2 а с шагом n... (при составлении фраз)
Ну да собстно если кому интересно вот мое произведение - пользуйтесь (не думаю что оно спамерам пригодиться




)
<?
class SeAlSe_textgen_Markov
{
var $input_text;
var $output_text;
var $step;
var $word_struct;
var $new_text_lenght;
function SeAlSe_textgen_Markov( $inp =
array(
"input_text"=>"",
"new_text_lenght"=>5000,
"step"=> 2,
)
)
{
$this->input_text = $inp["input_text"];
$this->new_text_lenght = $inp["new_text_lenght"];
$this->step = $inp["step"];
$this->build_structs();
}
function build_structs()
{
preg_match_all( "|([^ \n\r\t]+)[ \n\r\t]*|ims", $this->input_text, $arr );
$ret = $val = array();
for( $i=1; $i<=$this->step; $i++ ){
if( !( list( $k, $v ) = each( $arr[0] ) ) ) die( "small text" );
if( !$ret ){
$ret[$v] = array();
$param = &$ret[$v];
}else
$param = &$param[$v];
$val[$i] = $v;
}
while ( list( $k, $v ) = each( $arr[0] ) ){
$param[] = $val[$i] = $v;
for( $i=1; $i<=$this->step; $i++ ){
if( $val[$i+1] ) $val[$i] = $val[$i+1];
if( $i == 1 ) $param = &$ret[$val[$i]];
else $param = &$param[$val[$i]];
}
}
$this->word_struct = $ret;
return $ret;
}
function output()
{
$arr = $this->word_struct;
$sep = "";
for( $i=1; $i<=$this->step; $i++ ){
if( !( list( $k, $v ) = each( $arr ) ) ) die( "small text" );
$arr = $v;
$key[$i] = $k;
$text.= $sep.$k;
$sep = " ";
}
$firstkey = $key;
$firsrv = $v;
while( 1 ){
$k = array_rand( $v );
$val = $v = $v[$k];
$text.= $sep.$v;
if( strlen($text) > $this->new_text_lenght ) return $text;
if( !( $v = $this->word_struct[$key[2]] ) ){
$v = $this->word_struct[array_rand( $this->word_struct )];
}else{
$key[1] = $key[2];
}
for( $i=2; $i<$this->step; $i++ ){
$key[$i] = $key[$i+1];
$v = $v[$key[$i]];
}
if( strlen($val) == 0 || strlen($v[$val]) == 0 ){
$key = $firstkey;
$v = $firsrv;
}else{
$key[$i] = $val;
$v = $v[$val];
}
}
}
}
?>