XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
Цитата:
Сообщение от YasonDelAlt
MrSmiLe,
у тебя жутко не оптимизированный код
- ну пару СубСтрингов и правда можно занести в переменную, но вот насчёт "жутко не оптимизированный код" ненадо :)
Старый 02.07.2007, 10:51
Toadcop

offline
Опыт: 54,313
Активность:
вот мой вариант...
Код:
//#############################
//## Code by Toadcop[BuranX] ##
//#############################

globals
    string array SData
    integer SDataMax=0
    boolean array IsColorTag
endglobals

function echo takes string s returns nothing
        call DisplayTextToPlayer(GetLocalPlayer(),0,0,s)
endfunction

constant function s2i takes string S returns integer
return S
return 0
endfunction

function InitColorTagsDB takes nothing returns nothing
    set IsColorTag[s2i("0")]=true
    set IsColorTag[s2i("1")]=true
    set IsColorTag[s2i("2")]=true
    set IsColorTag[s2i("3")]=true
    set IsColorTag[s2i("4")]=true
    set IsColorTag[s2i("5")]=true
    set IsColorTag[s2i("6")]=true
    set IsColorTag[s2i("7")]=true
    set IsColorTag[s2i("8")]=true
    set IsColorTag[s2i("9")]=true
    set IsColorTag[s2i("a")]=true
    set IsColorTag[s2i("b")]=true
    set IsColorTag[s2i("c")]=true
    set IsColorTag[s2i("d")]=true
    set IsColorTag[s2i("e")]=true
    set IsColorTag[s2i("f")]=true
    set IsColorTag[s2i("A")]=true
    set IsColorTag[s2i("B")]=true
    set IsColorTag[s2i("C")]=true
    set IsColorTag[s2i("D")]=true
    set IsColorTag[s2i("E")]=true
    set IsColorTag[s2i("F")]=true
endfunction

function IsColorTagMember takes string s returns boolean
     return IsColorTag[s2i(s)]
endfunction

function GetCutsBX takes string s,integer i,integer segl returns integer
     local integer i2=0
     local integer i3=0
     local integer lng=StringLength(s)
     local string token=null
     local string stmp=null
     local integer lastspc=0
     local integer cnt=0
 loop
     set token=SubString(s,i,i+1)
   exitwhen cnt>segl
  if token=="|" then
     set stmp=SubString(s,i+1,i+2) 
    if stmp=="c" or stmp=="C" then
     set i3=1
     loop
       set stmp=SubString(s,i+i3,i+i3+1)
       exitwhen i3>9 or IsColorTagMember(stmp)==false
       set i3=i3+1
     endloop
     if i3>9 then
       set i=i+i3-1
     else
       set cnt=cnt+1
     endif
    elseif stmp=="r" or stmp=="R" then
     set i=i+1
    elseif stmp=="n" or stmp=="N" then
     return cnt
    else
     set cnt=cnt+1     
    endif 
  else
    set cnt=cnt+1
   if token==" " then
    set lastspc=cnt
   endif
   if cnt>=segl or token=="" then
    if token=="" then
      return cnt      
    else
     if lastspc>0 then
      return lastspc
     else
      return segl
     endif
    endif
   endif
  endif   
   set i=i+1
 endloop
     return cnt
endfunction

