За последние 24 часа нас посетили 16074 программиста и 1511 роботов. Сейчас ищут 874 программиста ...

Выборка возможных вариантов

Тема в разделе "PHP для новичков", создана пользователем feofs, 5 ноя 2010.

  1. feofs

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

    С нами с:
    26 июл 2010
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Донбасс
    Товарищи имеется такой вопрос.
    Есть массив например состоящий из 3 элементов (букв) array("a","b","c"),
    как можно перебрать все возможные варианты слов составленных (типа aaa,abb,abc, cab и т.д) из этих цифр и вывести их на экран либо сохранить в массиве. Согласно теории вероятности должно быть 3*3=27 вариантов.

    У меня не было под рукой соответсвующей литературы поэтому я хотел поступить так:
    например выражению abc относительно индексов букв в массиве соответсвует 012
    aac - 002
    abb- 001

    То есть получим дипазон от 000 до 222.
    И нужно выбрать числа которые содержать цифры 0,1,2 но не содержат 3,4,5...9. (001, 100,120,211 и т.д) всего должно было по идее получитьс тоже 27 вариантов.
    Затем сохранить эти числа в массиве. Получиться массив ("000","001","211","210" и т.д).
    Потом сопоставить числа из ячеек полученного массива с индексами массива ("a","b","c") и получить
    000 - aaa
    001 - aab
    211 - cbb
    и т.д.
    Вот код который листает дипазон но почему то не работает:
    for ($one=0;$one<=9;$one++)
    {
    for ($two=0;$two<=9;$two++)
    {
    for ($three=0;$three<=9;$three++)
    {
    $password=$one.$two.$three;
    settype($password,"string");
    if (ereg("[0-2]",$password))
    $new_password=$password;
    echo $new_password."<br>";
    if (ereg("[^3-9]",$new_password))
    echo $new_password."<br>";


    if ($password=="222")
    die("Stop...");
    }
    }
    }
    Подскажите pls что не так или другой вариант.
     
  2. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    если не получается придумать алгоритм, то можно просто написать $result = array('aaa', 'aab', 'aac', ..., 'ccc'); это конечно если на три буквы надо)
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Сомневаюсь, что это идеальный алгоритм :))) но вот поправил твой:
    PHP:
    1. <?php
    2. $cnt = 0;
    3. for($one = 0; $one <= 9; $one++) {
    4.    for($two = 0; $two <= 9; $two++) {
    5.       for($three = 0; $three <= 9; $three++) {
    6.          $password = $one . $two . $three;
    7.          //settype($password, "string");
    8.          if(ereg('[0-2]{3}', $password)) {
    9.             $new_password = $password;
    10.             echo($new_password . '<br />');
    11.             $cnt++;
    12.          }
    13.          /*if(ereg('[^3-9]', $new_password))
    14.             echo($new_password . '<br />');*/
    15.          if($password == '222')
    16.             die('Stop... Cnt = ' . $cnt);
    17.       }
    18.    }
    19. }
    20. ?>
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    В строчке settype($password, 'string') нет смысла, после того, как делаешь канкатенацию (вот это: $password = $one . $two . $three; ) - переменная $password уже становится типа string. Если так хочется самому задать тип переменным, напиши:
    $password = ((string) $one) . ((string) $two) . ((string) $three);
    но смысла в этом нету...
     
  5. feofs

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

    С нами с:
    26 июл 2010
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Донбасс
    sobachnik
    Спасибо заработало.
    А нет ли такого алгоритма без вложеных циклов, не очень удобно если перебирать например не 3 а поболее вариантов.
    Например массив из всех букв английского алфавита ("a","b"...."z")
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    У меня нету :)
     
  7. feofs

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

    С нами с:
    26 июл 2010
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Донбасс
    А как вы добились этой строкой нужного результата. Я думал она ищет равно три повторения чисел из дипазона 0-2, типа 000, 111, 222.
    Или как она вооще работает.
    И не пойму почему мой не работал
    $password=$one.$two.$three;

    if (ereg("[0-2]",$password))//вроде бы здесь выбираются числа где присутсвует 0-2


    $new_password=$password;//затем числа где есть 0,1,2 присваиваются новой пременной

    if (ereg("[^3-9]",$new_password))// а зетем из выбранных с 0-2 отбрасываются с 3,4,5 и т.д до 9
    echo $new_password."<br>";
    Но почему не заработало не понял?
    Если ставить if (ereg("[^0-9]",$password)) то тогда работает, т.е ничего не выбирается.
     
  8. feofs

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

    С нами с:
    26 июл 2010
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Донбасс
    :) Вот этой строкой:if(ereg('[0-2]{3}', $password))
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Регулярка '[0-2]' значит наличие хотя бы одного символа из этого диапазона (0...2) в заданной строке. Регулярка '[0-2]{3}' значит наличие трёх подряд идущих символов из указанного диапазона в заданной строке
     
  10. feofs

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

    С нами с:
    26 июл 2010
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Донбасс
    Спасибо понял
     
  11. asik

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

    С нами с:
    12 июл 2007
    Сообщения:
    211
    Симпатии:
    0
    PHP:
    1. <?php
    2.   $data=array('a','b','c');
    3.   $countIter=pow(count($data),count($data))-1;
    4.   for($i=0;$i<=$countIter;$i++)
    5.   {
    6.     $curMask = base_convert($i,10,count($data));
    7.     while(strlen($curMask)<count($data))
    8.     {
    9.       $curMask = '0'.$curMask;      
    10.     }
    11.     $newWorld='';
    12.     $FLAG = false;
    13.     for ($j=0;$j<strlen($curMask);$j++)
    14.     {
    15.         if(strpos($newWorld,$data[$curMask[$j]])!==FALSE)
    16.         {
    17.           $FLAG = true;
    18.         }
    19.         $newWorld .=$data[$curMask[$j]];
    20.     }
    21.     if((strlen($newWorld)<count($data))or($FLAG))
    22.     {
    23.       continue;
    24.     };
    25.     echo $newWorld."<br>";
    26.  
    27.   }
    28. ?>
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    PHP:
    1. <pre>
    2. <?php
    3. $arr = array('a', 'b', 'c', 'd');
    4. $cnt = count($arr);
    5. $result = array();
    6. calcAllCombs();
    7. print_r($result);
    8. function calcAllCombs($letters = array(), $depth = 0) {
    9.    global $arr, $cnt, $result;
    10.    for($i = 0; $i < $cnt; $i++) {
    11.       $letters[$depth] = $arr[$i];
    12.       if($depth < ($cnt - 1))
    13.          calcAllCombs($letters, $depth + 1);
    14.       else
    15.          $result[] = implode('', $letters);
    16.    }
    17. }
    18. ?>
    19. </pre>
    работает с любым количеством буков в исходном массиве.
    Правда не очень хорошо то, что global, но так короче...
     
  13. feofs

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

    С нами с:
    26 июл 2010
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Донбасс
    Спасибо за код попробую в действии. Написал сам но более примитивный, хочу тоже свой доработать может получиться. Хоть сам дойду до сути.
     
  14. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Комбинаторика, эх =)
     
  15. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Задачка боянистая, делал похожее недавно (надо было пересчитывать HEX в base32 получилось по сути тоже самое)
    PHP:
    1. <?php
    2. $map = array('a', 'b', 'c');
    3. $num = pow(count($map), count($map));
    4. $result = array();
    5. for($i=0; $i<$num; $i++) {
    6.     $temp = base_convert($i,10,count($map));
    7.     $temp = str_pad($temp, count($map), "0", STR_PAD_LEFT);
    8.     $temp = str_split($temp);
    9.     foreach ($temp as $key=>$val)
    10.         $temp[$key] = $map[$val];
    11.     $result[] = implode($temp);
    12. }
    13. ?>
    Это было бы комбинаторкой на Си или ASM (или даже на бейсике с паскалем) а тут все готовые функции есть, только подставь как в детском конструкторе...
     
  16. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Э... У меня выскакивает
    "Fatal error: Call to undefined function: str_split() in ...", причём на хостинге, а не на локалхосте. Это как так? Это ж вроде функция из тех, которые должны быть всегда доступны?
     
  17. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Мож у тебя на хостинге РНР4 ? [​IMG]
    Функция появилась в
    Код (Text):
    1. Version 5.0.0 Beta 1
    2. 29-Jun-2003
    © http://www.php.net/ChangeLog-5.php
     
  18. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Да эти функции вроде и в php4 были доступны...?
    Хостюсь на sweb.ru, сайт древний (с 2004-го года там висит), не знаю какой php был тогда, но даже если 4, то наверняка обновляли же они потом с выходом пятого...
     
  19. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    в public_html лежит папка cgi-bin, в ней файлик php5.cgi , следовательно предполагаю, что там пятый.
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    А проверить ?
     
  21. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    чЁрт! 4.4.9 [​IMG]
     
  22. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Забавно, но другой сайт (поновей) на том же хостинге (аккаунты разные) - phpversion 5.2.5
     
  23. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    а там в панели управления хостингом случайно нельзя выбирать версию?
    Я сталкивался с тем, что можно