Ищется нормальный рабочий алгоритм размножения текста по шаблону

Тема в разделе ".NET", создана пользователем svfolder, 25 мар 2015.

  1. svfolder

    svfolder Постоялец

    Регистр.:
    31 июл 2013
    Сообщения:
    96
    Симпатии:
    39
    Ищется нормальный рабочий алгоритм размножения текста по шаблону.
    Нашел один алгоритм, но он оказался рабочим на 30%, не умеет работать с шаблонами в которых несколько подстановочных блоков типа {aaa|ssss|cccc}{rrr|tttt|yyyyy}
    Вот он.



    Взял его за основу и начал перерабатывать, добрался до получения 2х массивов, массив блоков замен и массив того на что каждый из блоков надо заменить.
    Далее вынос мозга и непонятно как перемножить массивы и заменить текст чтобы вышло все верно.
    Ниже привожу метод.


    Код:
        Function Permutation(ByVal oldlist As ArrayList)
    
            Dim emp As New List(Of String)
            emp.Add(String.Empty)
    
            Dim result As New ArrayList
            Dim KeyVal As New Dictionary(Of String, String)
    
            For i = 0 To oldlist.Count - 1
    
                Dim mthColl As MatchCollection = Regex.Matches(oldlist(i), "{(.*?)}")
    
                If mthColl.Count > 0 Then
    
                    For Each Item As Match In mthColl
    
                        Dim all As String()() = {}
                        Dim cnt As Integer = 0
    
                        Dim allMatches As String() = {}
    
    
                        Dim tmpItem As Match = Item
    
                        While tmpItem.Success
                            cnt += 1
    
                            '-----------------------------
                            ReDim Preserve all(cnt - 1)
                            all(cnt - 1) = tmpItem.Groups(1).Value.ToString.Split("|")
                            '-----------------------------
    
                            '-----------------------------
                            ReDim Preserve allMatches(cnt - 1)
                            allMatches(cnt - 1) = tmpItem.Value
                            '-----------------------------
    
                            tmpItem = tmpItem.NextMatch
                        End While
    
                        '-----------------------------
                        Dim cntVariant As Integer = 0
    
    
    
                        For vCount = 0 To all.Count - 1
    
                            Dim tmpArrVariant = all(vCount)
                            Dim currMatch = allMatches(vCount)
    
    
                            For Each tmpVariant As String In tmpArrVariant
    
                                KeyVal.Add(tmpVariant, currMatch)
    
                            Next
    
    
                        Next
                        '-----------------------------
    
    
                        '-----------------------------
                        For Each matchReplace As String In allMatches
    
                            Dim str As String = oldlist(i).ToString
                            Dim len As Integer = str.Length
                            Dim delKey As String = ""
    
                            For Each Item1 As KeyValuePair(Of String, String) In KeyVal
    
                                str = str.Replace(Item1.Value, Item1.Key)
    
                                If str.Length <> len Then
                                    delKey = Item1.Key
                                    Exit For
                                End If
    
                            Next
    
                            result.Add(str)
                            'KeyVal.(delKey)
    
                        Next
    
    
                        Dim x = KeyVal
                        '-----------------------------
    
    
    
    
                        ''   Перебираем блоки которые надо заменить
                        'For Each matchReplace As String In allMatches
    
                        '    '   Перебираем массив вариантов замен
                        '    For Each arrVariant As String() In all
    
                        '        '   Перебираем варианты замен
                        '        For Each strVariant As String In arrVariant
    
                        '            Dim spl As String = strVariant.Trim()
    
                        '            KeyVal.Add(spl, matchReplace)
    
                        '        Next
    
                        '    Next
    
    
                        'Next
                        '-----------------------------
    
                    Next
    
                Else
                    result.Add(oldlist(i))
                End If
            Next
    
            Return result
    
        End Function
     
  2. sandyc

    sandyc Создатель

    Регистр.:
    26 авг 2011
    Сообщения:
    11
    Симпатии:
    1
    Ищу аналогичнй алгоритим, готов поучаствовать финансово в разработке или покупке. Или просто благодарности для автора.
     
  3. valekor

    valekor Постоялец

    Регистр.:
    3 авг 2013
    Сообщения:
    131
    Симпатии:
    16
    Нужен алгоритм обычного рандома или алгоритм перебора всех возможных комбинаций?
     
  4. svfolder

    svfolder Постоялец

    Регистр.:
    31 июл 2013
    Сообщения:
    96
    Симпатии:
    39
    Всех возможных комбинаций.
     
  5. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    288
    Вот начеркал на пхп, сложную функцию скопировал на stackoverflow, на .net переписать должно быть не сложно

    Код:
    <?php
    
    function combinations($arrays, $i = 0) {
        if (!isset($arrays[$i])) {
            return array();
        }
       
        if ($i == count($arrays) - 1) {
            return $arrays[$i];
        }
    
    // get combinations from subsequent arrays
        $tmp = combinations($arrays, $i + 1);
    
        $result = array();
    
    // concat each array from tmp with each element from $arrays[$i]
        foreach ($arrays[$i] as $v) {
            foreach ($tmp as $t) {
                $result[] = is_array($t) ?
                    array_merge(array($v), $t) :
                    array($v, $t);
            }
        }
    
        return $result;
    }
    
    $text = "wow {so|much|great}{!|,} {very|much|quite} algo";
    
    $parts = preg_split('#\{(.+?)\}#', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
    
    foreach ($parts as $i => $part) {
        if ($i % 2) {
            $parts[$i] = explode('|', $parts[$i]);
        } else {
            $parts[$i] = array($parts[$i]);
        }
    }
    
    $combs = combinations($parts);
    
    foreach ($combs as $c) {
        echo implode("", $c)."\n";
    }