проверка корректности списка диапазонов

dtmax

Guest
проверка корректности списка диапазонов

Hi, All!

Есть задача: проверить корректность задания диапазона, например:

правильный диапазон: 1-3, 5, 7-10
неправильный диапазон: 1-3, 2-5, 4-6

Сколько будет "поддиапазонов", заранее не известно.
Может, кто сталкивался? Подскажите оптимальный алгоритм или ссылку дайте.
Ясное дело, можно "тупо" в цикле перебирать значения, и следить, чтобы они
шли друг за другом по-порядку. Но может, у кого-то есть решение "красивше".
Возможно, как-то заюзать регулярные выражения, хотя я не представляю, как
даже сравнить 2 числа в регулярном выражении...

А может быть, кто-то решал уже и задачу "равноценного преобразования"
диапазонов? Т.е. из 2-3, 4-5 сделать 2-5...

Заранее спасибо.
Максим.
 

.des.

Поставил пиво кому надо ;-)
Ух же ты и задачу сформулировал :) Первоначально кажется, что действительно не тривиально... на самом деле -
PHP:
$str=" 1-3, 2-5, 7-10";
$str=str_replace(" ","",$str); // Убираем не нужные нам пробелы
$arr=split("[,-]",$str);
for($i=0,$c=sizeof($arr)-1;$i<$c;$i++)
	if((int)$arr[$i]>=(int)$arr[$i+1])
		break;
if($i==$c)
	echo "Диапазон верен";
else
	echo "Диапазон не верен";
насчет второй части.. так же легко :)
 

dtmax

Guest
Привет, .des.
Спасибо за ответ...
Что-то подобное (может не так оптимально), я сделал, посмотри кусок кода ниже. На самом деле задача сложнее, в частности, потом придется проверять, чтобы введенное занчение соответствовало этому диапазону, и избвить пользователя от сообщений об ошибках типа "диапазон 7-6,1-4 неверен", так как в принципе он верен. Я думал, что предложат как-то с массивами границ поддиапазонов поработать или какой-нибудь уже известный метод супер-пупер-автоматов, кем-то уже разработанный...
Но вероятно, этот бред пришлось делать только мне ;)


//check range for permitted characters and common view
if(!preg_match("/^((\d+(-\d+)?),?)+$/",$prop_range))
{
$err1=true;
$sv_errors[]=_w("Параметр 'Диапазон' задан некорректно.","");
}

//check for subranges to be in ascending order
if(!$err1)
{
$rx=split(",|-",$prop_range);
for($i=1;$i<sizeof($rx);$i++)
if($rx[$i-1]>=$rx[$i])
{
$err1=true;
$sv_errors[]=_w("Проверьте правильность поддиапазонов в параметре 'Диапазон'.","");
break; //end of cycle
}
}
 

.des.

Поставил пиво кому надо ;-)
Именно из-за того как ты сформулировал вопрос.. я тоже вначале подумал об автоматах.. но автоматы лишь усложнят решение :)
Если тебе нужно выявить конкретные поддиапазоны "неверные" то сплить по запятым и в цикле рассматривай поддиапазоны. Это будет проще.
И еще как я понимаю тебе диапазоны подобные следующим 7-6,1-4 тоже надо пропускать потому что они верные?
Ну тогда первоначально упорядочь массив поддиапазонов.

Задачу следовало бы на мой взгляд сформулировать так (навскидку): " Как проверить есть ли в строке перекрывающиеся диапазоны, и в случае их наличия - указать какие именно."
 

dtmax

Guest
спасибо...
мораль (для себя): не надо искать сложных путей ;)
все гениальное - просто (с) кто-то
 
Сверху