The Abyss, антимакрос

Special shard settings and features

Moderators: Murderator+, Murderator

Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Grin wrote:Как всегда ничего тут не изменилось;)
вот вечно через заднее место идут...
Дест тебе же уже предложили вариант который в несколько порядков будет быстрей работать и с 100% результатом. Я понимаю что ты ухватился за свое, но поверь - это глупо. Тем более есть есть проблемы с афинами преобразованиями. Найди одну формулу скалярного произведения векторов...

С афинными преобразованиями я уже разобрался, вроде :)

Не видел никаких вариантов, не покажешь ?..

Скажите мне, что делать - я это сделаю, мне не важно, как решать проблему, важно, чтобы это было эффективно.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Sanch wrote:Попробовать стоит, возможно гениальность решения кроется в простоте.

Я около 3 часов тестировал их антимакро.

Ещё вопросы есть?
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Перечитал тему - видел вариант только с перебивкой всех вариантов.. :)

Вариант действительно действенный, но реализация предполагает три варианта (как мне кажеться):
1. Хранить инфу в памяти инжы, что будет съедать кучу памяти.
2. Хранить инфу в реестре - что захламляеет реестр, но позволяет быстро и удобно вытаскивать нужные данные,
3. Хранить инфу в файлах - оттуда вытаскивать её ещё сложнее и дольше.

Я бы выбрал второй вариант, чтобы особо не вешать инжу захлаямлением памяти, впринципе - вариант вполне реальный, могу написать скриптик - будите сидеть нон-стоп цифры вводить, пока все не поперевводите (вариантов будет достаточно много) :roll:

А главное - решение будет коротким..

PS: Афинные преобразования заработали - синусы и косинусы местами перепутал, и ваще, не сразу понял, что это канонический алгоритм и на нуль мона намана поделить..

Вобщем вот, доразберусь с афинами, поеду в китай 8)

Моё решение, которое я хочу реализовать, предполагает, что на скриптах инжы, оно будет решаться не более 30 сек (по моим прикидкам и замерам), в завимимости от сложности предоставленного экземпляра.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Grin wrote:нарисуй цифры пронумеровав точки в порядке их появления. Порядок всегда один и тотже. Вспоминаем геометрию и выделяем в каждой цифре 2-3 уникальных угла образованных точками. Проверяем на соответствие на условие "Угол".
Чапра не примитивная (другую просто не нарисуешь), а вот способ ее подачи примитивен...

А это что?
Если не понятно, то
То все цифры ст роются в определенном порядке и этот порядок всегда один и тот же. Это не сравненной большой минус этого антимакра, так как теперь надо просто нарисовать все эти цифры пронумеровав точки в порядке их прорисовки. теперь начинаем анализировать цифры и мы видим что сочетание прямых углов в каждой цифре уникально...
А именно уникально из каких точек по номеру построена цифра. Достаточно выделить в цифре 2-3 таких угла и про на писать не большую процедуру проверки угла по 3-м точкам. Дальше оптимизируя алгоритм можно ускорить перебор возможных углов, так как нам уже дают подсказку среди каких цифр нам стоит искать и весь перебор с водится к проверки макс 2 цифр (если 3 цифра может быть получена путем исключения). Сей метод абсолютно не зависит на сколько и куда развернуты цифры.

ПС Так как матрица точек разворачивалась в дискретном пространстве то все координаты были округлены до целых, тоесть это может сказаться на тест "угла", но это будет очень не значительно.
Тест "Угла" проводитс по скалярному произведению векторов

ПСС только попробуй его продай;) прибью...

ПССС 30 сек?! и подсчитал же... То что выше будет работать доли секунды...
Last edited by Grin on 2007-05-04 10:02:37, edited 1 time in total.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Пропустил пост, дважды.. странно.

Ща вдумаюсь..

Слушай, стуки в асю?) 119060..

Спрошу что-нить )

PS: Ммм, два Junior Expert'а, а разница в знаниях очевидна.. Гмм )

PPS: Всё равно было приятно разобраться с афинными преобразованиями.

PPPS: На JavaScript тоже будет доли секунды работать, фишка с арктангенсом и квадратным корнем 8)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Ну так ты дойди до работающего алгоритма.
Потом прикрути яву к инжекту.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Grin wrote:Ну так ты дойди до работающего алгоритма.
Потом прикрути яву к инжекту.

Ява и яваскрипт штука разная, яву я пока не изучил :)

А насчёт работающих алгоритмов я уже приступил к осмысливанию того, что ты написал :)

PS: Харэ редактить свои посты :roll:
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Раз уж мне все всё так подробно расписали - буду тоже всё подробно расписывать и даже подробнее :)

Примечание: Незнаю, как нарисовать стрелку над вектором, в любом случае - это вектор.. Не перепутайте.

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