function ParseString takes string s,integer segl returns nothing
     local integer i=0
     local integer i2=0
     local integer i3=0
     local integer lng=StringLength(s)
     local string array tags
     local integer tagsmax=0
     local string token=null
     local string stmp=null
     local string curcut=null
     local integer lastspc=GetCutsBX(s,0,segl)
     local integer cnt=0
     local integer begin=0
     set SDataMax=0
 loop
     set token=SubString(s,i,i+1)
   exitwhen i>lng
  if token=="|" then
     set stmp=SubString(s,i+1,i+2) 
    if stmp=="c" or stmp=="C" then
     set i3=1
     loop
       set stmp=SubString(s,i+i3,i+i3+1)
       exitwhen i3>9 or IsColorTagMember(stmp)==false
       set i3=i3+1
     endloop
     if i3>9 then
       set i=i+i3-1
       set tagsmax=tagsmax+1
       set tags[tagsmax]=SubString(s,i-i3+1,i+1)
     else
       set cnt=cnt+1
   if cnt>=lastspc then
     set SDataMax=SDataMax+1
     set SData[SDataMax]=curcut+SubString(s,begin,i+1)
   if tagsmax>0 then
     set curcut=tags[tagsmax]
   else
     set curcut=null
   endif
     set cnt=0
     set begin=i+1
   if i<=lng then
     set lastspc=GetCutsBX(s,i+1,segl)
   endif
   endif
     endif
    elseif stmp=="r" or stmp=="R" then
     set tagsmax=tagsmax-1
    if tagsmax<0 then
     set tagsmax=0
    elseif tagsmax>0 then
     set curcut=curcut+SubString(s,begin,i)+tags[tagsmax]
     set begin=i+2
    endif
     set i=i+1
    elseif stmp=="n" or stmp=="N" then
     set begin=i+2
   if i<=lng then
     set lastspc=GetCutsBX(s,i+1,segl)
   endif
    else
     set cnt=cnt+1  
   if cnt>=lastspc then
     set SDataMax=SDataMax+1
     set SData[SDataMax]=curcut+SubString(s,begin,i+1)
   if tagsmax>0 then
     set curcut=tags[tagsmax]
   else
     set curcut=null
   endif
     set cnt=0
     set begin=i+1
   if i<=lng then
     set lastspc=GetCutsBX(s,i+1,segl)
   endif
   endif
    endif 
  else
    set cnt=cnt+1
   if cnt>=lastspc then
     set SDataMax=SDataMax+1
     set SData[SDataMax]=curcut+SubString(s,begin,i+1)
   if tagsmax>0 then
     set curcut=tags[tagsmax]
   else
     set curcut=null
   endif
     set cnt=0
     set begin=i+1
   if i<=lng then
     set lastspc=GetCutsBX(s,i+1,segl)
   endif
   endif
  endif   
   set i=i+1
 endloop
endfunction

function StrParseShowRes takes nothing returns nothing
    local integer i=1
  loop
   exitwhen i>SDataMax
    call echo(SData[i])
   set i=i+1
  endloop
endfunction

//===========================================================================
function InitTrig_Code takes nothing returns nothing
   call ExecuteFunc("InitColorTagsDB")
endfunction


я не исключаю что есть баги =) но вроде работает более мение + имеет проверку НЕХ значения
Прикрепленные файлы
Тип файла: w3x TcSP.w3x (9.9 Кбайт, 22 просмотров )
Старый 02.07.2007, 21:15
YasonDelAlt

offline
Опыт: 862
Активность:
MrSmiLe,
Цитата:
Сообщение от MrSmiLe
- ну пару СубСтрингов и правда можно занести в переменную, но вот насчёт "жутко не оптимизированный код" ненадо :)
Да ладно, щутю! :)
Но СубСтрингов было не пара, а почти в каждом if'е. ;)

YasonDelAlt добавил:
Вот окончательный вариант функции, исправлена ошибка с неправильным разбиением и добавлена обработка цветовых тегов. Просто и элегантно. Правда всяких проверок на правильность тегов нет, да и это, я думаю, не главное. Как всегда пишу код в уме и проверить его не начем.

код ищи ниже.

Отредактировано YasonDelAlt, 06.07.2007 в 09:50.
Старый 03.07.2007, 09:09
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
Правда всяких проверок на правильность тегов нет, да и это, я думаю, не главное
ну я считаю наоборот =) просто 1ой опечаткой ваша система обламываетьса. и получаеш плохо обрезаною строку или что то еще хуже =/.

Цитата:
Просто и элегантно
как Зибада правильно говорил главное не вид код а как и что он выполянет. т.е. вообщем не моветую заостратьса на факторе "красивый код" он не кому кроме вас не нужен =) (ну если только совместно что то пишите)

