Рандомизация текста

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kokoulin, 1 Nov 2011.

  1. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    65
    Likes Received:
    5
    Reputations:
    5
    помогите создать рандомизацию текста:
    сейчас делаю так:
    нажимаем кнопку пишем синонимы из них создается массив строк, а в строку текста вставляется {0}
    вставляем второй синонимы из них создается еще один массив строк а в строку текста вставляется {1}
    и так далее
    из всех массивов строк делается массив массивов
    потом при конфигурации строки текста берем рандомную строку из 1 го массива потом из второго и т.д.
    теперь хочу сделать, чтобы пользователь писал что то типа:
    Вася {Пошел|побежал|ушел}{пить|бухать|уничтожать}{алкоголь|пиво|водку}

    соответственно надо разделить строку на части в которых синонимы присвоить им номера и потом разделить части на синонимы и создать из них массив строк

    внимание вопрос: как это сделать проще?
    если кто ни будь предоставит код на c# будет очень хорошо)
     
  2. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    я сейчас вообще не понял что ты написал и как ты хочешь делать свою рандомизацию, но
    1) находишь позицию "{" (запоминаешь в sym_start)
    2) находишь следующую за 1) знак "}" (запоминаешь в sym_end)
    3) берешь получившийся текст вида a|b|c|d....
    4) считаешь в 3) количество знаков "|" (чтобы 2 раза работу не делать, можешь позиции этих знаков сохранить в массив, а можешь не сохранять, но тогда в п.6 прийдется заново их искать, тут уж как тебе нравится)
    5) берешь случайное число из диапазона 0 .. 4)
    6)
    6а) если в 5) выпал 0, то копируешь из 3) до 1-го "|",
    6б) если в 5) выпало число, равное количеству знаков "|", то от последнего "|" и до конца 3),
    6в) если между ними, то копируешь все от 5) до 5)+1 знака "|"
    6г) запоминаешь скопированное в my_word
    7) удаляешь из строки символы с sym_start по sym_end, а на позицию sym_start вставляешь my_word
    Элементарно, Ватсон.
    P.S. это если у тебя твои группы прямо по тексту растыканы, а не вводятся отдельно.
    Если же ты хочешь заменить {0}, то соответственно в 1) и 2) ничего запоминать не нужно, а находишь в тексте позицию соответствующего "слова", удаляешь его и на его место вставляй твое my_word
     
    #2 xophet, 1 Nov 2011
    Last edited: 1 Nov 2011
    1 person likes this.
  3. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    65
    Likes Received:
    5
    Reputations:
    5
    большое спасибо)
    да растыканы по тексту
     
  4. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    xophet, что за адов алгоритм? Это всё легко делается регулярками + простым рекурсивым алгоритмом.
     
  5. Niades

    Niades New Member

    Joined:
    30 Nov 2010
    Messages:
    28
    Likes Received:
    3
    Reputations:
    0
    Я вот так написал:
    PHP:
            static void Main(string[] args)
            {
                
    Regex rx = new Regex("{(.*?)}");
                
    string raw_input Console.ReadLine();
                foreach (
    string input in raw_input.Split(' '))
                {
                    if (
    rx.IsMatch(input))
                    {
                        
    string[] words rx.Match(input).Groups[1].Value.Split('|');
                        
    Console.Write(" " words[new Random(Guid.NewGuid().GetHashCode()).Next(words.Length)]);
                    }
                    else
                        
    Console.Write(" "+input);
                }
                
    Console.ReadKey();
            }
    Вроде требуемую задачу выполняет.
     
    1 person likes this.
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    а ты регулярки собираешься использовать даже там, где можно обойтись простым копированием? флаг в руки.
    я понимаю, что в варианте с регулярками думать не нужно, но алгоритм подробно описывает последовательность действий, необходимых для решения поставленной задачи с минимальными затратами ресурсов и времени. Выполняется он в 20-30 строчек кода, несмотря на всю растянутость в словесном описании.
    P.S. да, к стати, даже слегонца напрягая извилины на поверхности лежит процедура "extractstrings", но никак не регулярки.
     
    #6 xophet, 2 Nov 2011
    Last edited: 2 Nov 2011
  7. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    65
    Likes Received:
    5
    Reputations:
    5
    Спасибо ваш код делает как раз то что нужно)

    xophet: то что вы описали я реализовал в ~30 строк, но регулярками вышло проще и короче
     
    #7 kokoulin, 2 Nov 2011
    Last edited: 2 Nov 2011
  8. B0ri$ka

    B0ri$ka Banned

    Joined:
    1 Jul 2011
    Messages:
    33
    Likes Received:
    2
    Reputations:
    0
    xophet, в наше время такое программирование считается говнокодом
     
  9. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    в любое время использование ресурсоемких технологий там, где можно обойтись элементарными - говнокод
     
  10. Niades

    Niades New Member

    Joined:
    30 Nov 2010
    Messages:
    28
    Likes Received:
    3
    Reputations:
    0
    Вроде без регулярок:
    PHP:
                string raw_input Console.ReadLine(); 
                foreach (
    string input in raw_input.Split(' ')) 
                {
                    try
                    {
                        
    string[] words input.Split('{')[1].Split('}')[0].Split('|');
                        
    Console.Write(" " words[new Random(Guid.NewGuid().GetHashCode()).Next(words.Length)]);
                    }
                    catch (
    IndexOutOfRangeException)
                    {
                        
    Console.Write(" " input);
                    }
                } 
                
    Console.ReadKey(); 
    try..catch можно заменить на 2 if, но так короче.
     
    #10 Niades, 2 Nov 2011
    Last edited: 2 Nov 2011
  11. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Угу, а так же применение фреймворков, плугов под эти фреймворки и типа того - неумение прогать. (сарказм)
    Необходимо сочитать быстроту(читабельность) написания кода и скорость его выполнения - для каждой цели свои подходы. То-то все быдлокодеры(любые языки верхнего уровня) и не пишут на асме.
     
  12. B0ri$ka

    B0ri$ka Banned

    Joined:
    1 Jul 2011
    Messages:
    33
    Likes Received:
    2
    Reputations:
    0
    Это регэксп-то ресурсоёмкий? Хаха.
    Ну тогда выбрось свою VS или что там у тебя и сиди пиши в блокноте.

    Это как раз regex - элементарно.
    Развелось блин школоты быдлокодеров
     
  13. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    Извините, но школотой-быдлокодером вас не обзывали (или я не прав?). На каком основании вы применяете это ко мне?

    RegExp - если даже не ресурсоемкое средство, так медленнее pos, copy, delete в Delphi это точно. Про такие языки как php я помолчу, потому как там, как мне известно, регулярки - обычное дело, но в Delphi это далеко не так (там даже поддержки регулярок нету по стандартам)
     
  14. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    А вы попробуйте взять кусок текста килобайт на 30, и регулярку, которая заведомо не сработает с парой-тройкой знаков "*" в тексте. (хватит даже одного)
    запускаем. и любуемся загрузкой проца 100%
    а теперь представьте себе на минуту, что конечному пользователю данного ПО не нужна рандомизация. Ваша регулярка не срабатывает. Прога грузит процессор 100% клиент доволен :eek:
     
  15. B0ri$ka

    B0ri$ka Banned

    Joined:
    1 Jul 2011
    Messages:
    33
    Likes Received:
    2
    Reputations:
    0
    В данном конкретном случае регулярка лучше, удобнее, даёт меньше кода, и проще в отладке
     
  16. vernite akk=

    vernite akk= New Member

    Joined:
    18 May 2011
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    В RadStudio 2010 уже есть какойто стандартный компонент, я им не пользуюсь хз как называеться.
     
  17. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Какая такая отладка? :confused: :confused: да здесь кода 30 строк!
    короче хотите чудить - вперед. Хоть сервера гугла используйте для замены подстроки в строке =-)
     
  18. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Когда живешь на девятом этаже быстрейший способ спустится вниз - прыгнуть в окно, лифт и тем более лестница это путь быдлокодоров. А регулярные выражения это все происки индусов.
     
    #18 seosimf, 3 Nov 2011
    Last edited: 3 Nov 2011
  19. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    65
    Likes Received:
    5
    Reputations:
    5
    В общем после некоторых тестов и доработок правильнее работает адов алгоритм от xophet
    работает корректнее и как ни странно быстрее т.к.
    код от Niades не учитывает нескольких важных деталей таких как: пробела перед {||} может ни быть пробел в {qw qw|qw zx|qw as} тоже может быть а если встретит {} будет долго думать
    готовый вариант это алгоритм от xophet с некоторыми доработками

    PHP:
    private void button1_Click(object senderEventArgs e)
            {
                
    Regex rx = new Regex("{(.*?)}");
                
    string result "";
                
    int firstq;
                
    int s Convert.ToInt32(numericUpDown1.Value);
                
    int i 0;
                while (
    s)
                {
                
    string message textBox1.Text;
                while (
    message.IndexOf("{") != -1
                {
                    
    firstq message.IndexOf("{");
                    
    result string.Format(result message.Remove(firstq));
                    
    message message.Remove(0firstq);
                    
    int first message.IndexOf("{");
                    
    int end message.IndexOf("}");
                    
    first++;
                    
    int count end first;
                    
    string random message.Substring(firstcount);
                    
    string[] words random.Split('|');
                    
    string word words[new Random(Guid.NewGuid().GetHashCode()).Next(words.Length)];
                    
    string rep Convert.ToString(rx.Match(message));
                    
    message message.Replace(repword);
                }
                
    result string.Format(result message);
                
    textBox2.AppendText(string.Format(result " \r\n"));
                
    result null;
                
    message null;
                
    i++;
                }
                
            }
     
    #19 kokoulin, 4 Nov 2011
    Last edited: 4 Nov 2011
  20. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Не, не, это не мой алгоритм, у меня регулярок там вообще не было :(