Пусть у нас есть три точки, которые образуют угол:

Code: Select all

M1 ( x1, y1 ) - непосредственно угловая точка
M2 ( x2, y2 ) - первая точка, из которой будет идти луч в точку M1
M3 ( x3, y3 ) - вторая точка, из которой будет идти луч в точку M1


Соответсвенно имеем два вектора: M1M2, M1M3.
Вектор понятное дело имеет свои координаты:

Code: Select all

M1M2 ( x2 - x1, y2 - y1 )
M1M3 ( x3 - x1, y3 - y1 )


Обзавём координаты как-нибудь покороче:

Code: Select all

X1 = x2 - x1
Y1 = y2 - y1
X2 = x3 - y1
Y2 = y3 - y1


Теперь немного теории:
Скалярным произведением двух векторов называется сумма произведений одноименных координат этих векторов.

Т.е. в нашем случае:

Code: Select all

M1M2 * M1M3 = X1 * X2 + Y1 * Y2


Кроме того:
Скалярным произведением двух векторов в ДПСК (декартовой прямоугольной системе координат) называется произведение модулей этих двух векторов на косинус угла между ними.

Т.е.:

Code: Select all

M1M2 * M1M3 = |M1M2| * |M1M3| * cos(f)

Примечание: f - так я обозвал угол, который мы ищем.

Далее - модуль вектора, тоже штука нужная, тоже нужно знать:
Модулем вектора в ДПСК называется квадратный корень из суммы квадратов координат вектора.

Code: Select all

|M1M2| = sqrt( X1^2 + Y1^2 )
|M1M3| = sqrt( X2^2 + Y2^2 )


Ну и непосредственный ответ, на поставленный вопрос:

Code: Select all

cos( f ) = ( M1M2 * M1M3 ) / ( |M1M2| * |M1M3| )


Всё, дальше арифметика :)

PS: Grin. я всё верно описываю или можно как-нить попроще это намутить?)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Гмм, у меня глупый вопрос возник - а что делать с cos( f ) ?)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Все верно... только не ясно почему возник глупый вопрос...
можно лишь бобавить что уго между векторами можно определить только в пределах от 0 до Пи тоесть до 180 градусов (домашние задание: объясните почему так...)
Чему равен косинус 90 градусов?
правельно... 0
Но так как я уже говорит идет округдение когдинат то с не большой погрешностью нужно расматривать этот самый прямой угол...
то есть у сло вие должно быть не строгое...

ПС Собствено близость косинуса к 0 говорит что Тест на "угол" пройден успешно... и даные точки составляют прямой угол
Nmy
Expert!
Posts: 2152
Joined: 2005-09-14 15:31:58
Location: Latvia

Post by Nmy »

очистил
привет Грин
удачи Дестр :roll:
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Grin wrote:Все верно... только не ясно почему возник глупый вопрос...
можно лишь бобавить что уго между векторами можно определить только в пределах от 0 до Пи тоесть до 180 градусов (домашние задание: объясните почему так...)
Чему равен косинус 90 градусов?
правельно... 0
Но так как я уже говорит идет округдение когдинат то с не большой погрешностью нужно расматривать этот самый прямой угол...
то есть у сло вие должно быть не строгое...

ПС Собствено близость косинуса к 0 говорит что Тест на "угол" пройден успешно... и даные точки составляют прямой угол

Глупый-то оно конечно глупый, но я имел ввиду непосредственно, кароче забей)

PS: Времени нету - как-нибудь потом реализую всё это.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

ну вот а люди так ждали...
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Grin wrote:ну вот а люди так ждали...

Ну, говорят тебе дела.

Всё, что люядм нужно уже расписано, IMHO.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Так тактика изменилась...
Кривизна цифр все таки очень кривая;) расхождения углов большое...
По этому начинаем оценивать какая из цифр больше всего похожа на то что в гампе... вводим бальную систему соответствия, та что больше всего похожа и есть наша цифра;)
выкладываю сам механизм "Узнавания цифры" (главная процедура what())

Code: Select all

sub what()
   var i, score, num, temp, st
   dim x[11], y[11]
   dim nm[3]
   
   for i = 4 to 13
      st = uo.LastGump('command', i)
      x[i-3] = val(mid(st, 8, 3))
      y[i-3] = val(mid(st, 12, 3))
   next
   for i = 0 to 2
      nm[i] = val(uo.LastGump('text', i+1))
   next
   score = 10000
   index = 0
   for i = 0 to 2
      temp = numberscore(nm[i], x, y)
      if score > temp then
         score = temp
         index = i
      endif
   next
   uo.print(str(nm[index]))

end sub

