Автокликер 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
...и т.д.
Вставил сюда, чтобы твой труд не пропадал зря если что. Проверил всё кул. Но разбираться так и не стал :) Сложно для меня всё это. Не дружуж я со строкаим :)
Я тоже с ними не дружил. Вначале думал, что для меня вообще вряд ли пригодятся. Текстовые файлы кликером обрабатывать не собирался. А сейчас их полюбил. Отчасти наверно, что с их помощью сейчас можно реализовать замену массивам.
			 
			
			- 
				Что-то как ни пробовал вставлять, подстраивать  - нифига не получается  :-\
			
 
			
			- 
				
Что-то как ни пробовал вставлять, подстраивать  - нифига не получается  :-\
Ты бы подробней всё описал. А то часто "и тут вдруг выясняется..."
"нифига не получается" - слишком растянутое определение. Что хотел получить и что получилось?
			 
			
			- 
				Игорь, просто, чтобы тупо не молчать. Пока ничего конкретного. У меня тут небольшой затык. Поэтому пока не экспериментирую с этим. Спасибо за поддержку :)