1 (изменено: Alex_Lexon, 2017-02-04 00:00:16)

Тема: AHK: Значения из переменной в разные переменные

Здравствуйте, форумчане!
Короче, есть переменная, её содержание примерно такое: "A, B, A+, C, E, F, D, 2, 3, 1, 7, 5". Сами буквы и цифры - динамичны и не имеют логики появления, но структура именно такая. Каждая буква имеет значение, это прописано в начале скрипта (A := 7, D := 3 и т.д.) И скрипт должен сложить все значения и разделить их на кол-во значении, т.е. высчитать среднюю. Как такое вообще замутить? Единственный вариант до которого я догадался - это через RegExMatch магическим образом вытащить по отдельной переменной все буквы и цифры (Буквы поменять в цифры, естественно) но встает проблема с вычиткой кол-во этих значении, да и как реализовать то, что придумал, тоже не знаю, ибо это же кол-во может разнится.
Заранее спасибо за ответы!
P.S. Как дать значение A+? A+ := 7 не катит

2 (изменено: serzh82saratov, 2017-02-04 00:22:20)

Re: AHK: Значения из переменной в разные переменные

Alex_Lexon пишет:

Как дать значение A+? A+ := 7 не катит

Такой символ не поддерживается в названии переменной.

Alex_Lexon пишет:

Каждая буква имеет значение, это прописано в начале скрипта (A := 7, D := 3 и т.д.) И скрипт должен сложить все значения и разделить их на кол-во значении, т.е. высчитать среднюю.

А цифры в строке получается нигде не нужны?
Строка нужна чтобы знать какие использовать переменные?

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

3

Re: AHK: Значения из переменной в разные переменные

serzh82saratov пишет:

А цифры в строке получается нигде не нужны?
Строка нужна чтобы знать какие использовать переменные?

Не понял оба вопроса, если честно. В смысле цифры в строке не нужны? В строке информация, которую нужно сложить и вычесть среднюю.

4 (изменено: stealzy, 2017-02-04 00:36:16)

Re: AHK: Значения из переменной в разные переменные

1) Переписываете значения в начале скрипта в виде ассоциативного массива.
2) Удаляете из строки знаки плюса.
3) Loop, parse, string.  В цикле складываем - если число, сразу, если буква, достаем из массива.

5

Re: AHK: Значения из переменной в разные переменные

То есть сложить сумму указанных в строке переменных и чисел?

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

6 (изменено: stealzy, 2017-02-04 01:26:52)

Re: AHK: Значения из переменной в разные переменные

Colors := "red, A, B+, 5, 7"
arr := {red: 11, A: 22, "B+": 44}
summ := 0

Loop, parse, Colors, `,,%A_Space%
{
	a := A_LoopField

	if a is number
		summ+=a
	else if arr[a]
		summ+=arr[a]
	else
		MsgBox %a% Not Found

	N:=A_Index
}
MsgBox % summ / N

7

Re: AHK: Значения из переменной в разные переменные

Если же A и A+ это разные вещи, то замените "+" на "plus", скажем.

Зачем?

8 (изменено: stealzy, 2017-02-04 00:54:08)

Re: AHK: Значения из переменной в разные переменные

Malcev, действительно, достаточно взять в кавычки ключи массива.
Значит, вопрос решен.

9 (изменено: serzh82saratov, 2017-02-04 00:58:41)

Re: AHK: Значения из переменной в разные переменные

Помоему проще заменить на "plus".


A := 3, Ap := 5, C := 8 
str := "A, A+, C, 7, 5"
 
Loop, parse, % StrReplace(str, "+", "p"), `,, % A_Space, sum := 0
	sum += (A_LoopField + 0 = "" ? %A_LoopField% : A_LoopField), Count := A_Index
MsgBox % sum / Count
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Значения из переменной в разные переменные

Кто-то не обновил комментарии перед ответом ;-).

11

Re: AHK: Значения из переменной в разные переменные

stealzy пишет:

действительно, достаточно взять в кавычки ключи массива.

Про это?

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

12

Re: AHK: Значения из переменной в разные переменные

Ну да. Хотя если переменных, кончающихся на p нет, то проще выходит.

13 (изменено: serzh82saratov, 2017-02-04 01:10:01)

