Spintax {Task | Problem | Question}


19

Статья спиннинг с помощью Spintax

Вращение статьи - это метод поисковой оптимизации, с помощью которого оптимизаторы размещают уникальную версию релевантного контента в каталогах статей, сайтах Web 2.0 или других источниках обратных ссылок.

Иногда авторы веб-сайтов используют их на своих сайтах, но обычно их избегают, поскольку качество раскрученного контента будет ниже, чем рукописного контента. Спиннинг работает путем переписывания существующих статей или частей статей и замены отдельных слов, фраз, предложений или даже целых абзацев на любое количество альтернативных версий, чтобы обеспечить немного разные вариации с каждым спином.

Этот процесс может быть полностью автоматизирован или переписать вручную. Ваша задача сегодня будет состоять в том, чтобы создать программу или функцию, которая интерпретирует строку, содержащую Spintax , синтаксис, с помощью которого программа будет считывать различные доступные опции. Ниже приведен пример строки, которая использует Spintax:

{Hello|Hi there|Bonjour}, user! {What's up?|How are you?|Feeling alright?|I caught a fish!}

Как видите, фрагменты строки, которые должны быть «закручены», заключены в фигурные скобки, где отдельные параметры разделяются по |символу. Вот несколько примеров предложений, которые это может дать.

Hi there, user! What's up?
Hello, user! How are you?
Bonjour, user! Feeling alright?
Hello, user! What's up?
Hi there, user! I caught a fish!

Твоя работа

Ваша миссия, если вы решите принять ее, - создать программу или функцию, которая принимает входную строку, которая может содержать или не содержать Spintax , а затем распечатать 5 версий строки, случайным образом выбирая один из вариантов из каждого блока параметров. Вы можете сделать несколько предположений:

  1. Вам не нужно будет обращаться с вложенным Spintax ( {This|is {an|one}|example}).
  2. В |, {и }персонажи не будут происходить в другом месте, кроме внутри блока Spintax.
  3. Вам не нужно проверять, различаются ли 5 ​​выходных предложений, если код выбирает опции, используя функцию случайных чисел вашего языка.
  4. Вы можете предположить, что ввод заканчивается новой строкой.

правила

  1. Нет стандартных лазеек.

тесты

1. {A|The|One} {quick|magnificent|charming|lucky|fast|super|cool} {gold|tan|yellow|white|brown|silver} {beaver|packrat|cat|lion|tiger|fox|dog|wolf} {consumed|ate|pilfered} my {pastry|strudel|cake}.
-------------------------------------------
One cool brown wolf consumed my pastry.
...(3 more here)...
The charming yellow beaver ate my cake.
-------------------------------------------
2. This sentence is valid, and happens to have no Spintax!
-------------------------------------------
This sentence is valid, and happens to have no Spintax!
...(3 more here)...
This sentence is valid, and happens to have no Spintax!
-------------------------------------------
3. {beg|get|ton|sun|bun|can|top|big}{2|3|4|5}{A|B|C|D|E|F|G}{2|3|4|5|6|7}{at|as|be|ex|hi|}{!|#|%}
-------------------------------------------
top2F2hi%
...(3 more here)...
big3E4ex#

Четвертый тест можно найти здесь.


Это , поэтому выигрывает меньшее количество байтов.


2
Теперь с небольшим изменением ... сумасшедшие ребята!
Geobits

Какие типы символов мы можем ожидать при вводе?
Sp3000

@ Sp3000 Все из ASCII 32-127. Единственное место , где {, |, }собирается найти во входной строке, где есть Spintax.
Каде

Ответы:


8

Пиф, 18

V5sOMcR\|scR\{cz\}

Попробуйте онлайн здесь

Объяснение:

V5sOMcR\|scR\{cz\}                     : z = input()
V5                                     : do this 5 times
              cz\}                     : split z on the } character
          cR\{                         : split each element of the resulting list on {
         s                             : join the list of lists back into a list of strings
     cR\|                              : split these strings on the | character
   OM                                  : Choose a random element from each inner list
  s                                    : join those choices, and print them

1
Боже мой, это было быстро!
Каде

7

Руби, 46

С флагом командной строки -pзапустите

($_*=5).gsub!(/{(.+?)}/){$1.split(?|).sample}

Читайте в строке с завершающим переводом строки. Объедините его с собой 5 раз, измените его на месте и выведите результат. /{(.+?)}/является регулярным выражением с ленивым квантификатором: без ?него оно будет соответствовать крайнему левому {и правому краю, }а не ближайшему. $1является магической переменной, ссылающейся на первую группу захвата в каждом совпадении, в то время как ?|литерал ссылается на |символ. sampleметод массива, возвращающий случайный элемент


6

CJam, 25 22 19 18 байт

q5*'}/{'{/~'|/mR}/

Этот код требует, чтобы ввод содержал завершающий перевод строки.

Попробуйте онлайн в интерпретаторе CJam .

Как это устроено

q     e# Read from STDIN.
5*    e# Repeat the input five times.
'}/   e# Split at right curly brackets.
{     e# For each chunk:
  '{/ e#   Split at left curly brackets.
  ~   e#   Dump both chunks on the stack.
  '|/ e#   Split the right chunk at vertical bars.
  mR  e#   Select a chunk, pseudo-randomly.
}/    e#

В каждой итерации два блока (одна константа, одна переменная) остаются в стеке и будут напечатаны при выходе из программы.


6

Python 3, 110 байт

import re,random
exec('print("".join(random.choice(s.split("|"))for s in re.split("{(.*?)}",%r)));'%input()*5)

Regex расщепляется, как и остальные.

Python 3, 121 116 114 байтов

from random import*
exec(("print(%r[:-1]);"%(input()+'"')).translate({123:"'+choice(['",124:"','",125:"'])+'"})*5)

Этот выполняет соответствующие замены, а затем оценивает его. Если бы не избежание обратного слеша и апострофов, это оказалось бы короче.

Например, предположим, у нас есть Spintax

I {like|hate} {Python|C}.

В .translateвыполняет несколько конверсий , чтобы дать:

print('I '+choice(['like','hate'])+' '+choice(['Python','C'])+'.')

4

Perl, 50

$_=$_ x5;s/{(.*?)}/@r=split"\\|",$1;$r[rand@r]/ge

49символы +1для -p.

Это работает, сначала установив $_5 предложений. Затем он выполняет глобальный поиск и замену, где мы ищем каждую { | | }группу. Это разделяет группу на| и выбирает случайный элемент для замены.

Бежать с:

echo '{A|The|One} {quick|magnificent|charming|lucky|fast|super|cool} {gold|tan|yellow|white|brown|silver} {beaver|packrat|cat|lion|tiger|fox|dog|wolf} {consumed|ate|pilfered} my {pastry|strudel|cake}.' | perl -pe'$_=$_ x5;s/{(.*?)}/@r=split"\\|",$1;$r[rand@r]/ge'

$_ x=5сохраняет несколько байтов.
Деннис

4

Страус v0.7.0 , 27 символов

{`{.*?}`{);(;"|/.,R*F=}X}5*

Объяснение:

{...}5*  repeat 5 times
  `{.*?}`  regex to match "spintax" sections
  {...}X   replace with...
    );(;     remove first and last characters (the curly brackets)
    "|/      split on |
    .,R*     multiply length of that array by a random number
    F=       take the floor of that and get the nth element of the array

(примечание: релиз 0.7.0 был сделан после того, как этот вопрос был опубликован, но ответ все еще действителен, поскольку все коммиты, которые составляли этот релиз, были переданы до того, как эти вопросы были опубликованы.)


4

Пип, 25 22 20 байт

Опоздал на вечеринку, но вот мой. Принимает ввод в качестве аргумента командной строки, который может потребоваться заключить в кавычки.

L5P_@RR#_Ma^`}|{`^'|

Объяснение:

L5                    Loop 5 times:
          a^`}|{`     Split cmdline arg on curly braces using regex
                 ^'|  Split each item of the result on pipe (if there isn't one,
                        the result is a single-item list)
         M            Map this function to each item a in the result:
   _@RR#_             Calculate a random number between 0 and len(item)-1; use it to
                        index into item
  P                   Print the resulting list, concatenating elements together

17 байт (но не правильное представление)

L5PRC_Ma^`}|{`^'|

Требуется последняя версия Pip, обновленная после публикации этого вопроса. Оператор RC (случайный выбор) был запланирован в течение некоторого времени, но я до сих пор не удосужился его реализовать. : ^ (

Узнайте больше о Пип


1
Шутки в сторону? Вы пишете на своем родном языке, чтобы выиграть соревнования по гольфу?
Хлоя

3
@Chloe: CJam , GS2 , Страус , PYG , Pyth , Retina и RS всех языки гольф изобретенных пользователями этого сайта.
Деннис

3

JavaScript ES6, 86 84 байта

f=s=>s.repeat(5).replace(/{(.+?)}/g,(_,e)=>(p=e.split`|`)[Math.random()*p.length|0])

Это ожидает, что у ввода будет завершающий перевод строки. Он начинается с повторения ввода 5 раз, а затем замены каждой строки Spintax случайным словом из нее, которое получается путем разделения |символов и выбора случайного числа между 0 и длиной полученного массива минус 1. В этом случай, |0это просто более короткий способ сделать Math.floor. Спасибо vihan1086 за напоминание о помеченных шаблонных строках.

Фрагмент стека, приведенный ниже, содержит простой и легко проверяемый код.

f=function(s){
  return s.repeat(5).replace(/{(.+?)}/g,function(_,e){
    return (p=e.split('|'))[Math.random()*p.length|0]
  })
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('input').value+'\n')};document.getElementById('run').onclick=run;run()
<input type="text" id="input" value="{A|The|One} {quick|magnificent|charming|lucky|fast|super|cool} {gold|tan|yellow|white|brown|silver} {beaver|packrat|cat|lion|tiger|fox|dog|wolf} {consumed|ate|pilfered} my {pastry|strudel|cake}." style="width: 400px;" /><button id="run">Run</button><br />
<pre id="output"></pre>


|0эквивалентно Math.floorнет Math.round. Хотя это то, что вы хотите, так как Math.roundэто обеспечит неравномерное распределение.
Джордж Райт

@ GeorgeReith Вы правы, я хотел поставить слово, но случайно объявил. Спасибо
NinjaBearMonkey


2

Python 2, 139 байт

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

Попробуй здесь

import re,random
s=input()
exec"print''.join(t*(t!=''and(t[0]!='{'))or random.choice(t[1:].split('|'))for t in re.split('({.*?)}',s));"*5

1

Java, 243 215 242 234 байта

int i,k;void f(String s){String a,b[],c=s;for(;k++<5;System.out.println(c),c=s)while((i=c.indexOf("{"))>=0){a=c.substring(i,c.indexOf("}")+1);b=a.replaceAll("\\{|\\}","").split("\\|");c=c.replace(a,b[(int)(Math.random()*b.length)]);}}

Находит строки в фигурных скобках {}и заменяет их случайным элементом из массива строк, созданного путем разбиения по символу канала. (Я слишком поздно понял, что должно быть напечатано пять предложений: P)


1

Bash: 144 138 символов

IFS={} read -ap
w()(for o in "${p[@]}";{
[[ $o =~ \| ]]&&{
IFS=\| read -aa<<<"$o"
o=${a[RANDOM%${#a[@]}]}
}
echo -n "$o"
}
echo)
w
w
w
w
w

Образец прогона:

bash-4.3$ bash spintax.sh <<< "Look {ma'|daddy|mr. president}! No {bin|core|doc|find|mail}utils tools nor {Awk|Sed|jq|XML Starlet}!"
Look ma'! No docutils tools nor Awk!
Look daddy! No binutils tools nor XML Starlet!
Look mr. president! No docutils tools nor XML Starlet!
Look ma'! No docutils tools nor Awk!
Look mr. president! No binutils tools nor Sed!

1
Вы можете сохранить несколько байтов, используя w()(...) вместо w(){...}(позволяет исключить пробелы) printfвместо echo -nфигурных скобок вместо doи done.
Деннис

Спасибо, @ Денис. Опять таки. (К сожалению, я не первый раз забываю эти уловки.) Что касается того printf, что произойдет сбой во входной строке, содержащей «%», если я что-то не так понял.
manatwork

1

Javascript, 143 142 байта

a=prompt(b=5);for(c=[];b--;c.push(a.replace(/{(.+?)}/g,function(_,j){return (d=j.split("|"))[d.length*Math.random()|0]})));alert(c.join("\n"))

1

Python 3, 97 байт

Использование лямбда-функции в подстановке регулярных выражений. Это похоже на то, как я это делал в моём модуле Spintax https://github.com/AceLewis/spintax, однако это не касается вложенного Spintax или экранирования символов.

import re,random
print(re.sub("{(.*?)}",lambda x:random.choice(x.group(1).split('|')),input()*5))

Если вы не предполагаете, что ввод заканчивается новой строкой, то это будет 104 байта.

import re,random
print(re.sub("{(.*?)}",lambda x:random.choice(x.group(1).split('|')),(input()+'\n')*5))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.