![]() |
Переменные в строке
В питоне есть очень удобная конструкция замены специальных символов на значения:
Код AS3:
Код AS3:
|
Вы издеваетесь чтоль? У Вас две темы в блоге и Вы не знает, как сделать метод склеивания строк?
Кто Вам тогда темы для блога писал? Или Вы считаете нормальным вести блог, когда не знаете, как сделать простое склеивание? |
"123 %d 321".replace("%d", "asddsa")
// "123 asddsa 321" profit |
Gerbert, что вы такой агрессивный? Может человек никогда со строками не работал и спрашивает, как лучше. К тому же задача не так проста, как кажется.
nubideus "Привет %s, тебе сегодня исполнилось %d %s. Сегодня в %s день могут смотреть не %s" ["Юзернейм", "4", "года", "завтрашний", "только лишь все"] Добавлено через 4 минуты Я бы сделал как во флексе ResourceManager там замена напрямую из массива по индексу: "Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!" ["Юзернейм", "4", "года", "завтрашний", "только лишь все"] И гибче получается |
Цитата:
Ну а вообще, да, я извиняюсь перед ТС - простите! Это не мое дело. |
Цитата:
|
Ну угнали у него аккаунт, спрашивают чего непонятно, чего панику разводить?
|
Код AS3:
Код AS3:
|
Принимаю ваш праведный гнев. Просто не хотел отвлекаться от основных тасков и подвесил функцию на сообщество. Иcходил из того, что функция будет полезна многим, поэтому и спросил.
p.s Пишу свой Heartstone с блекджеком и шлюхами. Код есть на гитхабе. |
Цитата:
|
Медленный, но менее морочный вариант :D
Код AS3:
|
Небольшой тестик по теме
Код AS3:
UPD1: самый быстрый Inline вариант, стабильно 4 сек. на миллион Код AS3:
|
Код AS3:
testSlavaRa:8746 testNooob:8163 |
тест вашего и моего кода, в release(миллион итераций)
testSlavaRa:4100 testNooob:20680 все 4 теста с вашим кодом падают по таймауту UPD1: + ваш спокойно себе заменит и {a}, {b}, {c}, ... чего делать не должен( |
Цитата:
>Сегодня в %s день могут смотреть не %s. Не скучай, {0}! >Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, {0}! тут ошибка в том, что ты не тот код скопировал. ну и в регекспе лишний плюсик /{[0-9]+}+/g, но и с ним работает, так что не стал править вы не сможете отладить, если в строке будет {n}, где n больше или равно arg.length, по идее должно выдавать range error. я этого не учел потому что пофиг ваще например "asd asd {9999} sad" |
Извиняюсь, да.. мой косяк, исправил сообщение.
|
ну ещёб, у тебя там ошибки в коде, в следующей итерации str будет уже старый и поэтому будет работать быстрее.
если уж инлайнить то Код AS3:
|
Код AS3:
testMikroAcse:33144 testSlavaRa:23775 testNooob:26051 зы зачем надо было править мое форматирование? |
x10000
testNubideus:141 testMikroAcse:227 testSlavaRa:174 testNooob:173 > Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}! > Привет Юзернейм, тебе сегодня исполнилось 4 года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм! > {1{2}{3}{1}} > {1годазавтрашний4} > }{}{}{}{}{}{}{}[[[[]}{{}}]]}}{ > }{}{}{}{}{}{}{}[[[[]}{{}}]]}}{ testSlavaRa: > "{{1}}", ["Юзернейм", "0", "года", "завтрашний", "только лишь все"] > Юзернейм // wat testMikroAcse: >Привет {0}, тебе сегодня исполнилось {{1}} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}! >Привет Юзернейм, тебе сегодня исполнилось только лишь все года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм! testNooob: жааль что там только от 0 до 9, плюсик дает всего дополнительные 5% времени Код AS3:
ищет "{", потом ищет первую попавшуюся "}", arr[все что между ними]. если между ними ничего нет, то вставляется {}. Код AS3:
|
Вам делать нечего или как? Что это за экозитка в каждой теме, если нужно ПРОСТО решить поставленную задачу?
|
MikroAcse, ты первый:
- предложил альтернативное решение - заикнулся про скорость выполнения. но в твоем 11 посте ты показываешь самое медленное решение с багом Цитата:
ну и ты не поверишь, решение поставленной задачи в теме всего одно. все остальное - решение задачи из 4 поста |
Это не баг, это неправильное использование функции.
Сначала оно заменяет {1} на 4, а потом {4} на "только лишь все". |
MikroAcse,
arr = ["1", "2"] "{{0}}" // выдаст 2 "{{1}}" // выдаст {2} либо сделай правильную обработку вложенности, либо убери ее. иначе это баг как не посмотри |
Я не делал обработку вложенности, ты неправильно используешь функцию, вот и всё.
На этом я закончу наш разговор. |
parse (str:String, symbol:String, arr:Array) :String{
return "Привет Юзернейм, тебе сегодня исполнилось 4 года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм!"; } все работает, просто вы идиоты и ниправильна юзаити маю фукнцию |
Кстати, а ваши методы учитывают массив замены на более 10 элементов? На детском примере все быстры.
Код AS3:
Цитата:
Код AS3:
Цитата:
Цитата:
|
немного поправил. старый тест(x10000) теперь проходит за 130 мсек(было 140 мсек)
Код AS3:
Цитата:
код СлаваRa и MikroAcse мне не нравится больше не из-за бага, а из-за того, что они не парсят строку, из чего вытекает несколько проблем, помимо бага |
Ну так как взяли c# подход к форматированию, я не стал заморачиваться по поводу {{0}} и т.п., т.к. в c# string.Format не проверяет такие вещи, юзаешь - сам себе злобный буратино...
Хотя согласен, что для задачи можно было писать по TDD предусмотрев пару сотен вариантов инпут строки с подвохом) Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Код AS3:
|
Цитата:
|
Цитата:
|
псс, парень! не хочешь немного скорости?
Код AS3:
Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!! {q} {0} testMikroAcse:1335 Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!! {q} {{14}} testSlavaRa:2638 Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!! {q} Ехал testNooob:746 Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!! {q} {0} |
Цитата:
"{0} {{1}}" ["1", "год"] результат "1 {год}" |
> result += String.fromCharCode(
Nooob, прикрути substring, а то если увеличить расстояние между вставками, скорость упадет Цитата:
короче строка "{0} {} {" Цитата:
|
ага, исправил
Код AS3:
Код AS3:
x100000 Релиз: testNubideus:1082 testNooob:692 Дебаг: testNubideus:4162 testNooob:6135 в чем причина разницы в 10 раз в принипе понятно, но не понятно почему одни и те же алгоритмы в релизе кажут лучше чем в дебаге? в релизе есть NanoJIT? оверхед на хранение стека? разница GC? |
Nooob, а goto вам что-то дает, или это привычка с других языков?
|
не, решил попробовать просто, никогда раньше не пользовался, так как ситуаций не было. а тут не хотел просто ту же самую операцию вешать на continue goto, break goto.
|
x100000
Цитата:
Код AS3:
Цитата:
идею бессовестно урал, зато нашел баг. допустим строка 123: 0 * 1 + 1 1 * 10 + 2 12 * 100 + 3 = 1203 можно просто умножать на 10: 0 * 10 + 1 1 * 10 + 2 12 * 10 + 3 = 123 кстати у тебя последняя открытая скобка игнорится |
nubideus, ну всё, теперь я думаю что это самый быстрый вариант =)
|
| Часовой пояс GMT +4, время: 21:11. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.