1 (изменено: ppss42, 2022-12-26 07:00:55)

Тема: AHK: Spintax с несколькими уровнями вложенности

Здравствуйте. Подскажите пожалуйста, как реализовать spintax на ahk с несколькими уровнями вложенности? На просторах рунета находил спинтакс, но он работает по типу "{Привет|Хай}" а мне необходимо как в примере ниже:
"{Привет|Здравствуй} {Ты сейчас {дома|на улице|в кафе}}?"
Скрипт который я пытался использовать:

string = {Привет|Здравствуй}
MsgBox % spintax(string)

spintax(string) {
	Pos := 1
	while (Pos := RegExMatch(string, "{([^}]*)}", M, Pos + StrLen(R)))
		string := StrReplace(string, M, R := getRandomElement(StrSplit(M1, "|")))

	return string
}

getRandomElement(Arr) {
	Random rand, 1, % Arr.Count()
	return Arr.RemoveAt(rand)
}

2

Re: AHK: Spintax с несколькими уровнями вложенности

ppss42 пишет:

{Привет|Здравствуй} {Ты сейчас {дома|на улице|в кафе}}?

По-моему, здесь одна пара скобок лишняя:

{Привет|Здравствуй} Ты сейчас {дома|на улице|в кафе}?

Или я чего-то не понимаю?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: ppss42, 2022-12-26 13:53:59)

Re: AHK: Spintax с несколькими уровнями вложенности

teadrinker
Да, действительно. Проглядел. Возможно такой пример будет правильнее:
"{привет {Артем|Владимир}. Как твои дела?|Здравствуй {Света|Маша}. Чем занята?}"
Т.е. на выходе будет какое то одно предложение. Например "Привет Артем. Как твои дела?" либо "Здравствуй Маша. Чем занята?" Проверил на первом попавшемся онлайн сервисе по рандомизации текста, и он выдает правильную вариацию, но в приведенном выше скрипте, это не срабатывает. Искал решение на зарубежном форуме и ничего не нашел.

4

Re: AHK: Spintax с несколькими уровнями вложенности

ppss42 пишет:

Да, действительно )

Ознакомьтесь, пожалуйста, с Правилами, отредактируйте свой пост. Обратите внимание на точки в конце предложений.
Вроде так работает:

text = {Привет {Артем|Владимир}. Как твои дела?|Здравствуй {Света|Маша}. Чем занята?}
randomText := text
while RegExMatch(randomText, "xO)( \{ (?: [^{}]++ | (?-1) )* } )", m)
   randomText := SubStr(randomText, 1, m.Pos - 1) . GetRandomText(SubStr(m[0], 2, -1)) . SubStr(randomText, m.Pos + m.Len)

MsgBox, % randomText

GetRandomText(text) {
   newText := RegExReplace(text, "(\{|(?!^)\G)((?!}).)*?\K\|", Chr(1))
   arr := StrSplit(newText, "|")
   Random, rand, 1, arr.Count()
   Return StrReplace(arr[rand], Chr(1), "|")
}

Особо не тестировал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: ppss42, 2022-12-26 14:04:38)

Re: AHK: Spintax с несколькими уровнями вложенности

Все работает. Проверил на более сложной вариации текста, все идеально рандомизирует. Просто нет слов! Большое вам спасибо уважаемый teadrinker, не первый раз выручаете меня!