sub numberscore(num, x, y)
   dim Sings[10]
   var cheking = 1
   var n, i, total = 0
   dim xv[2], yv[2], point[3]
   
   Sings[2] = "080910080506"
   Sings[3] = "040706060708"
   Sings[5] = "040506060708"
   Sings[6] = "070910050608"
   Sings[8] = "030506060709"
   Sings[9] = "040607050807"
   
   for n = 0 to 1
      for i = 0 to 2
         point[i] = val(mid(Sings[num], n*6+i*2, 2))
      next
      for i = 0 to 1
         xv[i] = x[point[i]]-x[point[i+1]]
         yv[i] = y[point[i]]-y[point[i+1]]
      next
      total = total+anglscore(xv, yv)
   next
   return total
endsub
      
sub anglscore(x, y)
   var xy1 = x[0]*y[0]
   var xy2 = x[1]*y[1]
   var t = xy1+xy2
   
   x[0] = x[0]+y[0]
   x[1] = x[1]+y[1]
   return 100*t*t/((x[0]*x[0]-2*xy1)*(x[1]*x[1]-2*xy2))
end sub


ПС дальше ерунда осталась :roll:
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

В принципе в полне конечный вариант, по тестить особо не удалось, так как чара дали серого;) киляют постоянно;) (запускать antimacro)

Code: Select all

sub antimacro()

   var x, y
   
   while  not uo.Dead()
      if (uo.LastGump('replyed') == 0) and (uo.LastGump('text', 0)  == 'Please choose this number:') then
         x = uo.LastGump('x')
         y = uo.LastGump('y')
         uo.LClick(x+120, y+185+what()*35)
         wait(1000)
      end if
      wait(100)
   wend

end sub
      
sub what()

   var i, score, index, temp, st
   dim x[11], y[11]
   dim nm[3]
   
   for i = 3 to 12
      st = uo.LastGump('command', i)
      x[i-2] = val(mid(st, 8, 3))
      y[i-2] = val(mid(st, 12, 3))
   next
   for i = 0 to 2
      nm[i] = val(uo.LastGump('text', i+1))
   next
   score = 10000
   index = 0
   for i = 0 to 2
      temp = numberscore(nm[i], x, y)
      if score > temp then
         score = temp
         index = i
      endif
   next
   return index

end sub

sub numberscore(num, x, y)

   dim Sings[10]
   var cheking = 1
   var n, i, total = 0
   dim xv[2], yv[2], point[3]
   
   Sings[2] = "080910080506"
   Sings[3] = "040706060708"
   Sings[5] = "040506060708"
   Sings[6] = "070910050608"
   Sings[8] = "030506060709"
   Sings[9] = "040607050807"
   
   for n = 0 to 1
      for i = 0 to 2
         point[i] = val(mid(Sings[num], n*6+i*2, 2))
      next
      for i = 0 to 1
         xv[i] = x[point[i]]-x[point[i+1]]
         yv[i] = y[point[i]]-y[point[i+1]]
      next
      total = total+anglscore(xv, yv)
   next
   return total

endsub
      
sub anglscore(x, y)

   var xy1 = x[0]*y[0]
   var xy2 = x[1]*y[1]
   var t = xy1+xy2
   
   x[0] = x[0]+y[0]
   x[1] = x[1]+y[1]
   return 100*t*t/((x[0]*x[0]-2*xy1)*(x[1]*x[1]-2*xy2))

end sub
I'm
Expert!
Posts: 1396
Joined: 2004-10-15 22:38:04
Location: Moscow City.
Contact:

Post by I'm »

Браво Grin :D
Destruction wrote:Осталось стереть пост и продавать :D

И не надейся :)
The End.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Проблема имеет место быть.

Виновата строка:

Code: Select all

if (uo.LastGump('replyed') == 0) and (uo.LastGump('text', 0),  == 'Please choose this number:') then 


Вот так лучше будет:

Code: Select all

if (uo.LastGump('replyed') == 0) and (uo.LastGump('text', 0)  == 'Please choose this number:') then 


PS: Исправил пост грина.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
caH4o
Posts: 2
Joined: 2019-10-18 05:09:01

Re:

Post by caH4o »

Grin wrote:В принципе в полне конечный вариант, по тестить особо не удалось, так как чара дали серого;) киляют постоянно;) (запускать antimacro)

Code: Select all

      
sub anglscore(x, y)

   var xy1 = x[0]*y[0]
   var xy2 = x[1]*y[1]
   var t = xy1+xy2
   
   x[0] = x[0]+y[0]
   x[1] = x[1]+y[1]
   return 100*t*t/((x[0]*x[0]-2*xy1)*(x[1]*x[1]-2*xy2))

end sub


Удивительно если он вообще работал... или это специальная ошибка из разряда защиты от любителей скопировать\вставить не разбираясь в макросе :roll:

За саму идею аплодирую стоя!)
Post Reply