Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.90 KB | None | 0 0
  1. <?php
  2.  
  3.     if ( !function_exists('mb_str_split') )
  4.     {
  5.         function mb_str_split($string, $split_length = 1)
  6.         {
  7.             mb_internal_encoding('UTF-8');
  8.             mb_regex_encoding('UTF-8');  
  9.  
  10.             $split_length = ($split_length <= 0) ? 1 : $split_length;
  11.  
  12.             $mb_strlen = mb_strlen($string, 'utf-8');
  13.  
  14.             $array = array();
  15.  
  16.             for($i = 0; $i < $mb_strlen; $i += $split_length)
  17.             {
  18.                 $array[] = mb_substr($string, $i, $split_length);
  19.             }
  20.  
  21.             return $array;
  22.         }
  23.     }
  24.  
  25.     $length = $_GET['length'];
  26.     $proto = $_GET['proto'];
  27.     $dead = $_GET['dead'];
  28.     $live = str_replace("*", "", $proto);
  29.  
  30.     // загрузить соответствующий словарь в $dict
  31.     $dict = file("wordlist/" . $length . "_letters.txt", FILE_IGNORE_NEW_LINES);
  32.     $words = array();
  33.  
  34.     // цикл по каждому слову в словаре
  35.     foreach($dict as $word){
  36.         $flag = true;
  37.         // проверка, что слово соответствует маске
  38.         for($i=0; $i<mb_strlen($proto); $i++){
  39.             if($proto[$i] == "*"){          // подстановка
  40.                 for($j=0; $j<mb_strlen($live); $j++){
  41.                     if($word[$i] == $live[$j]){     // disallow a*** matching abba
  42.                         $flag = false;
  43.                         continue 3;
  44.                     }
  45.                 }
  46.                 continue;
  47.             }
  48.             if($proto[$i] == $word[$i]){    // correct, go to next letter
  49.                 continue;
  50.             } else{                         // incorrect
  51.                 $flag = false;
  52.                 continue 2;
  53.             }
  54.         }
  55.        
  56.         if($flag){
  57.             array_push($words, $word);
  58.         }
  59.  
  60.     }// конец цикла foreach
  61.     unset($word);
  62.  
  63.     $deadWords = array();
  64.  
  65.     //удаляем слова с исключёнными буквами
  66.     foreach ($words as $word){
  67.         for ($i=0; $i < mb_strlen($dead); $i++) {
  68.             if(mb_strpos($word, $dead[$i]) !== false){
  69.                 error_log("adding " . $word . " to deadWords");
  70.                 array_push($deadWords, $word);
  71.                 continue 2;
  72.             }
  73.         }
  74.        
  75.     }
  76.     unset($word);
  77.  
  78.     $words = array_values(array_diff($words, $deadWords));
  79.  
  80.     $alphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
  81.     $letters = array_fill_keys(mb_str_split($alphabet), 0);
  82.  
  83.     // проверка каждой букве на наличие в слове
  84.     foreach($words as $word){
  85.         // проверить каждую букву в каждом слове
  86.         for($i=0; $i<26; $i++){
  87.             if(mb_strpos($word,$alphabet[$i]) !== false){
  88.                 $letters[ $alphabet[$i] ]++;
  89.             }
  90.         }
  91.     }// конец цикла foreach
  92.     unset($word);
  93.  
  94.     arsort($letters, SORT_NUMERIC);
  95.  
  96.     // нормализуйте числа к размеру слов
  97.     $num_words = count($words);
  98.     foreach($letters as $l => $v){
  99.         $letters[$l] = $letters[$l] / $num_words;
  100.     }
  101.  
  102.  
  103.     //удалить буквы с нулевой вероятностю
  104.     foreach($letters as $l=>$v){
  105.         if($v == 0 || $v == 1){
  106.             $letters = array_diff($letters, array($l=>$v));
  107.         }
  108.     }
  109.     unset($l);
  110.  
  111.     $ret = array("words"=>$words, "letters"=>$letters);
  112.     var_dump($ret);
  113.     //echo json_encode($ret);
  114. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement