Author Topic: как решить задачку  (Read 2390 times)

0 Members and 1 Guest are viewing this topic.

scat

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
как решить задачку
« on: June 03, 2020, 11:17:41 AM »
у Феди $xu1 = 10  яблок
у Васи $xu2 = 20 яблок
у Валеры $xu3  = 30 яблок

какую формулу написать что у Валеры $xu3 больше всего яблок??

или из массива переменных выделить наибольшее число

$xu1 = 0 // федя
$xu2 = 0 // вася
$xu3 = 0 // валера

WAITMS(500)





GETSCREEN
SCANPICTURE($ARR_SCAN, 759,436, 841,694, "xu1.bmp", -1, 100)

$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   INC($xu1, 1)
   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)


GETSCREEN
SCANPICTURE($ARR_SCAN, 759,436, 841,694, "xu2.bmp", -1, 100)

$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   INC($xu2, 1)

   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)


GETSCREEN
SCANPICTURE($ARR_SCAN, 759,436, 841,694, "xu3.bmp", -1, 100)

$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   INC($xu3, 1)

   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)

LOGWRITE ("федя яблок: ", $xu1,"шт" ) // 10
LOGWRITE ("вася яблок", $xu2,"шт" ) // 20
LOGWRITE ("валера яблок ", $xu3,"шт")  //30


« Last Edit: June 03, 2020, 03:28:26 PM by scat »

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: как решить задачку
« Reply #1 on: June 03, 2020, 09:49:20 PM »
какую формулу написать что у Валеры $xu3 больше всего яблок??
или из массива переменных выделить наибольшее число

Вот как то так, примерно.
Скрипт переделал. Координаты найденных картинок можно добавить если нужны.

Code: (clickermann) [Select]
LOGCLEAR

STRSEPARATE("Федя:Вася:Валера", ":", $collectors) // Сборщики яблок, через разделитель ":"

FOR($i = 0, $i < ARRSIZE($collectors))
   
   GETSCREEN
   // Ищем картинки с именами "Федя.bmp", "Вася.bmp", "Валера.bmp"
   SCANPICTURE($ARR_SCAN, 759,436, 841,694, STRCONCAT($collectors[$i], ".bmp"), -1, 100)
   
   ARRPUSH($count, ARRSIZE($ARR_SCAN)/2) // Количество яблок найденных текущим сборщиком, добавляем в массив
   
   INIWRITE("config.ini", ARRSIZE($ARR_SCAN)/2, $collectors[$i], "ЯБЛОКИ") // Записываем в базу количество найденных сборщиком яблок и имя сборщика
   
   UNDEFINE($ARR_SCAN)
   
END_CYC

// LOGWRITE ("Федя яблок: ", $count[0]," шт." ) // 10
// LOGWRITE ("Вася яблок: ", $count[1]," шт." ) // 20
// LOGWRITE ("Валера яблок: ", $count[2]," шт.")  //30

ARRSORT($count) // Сортируем массив с количеством яблок

$max_count = $count[ARRSIZE($count-1)] // Максимальное количество яблок, в сортированном массиве из цифр, будет в последней ячейке

// LOGWRITE ($max_count)

$winner = INIREAD("config.ini", $max_count, "ЯБЛОКИ") // Берем из базы имя сборщика, собравшего максимальное количество яблок

// LOGWRITE ($winner)

LOGWRITE ("Больше всех яблок собрал ", $winner, " (", $max_count, " шт.)") // Выводим результат в лог

HALT

Да, еще GETSCREEN надо вынести из цикла, если по условиям задачи достаточно одного снимка экрана.
« Last Edit: June 03, 2020, 10:39:29 PM by 4.У.В.@.К »

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: как решить задачку
« Reply #2 on: June 04, 2020, 09:11:09 AM »
Другой вариант скрипта. Вместо связки "ini-файл + массив", теперь один массив, со склеенными строками "количество + имя" и STRFILTER для "расклейки" этих строк. Так должно работать быстрее.

Code: (clickermann) [Select]
LOGCLEAR

STRSEPARATE("Федя:Вася:Валера", ":", $names)

GETSCREEN

FOR($i = 0, $i < ARRSIZE($names))
   
   // Ищем картинки с именами "Федя.bmp", "Вася.bmp", "Валера.bmp"
   SCANPICTURE($ARR_SCAN, 759,436, 841,694, STRCONCAT($names[$i], ".bmp"), -1, 100)
   
   ARRPUSH($arr, STRCONCAT(ARRSIZE($ARR_SCAN)/2, $names[$i])) // Количество найденных яблок добавляем в массив
   
   LOGWRITE (STRCONCAT($names[$i], " яблок: ", ARRSIZE($ARR_SCAN)/2, " шт."))
   
   UNDEFINE($ARR_SCAN)
   
END_CYC

ARRSORT($arr) // Сортируем массив с количеством яблок

// Максимальное количество яблок, в сортированном массиве из цифр, будет в последней ячейке
$max_count = STRFILTER($arr[ARRSIZE($arr) - 1], "0123456789", 1)

//LOGWRITE ($max_count)

LOGWRITE ("Больше всех яблок собрал ", STRFILTER($arr[ARRSIZE($arr) - 1], "0123456789", 0), " (", $max_count, " шт.)")

HALT

Еще как вариант - сравнивать количество яблок условием внутри цикла и сохранять в переменную только наибольшую цифру + имя. Без массивов.

scat

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Re: как решить задачку
« Reply #3 on: June 04, 2020, 09:56:29 AM »
Еще как вариант - сравнивать количество яблок условием внутри цикла и сохранять в переменную только наибольшую цифру + имя. Без массивов.

Если возможно поподробнее
массив необязателен  важна скорость просчета и вывод конечного результата

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: как решить задачку
« Reply #4 on: June 04, 2020, 11:43:23 AM »
Тогда так. Совсем просто стало.)) Вывод сообщений в лог много времени отнимает, по этому лишние (отладочные) сообщения лучше отключать.

Code: (clickermann) [Select]
LOGCLEAR

STRSEPARATE("Федя:Вася:Валера", ":", $names)

GETSCREEN

FOR($i = 0, $i < ARRSIZE($names))
   
   // Ищем картинки с именами "Федя.bmp", "Вася.bmp", "Валера.bmp"
   SCANPICTURE($ARR_SCAN, 685,222, 1115,608, STRCONCAT($names[$i], ".bmp"), -1, 100)
   
   IF($max_count < ARRSIZE($ARR_SCAN)/2)
      $max_count = ARRSIZE($ARR_SCAN)/2
      $max_name = $names[$i]
   END_IF
   
   LOGWRITE (STRCONCAT($max_name, " яблок: ", ARRSIZE($ARR_SCAN)/2, " шт."))
   
   UNDEFINE($ARR_SCAN)
   
END_CYC

LOGWRITE ("Больше всех яблок собрал ", $max_name, " (", $max_count, " шт.)")

HALT

scat

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Re: как решить задачку
« Reply #5 on: June 04, 2020, 12:18:06 PM »


3 вариант самое то Спасибо тебе добрый человек