Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: И снова строки.
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » И снова строки.

Страниц (1): [1]
 

1. Valimar - 09 Марта, 2009 - 09:20:21 - перейти к сообщению
Опять я со своими задачками. Но мне никуда от этого не деться.

Есть некоторая строка символов из нулей и единиц. Например:

01000010000011000000000000101000 0100000000000 ......... 001

разбив эту строку на подстроки по три символа, я подсчитал подстроки, в которых встречается "1" и в которых нет. Получил следующий результат:

(стало быть 1, где блок с "1" и 0 - без)

10101000110100001001100011110100 1

Теперь трудная для меня задача. Есть кодовая комбинация, состоящая из четырех символов, в которой должно быть три "0" и одна "1", при чем независимо от их порядка (т.е. '1000', или '0100', или '0010', или '0001' ). Мне необходимо найти первое же совпадение в этой строке. Т.е. я проверяю первые четыре символа, если нет попадания, то смещаюсь на один символ и снова сравниваю и так, пока не получится. В данном примере первая комбинация будет '0100'

Мне кажется, что ни preg_match, ни strstr в этом случае не помогут. Я мыслю, что нужно искать по количеству нулей, а их в кодовой комбинации 3, т.е. взять четыре символа из строки, проверить, если количество нулей равно трем, то попадание, если нет - смещаемся на один символ вправо. Вообщем, голова просто кипит =)

изрисовал кучу бумаги, а идей толковых не родилось. Помогите, плиз =/
2. Champion - 09 Марта, 2009 - 11:39:42 - перейти к сообщению
Valimar пишет:
состоящая из четырех символов, в которой должно быть три "0" и одна "1",
Таких комбинаций не так уж и много - всего 4. Есть strpos() и or
(Добавление)
еще с preg_match вариант такой

preg_match('/(0*10*)/', $stroka_s_00101011, $mathes);
потом пройти по $matches и убрать ототуда элементы, длина которых не 4
3. Valimar - 09 Марта, 2009 - 12:17:45 - перейти к сообщению
Champion пишет:
Таких комбинаций не так уж и много - всего 4. Есть strpos() и or

Просто неизвестно, какая комбинация встретится первой. А если нужно будет изменить кодовую комбинацию, т.е. прибавить ещё один "0", то со strpos() уже не получится.

Вообще мне не понятно, как делать сдвиг на один символ.
4. Champion - 09 Марта, 2009 - 12:50:30 - перейти к сообщению
Valimar пишет:
Вообще мне не понятно, как делать сдвиг на один символ.
Если хочешь делать именно так, то:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $len = strlen($string);
  3. for ($i = 0; $i < $len - 4; $i++)
  4.         if (substr_count(substr($string, $i, 4), '1') == 1)
  5.                 echo substr($string, $i, 4).'<br>';
  6. ?>
5. IOpeH - 09 Марта, 2009 - 16:16:08 - перейти к сообщению
Champion, на работоспособность то проверял ? )))
PHP:
скопировать код в буфер обмена
  1.  
  2. $arr=array('1000', '0100', '0010', '0001');
  3. $str='101010001101000010011000111101001';
  4. $str2='';
  5.  
  6. foreach($arr as $v){
  7.         $num=strpos($str, $v);
  8.         if($num!==false){ $str2.=$num.', '; }
  9. }
  10. $str2=rtrim($str2, ', ');
  11. eval('$num=min('.$str2.');');
  12.  
  13. echo substr($str, $num, 4);
  14.  
6. Champion - 09 Марта, 2009 - 16:26:22 - перейти к сообщению
IOpeH, исправил, спасибо. then после if это конечно я дал))... На работе 2 недели в Дельфи программировал) Остальное тоже поправил)
7. Valimar - 09 Марта, 2009 - 16:59:39 - перейти к сообщению
IOpeH, Champion спасибо вам!

IOpeH Здорово! Только, вот это хорошо, когда известно, что комбинация из четырех символов, а если придется её менять, скажем, из трех символов (два нуля, одна единица) или из пяти (четыре нуля, одна единица), тут уже сложнее. В программе нужно будет заранее вносить нужные числа, т.е.:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $a = 4; // число смежных символов;
  4. $b = 3; // число нулей на $a символов;
  5. ?>
  6.  


Вообщем, Champion подсказал хорошую идею.

Начал делать так:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $mas = '101010001101000010011000111101001';
  4.  
  5. for($mas, $i = 0; strlen($s = substr($mas, $i, $a)) == $a; $i++)
  6. {
  7.      echo $s . "<br />";
  8. }
  9. // результат
  10. 1010
  11. 0101
  12. 1010
  13. 0100
  14. 1000
  15. 0001
  16. 0011
  17. 0110
  18. ...
  19. 1001
  20.  
  21. ?>
  22.  


А теперь мне нужно взять каждую полученную подстроку и сосчиать в ней кол-во нулей и сравнить с $b, если будет true, то выход из цикла.

Вот только подсчитать кол-во символов в подстроке не получается.

делаю так:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. for($j=0; $j<strlen($s); $j++)
  4. {
  5.     $res = substr($s, $j, 1);
  6.     if($res == '0')
  7.     {
  8.         $cnt++;
  9.     }
  10. }
  11. ?>
  12.  


Но вот дальше что-то не так делаю, код погружается в бесконечный цикл....блин =/
(Добавление)
Вот то, что я написал:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. for($mas, $i = 0; strlen($s = substr($mas, $i, 4)) == 4; $i++)
  4. {
  5.         //echo $s . "<br />";
  6.         for($j=0; $j<strlen($s); $j++)
  7.         {
  8.             $res = substr($s, $j, 1);
  9.             if($res == '0')
  10.             {
  11.                 $cnt++;
  12.             }
  13.         }
  14.         if ($cnt == 3)
  15.         {
  16.                 echo $s . "<br />";
  17.                 break;
  18.         }
  19. }
  20. echo $cnt;
  21. ?>
  22.  

И вложенный цикл непонятно, как работает. Такое ощущение, что он не обрабатывает каждую подстроку, а посимвольно возвращает всю строку. А $cnt возвращает 67
8. Valimar - 09 Марта, 2009 - 19:32:49 - перейти к сообщению
вроде всё, я просто забыл переменную $cnt переодически обнулять перед обработкой следующей подстроки, тем самым условие if ($cnt == 3) не выполнялось, т.к. счетчик постоянно рос =)))

 

Powered by ExBB FM 1.0 RC1