1

Тема: Найти ближайшее меньшее/большее число к заданному

Здравствуйте.
Имеется ряд чисел, разделённых запятыми. В том числе и десятичные. Необходимо найти наиближайшее число из этого списка, большее/меньшее заданного.

Допустим: 5, 8, 365.45776, 346.45653, 573.4665356, 3, 364.4654565
Я задал 353.56644. Ближайшее большее 365.45776. Меньшее - 346.45653.

Как это проще всего сделать?

2

Re: Найти ближайшее меньшее/большее число к заданному

Можно так:

var = 5, 8, 365.45776, 346.45653, 573.4665356, 3, 364.4654565
number = 353.56644

var := RegexReplace(var, " ") "," number
Sort, var, N U D,
RegexMatch(var, "([\d\.]*),?\Q" number "\E,?([\d\.]*)", match)
msgbox % "min: " match1 "`nmax: " match2

3

Re: Найти ближайшее меньшее/большее число к заданному

Я так сделал.


num = 353.56644
str = 5, 8, 365.45776, 346.45653, 573.4665356, 3, 364.4654565  

NextNum(str, num, less, more)
MsgBox % "min: " less "`nmax: " more

NextNum(str, num, ByRef less, ByRef more) {
    Sort, str, N D`, 
	Loop, Parse, str, `,, %A_Space%
	{
		if (A_LoopField > num) && (more := A_LoopField) != ""
			break
		less := A_LoopField
	} 
}

Malcev в Regex ещё можно минуса добавить, мало ли, понадобятся отрицательные.

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

4

Re: Найти ближайшее меньшее/большее число к заданному

Malcev, красиво, но можно короче:

var = 5, 8, 365.45776, 346.45653, 573.4665356, 3, 364.4654565
number = 353.56644

var .= "," number
Sort, var, N D,
RegexMatch(var, "([-\d\.]*),? ?\Q" number "\E,? ?([-\d\.]*)", match)
msgbox % "min: " match1 "`nmax: " match2
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: Найти ближайшее меньшее/большее число к заданному

Или можно просто в лоб через Loop, parse:

nums := "5, 8, 365.45776, 346.45653, 573.4665356, 3, 364.4654565"

MsgBox, % nearMin := getNearMinOrMax(nums, 353.56644, "nearMin")
MsgBox, % nearMax := getNearMinOrMax(nums, 353.56644, "nearMax")

getNearMinOrMax(numStr, num, modifier)  {
	Loop, parse, numStr, `,, %A_Space%
	{
		(modifier = "nearMin" && A_LoopField < num && (near = "" || A_LoopField > near) && near := A_LoopField)
		(modifier = "nearMax" && A_LoopField > num && (near = "" || A_LoopField < near) && near := A_LoopField)
	}
	Return near
}

По производительности наверно это лучший вариант.

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