Код:
set udg_PartStr[Index] = "|c" + stack[stackIndex] + SubString(Str, blockBegin, lastSpace) + "|r"
да пытайтесь избегать лишних клеений строк.

Toadcop добавил:
YasonDelAlt вообщем =) выражусь так... он не рабочий =) (твой код, логика алгоритма иммею ввиду)
Старый 03.07.2007, 12:15
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
YasonDelAlt, зачем тебе переход в нижний регистр?На что это влияет в этом коде?

А еще у меня такой вопрос:
вот, почто создал свой код и у меня почти все получилось, кроме переноса тегов из одного слова в другое(например: строка- |cff00ff00Слово1_Слово2|r ,Amount = 5, должно получится:
PartStr[0] = |cff00ff00Слово1|r
PartStr[1] = |cff00ff00Слово2|r
по задумке...но не переносится, я над эти еще поработаю.
А вот 2-е , что не получилось:
Если будет строка: Слово1_Слово2_Слово3, Amount = 13, тогда получится:
PartStr[0] = Слово1_Слово2
PartStr[1] = Слово3
, а если будет строка: |cffff0000Слово1|r_Слово2_Слово3, Amount = 13, тогда получится:
PartStr[0] = Слово1
PartStr[1] = Слово2_Слово3
Почему?
Ведь у меня сначала проверяет уберется ли в PartStr слово без тегов, если да, добавляет в PartStr слово с тегами.
И вообще StringLength какой-то глюченый, он должен определять длину строки, как мне кажется, а определяет чего-то не то:
Если слово без тегов, каждую букву считает за 2, а если с тегами, вообще непойми чего...как он так считает?
Старый 03.07.2007, 15:42
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Alex_Hell, длинна символа кириллицы = 2, английского = 1
Старый 03.07.2007, 17:26
Toadcop

offline
Опыт: 54,313
Активность:
кириллица - зло и некому не нужна <_<
Старый 03.07.2007, 17:36
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
тем не менее, длина строки на русском = (кол-во символов в строке * 2)
Старый 03.07.2007, 17:38
Toadcop

offline
Опыт: 54,313
Активность:
FellGuard безусловно =) это факт я просто иной факт проветил ;) да это даже видно если вводить парь в ВоВе или Баттле.нете (Вар3) то если Кириллическте символы то они занимают 2 звёздочки ^^
Старый 03.07.2007, 17:49
YasonDelAlt

offline
Опыт: 862
Активность:
Toadcop,
после опечатки обламается и движок варкрафта.
Хорошо выглядящий код проще понять, исправить и оптимизировать.
У меня всего три склеивания строки за кучу итераций цикла, у тебя же в каждой итерации оно есть, плюс ко всему происходит куча вызовов функций, не относящихся к главной цели - порубить строку.
Если ты проверил мой код на работоспособность, то пажалуйста скажи что не так он делает. Сам я не могу его потестить :(.

Alex_Hell,
перевод в нижний регистр заменяет код подобный этому:
Код:
elseif stmp=="r" or stmp=="R" then

в нескольких местах на:
Код:
elseif stmp=="r" then

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

FellGuard,
Цитата:
тем не менее, длина строки на русском = (кол-во символов в строке * 2)

ошибаешся, строка на русском может содержать знаки препинания, а их длина один байт. Так что длина строки (возвращаемая стандартной функцией) равна сумме длин всех символов в строке.
Старый 04.07.2007, 09:02
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
угу, давайте теперь запятые с пробелами причислять к русским символам

FellGuard добавил:
Цитата:
строки на русском
Старый 04.07.2007, 11:37
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
так чего, нужно делать функцию на проверку русские или английские символы в строке?
Тогда, как я думаю, предется самому назначать каждому слову свою длину и писать в переменную...
Цитата:
тем не менее, длина строки на русском = (кол-во символов в строке * 2)

Цитата:
ошибаешся, строка на русском может содержать знаки препинания, а их длина один байт. Так что длина строки (возвращаемая стандартной функцией) равна сумме длин всех символов в строке.

А мне кто-нить объяснит сколько занимает каждый символ английский - 1, русский - 2, а всякие там запятые и прочее?

Alex_Hell добавил:
Еще: YasonDelAlt,воспользуюсь твоей идеей перевода в нижний регистр.
Старый 04.07.2007, 13:24
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
после опечатки обламается и движок варкрафта.
да ? ух ты он что пропрыгивает плохой тег ? круто я и не знал =) типо крапом вроде начало тега +8 символов вперёд?

