За последние 24 часа нас посетили 18134 программиста и 1682 робота. Сейчас ищут 1137 программистов ...

Задачка

Тема в разделе "Решения, алгоритмы", создана пользователем Ensiferum, 23 янв 2011.

  1. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Недавно подкинули задачку:


    Чем короче решение - тем лучше. Решил её вот так:
    PHP:
    1. <?
    2. $str1 = "abcd 01234 87 01235";
    3. function work($text) {
    4.     $result = '';
    5.     $prev = 0;
    6.     $valid = true;
    7.     $convmap = array(0x80, 0xFFFF, 0, 0xFFFF);
    8.    
    9.     $words = explode(" ",$text);
    10.     foreach ($words as $word) {
    11.         for ($i = 0, $c=mb_strlen($word); $i < $c; $i++) {
    12.             $mb_char = mb_substr($word, $i, 1);
    13.             $cur =(mb_ereg("&#(\\d+);", mb_encode_numericentity($mb_char, $convmap, "UTF-8"), $match))? $match[1] : ord($mb_char);
    14.  
    15.             if ($prev - $cur != -1 && $prev != 0)
    16.                 $valid = false;
    17.             $prev = $cur;
    18.         }
    19.         if ($valid)
    20.             $result .= $word . "    ";
    21.         $valid = true;
    22.         $prev = 0;
    23.  
    24.     }
    25.     return $result;
    26. }
    27.  
    28. echo work($str1) . '<br/>';
    Стало интересно, а кто как ещё сможет решить?
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Сказано же не использовать ereg, есть preg_
     
  3. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    писал ночью, хотел спать, на компе PHP 5.2. Мне главное суть решения передать. А там ещё тюнинг возможен. Друг сделал решение гораздо короче.
     
  4. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    Похоже на скучную задачу из учебника. Неинтересно.
     
  5. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Колхоз - дело добровольное...
     
  6. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Неинтересно, решается одним проходом по строке, никакого деление на массив слов даже ненадо, знай храни начало последовательности (prev), а непорядочный символ запускает проверку now-prev > 1, и все
     
  7. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    karlozzz
    упор на UTF-8.Ты сначала реализуй, а после делай вывод
     
  8. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    function ordUTF8($c, $index = 0, &$bytes = null)
    {
    $len = strlen($c);
    $bytes = 0;

    if ($index >= $len)
    return false;

    $h = ord($c{$index});

    if ($h <= 0x7F) {
    $bytes = 1;
    return $h;
    }
    else if ($h < 0xC2)
    return false;
    else if ($h <= 0xDF && $index < $len - 1) {
    $bytes = 2;
    return ($h & 0x1F) << 6 | (ord($c{$index + 1}) & 0x3F);
    }
    else if ($h <= 0xEF && $index < $len - 2) {
    $bytes = 3;
    return ($h & 0x0F) << 12 | (ord($c{$index + 1}) & 0x3F) << 6
    | (ord($c{$index + 2}) & 0x3F);
    }
    else if ($h <= 0xF4 && $index < $len - 3) {
    $bytes = 4;
    return ($h & 0x0F) << 18 | (ord($c{$index + 1}) & 0x3F) << 12
    | (ord($c{$index + 2}) & 0x3F) << 6
    | (ord($c{$index + 3}) & 0x3F);
    }
    else
    return false;
    }


    с PHP.NET
     
  9. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    ага. видел это решение. откинул как длинное. А своим мозгом подумать не судьба?
     
  10. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Осталось только доработать под utf-8 :) .
    PHP:
    1. <?php                                                          
    2.  
    3. function ord_sort($array) {
    4.     if (!is_array($array))  {
    5.         return FALSE;        
    6.     }                        
    7.     $array_new = array();    
    8.     foreach ($array as $value)  {
    9.         $array_new[] = ord($value);
    10.     }
    11.     natsort($array_new);
    12.     for ($i = 0; $i < count($array_new); $i++)    {
    13.         if ($i == 0)    {continue;}
    14.         if ($array_new[$i] - $array_new[$i - 1] != 1)   {return FALSE;}
    15.     }
    16.     $array = array();
    17.     foreach ($array_new as $value)  {
    18.         $array[] = chr($value);
    19.     }
    20.     return $array;
    21. }
    22.  
    23. $str = "abcd 01234 87 01235";
    24. $list = explode(" ", $str);
    25. foreach ($list as $word_old)    {
    26.     $word_temp = strtolower($word_old);
    27.     $array = str_split($word_temp);
    28.     //$array = mb_split('/\w/s', $word_temp);
    29.     if (($array = ord_sort($array)) !== FALSE)  {
    30.         $word_new = implode("", $array);
    31.         if ($word_temp === $word_new)    {
    32.             echo $word_old. " ";
    33.         }
    34.     }
    35. }
    36.  
    37. ?>
     
  11. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    А это самое сложное - заточить под UTF-8


    А есть ещё короче решение! Ну что, никто не может ответить? Или влом?
     
  12. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Короч, задача на два этапа делится,
    1) поиск в строке подстроки по алфавиту, это как я полагаю, все понимают, что элементарно, НО
    2) функция определения позиции символа в таблице кодировки, а над этим надо подумать, так что кому интересно предлагаю решать именно 2 задачу, сам бы помозговал, но пока некогда
     
  13. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Что тут думать? ord().
     
  14. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Как вариант :) :
    PHP:
    1. $str = iconv("UTF-8","CP-1251", $str);
     
  15. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Jampire
    да блин... сверху возьми третий пример и прогони через своё решение!
     
  16. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Jampire
    А то что кодировки совершенно разные, одна двухбайтовая, другая нет, это пох))) И пох что останется лишь оооочень малая часть символов))))