J
expert
offline
Опыт:
48,447Активность: |
[Task] Разбивка строки
Задача решена MrSmiLe-ом, ему перечисленно 600 опыта. (пост)
вообщем эта задача большей частью только на алгоритмику, нужно сделать функцию Код:
которая разбивает строку Str на отдельные составляющие длина которых не больше числа Amount, они суются по порядку в массив udg_PartStr начиная с [0], и после функция возвращает количество занятых ячеек в этом массиве на эту строку. Теперь самое сложное, нужно сделать так чтобы каждая часть не имела обрыва слова, т.е. разбиение строки проходило только между слов, а также усложняя задачу - Str может содержать цветовые теги, именно это является главной задачей... Также нужно учитывать возможность нахождении одного или нескольких цветовых тегов внутри другово И если я подставлю эту функцию в код: Код:
выполнялось то что надо... -------------------------------------------------- Если кто непонял, то обьясню на примере Str = Шла Саша по шоссе и сосала сушку Amount = 12 в результате в масиве должно быть: [0] - "Шла Саша по" [1] - "шоссе и" [2] - "сосала сушку" -------------------------------------------------- P.S. Не стесняйтесь предлагать идеи, может вы сами не можете сделать, но поможете другим. эту задачу я выбрал потому что она большей степенью зависит от настойчивости и заинтересованности, чем от знаний (последняя задача от тоадкопа про Локал Плауер). Отредактировано ShadoW DaemoN, 07.08.2008 в 00:23. |
26.06.2007, 20:33 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
если для вас это сложно сделайте пока что алгоритм без учитывания цветовых тегов... |
26.06.2007, 21:28 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
через пробелы отлавливать кол-во слов. смотреть сколько у нас будет полнеценных "частей" (т.е. там где кол-во необходимых часетй -1 делится без остатка). в первые числа вкидывать по несколько слов + в конец то что останется... вроде примерно так, расписывать лень=) |
27.06.2007, 11:24 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
ADOLF лень=/ ненавижу лень всегда мне мешает, попробуй осуществить, сначало без учитывания цыетовых тегов хотябы, а потом с учитыванием.
P.S. Есль много способов которыми можно решить эту задачу, пытайтесь найти самый легкий, оптимальность здесь не самое важное, т.к. код выполняется еденично... Если через неделю ничего не будет придуманно, я выложу свой алгоритм... |
27.06.2007, 11:37 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YasonDelAlt
offline
Опыт:
862Активность: |
Jon
Что-то приблизительно такое забацал тут минут за 10 (не могу проверить, вара у меня под рукой нет сейчас): » код Функция еще сырая, но надеюсь общий смысл ясен: парсим всю строку в поисках пробелов и тегов, напоролись на тег цвета: увеличиваем позицию в строке, но трогаем логическую длину, тоже самое с конечным тегом,Код:
напоролись на пробел: сравниваем логическую длину с требуемой, если больше то сбрасываем кусок до предыдущего пробела и устанавлеваем начало блока на прошлый пробелл, восстанавливаем значения нужных переменных и продолжаем парсить. Вот и все. Да чуть не забыл, с русским текстом функция работать не будет, если нужен русский текст то используйте мою библиотеку Russian Strings Librarry, заменив вызовы функций по работе с текстом на аналоги из библиотеки. Отредактировано Jon, 28.06.2007 в 20:21. |
27.06.2007, 11:55 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
YasonDelAlt неплохо, (Для справки: страки в джазе (и символы тоже) нужно выделять двойными ковычками...), но немаловажное замечание - Цветовой тег не переносится на следующую строку.
олодец что догодался насчет регистра Jon добавил: + неточное разбиение строки, т.е. разбивает строку иногда там где вошло бы еще слово... Отредактировано Jon, 11.07.2007 в 19:40. |
27.06.2007, 12:12 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
лан, раз уж умничаем то тогда если вам нужно сделать аналого тега |n :
Код:
|
27.06.2007, 12:14 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
ADOLF не все так просто, т.к. если поставить в строку эту переменую, то по алгоритму она будет воспринимать это как обычный симвло, и получится что одну часть разобьет еще на 2, это надо делать также джазом, т.е. если встретился тег |n, перейти к следующему индексу массива, а текущий закончить
Отредактировано Jon, 30.06.2007 в 19:10. |
27.06.2007, 12:21 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
я имел ввиду если вставлять просто в строку... |
27.06.2007, 12:23 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
было бы неплохо кстате предусмотреть возможность нахождения одного или нескольких цветовых тегов внутри другого. |
27.06.2007, 15:29 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
смотрите верх первого поста
Отредактировано Jon, 28.06.2007 в 20:07. |
28.06.2007, 20:00 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
dk
offline
Опыт:
60,293Активность: |
Мой вариант, есть поддержка русских символов и вложенных тегов... Теги должны быть заданы в стандарте |cXXXXXXXX|r
» код [script]globals string array udg_PartStr endglobals function PriceStr takes string Str, integer Amount returns integer local integer Index = 0 local integer lspace = 0 local integer length = 0 local integer maxlength = StringLength(Str) local integer partlength = 0 local integer dpart = 0 local integer position = 0 local string symbol = "" local string tag = "" local string a = SubString("À", 0, 1) local string b = SubString("ð", 0, 1) // -------- loop // -------- set symbol = SubString(Str, position, position + 1) if symbol == a or symbol == b then set position = position + 1 elseif symbol == "|" then set tag = SubString(Str, position + 1, position + 2) if tag == "c" then set position = position + 9 set partlength = partlength - 1 elseif tag == "r" then set position = position + 1 set partlength = partlength - 1 endif elseif symbol == " " then set lspace = position endif // -------- set partlength = partlength + 1 if partlength > Amount then set udg_PartStr[Index] = SubString(Str, dpart, lspace) set Index = Index + 1 set position = lspace set dpart = lspace + 1 set partlength = 0 endif // -------- set position = position + 1 exitwhen position > maxlength endloop return Index endfunction[/script] Dead_knight добавил: Кста джон в твоей функции для проверки превышена максимальная длина строки... |
29.06.2007, 12:01 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exAres
I love magic :)
offline
Опыт:
7,788Активность: |
Dead_knight твой алгоритм работает не корректно, русские буквы не правильно считает + если в конце строки пробел то последняя строка не защитывается.
Я от нечего делать сделал свой вариант, имхо он не далеко не идеален, но работает :) » Код см. ниже Отредактировано MrSmiLe, 02.07.2007 в 02:48. |
30.06.2007, 17:58 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
молодцы.. начну тестить кодики через пару часиков.. ща пока отдохните
Jon добавил: Dead_knight у тебя последняя строка не показывается и цветовые теги не переносятся на следующую строчку MrSmiLe у тебя с цветовыми тегагами какаято хня получается (в текст добовляются левые сиволы, некоторые теги переносятся, а некоторые на одной же строчке не доходят до конца)... и строчки не ровные получаются... Jon добавил: MrSmiLe, из твоего кода: Код:
хех... слишком большие строки отрезаеш Jon добавил: люди... вы че делаете? я же сказал что вы должны предусмотреть возможность нахождения одного или много тегов внутри другово тега. Это без покрайне мере 2-ух массивов не сделать... Необязательно делать подержку руских символов... главное это работа с тегами Jon добавил: я ща подправлю строку в первом посте... сделаю ее так чтобы демонстрировать больше багоф... Jon добавил: награда опыта увеличина:) Отредактировано Dead_knight, 01.07.2007 в 04:52. |
30.06.2007, 19:44 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Я уезжаю на неделю... приеду посмотрю че сдесь еще скажут... если скажут вообще... напомню что необязательно надо делать поддержку руских символов, конечно было бы лучше сделать основной является работа с тегами
|
01.07.2007, 01:06 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
dk
offline
Опыт:
60,293Активность: |
Так я вроде все исправил и добавил перенос тегов...
» code Код:
Отредактировано Dead_knight, 02.07.2007 в 08:49. |
01.07.2007, 11:53 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
ну имхо я тоже попробую... =) |
01.07.2007, 13:45 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exAres
I love magic :)
offline
Опыт:
7,788Активность: |
Dead_knight если смотреть только пример с этой строкой и с таким количеством символов то норм, а ты попробуй количество символов 100 или 10 поставь :)
Вот я исправил свои ошибки + добавил возможность использования |n и продолжения цветовых тегов вложеных друг в друга. » StrParse Код:
Отредактировано MrSmiLe, 02.07.2007 в 10:48. |
02.07.2007, 02:51 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
dk
offline
Опыт:
60,293Активность: |
ну когда делишь на 100 все работает правильно... Просто вар имеет свою встроенную функцию переноса которая и переносит, а вот с 10 не работает, ну и понятно нех задавать промежуток меньше максимальной длины слова, хотя впринципи можно было и предусмотреть это... |
02.07.2007, 08:49 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YasonDelAlt
offline
Опыт:
862Активность: |
Jon
Код я свой писал не проверяя (вара у меня под рукой нету, да и компа тоже), на счет кавычек это ты верно подметил, привычка, что поделать, сейчас больше пишу на С-образных языках. На счет неточного разбиения: кажется я сравнение перепутал: Код:
Нужно заменить на: Код:
и должно заработать. Этот "конкурс" я выйграть не смогу (отлаживать код не на чем), а вот другим постараюсь помочь. Значит так, над кирилицей особо не партесь, потом отлаженную функцию легко можно будет перевести на русский с помощью моей библиотеки (сомореклама ;) см. выше). Перенос вложенных тегов можно легко реализовать с помощью стека (надеюсь все знают что это такое), сам стек создается с помощью локального массива строк и переменной счетчика. Во время парсинга строки, если напарываемся на цветовой тег, то запихиваем цветовую составляющую в стек, если напоролись на конечный тег ("|R"), то вытаскиваем из стека элемент, если пришло время сбрасывать строку в массив, смотрим есть ли что-нибудь в стеке, если есть, то обрамляем строку в тег, иначе сбразываем в массив чистую стоку без тега. Обработку тега "|N" добавить проще простого: берем кусок, где обрабатывается тег "|R", копируем его, вставляем рядом и заменяем "r" на "n" и все! Медетируйте! :) Jon, что-то я запамятовал, функция StringCase обрабатывает кирилицу или нужно шаманить над аналогом в библиотеку? MrSmiLe, у тебя жутко не оптимизированный код, чего только стоит куча бесполезных вызовов SubString в цикле. Куда лучше выделить отдельную переменную и в начале цикла запихивать в нее отдельный символ, а после уже сравнивать с этой переменной. Будет быстрее работать в несколько раз, да и выглядить будет лучше, нагляднее. |
02.07.2007, 09:09 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|