Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
str = "{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.";
function change(str){
str = str.replace(/\{([^{]+?)\}/g, function(full, match){
var bits = match.split('|');
return bits[Math.floor(Math.random(1)*bits.length)];
});
return str.indexOf('|') != -1 ? change(str) : str;
}
change(str);
function lol($rst){
while( preg_match('#\{([^{}]*)\}#',$rst) ){
$rst = preg_replace_callback('#\{([^{}]*)\}#iUs','rst',$rst);
}
return $rst;
}
function rst($r){
$r = explode('|',$r[1]);
return $r[rand(0,sizeof($r)-1)];
}
echo lol("{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|
простое} тестовое предложение {изменялось {быстро|мгновенно} случайным
образом|менялось каждый раз}.");
$s = '{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.';
1 while $s =~ s/{([^{}]+)}/@arr = split '\|',$1; $arr[rand scalar @arr]/eg;
print "Result: $s\n";
import re, random
def repl(m):
while True:
m, n = re.subn(r"{([^{}]*)}", lambda x: random.choice(x.group(1).split("|")), m)
if (n == 0): break
return m
print repl(u"{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.")
function Token(type, pos, value) {
this.type = type;
this.pos = pos;
this.value = value;
}
Token.END_OF_LINE = 0;
Token.OPERATOR = 1;
Token.TEXT = 2;
function Parser(text) {
this._text = text;
this._pos = 0;
this._len = text.length;
}
Parser.prototype = {
operators: {'{': true, '}': true, '|': true},
nextToken: function() {
if (this._pos >= this._len) return new Token(Token.END_OF_LINE);
if (this._text[this._pos] in this.operators) {
return new Token(Token.OPERATOR, this._pos, this._text[this._pos++]);
}
var text = '', start = this._pos;
while ((this._pos < this._len) && !(this._text[this._pos] in this.operators)) {
text += this._text[this._pos];
this._pos++;
}
return new Token(Token.TEXT, start, text);
},
getNextToken: function() {
var pos = this._pos, result = this.nextToken();
this._pos = pos;
return result;
}
};
function Interpretter(text) {
this._parser = new Parser(text);
}
Interpretter.prototype = {
value: function() {
var result = '', token = this._parser.getNextToken();
while (token.type == Token.TEXT || (token.type == Token.OPERATOR && token.value == '{')) {
token = this._parser.nextToken();
if (token.type == Token.OPERATOR) {
if (token.value == '{') {
result += this.expression();
} else {
throw 'Syntax error at pos ' + token.pos;
}
} else {
result += token.value;
}
token = this._parser.getNextToken();
}
return result;
},
expression: function() {
var variants = [this.value()], token = this._parser.nextToken();
while (token.value == '|') {
variants.push(this.value());
token = this._parser.nextToken();
}
if (!token.type == '}') 'Syntax error at pos ' + token.pos;
return variants[Math.floor(Math.random(1) * variants.length)];
}
};
var text = '{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.';
var interpretter = new Interpretter(text);
alert(interpretter.value());
* This source code was highlighted with Source Code Highlighter.
$p1=$p2=false;
while (($p2 = strpos($str,'}'))!==false && ($p1 = strrpos(substr($str,0,$p2),'{'))!==false) {
$a = explode('|', substr($str, $p1+1,$p2-$p1-1));
$str = substr_replace($str, $a[rand(0,count($a)-1)], $p1, $p2+1-$p1);
}
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string text = "{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.";
StringRandomizerConfig config = new StringRandomizerConfig() { delim = '|', beginBrase = '{', endBrase='}' };
var rnd = new StringRandomizer(config);
for (int i = 0; i < 10; i++)
{
Console.WriteLine(rnd.Rand(text));
}
Console.ReadKey();
}
}
public struct StringRandomizerConfig
{
public char delim;
public char beginBrase;
public char endBrase;
}
class StringRandomizer
{
public StringRandomizerConfig config { get; private set; }
private Random random = new Random();
public StringRandomizer(StringRandomizerConfig config)
{
this.config = config;
}
public string Rand(string text)
{
var stack = new Stack<int>();
if (text.IndexOf(config.beginBrase) > -1)
{
int i = 0;
do
{
if (text[i] == config.beginBrase)
{
stack.Push(i);
}
if (text[i] == config.endBrase)
{
var firstPos = stack.Pop();
var lastPos = i;
var lenBefore = text.Length;
text = text.Replace(text.Substring(firstPos, lastPos - firstPos + 1),
Rand(text.Substring(firstPos + 1, lastPos - firstPos - 1)));
i -= lenBefore - text.Length;
}
} while (++i < text.Length);
return text;
}
else
{
var pieces = text.Split(new[] {config.delim}, StringSplitOptions.RemoveEmptyEntries);
return pieces[random.Next(pieces.Count() - 1)];
}
}
}
}
«Правильное» тестовое задание для соискателя-программиста