Author Topic: обычный массив  (Read 1876 times)

0 Members and 1 Guest are viewing this topic.

Луций

  • Активный участник
  • ***
  • Posts: 248
  • чат в телеге: https://t.me/klickermannchat
    • View Profile
    • Пишу скрипты на заказ:
обычный массив
« on: December 01, 2020, 06:59:14 PM »
всем привет, я всегда писал скрипты максимально простым языком без использования массивов, и пришел к моменту когда функциями уж очень геморно писать, а массив в теории сможет все сдеалать красиво и просто

для примера у меня есть задача в которой есть имена и баллы, количество имен и цифр может быть разным, нам нужно каждое имя сохранять, а баллы к имени прибавлять

например
аня 2
паша 3
аня 9
аня 6
паша 1

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

аня 17
паша 4

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

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: обычный массив
« Reply #1 on: December 01, 2020, 08:50:30 PM »
Первый вариант - имеем псевдо двумерный массив. Где четные элементы массива - это имя, не четные - баллы.

Code: (clickermann) [Select]
//создаем рандомный массив с именами и баллами
$rnd = rnd(5,15) // имен будет от 5 до 15
FOR($a=0,$a<$rnd)
   
   IF(rnd(0,1))
      $name = "аня"
   ELSE
      $name = "паша"
   END_IF
   
   arrpush($arr, $name)  //добавляем в конец массива имя
   arrpush($arr, rnd(1, 20)) //добавляем в конец массива баллы
   
END_CYC

//смотрим что у нас вышло в массиве
FOR($a=0,$a<arrsize($arr), 2)
   print($arr[$a], " ", $arr[$a+1])
END_CYC


//суммируем баллы для каждого имени


FOR($a=0,$a<arrsize($arr), 2)
   IF($arr[$a] = "аня")
      $anne = $anne + $arr[$a+1]
   ELSE
      $pasha = $pasha + $arr[$a+1]
   END_IF   
END_CYC

//смотрим результат
print("")
print("в сумме")
print("аня ", $anne)
print("паша ", $pasha)

halt

Code: (лог) [Select]
20:50:02 паша 11
20:50:02 паша 5
20:50:02 аня 14
20:50:02 аня 9
20:50:02 паша 3
20:50:02 аня 4
20:50:02 паша 11
20:50:02
20:50:02 в сумме
20:50:02 аня 27
20:50:02 паша 30



Второй вариант - имеем два отдельных массива для имен и для баллов, где номер элемента массива с именем соответствует номеру элемента массива с баллами.

Code: (clickermann) [Select]
//создаем рандомные массивы с именами и с баллами
$rnd = rnd(5,15) // имен будет от 5 до 15
FOR($a=0,$a<$rnd)
   
   IF(rnd(0,1))
      $name = "аня"
   ELSE
      $name = "паша"
   END_IF
   
   $arr_name[$a] = $name  //пишем в массив рандомное имя
   $arr_points[$a] = rnd(1, 20) //в другой массив пишем рандомное кол-во баллов
   
END_CYC

//смотрим что у нас вышло в массиве
FOR($a=0,$a<arrsize($arr_name))
   print($arr_name[$a], " ", $arr_points[$a])
END_CYC


//суммируем баллы для каждого имени


FOR($a=0,$a<arrsize($arr_name))
   IF($arr_name[$a] = "аня")
      $anne = $anne + $arr_points[$a]
   ELSE
      $pasha = $pasha + $arr_points[$a]
   END_IF   
END_CYC

//смотрим результат
print("")
print("в сумме")
print("аня ", $anne)
print("паша ", $pasha)

halt

Code: (лог) [Select]
20:56:44 аня 16
20:56:45 паша 3
20:56:45 паша 6
20:56:45 аня 19
20:56:45 паша 5
20:56:45 паша 6
20:56:45 паша 13
20:56:45 аня 5
20:56:45 паша 7
20:56:45 паша 1
20:56:45 аня 6
20:56:45
20:56:45 в сумме
20:56:45 аня 46
20:56:45 паша 41



Третий вариант - имеем один массив со строками имя/баллы

Code: (clickermann) [Select]
//создаем рандомный массив со строкой имя+баллы
$rnd = rnd(5,15) // имен будет от 5 до 15
FOR($a=0,$a<$rnd)
   
   IF(rnd(0,1))
      $name = "аня"
   ELSE
      $name = "паша"
   END_IF
   
   $arr[$a] = strconcat($name," ", rnd(1, 20))  //пишем в массив строку с рандомным именем и с рандомным кол-вом баллов
   
END_CYC

//смотрим что у нас вышло в массиве
FOR($a=0,$a<arrsize($arr))
   print($arr[$a])
END_CYC


//суммируем баллы для каждого имени
//в этом варианте добавляется лишняя работа со строками

FOR($a=0,$a<arrsize($arr))
   
   $points = int(strcut2($arr[$a], strpos($arr[$a], " ")+1, strlen($arr[$a])))
   
   
   IF(strpos($arr[$a], "аня"))
      $anne = $anne + $points
   ELSE
      $pasha = $pasha + $points
   END_IF