то что проиходит у меня в алгоритме имеет повод =)

кстати посмотрев на ваши алгоритмы =/ я немогу представить что они могу работать правильно...
только если у смайла т.к. у него есть нужный по размеру для этого код. вообщем полубому надо узнать на 100% где будет строка обрезана перед началом самого парса иначе вас ждёт кучу багов =). в моём случаи это делаетьса функией которая находит длину куска (вроде как я тестил нормально это делает). потом главный парсур оринтируетьса по этим данным не допуская ошибок.

хрен знает попробуйте завалить его =) (мой парсер такой задачей которую он бы выполнил не правильно в текущих рамках условий конечно ;)) просто я сам не смог найти как известно разным людям легче находить ошибки из за разного мышления =)

Цитата:
Еще: YasonDelAlt,воспользуюсь твоей идеей перевода в нижний регистр.
а я воспользуюсь идеей алфовита и напишу сейчас пару буковог т.е. это просто нативка близзов =) скорость выполнения которой еще не известна ну наверно достаточно быстрая. // могу тестнуть

Цитата:
угу, давайте теперь запятые с пробелами причислять к русским символам
России пренадлежит всё ! xD

Toadcop добавил:
угу
вот...
Код:
call StringCase(ss,false) 

      if ss=="s" or ss=="S" then    // - эта проверку будет чуть быстрей выполнятьса чем Case
      endif

ну вообщем я про то что не надо заявлять что это будет там круче + быстрее (да при нескольких вызовах оно будет чуть быстрее) но это фигня т.к. можно спороть в другой части алгоритма и потратить больше времени.

YasonDelAlt + как ты определяеш скорость выполнения алгоритма ? =)
Старый 04.07.2007, 15:14
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
А я тут попробовал через StringCase(Substring(Str,X,X),false) находить пробелы и теги, где X - позиция проверяемого Loop-а и он вообще чего-то не правильно находит, как только убрал StringCase и оставил SubString(Str,X,X) - все стало работать...ничего не понял:)
Лучше через
Код:
if s == "|c" or s == "|C"
Старый 04.07.2007, 16:49
Toadcop

offline
Опыт: 54,313
Активность:
Alex_Hell это относительно... то что ты написал =) ну как ты хош вообщем это только визуальный вопрос т.к. в производительности разници почти нету.
Старый 04.07.2007, 17:04
YasonDelAlt

offline
Опыт: 862
Активность:
Toadcop, я моло мальки представляю что происходит в потрохах движка вара, и знаю, что каждое сравнение преременных сложных типов данных (в данном случае строк) порождает вызов функции сравнения, по этому одна функция перевода в нижный регистр лучше, чем три лишних сравнения, а в цикле набираеются десятки лиших вызовов вункций. Я хоть и не професиональный программист, но я постоянно учусь (у меня относительно обширные знания, но опыта маловато).

Я исправил одну из ошибок в своей функции, которая могла приводить к кривому разбиению строки, если цветовой тег находился в начале блока. Toadcop, будь добр, если можешь проверь мою функцию (используя латиницу!), будет она работать или нет, плиз!

Насчет облома с кривыми тегами, ты же сам видел, какая лажа выводится если сделать очепятку в теге!!?

