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

svfolder

Постоялец
Регистрация
31 Июл 2013
Сообщения
159
Реакции
156
  • Автор темы
  • Заблокирован
  • #1
Ищется нормальный рабочий алгоритм размножения текста по шаблону.
Нашел один алгоритм, но он оказался рабочим на 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
 

sandyc

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

valekor

Постоялец
Регистрация
3 Авг 2013
Сообщения
133
Реакции
18
Нужен алгоритм обычного рандома или алгоритм перебора всех возможных комбинаций?
 

roddik

Колбаска
Регистрация
26 Янв 2007
Сообщения
346
Реакции
292
Вот начеркал на пхп, сложную функцию скопировал на 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";
}

wow great, much algo
wow great! much algo
wow great, quite algo
wow great! quite algo
wow great, very algo
wow great! very algo
wow much, much algo
wow much! much algo
wow much, quite algo
wow much! quite algo
wow much, very algo
wow much! very algo
wow so, much algo
wow so! much algo
wow so, quite algo
wow so! quite algo
wow so, very algo
wow so! very algo
 
Сверху