Анагра́мма (от греч. ανα- — «пере» и γράμμα — «буква») — литературный прием, состоящий в перестановке букв или звуков определенного слова (или словосочетания), что в результате дает другое слово или словосочетание
Анаграммы используются для шифрования ответа на вопрос викторины (шарады, кроссворда и т.п.).
Предлагаю вашему вниманию две функции, реализующие алгоритм получения анаграмм из отдельных слов и словосочетаний.
Работу функция «в боевом», как говорится режиме можно увидеть здесь.
Для выбора наиболее «перемешанной» анаграммы применяется функция Левенштейна.
Для слов длиной в три буквы и меньше анаграмма не составляется — смысла нет.
Кодировка — 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; }
то получим вот такую «красоту»:

Правильный ответ: Агафон Никитин.
ссылка на оригинал статьи https://habr.com/post/425975/
Добавить комментарий