Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Skomopox on April 08, 2013, 04:17:32 PM
-
Привет Всем! Кто подскажет насколько реально сделать так чтобы вычислял мин и максимум из цифр?
Пример: Есть 25 переменных. У всех каждый цикл меняются значения этих переменных. Как бы так можно было написать, чтобы кликер из этих 25 вычислял 5 самых больших по значению? Есть идеи?
-
Вот пример:
50 циклов выдается случайное число от 10 до 500
$resMin = 999999
for($i, $i < 50)
$res = RND(10,500)
IF($res > $resMax)
$resMax = $res
END_IF
IF($res < $resMin)
$resMin = $res
END_IF
end_cyc
LOGWRITE ("MAX ", $resMax, " MIN ", $resMin)
Halt
Прогоняем скрипт и получаем нижний и верхний пределы
-
А я понял задачу по другому. сформулируй подробней.
Что есть, в каком диапазоне. Есть ли отрицательные. ну и т.д.
молодец, продублировал.
-
Конкретный пример:
$c1=13
$c2=24
$c3=35
$c4=4
$c5=21
$c6=14
$c7=16
$c8=27
$c9=26
$c10=5
...
и т.д. Вот допустим 10 переменных. Как сделать, чтобы кликер из этих хотя бы 10 переменных нашёл 3 наибольших? Я то вижу, что это $c3,$c8,$c9. А вот в кликере... Да, я конечно могу каждый сравнивать друг сдругом, но если их у меня допустим 40-50 переменных, то пи...ц какой длинный скрипт получиться :) Есть идеи попроще?
-
Ну и что ж это за скрипт такой с 50 переменными? Может все дело в изначально неправильной логике?
-
Конкретный пример:
$c1=13
$c2=24
$c3=35
$c4=4
$c5=21
$c6=14
$c7=16
$c8=27
$c9=26
$c10=5
...
и т.д. Вот допустим 10 переменных. Как сделать, чтобы кликер из этих хотя бы 10 переменных нашёл 3 наибольших? Я то вижу, что это $c3,$c8,$c9. А вот в кликере... Да, я конечно могу каждый сравнивать друг сдругом, но если их у меня допустим 40-50 переменных, то пи...ц какой длинный скрипт получиться :) Есть идеи попроще?
Проще не знаю как. Всё равно только перебор.
Например так:
$c1=13
$c2=24
$c3=35
$c4=4
$c5=21
$c6=14
$c7=16
$c8=27
$c9=26
$c10=5
GOSUB(max_opred)
$max1=$max
GOSUB(max_opred)
$max2=$max
GOSUB(max_opred)
$max3=$max
LOGWRITE ("max1= ",$max1,", max2= ",$max2,", max3= ",$max3)
HALT
SUB(max_opred)
$max=0
IF($pr1 = 0)
IF($c1 > $max)
$pr1=1
$max=$c1
END_IF
END_IF
IF($pr2 = 0)
IF($c2 > $max)
$pr2=1
$max=$c2
END_IF
END_IF
IF($pr3 = 0)
IF($c3 > $max)
$pr3=1
$max=$c3
END_IF
END_IF
IF($pr4 = 0)
IF($c4 > $max)
$pr4=1
$max=$c4
END_IF
END_IF
IF($pr5 = 0)
IF($c5 > $max)
$pr5=1
$max=$c5
END_IF
END_IF
IF($pr6 = 0)
IF($c6 > $max)
$pr6=1
$max=$c6
END_IF
END_IF
IF($pr7 = 0)
IF($c7 > $max)
$pr7=1
$max=$c7
END_IF
END_IF
IF($pr8 = 0)
IF($c8 > $max)
$pr8=1
$max=$c8
END_IF
END_IF
IF($pr9 = 0)
IF($c9 > $max)
$pr9=1
$max=$c9
END_IF
END_IF
IF($pr10 = 0)
IF($c10 > $max)
$pr10=1
$max=$c10
END_IF
END_IF
END_SUB
Если будет вызываться не 1 раз вначале нужно добавить обнуление переменных $pr1-$pr10
-
Если покороче, то вот:
$c1=13
$c2=24
$c3=35
$c4=4
$c5=21
$c6=14
$c7=16
$c8=27
$c9=26
$c10=5
$string=STRCONCAT($c1,":",$c2,":",$c3,":",$c4,":",$c5,":",$c6,":",$c7,":",$c8,":",$c9,":",$c10)
GOSUB(max_opred)
$max1=$max
GOSUB(max_opred)
$max2=$max
GOSUB(max_opred)
$max3=$max
LOGWRITE ("max1= ",$max1,", max2= ",$max2,", max3= ",$max3)
HALT
SUB(max_opred)
$cut=$string
$max=0
WHILE(INT(STRPOS($cut,":"))!0)
$num=INT(STRCUT2($cut,1,STRPOS($cut,":")-1))
$cut=STRCUT2($cut,STRPOS($cut,":")+1,99999)
IF($num > $max)
$max=$num
END_IF
END_CYC
IF(INT($cut) > $max)
$max=INT($cut)
END_IF
IF(STRPOS($string,$max)=1)
$string=STRREPLACE($string, STRCONCAT($max,":"), "")
ELSE
$string=STRREPLACE($string, STRCONCAT(":",$max), "")
END_IF
END_SUB
Здесь при увеличении количества переменных будет расти только длина строки
$string=STRCONCAT($c1,":",$c2,":",$c3,":",$c4,":",$c5,":",$c6,":",$c7,":",$c8,":",$c9,":",$c10)
Длина всегда 29 строк против 72 для 10 переменных, если больше-строк больше.
-
Игорь спасибо! Я уже ответил в ВК. Хотя может тут и лучше было бы. Если будут ещё идеи по поводу того, что я написал, выкладывай с удовольствием :)
-
а зачем ещё уменьшать. Уже нормально. 28 строк для нахождения 3 максимальных, для пяти будет 32. В подпрограмму её и всё. То же для минимального если нужно.
-
$c1=13
$c2=24
$c3=35
$c4=4
$c5=21
$c6=14
$c7=16
$c8=27
$c9=26
$c10=5
$string=STRCONCAT($c1,":",$c2,":",$c3,":",$c4,":",$c5,":",$c6,":",$c7,":",$c8,":",$c9,":",$c10)
$string_pos=$string
GOSUB(max_opred)
$max1=$max
$pos1=$pos_result
GOSUB(max_opred)
$max2=$max
$pos2=$pos_result
GOSUB(max_opred)
$max3=$max
$pos3=$pos_result
LOGWRITE ("c",$pos1,"= ",$max1,", c",$pos2,"= ",$max2,", c",$pos3,"= ",$max3)
HALT
SUB(max_opred)
$cut=$string
$max=0
WHILE(INT(STRPOS($cut,":"))!0)
$num=INT(STRCUT2($cut,1,STRPOS($cut,":")-1))
$cut=STRCUT2($cut,STRPOS($cut,":")+1,99999)
IF($num > $max)
$max=$num
END_IF
END_CYC
IF(INT($cut) > $max)
$max=INT($cut)
END_IF
IF(STRPOS($string,$max)=1)
$string=STRREPLACE($string, STRCONCAT($max,":"), "")
ELSE
$string=STRREPLACE($string, STRCONCAT(":",$max), "")
END_IF
//LOGWRITE ("string= ",$string)
$pos=0
$cut=$string_pos
WHILE(INT(STRPOS($cut,":"))!0)
INC($pos)
$num=INT(STRCUT2($cut,1,STRPOS($cut,":")-1))
$cut=STRCUT2($cut,STRPOS($cut,":")+1,99999)
IF($num = $max)
$pos_result = $pos
$cut = ""
END_IF
END_CYC
IF($pos_result=0)
INC($pos)
$pos_result = $pos
END_IF
END_SUB
Вставил сюда, чтобы твой труд не пропадал зря если что. Проверил всё кул. Но разбираться так и не стал :) Сложно для меня всё это. Не дружуж я со строкаим :)
-
Вообще использовать немогу в таком варианте, к сожалению. Вариант у меня только один, ну как я вижу. Это, допустим, 10 переменных $c1-$c10. Изначально каждый равен 0. Но каждый цикл они у меня меняются. И каждый цикл мне необходимо вычислять 3 наибтольших и использовать это. Но, в таком варианте, как у тебя не получиться. Да мне в любом случае придётся наибольшие числа примерять под другие переменные, но не так. А именно: параллельно будут, допустим $gc1-$gc10. И вот допутим если $c4 одна из 3 наибольших чисел, то $gc4=1 и тогда я могу это использовать. Вот в таком варианте.
-
Вообще использовать немогу в таком варианте, к сожалению. Вариант у меня только один, ну как я вижу. Это, допустим, 10 переменных $c1-$c10. Изначально каждый равен 0. Но каждый цикл они у меня меняются. И каждый цикл мне необходимо вычислять 3 наибтольших и использовать это. Но, в таком варианте, как у тебя не получиться. Да мне в любом случае придётся наибольшие числа примерять под другие переменные, но не так. А именно: параллельно будут, допустим $gc1-$gc10. И вот допутим если $c4 одна из 3 наибольших чисел, то $gc4=1 и тогда я могу это использовать. Вот в таком варианте.
Не вижу никакой проблемы. В конце перед End_SUB добавить:
IF($pos_result = 1)
$gc1=1
END_IF
IF($pos_result = 2)
$gc2=1
END_IF
IF($pos_result = 3)
$gc3=1
END_IF
IF($pos_result = 4)
$gc4=1
END_IF
...и т.д.
Вставил сюда, чтобы твой труд не пропадал зря если что. Проверил всё кул. Но разбираться так и не стал :) Сложно для меня всё это. Не дружуж я со строкаим :)
Я тоже с ними не дружил. Вначале думал, что для меня вообще вряд ли пригодятся. Текстовые файлы кликером обрабатывать не собирался. А сейчас их полюбил. Отчасти наверно, что с их помощью сейчас можно реализовать замену массивам.
-
Что-то как ни пробовал вставлять, подстраивать - нифига не получается :-\
-
Что-то как ни пробовал вставлять, подстраивать - нифига не получается :-\
Ты бы подробней всё описал. А то часто "и тут вдруг выясняется..."
"нифига не получается" - слишком растянутое определение. Что хотел получить и что получилось?
-
Игорь, просто, чтобы тупо не молчать. Пока ничего конкретного. У меня тут небольшой затык. Поэтому пока не экспериментирую с этим. Спасибо за поддержку :)