Author Topic: Считать количество скопированных одинаковых слов  (Read 5026 times)

0 Members and 1 Guest are viewing this topic.

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Всем хорошего настроения:)

Подскажите, как лучше сделать?

Запуская скрипт идёт копирование слова. Затем второй раз копирование другого слова и т.д. Слова разные, но иногда повторяются.

Суть в том, что если одно слово скопировано менее 10 раз, причем не важно за какой период, за последний час или в течение нескольких лет, то скрипт продолжается по сценарию А, а если более 10 раз, то по сценарию Б.

То есть данные должны храниться где-то на компе. Например, в текстовом файле, чтобы если закрыть кликерманн, а завтра открыть его снова, то данные сохранялись.

У кого какие идеи, как это можно сделать? Есть соображения скопированное слово помещать в текстовый файл, а затем фиксировать там кол-во скопированных одинаковых слов. Сначала думал просто все скопированные слова кидать в столбик, а потом как-то считать кол-во одинаковых строк в файле и если их больше 10, то вариант Б, но это быстро засорит файл и кликер будет работать медленно.

Есть идея формировать файл по типу:
Молоко*12
Сметана*4
Сахар*8
Соответствено если скопировалось слово "сахар", то Сахар*8 меняется на Сахар*9, но как это реализовать я не знаю. Если затем копируется слово Лимонад к примеру, а такого слова нет в файле, то создается новая строка Лимонад*1

Может как-то ещё можно сделать? У кого какие идеи?

Прикрепляю скриптик

Code: (clickermann) [Select]
FOR($a=0,$a<3)
   LCLICK(637,149)  // Выделение слова
   WAITMS(10)
