A Spintax {Task | Problem | Question}

19

Artikel Berputar dengan Spintax

Pemintalan artikel adalah teknik optimisasi mesin pencari yang digunakan pengoptimal mesin pencari untuk memposting versi unik dari konten yang relevan di direktori artikel, situs web 2.0, atau sumber lain untuk tautan balik.

Kadang-kadang digunakan oleh penulis situs web di situs mereka sendiri tetapi biasanya dihindari karena kualitas konten pintal akan lebih rendah daripada konten tulisan tangan. Pemintalan bekerja dengan menulis ulang artikel yang ada, atau bagian dari artikel, dan mengganti kata, frasa, kalimat, atau bahkan seluruh paragraf tertentu dengan sejumlah versi alternatif untuk memberikan variasi yang sedikit berbeda dengan setiap putaran.

Proses ini dapat sepenuhnya otomatis atau ditulis ulang secara manual. Pekerjaan Anda hari ini adalah membuat program atau fungsi yang menginterpretasikan string yang berisi Spintax , sintaks yang digunakan program untuk membaca berbagai opsi yang tersedia. Di bawah ini adalah contoh string yang menggunakan Spintax:

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

Seperti yang Anda lihat, bagian-bagian dari string yang akan 'berputar' diapit oleh kurung kurawal, di mana opsi individual dipisahkan oleh |karakter. Berikut adalah beberapa contoh kalimat yang bisa dihasilkan.

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!

Pekerjaan Anda

Misi Anda, jika Anda memilih untuk menerimanya, adalah membuat program atau fungsi yang mengambil string input yang mungkin atau mungkin tidak mengandung Spintax , lalu mencetak 5 versi string, memilih secara acak salah satu pilihan dari setiap blok opsi. Anda dapat membuat beberapa asumsi:

  1. Anda tidak perlu menangani Spintax bersarang ( {This|is {an|one}|example}).
  2. The |, {dan }karakter tidak akan muncul di tempat lain selain di dalam blok Spintax.
  3. Anda tidak perlu memeriksa apakah 5 kalimat keluaran berbeda, selama kode memilih opsi menggunakan fungsi angka acak bahasa Anda.
  4. Anda dapat menganggap input berakhir dengan baris baru.

Aturan

  1. Tidak ada celah standar.

Tes

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#

Tes keempat dapat ditemukan di sini.


Ini adalah , jumlah byte yang paling sedikit menang.

Kade
sumber
2
Sekarang, dengan sedikit perubahan ... lib gila!
Geobits,
Jenis karakter apa yang dapat kita harapkan dalam input?
Sp3000
@ Sp3000 Semuanya dari ASCII 32-127. Satu-satunya tempat di mana {, |, }akan ditemukan dalam string input mana ada Spintax.
Kade

Jawaban:

8

Pyth, 18

V5sOMcR\|scR\{cz\}

Cobalah online di sini

Penjelasan:

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
FryAmTheEggman
sumber
1
Ya Tuhan, itu cepat!
Kade
7

Ruby, 46

Dengan bendera baris perintah -p, jalankan

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

Baca dalam string dengan baris baru. Menggabungkannya sendiri 5 kali, memutasikannya di tempat, dan output hasilnya. /{(.+?)}/adalah ekspresi reguler dengan kuantifier malas: tanpa ?, itu akan cocok dengan yang paling kiri {ke yang paling tepat }bukan yang terdekat. $1adalah variabel ajaib yang merujuk ke grup tangkapan pertama di setiap pertandingan, sedangkan ?|literal mengacu pada |karakter. sampleadalah metode array yang mengembalikan elemen acak.

histokrat
sumber
6

CJam, 25 22 19 18 byte

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

Kode ini membutuhkan input untuk memuat baris baru.

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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#

Dalam setiap iterasi, dua potongan (satu konstanta, satu variabel) ditinggalkan di tumpukan dan akan dicetak ketika program keluar.

Dennis
sumber
6

Python 3, 110 byte

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

Regex membelah, seperti yang lainnya.

Python 3, 121 116 114 byte

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

Yang ini melakukan penggantian yang sesuai kemudian mengevaluasinya. Jika bukan karena melarikan diri dari garis miring terbalik dan tanda kutip, ini akan menjadi lebih pendek.

Sebagai contoh, misalkan kita memiliki Spintax

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

Yang .translatemelakukan beberapa konversi untuk memberikan:

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

