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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: И снова строки.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Valimar
Отправлено: 09 Марта, 2009 - 09:20:21
Post Id



Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Янв. 2009  


Помог: 0 раз(а)




Опять я со своими задачками. Но мне никуда от этого не деться.

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

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

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

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

10101000110100001001100011110100 1

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

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

изрисовал кучу бумаги, а идей толковых не родилось. Помогите, плиз =/
 
 Top
Champion Супермодератор
Отправлено: 09 Марта, 2009 - 11:39:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Valimar пишет:
состоящая из четырех символов, в которой должно быть три "0" и одна "1",
Таких комбинаций не так уж и много - всего 4. Есть strpos() и or
(Добавление)
еще с preg_match вариант такой

preg_match('/(0*10*)/', $stroka_s_00101011, $mathes);
потом пройти по $matches и убрать ототуда элементы, длина которых не 4
 
 Top
Valimar
Отправлено: 09 Марта, 2009 - 12:17:45
Post Id



Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Янв. 2009  


Помог: 0 раз(а)




Champion пишет:
Таких комбинаций не так уж и много - всего 4. Есть strpos() и or

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

Вообще мне не понятно, как делать сдвиг на один символ.
 
 Top
Champion Супермодератор
Отправлено: 09 Марта, 2009 - 12:50:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




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. ?>
 
 Top
IOpeH
Отправлено: 09 Марта, 2009 - 16:16:08
Post Id



Частый гость


Покинул форум
Сообщений всего: 175
Дата рег-ции: Нояб. 2007  


Помог: 0 раз(а)




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.  
 
 Top
Champion Супермодератор
Отправлено: 09 Марта, 2009 - 16:26:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




IOpeH, исправил, спасибо. then после if это конечно я дал))... На работе 2 недели в Дельфи программировал) Остальное тоже поправил)
 
 Top
Valimar
Отправлено: 09 Марта, 2009 - 16:59:39
Post Id



Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Янв. 2009  


Помог: 0 раз(а)




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

(Отредактировано автором: 09 Марта, 2009 - 17:46:50)

 
 Top
Valimar
Отправлено: 09 Марта, 2009 - 19:32:49
Post Id



Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Янв. 2009  


Помог: 0 раз(а)




вроде всё, я просто забыл переменную $cnt переодически обнулять перед обработкой следующей подстроки, тем самым условие if ($cnt == 3) не выполнялось, т.к. счетчик постоянно рос =)))
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB