Một Spintax {Nhiệm vụ | Vấn đề | Câu hỏi}


19

Điều quay với Spintax

Quay bài viết là một kỹ thuật tối ưu hóa công cụ tìm kiếm, theo đó các trình tối ưu hóa công cụ tìm kiếm đăng một phiên bản duy nhất của nội dung có liên quan trên các thư mục bài viết, trang web 2.0 hoặc các nguồn khác cho liên kết ngược.

Nó đôi khi được sử dụng bởi các tác giả trang web trên các trang web riêng của họ nhưng thường tránh vì chất lượng nội dung quay sẽ thấp hơn nội dung viết tay. Kéo sợi hoạt động bằng cách viết lại các bài viết hiện có hoặc các phần của bài viết và thay thế các từ, cụm từ, câu hoặc thậm chí toàn bộ đoạn văn cụ thể bằng bất kỳ số phiên bản thay thế nào để cung cấp một biến thể hơi khác nhau với mỗi lần quay.

Quá trình này có thể hoàn toàn tự động hoặc viết lại bằng tay. Công việc của bạn hôm nay sẽ là tạo ra một chương trình hoặc chức năng diễn giải một chuỗi chứa Spintax , cú pháp mà theo đó một chương trình sẽ đọc các tùy chọn khác nhau có sẵn. Dưới đây là một chuỗi ví dụ sử dụng Spintax:

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

Như bạn có thể thấy, các phần của chuỗi được 'quay' được đặt trong các dấu ngoặc nhọn, trong đó các tùy chọn riêng lẻ được phân chia theo |ký tự. Dưới đây là một số câu ví dụ này có thể tạo ra.

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!

Công việc của bạn

Nhiệm vụ của bạn, nếu bạn chọn chấp nhận nó, là tạo một chương trình hoặc hàm lấy chuỗi đầu vào có thể có hoặc không chứa Spintax , sau đó in 5 phiên bản của chuỗi, chọn ngẫu nhiên một trong các lựa chọn từ mỗi khối tùy chọn. Bạn có thể đưa ra một vài giả định:

  1. Bạn sẽ không cần phải xử lý Spintax ( {This|is {an|one}|example}) lồng nhau .
  2. Các |, {}ký tự sẽ không xảy ra bất cứ nơi nào khác ngoài trong một khối Spintax.
  3. Bạn không cần kiểm tra xem 5 câu đầu ra có khác biệt không, miễn là mã chọn các tùy chọn sử dụng hàm số ngẫu nhiên trong ngôn ngữ của bạn.
  4. Bạn có thể giả sử đầu vào kết thúc bằng một dòng mới.

Quy tắc

  1. Không có sơ hở tiêu chuẩn.

Xét nghiệm

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#

Một bài kiểm tra thứ tư có thể được tìm thấy ở đây.


Đây là , vì vậy số byte ít nhất sẽ thắng.


2
Bây giờ, với một thay đổi nhỏ ... libs điên!
Geobits

Những loại ký tự chúng ta có thể mong đợi trong đầu vào?
Sp3000

@ Sp3000 Mọi thứ từ ASCII 32-127. Nơi duy nhất {, |, }sẽ được tìm thấy trong chuỗi đầu vào là nơi có Spintax.
Kade

Câu trả lời:


8

Bình thường, 18

V5sOMcR\|scR\{cz\}

Dùng thử trực tuyến tại đây

Giải trình:

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
Chúa ơi, thật nhanh!
Kade

7

Ruby, 46

Với cờ dòng lệnh -p, chạy

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

Đọc trong một chuỗi với một dòng mới. Nối nó với chính nó 5 lần, thay đổi nó tại chỗ và đưa ra kết quả. /{(.+?)}/là một biểu thức chính quy với một bộ định lượng lười biếng: không có ?, nó sẽ khớp từ trái {sang phải ngoài cùng }thay vì biểu thức gần nhất. $1là một biến ma thuật đề cập đến nhóm bắt đầu tiên trong mỗi trận đấu, trong khi ?|nghĩa đen là nói đến |nhân vật. samplelà một phương thức mảng trả về một phần tử ngẫu nhiên.


6

CJam, 25 22 19 18 byte

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

Mã này yêu cầu đầu vào để chứa một dòng mới.

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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#

Trong mỗi lần lặp, hai khối (một hằng số, một biến) được để lại trên ngăn xếp và sẽ được in khi chương trình thoát.


6

Python 3, 110 byte

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

Regex chia tách, giống như những người khác.

Python 3, 121 116 114 byte

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

Điều này thực hiện các thay thế thích hợp sau đó đánh giá nó. Nếu nó không thoát khỏi dấu gạch chéo ngược và dấu nháy đơn, thì điều này sẽ trở nên ngắn hơn.

Ví dụ: giả sử chúng ta có Spintax

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