Perl, 50

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

49karakter +1untuk -p.

Ini bekerja dengan pengaturan pertama $_ke 5 kalimat. Kemudian ia melakukan pencarian dan penggantian global, tempat kami mencari setiap { | | }grup. Itu membagi grup |, dan mengambil elemen acak untuk penggantian.

Jalankan dengan:

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'
hmatt1
sumber
$_ x=5menghemat beberapa byte.
Dennis
4

Burung unta v0.7.0 , 27 karakter

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

Penjelasan:

{...}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

(catatan: rilis 0.7.0 dibuat setelah pertanyaan ini diposting, tetapi jawabannya masih valid karena semua komitmen yang membentuk rilis itu semua didorong sebelum pertanyaan ini diposting.)

Gagang pintu
sumber
4

Pip, 25 22 20 byte

Terlambat ke pesta, tapi ini milikku. Mengambil input sebagai argumen baris perintah, yang mungkin perlu dikutip.

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

Penjelasan:

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 byte (tetapi bukan pengiriman yang valid)

L5PRC_Ma^`}|{`^'|

Membutuhkan Pip versi terbaru, diperbarui setelah pertanyaan ini diposting. Operator RC (pilihan acak) telah direncanakan untuk beberapa waktu, tetapi saya tidak pernah sempat mengimplementasikannya sampai sekarang. : ^ (

Pelajari lebih lanjut tentang Pip

DLosc
sumber
1
Serius? Anda menulis bahasa Anda sendiri untuk memenangkan kontes golf?
Chloe
3
@ Chloe: CJam , GS2 , Ostrich , pyg , Pyth , Retina dan rs adalah bahasa golf yang diciptakan oleh pengguna situs ini.
Dennis
3

JavaScript ES6, 86 84 byte

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

Ini mengharapkan input memiliki baris baru. Dimulai dengan mengulangi input 5 kali, dan kemudian mengganti setiap string Spintax dengan kata acak darinya, yang diperoleh dengan memisahkan |karakter dan kemudian memilih angka acak antara 0 dan panjang array yang dihasilkan dikurangi 1. Dalam hal ini kasus, |0hanyalah cara yang lebih singkat untuk dilakukan Math.floor. Terima kasih kepada vihan1086 untuk mengingatkan saya tentang string templat yang ditandai.

Cuplikan Stack di bawah ini berisi kode yang tidak mudah diserang dan mudah diuji.

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>

NinjaBearMonkey
sumber
|0sama dengan Math.floortidak Math.round. Meskipun itu yang Anda inginkan Math.roundakan memberikan distribusi yang tidak merata.
George Reith
@ GeorgeReith Anda benar, saya bermaksud meletakkan lantai tetapi secara tidak sengaja meletakkannya. Terima kasih
NinjaBearMonkey
2

Perl, 82 byte

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

Python 2, 139 byte

Menambahkan dua byte untuk kutipan di sekitar string input. Jika ini tidak diperlukan, beri tahu saya.

Coba di sini

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
mbomb007
sumber
1

Java, 243 215 242 234 byte

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

Menemukan string dalam kurung {}dan menggantinya dengan elemen acak dari array string yang dibuat dengan memisahkan oleh karakter pipa. (Saya menyadari sedikit terlambat bahwa lima kalimat harus dicetak: P)

TNT
sumber
1

Bash: 144 138 karakter

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

Contoh dijalankan:

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!
manatwork
sumber
1
Anda dapat menyimpan beberapa byte dengan menggunakan w()(...)bukan w(){...}(memungkinkan untuk menghilangkan spasi putih), printfbukan echo -ndan kurung keriting bukan dodan done.
Dennis
Terima kasih, @Dennis. Lagi. (Sedih bukan pertama kali saya melupakan trik ini.) Mengenai printf, itu akan gagal pada input string yang mengandung "%", kecuali saya salah paham sesuatu.
manatwork
1

Javascript, 143 142 byte

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"))
SuperJedi224
sumber
1

Python 3, 97 byte

Menggunakan fungsi lambda dalam substitusi regex. Ini agak mirip dengan bagaimana saya melakukannya di modul Spintax saya https://github.com/AceLewis/spintax namun tidak berurusan dengan Spintax bersarang atau melarikan diri dari karakter.

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

Jika Anda tidak menganggap input berakhir dengan baris baru maka akan menjadi 104 byte.

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