Re: AHK: Значения из переменной в разные переменные

И с массивом несложно, просто в шапке про переменные написано.


o := {A:3, "A+":5, C:8} 
str := "A, A+, C, 7, 5"

Loop, parse, str, `,, % A_Space, sum := 0  
	Sum += (A_LoopField + 0 = "" ? o[A_LoopField] : A_LoopField), Count := A_Index
MsgBox % Sum / Count
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14 (изменено: stealzy, 2017-02-04 01:22:52)

Re: AHK: Значения из переменной в разные переменные

Я тоже сначала тернарный использовал. А потом подумал, что лучше написать длиннее но понятнее.
Читать большой скрипт с подобным кодом вообще тяжело.
Засунуть 0 в OmitChars это оригинально, если ТС понадобиться произведение вместо суммы, он, я думаю не сразу дойдет, в чем подвох  :-). И не инициализированные переменные считать равными нулю не факт, что можно.

15 (изменено: serzh82saratov, 2017-02-04 01:47:48)

Re: AHK: Значения из переменной в разные переменные

stealzy пишет:

Я тоже сначала тернарный использовал.

Можно и без тернарного.


o := {A:3, "A+":5, C:8} 
str := "A, A+, C, 7, 5" 

Loop, parse, str, `,, % A_Space, S := C := 0
	i := A_LoopField, (i + 0 != "" && (++C, S += i)) || (o[i] + 0 != "" && (++C, S += o[i])) 
MsgBox % S / C
stealzy пишет:

Читать большой скрипт с подобным кодом вообще тяжело.

Думаю дело привычки, чем чаще используешь, тем проще читаешь.

stealzy пишет:

если ТС понадобиться произведение вместо суммы, он, я думаю не сразу дойдет, в чем подвох

Пункта про простоту кода не было.

stealzy пишет:

И не инициализированные переменные считать равными нулю не факт, что можно.

Тут не понял.

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

16 (изменено: serzh82saratov, 2017-02-04 02:12:09)

Re: AHK: Значения из переменной в разные переменные

В предыдущем посте в код добавлена проверка, что переменная имеет значение.
stealzy в 6 посте на этот счёт есть пара ошибок.

Если с переменными, то так правильнее:


A := 3, A# := 5, C := 8 
str := "A, A+, C, 7, 5"
 
Loop, parse, % StrReplace(str, "+", "#"), `,, % A_Space, Sum := Co := 0
	# := A_LoopField, (# + 0 != "" && (++Co, Sum += #)) || (%#% + 0 != "" && (++Co, Sum += %#%)) 
MsgBox % Sum / Co

Вместо плюса, в имени переменной "#".

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

17

Re: AHK: Значения из переменной в разные переменные

В условии так-то не сказано, что входящие данные неправильные.
Не вижу причин считать любую распарсенную переменную равной нулю, если для нее явно не задано значение. И две запятых подряд в строке - лучше предупредить. Или не в этом ошибка?

18 (изменено: serzh82saratov, 2017-02-04 03:34:16)

Re: AHK: Значения из переменной в разные переменные

stealzy пишет:

В условии так-то не сказано, что входящие данные неправильные.

Как и про обратное. И зачем тогда?

else if arr[a]
MsgBox %a% Not Found
stealzy пишет:

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

Также как и до этого совершенно не понимаю, о чём речь...

stealzy пишет:

И две запятых подряд в строке - лучше предупредить. Или не в этом ошибка?

Про две запятых не понял. Ошибка как я посчитал в том, что раз уже проверка значения ключа массива в коде есть, то это указывает на то, что автор кода предполагает вероятность неверных данных, тогда например так:

arr := {red: 11, A: 22, "B+": 44}
Colors := "red, A, B+, C, 5, 7" 

или так

arr := {red: 11, A: 22, "B+": "text"}
Colors := "red, A, B+, 5, 7"

будет неправильный результат.

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

19 (изменено: Alex_Lexon, 2017-02-04 20:51:48)

Re: AHK: Значения из переменной в разные переменные

Угу, окей, давайте дальше. Ответ получается, к примеру - 5. Теперь нужно обратно перевести это значение в букву. Представим, что переменная kkk имеет значение 5. По таблице получается, что 5 это В. Как сделать, чтобы MsgBох выдавал не 5, а B?