Việc .translatethực hiện một vài chuyển đổi để cung cấp:

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

4

Perl, 50

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

49nhân vật +1cho -p.

Nó hoạt động bằng cách thiết lập đầu tiên $_đến 5 câu. Sau đó, nó thực hiện tìm kiếm toàn cầu và thay thế, nơi chúng tôi tìm kiếm cho mỗi { | | }nhóm. Nó tách nhóm trên |và chọn một yếu tố ngẫu nhiên để thay thế.

Chạy với:

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=5tiết kiệm một vài byte.
Dennis

4

Đà điểu v0.7.0 , 27 ký tự

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

Giải trình:

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

(lưu ý: bản phát hành 0.7.0 đã được thực hiện sau khi câu hỏi này được đăng, nhưng câu trả lời vẫn còn hiệu lực vì tất cả các cam kết tạo nên bản phát hành đó đều được đẩy trước khi câu hỏi này được đăng.)


4

Pip, 25 22 20 byte

Đến bữa tiệc muộn, nhưng đây là của tôi. Đưa đầu vào dưới dạng đối số dòng lệnh, có thể cần được trích dẫn.

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

Giải trình:

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 (nhưng không phải là một đệ trình hợp lệ)

L5PRC_Ma^`}|{`^'|

Yêu cầu phiên bản mới nhất của Pip, được cập nhật sau khi câu hỏi này được đăng. Toán tử RC (lựa chọn ngẫu nhiên) đã được lên kế hoạch một thời gian, nhưng tôi chưa bao giờ thực hiện nó cho đến bây giờ. : ^ (

Tìm hiểu thêm về Pip


1
Nghiêm túc? Bạn viết ngôn ngữ của riêng bạn để giành chiến thắng trong các cuộc thi golf?
Chloe

3
@Chloe: CJam , GS2 , Ostrich , pyg , Pyth , Retinars là tất cả các ngôn ngữ chơi gôn được phát minh bởi người dùng của trang web này.
Dennis

3

JavaScript ES6, 86 84 byte

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

Điều này hy vọng đầu vào sẽ có một dòng mới. Nó bắt đầu bằng cách lặp lại đầu vào 5 lần, sau đó thay thế mỗi chuỗi Spintax bằng một từ ngẫu nhiên từ nó, thu được bằng cách tách các |ký tự và sau đó chọn một số ngẫu nhiên giữa 0 và độ dài của mảng kết quả trừ đi 1. Trong phần này trường hợp, |0chỉ là một cách làm ngắn hơn Math.floor. Cảm ơn vihan1086 đã nhắc nhở tôi về các chuỗi mẫu được gắn thẻ.

Đoạn mã dưới đây chứa mã không được mã hóa và dễ kiểm tra.

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>


|0tương đương với Math.floorkhông Math.round. Mặc dù đó là những gì bạn muốn vì Math.roundsẽ cung cấp phân phối không đồng đều.
George Reith

@GeorgeReith Bạn nói đúng, ý tôi là đặt sàn nhưng vô tình đặt vòng. Cảm ơn
NinjaBearMonkey

2

Perl, 82 byte

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

2

Python 2, 139 byte

Đã thêm hai byte cho dấu ngoặc kép xung quanh chuỗi đầu vào. Nếu những điều này là không cần thiết cho tôi biết.

Hãy thử nó ở đây

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

Tìm các chuỗi trong dấu ngoặc nhọn {}và thay thế chúng bằng một phần tử ngẫu nhiên từ mảng các chuỗi được tạo bằng cách tách bởi ký tự ống. (Tôi nhận ra một chút quá muộn rằng năm câu phải được in: P)


1

Bash: 144 138 ký tự

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

Chạy mẫu:

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
Bạn có thể lưu một vài byte bằng cách sử dụng w()(...)thay vì w(){...}(cho phép loại bỏ khoảng trắng), printfthay vì echo -nvà dấu ngoặc nhọn thay vì dodone.
Dennis

Cảm ơn bạn, @Dennis. Lần nữa. (Đáng buồn thay, đây không phải là lần đầu tiên tôi quên những thủ thuật này.) Về printfđiều đó, sẽ thất bại trong chuỗi đầu vào có chứa %%, trừ khi tôi hiểu nhầm điều gì đó.
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"))

1

Python 3, 97 byte

Sử dụng hàm lambda trong thay thế regex. Điều này hơi giống với cách tôi đã làm trong mô-đun Spintax của mình https://github.com/AceLewis/spintax tuy nhiên nó không xử lý Spintax lồng nhau hoặc thoát các ký tự.

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

Nếu bạn không cho rằng đầu vào kết thúc bằng một dòng mới thì nó sẽ là 104 byte.

import re,random
print(re.sub("{(.*?)}",lambda x:random.choice(x.group(1).split('|')),(input()+'\n')*5))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.