Spintax

myweb101

Client
Регистрация
29.04.2013
Сообщения
175
Благодарностей
30
Баллы
28
Здравствуйте, как получить все варианты строк в спинтакс строке-тексте?

Через экшен spintax не очень. Делал в цикле, количество итерации считал по знаку | и умножал на 2 (если меньше, то не все варианты отдает), а потом удалял повторы.

Пример:
{Hello|Hi}{World|There!}, how are you? {Hello|Howdy|Hola} to you, {Mr.|Mrs.|Ms.} {Smith|Williams|Davis}!

Более сложных конструкции не надо,
{{Hello|Howdy|Hola}|{Hello|Howdy|Hola}}

Но такой алгоритм очень сильно не производительный:(
Нашел:
http://stackoverflow.com/questions/14041495/regex-match-performance-issue-for-spintax-parser/14047581#14047581
http://mylifeismymessage.net/spintax-calling-c-powershell/

Но знаний не хватает перебросить код в зенку, помогите или у вас есть уже готовые сниппеты?
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Сложную синонимизацию проще генерировать заранее через сторонний софт, и потом подхватывать из файла, заодно можно быть увереным что повторов не будет.
Например через "Generating The Web"
 

myweb101

Client
Регистрация
29.04.2013
Сообщения
175
Благодарностей
30
Баллы
28
Загвоздка то в том, что не сео генератор, не Generating The Web не имеют консольного управления.
Нашел решение на php. Но опять же костыли:(
Вызывать из консоли, тоже не вариант.
 

Вложения

Последнее редактирование:

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Первый код легко перебрасывается, достаточно добавить в общий код.
Но там тоже просто генерация, без возможности создания списка всех вариантов.
Пример шаблона в атаче.
 

Вложения

Последнее редактирование:
  • Спасибо
Реакции: myweb101

myweb101

Client
Регистрация
29.04.2013
Сообщения
175
Благодарностей
30
Баллы
28
OwnCode пустой:-)
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Гм странно, у вас какая версия зенно постера ? может не поддерживает общий код еще просто.
Вообще его содержимое было такое:
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;

namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
    public static object SyncObject = new object();

    //// SPintax start 
        static int[] partIndices = new int[100];
        static int[] depth = new int[100];
        static char[] symbolsOfTextProcessed = new char[100000];

        public static String SpinEvenMoreFaster(String text)
        {
            int cur = SpinEvenMoreFasterInner(text, 0, text.Length, 0);
            return new String(symbolsOfTextProcessed, 0, cur);
        }

        public static int SpinEvenMoreFasterInner(String text, int start, int end, int symbolIndex)
        {
            int last = start;
            var rand = new Random();
            for (int i = start; i < end; i++)
            {
                if (text[i] == '{')
                {
                    int k = 1;
                    int j = i + 1;
                    int index = 0;
                    partIndices[0] = i;
                    depth[0] = 1;
                    for (; j < end && k > 0; j++)
                    {
                        if (text[j] == '{')
                            k++;
                        else if (text[j] == '}')
                            k--;
                        else if (text[j] == '|')
                        {
                            if (k == 1)
                            {
                                partIndices[++index] = j;
                                depth[index] = 1;
                            }
                            else
                                depth[index] = k;
                        }
                    }
                    if (k == 0)
                    {
                        partIndices[++index] = j - 1;
                        int part = rand.Next(index);
                        text.CopyTo(last, symbolsOfTextProcessed, symbolIndex, i - last);
                        symbolIndex += i - last;
                        if (depth[part] == 1)
                        {
                            text.CopyTo(partIndices[part] + 1, symbolsOfTextProcessed, symbolIndex, partIndices[part + 1] - partIndices[part] - 1);
                            symbolIndex += partIndices[part + 1] - partIndices[part] - 1;
                        }
                        else
                        {
                            symbolIndex = SpinEvenMoreFasterInner(text, partIndices[part] + 1, partIndices[part + 1], symbolIndex);
                        }
                        i = j - 1;
                        last = j;
                    }
                }
            }
            text.CopyTo(last, symbolsOfTextProcessed, symbolIndex, end - last);
            return symbolIndex + end - last;
        }
    //// SPintax end

///SPintax 2 start
public static String SpinNoRE(String text)
{
    string[] parts;
    var rand = new Random();
    int i, j, e = -1;
    char[] curls = new char[] {'{', '}'};
    text += '~';

    do
    {
        i =  e;
        e = -1;
        while ((i = text.IndexOf('{', i+1)) != -1)
        {
            j = i;
            while ((j = text.IndexOfAny(curls, j+1)) != -1 && text[j] != '}')
            {
                if (e == -1) e = i;
                i = j;
            }
            if (j != -1)
            {
                parts = text.Substring(i+1, (j-1)-(i+1-1)).Split('|');
                text = text.Remove(i, j-(i-1)).Insert(i, parts[rand.Next(parts.Length)]);
            }
        }
    }
    while (e-- != -1);

    return text.Remove(text.Length-1);
}
///SPintax 2 end
     
        // Insert your code here
    }
}
Если надо могу переделать под обычный снипет, но так удобнее использовать.
 
  • Спасибо
Реакции: myweb101

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
Подскажите, а как результат выводить в нужную переменную и в одном кубике использовать таких 3 строки кода ?
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Подскажите, а как результат выводить в нужную переменную и в одном кубике использовать таких 3 строки кода ?
C#:
project.Variables["Variable1Name"].Value = "value1";
project.Variables["Variable2Name"].Value = "value2";
project.Variables["Variable3Name"].Value = "value3";
 
  • Спасибо
Реакции: keltuzhaknut

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)