1 (изменено: Странникх, 2016-01-05 04:40:57)

Тема: AHK: Перебор возможных комбинаций

If (m_value != 1
&& ((m_1 = "true"	
&& m_2 = "false"	
&& m_3 = "false"	
&& m_4 = "false"	
&& m_5 = "false")
|| (m_1 = "false"	
&& m_2 = "true"	
&& m_3 = "false"	
&& m_4 = "false"	
&& m_5 = "false")))

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

2 (изменено: yalanne, 2016-01-05 14:53:49)

Re: AHK: Перебор возможных комбинаций

Вот так подходит?

m_value := 2
m_1 := true
m_2 := false
m_3 := false
m_4 := false
m_5 := false



variants := "01000|10000"

if (m_value != 1)
and (m_1 m_2 m_3 m_4 m_5 ~= "^(" variants ")$")
	MsgBox 1

Если же надо что бы true\false указывалась как текст, то есть в кавычках то вот:

m_value := 2
m_1 := "false"
m_2 := "true"
m_3 := "false"
m_4 := "false"
m_5 := "false"



variants := "01000|10000"

if (m_value != 1)
and (%m_1% %m_2% %m_3% %m_4% %m_5% ~= "^(" variants ")$")
	MsgBox 1

3 (изменено: Странникх, 2016-01-05 15:23:06)

Re: AHK: Перебор возможных комбинаций

Не совсем понял как применить для решения своей задачи. Как сверить, чтобы при m_value != 1 находился скажем любой m_ЧИСЛО со значением true, так, чтобы остальные (оставшиеся) m_ЧИСЛО были в значении false?

По аналогии, при m_value != 1 найти только 2 переменных m_ЧИСЛО в значении true, остальные false.

Не могли бы пояснить запись:

~= "^(" variants ")$")
; и саму переменную
variants := "01000|10000"

От 01000 до 10000 так понимаю разброс в цифровом значении, а как в буквенным виде сверять тогда?

4 (изменено: yalanne, 2016-01-05 15:51:18)

Re: AHK: Перебор возможных комбинаций

'~=' - Это сокращенный вариант функции RegExMatch(). Но в отличии от этой функции Этот оператор принимает только Haystack(слева) и NeedleRegEx (справа).

В RegEx символ '^' означает что поиск будет с начала строки.
Дальше идут круглые скобки '()' с помощью их можно указать группу символов. Знак вертикального разделения '|' служит в RegEx оператором 'ИЛИ'. с помощью переменной внедряется часть шаблона regex в скобки.
'$' Значит что это конец строки и после него не чего не может быть.

И да в переменной можно в место "01000" можно указать шаблон поиска "falsetruefalsefalsefalse"(можно переписать на более читаемый для юзера шаблон по желанию). Во втором примере просто строковая true\false преобразовывались в число 1\0.

В общем То что слева объединяется в одну строку и если оно равно одному из вариантов из переменной variants перечисленные через '|'  то условие истина.

Сейчас постараюсь написать как вы описали.

5 (изменено: yalanne, 2016-01-05 17:03:37)

Re: AHK: Перебор возможных комбинаций

Странникх пишет:

любой m_ЧИСЛО

Этих переменных может быть любое количество или строго 5?

Если всегда 5 то вот:

m_value := 0
m_1 := "true"
m_2 := "false"
m_3 := "false"
m_4 := "false"
m_5 := "false"


m_MaxIndexsTrue := %m_1% + %m_2% + %m_3% + %m_4% + %m_5%

if (m_value != 1)
? (m_MaxIndexsTrue = 1) ; Если m.value НЕравно 1 и Количество true равно 1, то истина по этому условию.
: (m_MaxIndexsTrue = 2) ; Если m.value равно 1 и Количество true равно 2, то истина по этому условию.
  MsgBox 1

Если любое количество то, уже через массив. Скорей всего если любое кол-во, то это определяется в цикле под определенным условием( в этом случает true если индекс в цикле равно 3)

m := {}

m.value := 0


m.Index := [] ; очистка массива.

loop 6
{
if (A_Index = 3)
 v := "true"
Else
 v := "false"

m.Index.Insert(v)
}

m.MaxIndexsTrue := 0
for i,k in m.Index
    m.MaxIndexsTrue += %k%

  
if (m.value != 1)
? (m.MaxIndexsTrue = 1) ; Если m.value НЕравно 1 и Количество true равно 1, то истина по этому условию.
: (m.MaxIndexsTrue = 2) ; Если m.value равно 1 и Количество true равно 2, то истина по этому условию.
  MsgBox 1

6 (изменено: Странникх, 2016-01-09 02:31:34)

Re: AHK: Перебор возможных комбинаций

Не могу понять свою синтаксическую ошибку в этих условиях:


m_1 := "false"
m_2 := "false"
m_3 := "false"
m_4 := "true"
m_5 := "false"

If (%m_1% %m_2% %m_3% %m_4% %m_5% ~= "^(" false true false false false 
									   || true false false false false ")$")

Если убрать последнюю строчку, то условия работают, как полагаются. А в этом примере они работают, даже когда не соблюдены (то есть m_4 = "true")

ADD:
Прочитал в справке про Производительность RegExMatch. Возник вопрос.

Для поиска простых подстрок используйте функцию InStr(), поскольку она быстрее, чем RegExMatch().

Насколько сильно может вызывать задержку в мс функция RegExMatch?

7

Re: AHK: Перебор возможных комбинаций

Странникх пишет:

Не могу понять свою синтаксическую ошибку

m_1 := "false"
m_2 := "false"
m_3 := "false"
m_4 := "true"
m_5 := "false"

If (%m_1% %m_2% %m_3% %m_4% %m_5% ~= "^(" false true false false false 
								    . "|" true false false false false ")$")
									  
									 MsgBox 1

Оператор должен быть из одной вертикальной линии и в кавычках.


Насчет InStr() не знаю. Не использовал эту функцию не разу.

8 (изменено: Странникх, 2016-01-09 02:56:07)

Re: AHK: Перебор возможных комбинаций

Отлично! Все понятно, хотя доходило больше часа. Спасибо большое.