END_CYC

//смотрим результат
print("")
print("в сумме")
print("аня ", $anne)
print("паша ", $pasha)

halt

Code: (лог) [Select]
21:14:12 паша 10
21:14:12 паша 6
21:14:12 паша 16
21:14:12 паша 12
21:14:12 аня 6
21:14:13 аня 5
21:14:13 паша 3
21:14:13 аня 2
21:14:13 паша 18
21:14:13 аня 7
21:14:13
21:14:13 в сумме
21:14:13 аня 20
21:14:13 паша 65
« Last Edit: December 01, 2020, 09:34:14 PM by dramster »

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: обычный массив
« Reply #2 on: December 01, 2020, 09:55:22 PM »
имен и балов может быть огромное количество

Если список имен и баллов будет очень большой, то лучше сделать, как сделал Атеист - http://crapware.aidf.org/forum/index.php?topic=4033.msg27491#msg27491
Из его скрипта тебе нужна только нереальная восьмая строка, которая содержит в себе весь замысел. Это и есть ядро. Никаких условий, только действия. Одна строка чистого кайфа.)) Ну и "обвес" от себя добавишь. Всё там очень похоже на эту задачу, только цифры придется наращивать не на единицу, а на конкретное число. Лично я, копал бы в том направлении, но мне лень))...


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: обычный массив
« Reply #3 on: December 01, 2020, 10:21:54 PM »
имен и балов может быть огромное количество

Если список имен и баллов будет очень большой, то лучше сделать, как сделал Атеист - http://crapware.aidf.org/forum/index.php?topic=4033.msg27491#msg27491
Из его скрипта тебе нужна только нереальная восьмая строка, которая содержит в себе весь замысел. Это и есть ядро. Никаких условий, только действия. Одна строка чистого кайфа.)) Ну и "обвес" от себя добавишь. Всё там очень похоже на эту задачу, только цифры придется наращивать не на единицу, а на конкретное число. Лично я, копал бы в том направлении, но мне лень))...

Можно и так, но в данном случае мне кажется этот вариант врядли быстрее.

Для первого случая, где псевдо двумерный массив:

Code: (clickermann) [Select]
TFCLEAR("name_points.ini", 1)
//создаем рандомный массив с именами и баллами
$rnd = rnd(5,15) // имен будет от 5 до 15
FOR($a=0,$a<$rnd)
   
   IF(rnd(0,1))
      $name = "аня"
   ELSE
      $name = "паша"
   END_IF
   
   arrpush($arr, $name)  //добавляем в конец массива имя
   arrpush($arr, rnd(1, 20)) //добавляем в конец массива баллы
   
END_CYC

//смотрим что у нас вышло в массиве
FOR($a=0,$a<arrsize($arr), 2)
   print($arr[$a], " ", $arr[$a+1])
END_CYC


//суммируем баллы для каждого имени


FOR($a=0,$a<arrsize($arr), 2)
   INIWRITE("name_points.ini", $arr[$a], int(INIREAD("name_points.ini", $arr[$a])) + $arr[$a+1])
END_CYC


//смотрим результат
print("")
print("в сумме")

print("аня ", INIREAD("name_points.ini", "аня"))
print("паша ", INIREAD("name_points.ini", "паша"))

halt

Code: (лог) [Select]
22:16:53 паша 14
22:16:53 аня 14
22:16:53 паша 20
22:16:53 паша 14
22:16:53 паша 7
22:16:53 аня 16
22:16:54 паша 15
22:16:54
22:16:54 в сумме
22:16:54 аня 30
22:16:54 паша 70
« Last Edit: December 02, 2020, 12:10:18 AM by dramster »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: обычный массив
« Reply #4 on: December 01, 2020, 10:37:13 PM »
Решил потестить, массив с 1000 именами. Через ини в 20 !!! раз дольше считает.

Code: (clickermann) [Select]
TFCLEAR("name_points.ini", 1)
//создаем рандомный массив с именами и баллами
$rnd = 1000 // имен будет 1000
FOR($a=0,$a<$rnd)
   
   IF(rnd(0,1))
      $name = "аня"
   ELSE
      $name = "паша"
   END_IF
   
   arrpush($arr, $name)  //добавляем в конец массива имя
   arrpush($arr, rnd(1, 20)) //добавляем в конец массива баллы
   
END_CYC

//смотрим что у нас вышло в массиве
//FOR($a=0,$a<arrsize($arr), 2)
//   print($arr[$a], " ", $arr[$a+1])
//END_CYC


//суммируем баллы для каждого имени

$time = $_ms
FOR($a=0,$a<arrsize($arr), 2)
   INIWRITE("name_points.ini", $arr[$a], int(INIREAD("name_points.ini", $arr[$a])) + $arr[$a+1])
END_CYC
print("С помощью ини ", $_ms - $time, " мс.")

//смотрим результат
print("")
print("в сумме")