END_CYC
KEYDOWN (#CTRL)
WAITMS (50)
KEYPRESS (#C)
KEYUP (#CTRL)
WAITMS (50)
$imk = FROMCLIP() // Слово в переменной

// Например, $imk = Молоко
// Если слово Молоко было скопировано более 10 раз за всю жизнь, то уведомление об этом, иначе уведомление о том, что лимит ещё есть.

Второй скрипт должен обнулять слово. Например, скопирован Лимонад и в том же файле Лимонад*0

Буду благодарен за ответы!
« Last Edit: May 27, 2022, 12:18:58 PM by SimplY »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
скопировано менее 10 раз, то скрипт продолжается по сценарию А, а если более 10 раз...
А если ровно 10 раз?  ;D


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Code: (clickermann) [Select]
$imk = FROMCLIP()

$file = "words.txt"

$word = STRCONCAT($imk, "*")
$len_file = TFCOUNT($file)
FOR($i=1, $i <= $len_file)
    $str = TFREAD($file, $i)
    $pos = STRPOS($str, $word)
    IF($pos > 0)
        // слово уже есть
        $count = STRCUT($str, STRPOS($str, "*") + 1, 10)
        INC($count)
        TFDELETE($file, $i)
        TFWRITE($file, STRCONCAT($word, $count))
        $i = 500000
    END_IF
    WAITMS(5)
END_CYC

// слова ещё нет
IF($i < 500000)
    TFWRITE($file, STRCONCAT($word, 1))
END_IF

IF($count <= 10)
    // сценарий А
ELSE
    // сценарий Б
END_IF

Если слов много, считывать лучше в массив
« Last Edit: May 27, 2022, 01:15:05 PM by Vint »


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
А если в ini записывать слово в качестае параметра и увеличивать значение пока не больше десяти? Было бы намного проще и быстрее, и пофиг на количество слов. Или в ини кирилица не прокатит? Нет возможности проверить...

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
скопировано менее 10 раз, то скрипт продолжается по сценарию А, а если более 10 раз...
А если ровно 10 раз?  ;D
То тоже вариант Б 🤣

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Code: (clickermann) [Select]
$imk = FROMCLIP()

$file = "words.txt"

$word = STRCONCAT($imk, "*")
$len_file = TFCOUNT($file)
FOR($i=1, $i <= $len_file)
    $str = TFREAD($file, $i)
    $pos = STRPOS($str, $word)
    IF($pos > 0)
        // слово уже есть
        $count = STRCUT($str, STRPOS($str, "*") + 1, 10)
        INC($count)
        TFDELETE($file, $i)
        TFWRITE($file, STRCONCAT($word, $count))
        $i = 500000
    END_IF
    WAITMS(5)
END_CYC

// слова ещё нет
IF($i < 500000)
    TFWRITE($file, STRCONCAT($word, 1))
END_IF

IF($count <= 10)
    // сценарий А
ELSE
    // сценарий Б
END_IF

Если слов много, считывать лучше в массив

Массив это же много переменных, а переменные хранятся только во время текущего запуска скрипта, или я что-то не знаю?
Слов порядка двух тысяч
Спасибо, возможность проверить будет в понедельник
« Last Edit: May 28, 2022, 06:57:42 AM by SimplY »

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Code: (clickermann) [Select]
$imk = FROMCLIP()

$file = "words.txt"

$word = STRCONCAT($imk, "*")
$len_file = TFCOUNT($file)
FOR($i=1, $i <= $len_file)
    $str = TFREAD($file, $i)
    $pos = STRPOS($str, $word)
    IF($pos > 0)
        // слово уже есть
        $count = STRCUT($str, STRPOS($str, "*") + 1, 10)
        INC($count)
        TFDELETE($file, $i)
        TFWRITE($file, STRCONCAT($word, $count))
        $i = 500000
    END_IF
    WAITMS(5)
END_CYC

// слова ещё нет
IF($i < 500000)
    TFWRITE($file, STRCONCAT($word, 1))
END_IF

IF($count <= 10)
    // сценарий А
ELSE
    // сценарий Б
END_IF

Если слов много, считывать лучше в массив

Ошибка:
Если первый раз делать, то норм, но если слово до звездочки уже есть в файле, то выплывает окно
Ошибка при интерпритации строки INT($count)

И как сделать, чтобы другой скрипт обнулял результат слова? Например: Находит слово Лимонад в строке и не важно, какое число после звёздочки, удаляет строку.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ошибка:
Если первый раз делать, то норм, но если слово до звездочки уже есть в файле, то выплывает окно
Ошибка при интерпритации строки INT($count)

Скрипт написан и проверялся на версии 4.13.14x32
И не INT($count), а INC($count) если используется более старая версия, то возможно нужно привести переменную к числу принудительно
Code: (clickermann) [Select]
$count = INT($count)Но на указанной версии будет всё нормально и так.

И как сделать, чтобы другой скрипт обнулял результат слова? Например: Находит слово Лимонад в строке и не важно, какое число после звёздочки, удаляет строку.
Блин, ну все команды же уже есть, ну подумай немного, разбери их. Там даже дописывать ничего не нужно, только удалить часть строк.


Иван_Васильевич

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
но если слово до звездочки уже есть в файле, то выплывает окно
Ошибка при интерпритации строки INT($count)
почему до звёздочки?
$count = STRCUT($str, STRPOS($str, "*") + 1, 10)
 в данном случае в переменную копируются 10 символов строки после звёздочки!
 Вам на месте конечно виднее, но я бы  перед копированием проверял длину строки, чтоб не давать команду на копирование того чего нет.
 и после этой строки на время отладки добавил вывод переменной $count в лог, чтоб сразу стало понятно на что ругается следующая строка.
Вы уже года три эту Кефирную тему разрабатываете - Достойно уважения на фоне массы за полчаса "сломавших Всю голову" и "Всё уже перепробовал" (кроме заглянуть в справку или меню команд  ;D)
« Last Edit: May 30, 2022, 08:30:12 AM by Иван_Васильевич »

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Ошибка:
Если первый раз делать, то норм, но если слово до звездочки уже есть в файле, то выплывает окно
Ошибка при интерпритации строки INT($count)

Скрипт написан и проверялся на версии 4.13.14x32
И не INT($count), а INC($count) если используется более старая версия, то возможно нужно привести переменную к числу принудительно
Code: (clickermann) [Select]
$count = INT($count)Но на указанной версии будет всё нормально и так.

И как сделать, чтобы другой скрипт обнулял результат слова? Например: Находит слово Лимонад в строке и не важно, какое число после звёздочки, удаляет строку.
Блин, ну все команды же уже есть, ну подумай немного, разбери их. Там даже дописывать ничего не нужно, только удалить часть строк.

Code: (clickermann) [Select]
// ===================== Работа с файлом ========================
   FOR($a=0,$a<3)
      LCLICK(636,150)  // Выделяет имя
      WAITMS(5)
   END_CYC
   copy()
   $imk = FROMCLIP()
   $imk = FROMCLIP()
   $file = "база нз.txt"
   $word = STRCONCAT($imk, "*")
   $len_file = TFCOUNT($file)
   FOR($i=1, $i <= $len_file)
      $str = TFREAD($file, $i)
      $pos = STRPOS($str, $word)
      IF($pos > 0)
         // слово уже есть
         $count = STRCUT($str, STRPOS($str, "*") + 1, 10)
         LOGWRITE ($count)
         WAITMS(20)
         $count = INC($count)
         LOGWRITE ($count)
         WAITMS(20)
         TFDELETE($file, $i)
         TFWRITE($file, STRCONCAT($word, $count))
         $i = 500000
      END_IF
      WAITMS(5)
   END_CYC
   
   // слова ещё нет
   IF($i < 500000)
      TFWRITE($file, STRCONCAT($word, 1))
   END_IF
   
   IF($count < 5)
      $peiod = 2
   ELSE
      IF($count < 10)
         $peiod = 10
      ELSE
         $dialog = DIALOGBOX("Искать?", 4, 2)
         IF ($mr = 6)
            print("Да")
         ELSE
            print("Нет")
         END_IF
      END_IF
   END_IF

ОШИБКА:
Ошибка интерпритации строки IF($count < 5)

Поразбирался. Если поменять поставить случайно набранную переменную, то ошибки не возникает.
Поставил запись в лог, чтобы понять, что $count в себе содержит

14:36:27 INC("INC("
14:36:27 INC("INC("INC("")

Версия кликера 4.13.014 x64
« Last Edit: May 30, 2022, 10:44:47 AM by SimplY »

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
но если слово до звездочки уже есть в файле, то выплывает окно
Ошибка при интерпритации строки INT($count)
почему до звёздочки?
$count = STRCUT($str, STRPOS($str, "*") + 1, 10)
 в данном случае в переменную копируются 10 символов строки после звёздочки!
 Вам на месте конечно виднее, но я бы  перед копированием проверял длину строки, чтоб не давать команду на копирование того чего нет.
 и после этой строки на время отладки добавил вывод переменной $count в лог, чтоб сразу стало понятно на что ругается следующая строка.
Вы уже года три эту Кефирную тему разрабатываете - Достойно уважения на фоне массы за полчаса "сломавших Всю голову" и "Всё уже перепробовал" (кроме заглянуть в справку или меню команд  ;D)

Звёздочка как разделяющий символ слово и кол-во. Можно конечно было бы просто ри каждом копировании кидать снова слово как строку, но файл будет большой и читаться будет долго

Про длинну строки хорошая идея. Попробую сделать, может и получится:)

Да-да-да)))) Я импортозамещаю сельское хозяйство  ;D ;D ;D

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Code: (clickermann) [Select]
         $count = INC($count)
14:36:27 INC("INC("
14:36:27 INC("INC("INC("")

Версия кликера 4.13.014 x64

Что такое 
Code: (clickermann) [Select]
$count = INC($count)
Где ты его взял?


SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Code: (clickermann) [Select]
         $count = INC($count)
14:36:27 INC("INC("
14:36:27 INC("INC("INC("")

Версия кликера 4.13.014 x64

Что такое 
$count = INC($count)

Где ты его взял?

Изменил на
$count = INT($count) и проблема исчезла

Но до сих-пор при копировании Кефир сначала Кефир*1, При повторном копировании слова Кефир*0 и далее Кефир*0

« Last Edit: May 30, 2022, 11:10:22 AM by SimplY »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Не знаю что ты ещё изменил. Первоначальный код работал и работает
Quote
STRCONCAT*1
Молоко*1
количество*2
imk*1
words*4


SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Не знаю что ты ещё изменил. Первоначальный код работал и работает
Quote
STRCONCAT*1
Молоко*1
количество*2
imk*1
words*4

На удивление вставил первоначальный скрипт и всё заработало:)