スピンタックス{タスク|問題|質問}


19

Spintaxを使用した記事の回転

記事の紡績は、検索エンジン最適化手法であり、これにより、検索エンジンオプティマイザーは関連するコンテンツの一意のバージョンを記事ディレクトリ、Web 2.0サイト、またはバックリンクの他のソースに投稿します。

Webサイトの作成者が自分のサイトで使用することもありますが、通常は回避されます。これは、スピンコンテンツの品質が手書きコンテンツよりも低くなるためです。スピニングは、既存の記事または記事の一部を書き換え、特定の単語、フレーズ、文、または段落全体を任意の数の代替バージョンに置き換えて、各スピンでわずかに異なるバリエーションを提供することで機能します。

このプロセスは完全に自動化するか、手動で書き直すことができます。今日の仕事は、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つを選択してことです。いくつかの仮定を立てることができます。

  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#

4番目のテストはここにあります。


これはなので、バイト数が最も少なくなります。


2
さて、わずかな変更を加えて...狂ったライブラリ!
ジオビット

入力ではどのような種類の文字を期待できますか?
Sp3000

@ Sp3000 ASCII 32-127のすべて。唯一の場所{|}Spintaxがある場合、入力文字列中に見出されることが予定されています。
カーデ

回答:


8

Pyth、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#

各反復で、2つのチャンク(1つは定数、1つは変数)がスタックに残り、プログラムの終了時に出力されます。


6

Python 3、110バイト

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

他のような正規表現の分割。

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(ランダム選択)演算子はしばらくの間計画されていましたが、今までそれを実装することはできませんでした。:^(

Pipの詳細


1
マジ?あなたはゴルフコンテストに勝つためにあなた自身の言語を書きますか?
クロエ

3
@Chloe:CJamGS2OstrichpygPythRetinaおよび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>


|0Math.floornot と同等Math.roundです。それがMath.round不均一な分布を提供するので、それはあなたが望むものですが。
ジョージリース

@GeorgeReithそうですね、床を置くつもりでしたが、誤って丸くするつもりでした。おかげで
NinjaBearMonkey

2

Perl、82バイト

while($o=<>){for(0..4){$_=$o;s/{(.*?)}/@x=split\/\|\/,$1 and$x[rand@x]/ge;print;}}

2

Python 2、139バイト

入力文字列を引用符で囲むために2バイトを追加しました。これらが必要でない場合はお知らせください。

ここで試してみてください

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)]);}}

中括弧内の文字列を検索{}し、パイプ文字で分割して作成された文字列の配列からランダムな要素に置き換えます。(5文を印刷する必要があることに少し遅すぎることに気づきました:P)


1

バッシュ: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と中括弧の代わりに、dodone
デニス

ありがとう、デニス。再び。(悲しいことに、これらのトリックを忘れるのは初めてではありません。)に関してprintf、何かを誤解しない限り、「%」を含む入力文字列では失敗します。
マナトワーク

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))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.