print("аня ", INIREAD("name_points.ini", "аня"))
print("паша ", INIREAD("name_points.ini", "паша"))


wait(1)
//суммируем баллы для каждого имени
print("------------------------")
print(" ")
$time = $_ms
FOR($a=0,$a<arrsize($arr), 2)
   IF($arr[$a] = "аня")
      $anne = $anne + $arr[$a+1]
   ELSE
      $pasha = $pasha + $arr[$a+1]
   END_IF   
END_CYC
print("Обычное суммирование через условия ", $_ms - $time, " мс.")
 
//смотрим результат
print("")
print("в сумме")
print("аня ", $anne)
print("паша ", $pasha)

halt

Code: (лог) [Select]
22:36:29 С помощью ини 13272 мс.
22:36:29
22:36:29 в сумме
22:36:30 аня 5239
22:36:30 паша 5307
22:36:31 ------------------------
22:36:31 
22:36:31 Обычное суммирование через условия 690 мс.
22:36:32
22:36:32 в сумме
22:36:32 аня 5239
22:36:32 паша 5307
« Last Edit: December 02, 2020, 12:10:02 AM by dramster »

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: обычный массив
« Reply #5 on: December 01, 2020, 10:50:55 PM »
Решил потестить, массив с 1000 именами. Через ини в 20 !!! раз дольше считает.

А ты потести с 1000 разными именами, а не с двумя именами 1000 раз.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: обычный массив
« Reply #6 on: December 01, 2020, 10:59:23 PM »
Решил потестить, массив с 1000 именами. Через ини в 20 !!! раз дольше считает.

А ты потести с 1000 разными именами, а не с двумя именами 1000 раз.

Не спорю.

Я так и написал  :D:

Можно и так, но в данном случае мне кажется этот вариант врядли быстрее.



4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: обычный массив
« Reply #7 on: December 01, 2020, 11:21:24 PM »
Можно и так, но в данном случае мне кажется этот вариант врядли быстрее.

Что значит "кажется"? Цифры нужны, раз уж споришь.
Одно условие крутить в цикле, много времени не надо. А ты попробуй тысячи условий обработать, скажем так - "одной строкой".
И вот эту фразу - "//чудо нереальная строка :)", не стоило писать, если красоты кода (и самой идеи) не понимаешь. Сотри пожалуйста, если конечно оценишь эту строку. Ок?)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: обычный массив
« Reply #8 on: December 01, 2020, 11:57:09 PM »
А в чём чудность строки?
Просто читает, увеличивает и пишет назад. В таком виде используется часто.
Вся красота заключается в том, что нам скрыто под капотом реализации функции iniwrite. Это она на делфи ищет дубли ключей в секции перед записью, чтоб не создавать дублей.
Это конечно выход в некоторых ситуациях, но так насиловать диск не каждый захочет, особенно если ssd.


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: обычный массив
« Reply #9 on: December 02, 2020, 12:07:36 AM »
----
Ойёйёйё... Че ты прицепился  ??? Я же написал выше НЕ СПОРЮ.  Я не первый день на форуме. Думаешь я не видел такого использования функций работы с ини? Да это круто в некоторых случаях. Помнится мне и у меня такой случай когдато был, но не нашел той темы.

Если тебе легче от этого, удалил "оскорбительную" фразу. Только я ее копипастил с твоего сообщения:
Если список имен и баллов будет очень большой, то лучше сделать, как сделал Атеист - http://crapware.aidf.org/forum/index.php?topic=4033.msg27491#msg27491
Из его скрипта тебе нужна только нереальная восьмая строка, которая содержит в себе весь замысел. Это и есть ядро. Никаких условий, только действия. Одна строка чистого кайфа.)) Ну и "обвес" от себя добавишь. Всё там очень похоже на эту задачу, только цифры придется наращивать не на единицу, а на конкретное число. Лично я, копал бы в том направлении, но мне лень))...

Кстати, фразу:
имен и балов может быть огромное количество
я наверно понял не так как ты, я решил что количество одинаковых имен может быть огромное количество. Если имелось ввиду что много разных вариантов имен, то и действительно проще использовать INIWRITE.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: обычный массив
« Reply #10 on: December 02, 2020, 08:45:17 AM »
Ещё бы понимать "огромно" это сколько в данном случае.
В моём понимании до 1000 - это мало, 10000 это средне, 100000 - много, 1000000 -очень много. Огромно - наверное, от десятка миллионов. Но это не про кликер такие числа.


Луций

  • Активный участник
  • ***
  • Posts: 248
  • чат в телеге: https://t.me/klickermannchat
    • View Profile
    • Пишу скрипты на заказ:
Re: обычный массив
« Reply #11 on: December 02, 2020, 08:30:03 PM »
ого готовое решение, пойду допиливать в проект но потестить смогу не скоро
дай вам бог здоровья как говорится

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: обычный массив
« Reply #12 on: December 02, 2020, 10:13:12 PM »
ого готовое решение, пойду допиливать в проект но потестить смогу не скоро
дай вам бог здоровья как говорится

да подавись