Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Переменные в строке (http://www.flasher.ru/forum/showthread.php?t=208835)

nubideus 07.09.2014 04:36

MikroAcse, ты первый:
- предложил альтернативное решение
- заикнулся про скорость выполнения.

но в твоем 11 посте ты показываешь самое медленное решение с багом
Цитата:

testMikroAcse:
>Привет {0}, тебе сегодня исполнилось {{1}} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!
>Привет Юзернейм, тебе сегодня исполнилось только лишь все года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм!
должно быть:
> Привет Юзернейм, тебе сегодня исполнилось {4} года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм!
сначала исправь баг, потом уже критикуй

ну и ты не поверишь, решение поставленной задачи в теме всего одно. все остальное - решение задачи из 4 поста

MikroAcse 07.09.2014 13:46

Это не баг, это неправильное использование функции.
Сначала оно заменяет {1} на 4, а потом {4} на "только лишь все".

nubideus 07.09.2014 15:59

MikroAcse,
arr = ["1", "2"]
"{{0}}" // выдаст 2
"{{1}}" // выдаст {2}

либо сделай правильную обработку вложенности, либо убери ее. иначе это баг как не посмотри

MikroAcse 07.09.2014 19:06

Я не делал обработку вложенности, ты неправильно используешь функцию, вот и всё.
На этом я закончу наш разговор.

nubideus 07.09.2014 20:37

parse (str:String, symbol:String, arr:Array) :String{
return "Привет Юзернейм, тебе сегодня исполнилось 4 года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм!";
}

все работает, просто вы идиоты и ниправильна юзаити маю фукнцию

GBee 07.09.2014 23:20

Кстати, а ваши методы учитывают массив замены на более 10 элементов? На детском примере все быстры.
Код AS3:

var elems:Array = ["Ехал", "Грек", "а", "через", "рек", "у", "видит", "в", "е", "рак", "сунул", "руку", "за", "цап"];
var template:String = "{0} {1}{2} {3} {4}{5}, {6} {1}{2} {7} {4}{8} {9}, {10} {1}{2} {7} {4}{5} {11}, {9} {12} {11} {1}{5} {13}!!";

Цитата:

все работает, просто вы идиоты и ниправильна юзаити маю фукнцию
Из серии :o)
Код AS3:

function random():int
{
    return 4;
}

Цитата:

Это не баг, это неправильное использование функции.
Сначала оно заменяет {1} на 4, а потом {4} на "только лишь все".
Это баг, должно быть {4}.

Цитата:

Вам делать нечего или как? Что это за экозитка в каждой теме, если нужно ПРОСТО решить поставленную задачу?
В споре рождается истина. Пока спорящие не переходят на личности и кидаются весомыми аргументами это вообще супер.

nubideus 08.09.2014 03:51

немного поправил. старый тест(x10000) теперь проходит за 130 мсек(было 140 мсек)
Код AS3:

var arr:Array = ["Ехал", "Грек", "а", "через", "рек", "у", "видит", "в", "е", "рак", "сунул", "руку", "за", "цап"];
var str:String = "{0} {1}{2} {3} {4}{5}, {6} {1}{2} {7} {4}{8} {9}, {10} {1}{2} {7} {4}{5} {11}, {9} {12} {11} {1}{5} {13}!!";
 
var result:String = "";
var openIndex:uint = 0;
var closeIndex:uint = 0;
var i:uint = 0;
parse: while (true) {
        openIndex = str.indexOf("{", i) + 1;
        if (openIndex) {
                sl: for (i = openIndex; ; i++ ) {
                        switch(str.charAt(i)) {
                                case "0": case "1":
                                case "2": case "3":
                                case "4": case "5":
                                case "6": case "7":
                                case "8": case "9":
                                        continue;
                                case "}":
                                        break sl;
                                default:
                                        continue parse;
                        }
                }
                if(openIndex < i){
                        var substr:String = str.substring(openIndex, i);
                        result += str.substring(closeIndex, openIndex - 1) + arr[uint(substr)];
                        closeIndex = i + 1;
                }
                continue;
        }
        break;
}
result += str.substring(closeIndex, str.length);
 
trace(result);
// Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!!

Цитата:

Кстати, а ваши методы учитывают массив замены на более 10 элементов? На детском примере все быстры.
у СлаваRa баг тот же, что и у MikroAcse, а у Nooob надо только плюсик в регексп дописать, что бы он стал замечать больше 10.

код СлаваRa и MikroAcse мне не нравится больше не из-за бага, а из-за того, что они не парсят строку, из чего вытекает несколько проблем, помимо бага

СлаваRa 08.09.2014 08:50

Ну так как взяли c# подход к форматированию, я не стал заморачиваться по поводу {{0}} и т.п., т.к. в c# string.Format не проверяет такие вещи, юзаешь - сам себе злобный буратино...
Хотя согласен, что для задачи можно было писать по TDD предусмотрев пару сотен вариантов инпут строки с подвохом)

Цитата:

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

nubideus 08.09.2014 15:29

Цитата:

в c# string.Format не проверяет такие вещи
"}{", "{}", "{}}" - FormatException

Цитата:

для вывода открывающих и закрывающих фигурных скобок необходимо использовать escape-последовательности. Для вывода открывающей или закрывающей фигурной скобки в фиксированном тексте следует поставить две открывающие или, соответственно, закрывающие фигурные скобки подряд ("{{" или "}}").
Цитата:

Интерпретация вложенных скобок не поддерживается.
т.е. если я напишу "{{0}}", то ничего не будет, выведет "{0}". как и "{{blahblah}}" => "{blahblah}"

Цитата:

c# string.Format не проверяет такие вещи, юзаешь - сам себе злобный буратино...
именно что все проверяет и кидает ошибки.

Цитата:

Цитата:

что они не парсят строку, из чего вытекает несколько проблем, помимо бага
каких?
я думаю, что для тебя и для MikroAcse не будет никаких проблем. ведь вы используете свои функции правильно...

MikroAcse 08.09.2014 16:21

Код AS3:

                        var arr:Array = ["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
                        var str:String = "Привет {0}, тебе сегодня исполнилось {1} {{1}} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!";
                        var res:String = "";
                        var current:String;
                        var nesting:int = 0;
 
                        for (var j:int = 0, l:int = str.length; j < l; j++)
                        {
                                var char:String = str.charAt(j);
 
                                if (char == '{') {
                                        if (nesting == 0) {
                                                current = "";
                                        } else {
                                                current += '{';
                                        }
                                        nesting++;
                                        continue;
                                }
                                if (char == '}') {
                                        if (nesting == 1) {
                                                var parsed:Number = parseFloat(current);
                                                if (isNaN(parsed)) {
                                                        res += "{" + current + "}";
                                                } else {
                                                        res += arr[parsed];
                                                }
                                        } else {
                                                current += '}';
                                        }
                                        nesting--;
                                        continue;
                                }
                                if (nesting == 0) {
                                        res += char;
                                } else {
                                        current += char;
                                }
                        }
 
                        trace(res); // Привет Юзернейм, тебе сегодня исполнилось 4 {{1}} года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм!

Не заменяет вовсе. Так сойдёт? :D


Часовой пояс GMT +4, время: 19:56.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.