Pull to refresh

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

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

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

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

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

то получим вот такую «красоту»:

image

Правильный ответ: Агафон Никитин.
Tags:
Hubs:
Total votes 13: ↑1 and ↓12-11
Comments42

Articles