for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Игры Разума
   :: Помощь сайту :: 

between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата: 07.07.11 10:48:58ОтветитьЦитировать
Понадобилась мне функция between,
которая возвращает .t. и для варианта с "переставленными" границами,
т.е. between(2, 3, 1)

Параметры числовые.
Скорость выполнения имеет значение.
Может кто подкинет ещё идей?

Пока есть такие варианты:
function between1(a, b, c)  
  return between(a, b, c) or between(-a, -b, -c)  
    
  function between2(a, b, c)  
  return between(a, b, c) or between(a, c, b)  
    
  function between3(a, b, c)  
  return (a>b)<>(a>c) or (a<b)<>(a<c)  
    
  function between4(a, b, c)  
  return !((a>b)=(a>c) and (a<b)=(a<c))  
    
  function between5(a, b, c)  
  return between(a, min(b, c), max(b, c))  
    
  function between6(a, b, c)  
  return a>=min(b, c) and a<=max(b, c)


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive

Re: between
PaulWist

Сообщений: 13077
Дата: 07.07.11 11:49:06ОтветитьЦитировать
так лучше

m.first = 3  
  m.second = 1  
  m.current = 2.5  
    
  ?ABS(m.first - m.second) >= ABS(m.current - m.first)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено: PaulWist, 07.07.11 11:54
Ratings: 0 negative/0 positive

Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата: 07.07.11 11:56:10ОтветитьЦитировать
PaulWist
так лучше
m.first = -1  
  m.second = -3  
  m.current = 2.5  
  ?ABS(m.first - m.second) >= ABS(m.current - m.first)
Неа.
m.first = 0
m.second = 10
m.current = 1


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive

Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата: 07.07.11 11:57:06ОтветитьЦитировать
Видимо, ты имел в виду это:
function between7(a, b, c)
return abs(b-c)>=a - min(b, c)


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive

Re: between
PaulWist

Сообщений: 13077
Дата: 07.07.11 11:58:39ОтветитьЦитировать
У меня возвращает .t., а у тебя?

first, second - это границы диапазона

current - число которе ищем в диапазоне


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive

Re: between
PaulWist

Сообщений: 13077
Дата: 07.07.11 12:00:35ОтветитьЦитировать
Goodwin
Видимо, ты имел в виду это:
function between7(a, b, c)
return abs(b-c)>=a - min(b, c)

Нет.

between(current, first, second)
либо


between(current, second,  first)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive

Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата: 07.07.11 12:24:20ОтветитьЦитировать
Я минус потерял.
Вот тут врёт:
m.first = 0
m.second = 10
m.current = -1


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive

Re: between
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата: 11.07.11 10:56:05ОтветитьЦитировать
func is_between (aa,bb,cc)
retu between(aa,cc,bb)


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено: Влад Колосов, 11.07.11 10:57
Ratings: 0 negative/0 positive

Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата: 11.07.11 12:17:02ОтветитьЦитировать
Так оно на прямом порядке не сработает.

Итак, проверяем:
  
  create Cursor result (AlgNo i, TestNo i, time y)  
    
  create Cursor alg(code v(254))  
  insert into alg values('between(a, b, c) or between(-a, -b, -c)')  
  insert into alg values('between(a, b, c) or between(a, c, b)')  
  insert into alg values('(a>b)<>(a>c) or (a<b)<>(a<c)')  
  insert into alg values('!((a>b)=(a>c) and (a<b)=(a<c))')  
  insert into alg values('between(a, min(b, c), max(b, c))')  
  insert into alg values('a>=min(b, c) and a<=max(b, c)')  
  insert into alg values('abs(b-c)>=a - min(b, c)')  
    
  test(1, 1, 2, 3)  
  test(2, 4, 2, 3)  
  test(3, 1, 3, 2)  
  test(4, 4, 3, 2)  
  test(5, 3, 2, 4)  
  test(6, 3, 4, 2)  
    
  select AlgNo, sum(time) from result group by 1 order by 2  
    
  function test  
  	param n, a, b, c  
  	scan  
  		s=seco()  
  		ExecScript(;  
  			'for i=1 to 1000000'+chr(13)+ ;  
  				'=('+code+')'+chr(13)+ ;  
  			'endfor')  
  		insert into result values(recno('alg'), n, seco()-s)  
  	endscan  
  endfunc

Получаем:
Цитата:
№ алгоритма - общее время
2 - 4.1230
1 - 4.3080
6 - 4.3770
7 - 4.4570
5 - 4.5940
3 - 4.7520
4 - 4.8140


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive

Re: between
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата: 11.07.11 13:59:00ОтветитьЦитировать
То есть как не работает?
Задача: определить, находится ли А между Б и В, так ведь? Находится ли двойка между тройкой и единицей или между единицей и тройкой?

  
  ss= SECONDS()  
  FOR ii = 1 TO 1000000  
  	is_between(ii,30,24)  
  ENDFOR  
  ?SECONDS()-ss    
      
      
  func is_between (aa,bb,cc)  
  retu between(aa,iif(cc<bb,cc,bb),iif(bb<cc,cc,bb))

У меня 2.3 сек.

Вариант between(aa, bb, cc) or between(-aa, -bb, -cc) 2.4 сек


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено: Влад Колосов, 11.07.11 14:01
Ratings: 0 negative/0 positive

Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата: 12.07.11 07:48:15ОтветитьЦитировать
Влад Колосов
То есть как не работает?

Вот это:
func is_between (aa,bb,cc)   
  retu between(aa,cc,bb)
не работает для 2, 1, 3

Вот это
between(aa,iif(cc<bb,cc,bb),iif(bb<cc,cc,bb))
работает, но долго (5.65 в моей таблице)

У тебя тест некорректный: при ii>30 (т.е. весь цикл) просчитывается только вариант a>c>b


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive

Re: between
Igor Korolyov

Сообщений: 32506
Дата: 12.07.11 12:33:53ОтветитьЦитировать
Чёт я не понимаю, ведь вариант
between(a, b, c) or between(a, c, b)
самый простой, логичный, и явно не самый медленный - чего ж ещё желать то? Или цель найти наиболее "индусский" код реализующий такое поведение

------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата: 12.07.11 13:44:31ОтветитьЦитировать
Сначала просто искалось побыстрее, а потом спортивный интерес проснулся.
Однако, ничего любопытного обнаружить не удалось:
очевидно оказалось оптимальным.


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive

Re: between
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата: 12.07.11 15:37:22ОтветитьЦитировать
У меня 3-й вариант самый быстрый!

3,0.6330
4,0.6810
2,0.9660
5,0.9760
7,0.9840
1,1.0430
6,1.0540
8,1.2810

8 - мой вариант


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут писать в этом форуме.

On-line: 20 Сергей Зиньковский Simple777  and Guests: 18


© 2000-2019 Fox Club 
Яндекс.Метрика