Анагра́мма (от греч. ανα- — «пере» и γράμμα — «буква») — литературный прием, состоящий в перестановке букв или звуков определенного слова (или словосочетания), что в результате дает другое слово или словосочетаниеАнаграммы используются для шифрования ответа на вопрос викторины (шарады, кроссворда и т.п.).
Предлагаю вашему вниманию две функции, реализующие алгоритм получения анаграмм из отдельных слов и словосочетаний.
Работу функций «в боевом», как говорится, режиме можно увидеть здесь.
Для выбора наиболее «перемешанной» анаграммы применяется функция Левенштейна.
Для слов длиной в три буквы и меньше анаграмма не составляется — смысла нет.
Для чисел — то же.
Кодировка — UTF-8.
В качестве значения единственного параметра функции GetAnagramm подаём слово или словосочетание, а на выходе GetWordAnagramm получаем готовую анаграмму в которой все буквы заключены в SPAN-элементы HTML (для того, чтобы CSS-стилями придать анаграмме презентабельный вид).
//Получение анаграммы слова или словосочетания
function GetAnagramm($anagramm)
{
$out_anagramm = "";
$len_anagramm = mb_strlen($anagramm,'UTF-8');
$int_anagramm = (int)$anagramm;
if ($len_anagramm > 3 && $int_anagramm == 0)
{
mb_regex_encoding('UTF-8');
mb_internal_encoding('UTF-8');
$wordslist = preg_split('[-| ]', $anagramm);
$out_anagramm = "";
$len_anagramm = 0;
$i = 0;
foreach ( $wordslist as $value)
{
$len_anagramm = $len_anagramm + mb_strlen($value,'UTF-8');
$simbol = mb_substr($anagramm, $len_anagramm+$i, 1, 'UTF-8');
$span = "";
if ($simbol <> "") $span = "<span class=\"annagramm\">".$simbol."</span> ";
if (mb_strlen($value,'UTF-8') == 1)
{
$out_anagramm .= "<span class=\"annagramm\">".$value."</span> ".$span;
}else{
$out_anagramm .= GetWordAnagramm($value).$span;
}
$i++;
}
}
return $out_anagramm;
}
//Получение аннаграммы отдельного слова
function GetWordAnagramm($anagramm)
{
$array_an = preg_split('//u',$anagramm,-1,PREG_SPLIT_NO_EMPTY);
$j = 0;
$maxLeven = 0;
while ($j < 10)
{
srand((float)microtime() * 1000000);
shuffle($array_an);
$an = "";
$ot = "";
$i = 0;
foreach ( $array_an as $value )
{
$an .= $value." ";
$ot .= mb_substr ($anagramm, $i, 1, 'UTF-8')." ";
$i++;
}
$leven = levenshtein ($an,$ot);
$j++;
if ($leven > $maxLeven)
{
$maxLeven = $leven;
$best_array_an = $array_an;
}
}
$an_div = "";
foreach ( $best_array_an as $value )
{
$an_div .= "<span class=\"annagramm\">".$value."</span> ";
}
return $an_div;
}
Если на страницу вывода добавить CSS-стиль для SPAN-класса annagramm:
span.annagramm {
background-color: #ffffff;
border-style: outset;
border-width: 1px;
border-color: #cccccc;
-webkit-border-radius: 4px;
-moz-border-radius:4px;
border-radius: 4px;
padding: 4px;
padding-left: 6px;
padding-right: 6px;
margin-left: 1px;
margin-right: 1px;
margin-top: 6px;
margin-bottom: 6px;
font-weight: bold;
color: #4f4ba8;
font-size: 11pt;
text-transform: uppercase;
box-shadow: 0 1px 4px rgba(0, 0, 0, .3), -23px 0 20px -23px rgba(0, 0, 0, .8), 23px 0 20px -23px rgba(0, 0, 0, .8), 0 0 40px rgba(0, 0, 0, .1) inset;
}
то получим вот такую «красоту»:

Правильный ответ: Агафон Никитин.