Преобразование слов и словосочетаний в анаграмму

от автора

Анагра́мма (от греч. ανα- — «пере» и γράμμα — «буква») — литературный прием, состоящий в перестановке букв или звуков определенного слова (или словосочетания), что в результате дает другое слово или словосочетание

Анаграммы используются для шифрования ответа на вопрос викторины (шарады, кроссворда и т.п.).

Предлагаю вашему вниманию две функции, реализующие алгоритм получения анаграмм из отдельных слов и словосочетаний.


Работу функция «в боевом», как говорится режиме можно увидеть здесь.

Для выбора наиболее «перемешанной» анаграммы применяется функция Левенштейна.
Для слов длиной в три буквы и меньше анаграмма не составляется — смысла нет.
Кодировка — 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) {     $an_div = "";     $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; } 

то получим вот такую «красоту»:
image
Правильный ответ: Агафон Никитин.


ссылка на оригинал статьи https://habr.com/post/425975/