1

Тема: AHK: Порядок чисел

Я честно искал, и ничего не нашел.

Есть 5 строк в файле


id1 23
id2 33
id3 11
id4 64
id5 4

Надо посмотреть что идёт после пробела, сами цифры и составить в порядке убывания (от большего к меньшему),но составить их построчно, то есть в итоге получить:


id4 64
id2 33
id1 23
id3 11
id5 4

Каким способом это можно провернуть используя меньше строк кода?

2

Re: AHK: Порядок чисел

Ну если прямо такой пример, то я угадаю мелодию с одной ноты.


str = 
(
id1 23
id2 33
id3 11
id4 64
id5 4 
)

Sort, str, N P5 R

MsgBox % str
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

3 (изменено: belyankin12, 2019-04-29 23:14:16)

Re: AHK: Порядок чисел

Я уверен, что более опытные товарищи подскажут методы попроще и понадежнее, да и я вполне мог бы что-то получше придумать, если бы зашел в справку, но этот путь пришел мне в голову сразу же, потому покажу его вам:

tarr := [[], [], []]

Loop {
	FileReadLine, line, 1.txt, %A_Index%
	if ErrorLevel
		break
	
	tarr[3][A_Index] := line
	c_Index := A_Index
	
	RegExMatch(line, "id([0-9]+) ([0-9]+)", end_str)
	
	if (tarr[1].length() = 0) {
		tarr[1][1] := c_Index
		tarr[2][1] := end_str2
		continue
	}
	
	Loop % tarr[2].length()
	{
		if (tarr[2][tarr[2].length()] < end_str2) {
			tarr[2][tarr[2].length() + 1] := end_str2
			tarr[1][tarr[2].length() + 1] := c_Index
			break
		}
		
		if (tarr[2][tarr[2].length() - A_Index + 1] > end_str2) and (tarr[2][tarr[2].length() - A_Index] < end_str2) {
			tarr[2][tarr[2].length() - A_Index + 2] := tarr[2][tarr[2].length() - A_Index + 1]
			tarr[2][tarr[2].length() - A_Index + 1] := end_str2
			
			tarr[1][tarr[2].length() - A_Index + 2] := tarr[1][tarr[2].length() - A_Index + 1]
			tarr[1][tarr[2].length() - A_Index + 1] := c_Index
			break
		}
	}
}

For k, v in tarr[1]
{
	val := tarr[3][v]
	FileAppend, %val%`n, 2.txt
}

На самом деле в процессе обучения фраза "меньше строк кода" не самый лучший подход. Дело в том, что когда вы учитесь чему-то, лучше делать все по-своему, пусть это и костыли, пусть вы используете 200 строк вместо 20. Я почти уверен, что в процессе обучения у вас не стоит задача написать что-то с максимальным быстродействием и минимальным потреблением памяти (это и есть цель минимизации кода). Ограничивая себя вы лишь лишаете себя возможности узнать как работают те или иные команды, которые в "эталонном" решении может быть и не нужны сейчас, но обязательно понадобятся в будущем. Не спорю, что необходимо перенимать более надежные и продвинутые методы у более опытных товарищей, но это не панацея. Пока функциональность вашего скрипта не зависит от выбранного вами метода напрямую (кроме вышеупомянутой скорости и количества потребляемой памяти - что на практике очень редко дает какое-то существенное преимущество) лучше заимствовать лишь алгоритмы (пути достижения цели), а достигать их нужно самому.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

4

Re: AHK: Порядок чисел


str = 
(
id1 23
id2 33
id3 11
до последнего пробела например 64
id5 4 
)

Sort, str, F Func

MsgBox % str

Func(a1, a2) {   
    return RegExReplace(a2, ".* ") - RegExReplace(a1, ".* ")
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5

Re: AHK: Порядок чисел

wladkokopops пишет:

Каким способом это можно провернуть используя меньше строк кода?

Видимо товарищ опытен, и ему интересно не решение задачи как таковой.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

6

Re: AHK: Порядок чисел

Надеюсь это так .

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.