Alex_Hell, в МелкоМягких Форточках есть такая фигня как MultiByteString, это извращенное подобие Юникода (скорее даже предок). В таких строках базовая часть ASCII - первые 127 символов (управляющие символы, латинский алфавит, цифры, знаки препинание и еще кой какие символы) кодируется одним байтом, а вот все остальное (символы национальных алфавитов и другие редкие символы) кодируется двумя байтами. В Форточках есть несколько API-функций для работы с такими строками. В общем это большой геморой, и моло кто с ними связывается. Но вот близы видать посудили, что сыкономить чуток памяти (они ж на английском говорят и кроме латиницы им не фига не надо) будет не плохо, и не стали использовать Юникод. Но использовать иностранные алфавиты для локализации осталась возможность. А ведь программистов там много, и за всеми не уследишь. По этому часть из них рачитывала на мультибайтовые строки и использовали соответвующие функции (те кто за графику отвечают, русский текст то быводится нормально), а другие (те кто над JASS движком колдовал) использовали API для обычных ASCIIZ (кааждый символ занимает оди быйт) строк. Вот по этому нам - русским людям, приходится парится над самопальными функциями для обработки строк.
Все выше написанное не воспренимать за голые факты, ибо все это мои домыслы, а верить в них или нет - ваше дело.

Alex_Hell, может ты просто переводил в нижний регистр (StringCase(ss,false)), а сравнивал с символами в верхнем?

YasonDelAlt добавил:
Alex_Hell, если ты не понимаешь прицип отлова русских символов в строке, то и не парься, просто возьми функции для работы со строками из библиотеки. Ну или посмотри как это там делается.
Старый 05.07.2007, 09:51
Markiz

offline
Опыт: 11,432
Активность:
Отдаю свой голос за вариант YasonDelAlt: чистый код, алгоритм отличный (за идею со стеком отдельный респект), код небольшой.
Сейчас еще проведу тесты в варе на предмет синтаксических ошибок+стресстест вырожденных случаев, но вроде они предусмотрены кодом.

Markiz добавил:
Синтаксические ошибки: 14 строка - надо string array вместо array string
18 строка - надо exitwhen вместо exitwen

Markiz добавил:
YasonDelAlt
Неправильный ответ в тесте "Shla Sasha Po Shosse i Sosala Sushku" (size = 10) -- последние два слова отправились в одну строку, а это 13 символов (если вместе с пробелом)
Вот мапа, в принципе на ней можно тестить всех участников

Markiz добавил:
Код тоадкопа на правильность таким образом проверить невозможно, так как он не удосужился его оформить в соответствии с первым постом топика.
Прикрепленные файлы
Тип файла: w3m TEST_MAP_STRINGS.w3m (18.0 Кбайт, 13 просмотров )
Старый 05.07.2007, 18:16
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
Код тоадкопа на правильность таким образом проверить невозможно, так как он не удосужился его оформить в соответствии с первым постом топика.
тру челы юзает препроцессоры ;)

Цитата:
я моло мальки представляю что происходит в потрохах движка вара
а ты что его писал ? О_О круто ! представь с точки зрения производительности джасс совсем иной чем обычные языки програмирования ;) так что "твои знания" большого применения не имеют =)

Цитата:
(за идею со стеком отдельный респект)
- представь я дотого как начал писать алгоритм уже знал что надо будет создать стек для тегов O_O. я украл идею
YasonDelAlt даже незная этого О_О.

вообщем всё ясно...

Toadcop добавил:
а мой голос за алг смайла =) МрСмайл +1
Старый 05.07.2007, 21:25
Markiz

offline
Опыт: 11,432
Активность:
Toadcop
У него рабочий код написан крайне изящно и без извращений, у тебя несколько килобайт хз чего.
Ну а то, что ты не в состоянии прочитать условия, так кто ж виноват.
Старый 05.07.2007, 22:29
Toadcop

offline
Опыт: 54,313
Активность:
Markiz никаках условий там нету =) просто автор более лам чем я зачем мне спускатьса специально на ламерский уровень ? =) есть задачя я иё решаю как я считаю правильно вот и всё.

Цитата:
у тебя несколько килобайт хз чего.
я не виноват что ты не шариш =/ хотя ничего особенного.

+ честно то его алг сосёт... почему ? автор сам написал у него мало опыта... а теория являетьса парашей на бумаге это все знают.
Старый 05.07.2007, 22:42
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:07.