1 (изменено: serzh82saratov, 2014-04-27 17:58:17)

Тема: AHK: Ближайшее к нулю число

Собственно для поиска оптимального алгоритма (разминки).
Нужна функция возвращающая ближайшее к нулю число.
Кормить будем списком типа:

-345|-100|-234|0|500|400|200|

С флагом возвращает отрицательное: -100.
Без флага положительное: 200

Ноль в списке может и не присутсвовать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Ближайшее к нулю число

serzh82saratov пишет:

Ноль в списке может и не присутсвовать.

А зачем тогда вообще ноль в списке, если он не является претендентом?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Ближайшее к нулю число

Непонимаю, претендентом на что?
Мало ли какие числа попадут в список (любое целое число), и ноль тоже возможен, и не однократно как и любое другое число тоже может быть повторено в списке.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Ближайшее к нулю число

А зачем тогда оговаривать, что ноль в списке может не присутствовать? Просто задача поставлена не совсем корректно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Irbis, 2014-04-27 19:29:04)

Re: AHK: Ближайшее к нулю число

teadrinker, чем же вам "0" не угодил? Я так понимаю, ТС упомянул про возможное отсутствие "0" в списке, чтобы не было повода решить задачу поиском следующего за нулем числа в отсортированной строке для положительных чисел (или предыдущего - для отрицательных).

str = -345|-100|-234|0|500|400|200|
Sort, str, N D|
MsgBox % Min(str, "-")
Return
Min(str, s:= "")
{
   Loop, Parse, str, "|"
      if !res || abs(res) >= abs(A_LoopField) && (s . 1) * A_LoopField > 0
      res := A_LoopField
   Return res
}

6

Re: AHK: Ближайшее к нулю число

Да не знаю, просто уточнил, дабы не было желания искать в отсортированной строке ноль и число рядом с ним.

Просто задача поставлена не совсем корректно.

Даже не знаю как ещё сформулировать задачу... вроде всё просто.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Ближайшее к нулю число

Irbis пишет:

teadrinker, чем же вам "0" не угодил? Я так понимаю, ТС упомянул про возможное отсутствие "0" в списке, чтобы не было повода решить задачу поиском следующего за нулем числа в отсортированной строке для положительных чисел (или предыдущего - для отрицательных).

str = -345|-100|-234|0|500|400|200|
Sort, str, N D|
MsgBox % Min(str, "-")
Return
Min(str, s:= "")
{
   Loop, Parse, str, "|"
      if !res || abs(res) >= abs(A_LoopField) && (s . 1) * A_LoopField > 0
      res := A_LoopField
   Return res
}

М-м-м... А зачем тут вообще строчка

Sort, str, N D|

если всё равно сравниваются все числа подряд?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Ближайшее к нулю число

IrbisБлагодарю за работу

ТС упомянул про возможное отсутствие "0" в списке, чтобы не было повода решить задачу поиском следующего за нулем числа в отсортированной строке для положительных чисел (или предыдущего - для отрицательных).

Мысли читаете

М-м-м... А зачем тут вообще строчка

Прямо как в недавней теме

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Ближайшее к нулю число

Да кстати не ясно наличие оператора ">=", разве ">" недостаточно?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Ближайшее к нулю число

Мой вариант:

str = -345|-100|-234|0|500|400|200|
MsgBox % Min(str, "-") . "`n" . Min(str)

Min(str, s:= "")
{
   Sort, str, N D|
   Return RegExReplace(str, s ? ".*(\-\d+).*" : ".*?\|([^\-0]\d+).*", "$1")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Ближайшее к нулю число

Пожалуйста.
Ну, в общем, сначала была мысль ускорить обработку строки - из отсортированной строки выводить первое положительное число для случая с "+" числами. Потом отказался, т.к. сортировка априори занимает больше времени, чем однократный проход по всему ряду. Но тем не менее стоку с сортировкой забыл убрать. (*фейспалм*)

Для таких запущенных, как у меня, случаев, пытливый взгляд модератора как нельзя кстати.

12

Re: AHK: Ближайшее к нулю число

Мой, конечно, по скорости не оптимальный, но если уж возникла идея использовать Sort .

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Ближайшее к нулю число

но если уж возникла идея использовать Sort .

Ну да, она первая и пришла.

serzh82saratov пишет:

Да кстати не ясно наличие оператора ">=", разве ">" недостаточно?

Так всё таки.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14 (изменено: Irbis, 2014-04-27 20:10:20)

Re: AHK: Ближайшее к нулю число

teadrinker, ваш вариант красив, безусловно.
Правда, в моем примере в качестве флага "s" можно передавать не только "-", но и "+", а не только пустую строку для положительных числа, а в вашем Min(str, "+") даст не тот ответ. Ну это мелочь.

serzh82saratov пишет:

Да кстати не ясно наличие оператора ">=", разве ">" недостаточно?

И это излишне, ">" достаточно. Спасибо.

15

Re: AHK: Ближайшее к нулю число

На самом деле это было так, в порядке бреда . А про флаг — такое условие было.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Ближайшее к нулю число

Тоже качестве бреда сокращю-ка строчку.


Min(str, s:= "") { 
    Loop, Parse, str, "|"
        (!res || abs(res) > abs(A_LoopField) && (s . 1) * A_LoopField > 0) ? res := A_LoopField : "" 
   Return res
 }

Irbis
Ну Вы меня второй день подряд радуете изысками

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Ближайшее к нулю число

Забыл уточнить, в строке ведь может не быть удовлетворяющего числа:


str = 0|500|400|200|

Если тут надо отрицательное, то надо вернуть пустую строку.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: Ближайшее к нулю число

В таком разе проверку на знак числа поставить в первую очередь:

str = 0|500|400|200|
MsgBox % Min(str, "-")
Min(str, s:= "") { 
    Loop, Parse, str, "|"
        (s . 1) * A_LoopField > 0 && (!res || abs(res) > abs(A_LoopField)) ? res := A_LoopField : "" 
   Return res
 }
 

19

Re: AHK: Ближайшее к нулю число

Точно. Спасибо!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui