A Spintax {Task | ปัญหา | คำถาม}


19

บทความการปั่นด้วย Spintax

บทความการปั่นเป็นเครื่องมือเพิ่มประสิทธิภาพกลไกค้นหาโดยที่เครื่องมือค้นหาการเพิ่มประสิทธิภาพโพสต์รุ่นที่ไม่ซ้ำกันของเนื้อหาที่เกี่ยวข้องในไดเรกทอรีบทความเว็บไซต์ 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
ตอนนี้มีการเปลี่ยนแปลงเล็กน้อย ... libs บ้า!
Geobits

อักขระประเภทใดที่เราคาดหวังได้ในอินพุต
Sp3000

@ Sp3000 ทุกอย่างตั้งแต่ ASCII 32-127 สถานที่เดียวที่{, |, }เป็นไปได้ที่จะพบในสายป้อนเป็นที่ที่มี Spintax
Kade

คำตอบ:


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
พระเจ้าของฉันนั่นเร็วมาก!
Kade

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บันทึกไม่กี่ไบต์
Dennis

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

Pip, 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
อย่างจริงจัง? คุณเขียนภาษาของคุณเองเพื่อชนะการแข่งขันกอล์ฟหรือไม่?
Chloe

3
@Chloe: CJam , GS2 , นกกระจอกเทศ , PYG , Pyth , จอประสาทตาและอาร์เอสมีทุกภาษากอล์ฟคิดค้นโดยผู้ใช้ของเว็บไซต์นี้
Dennis

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จะให้การกระจายที่ไม่สม่ำเสมอ
George Reith

@ 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
Dennis

ขอบคุณ @Dennis อีกครั้ง (น่าเศร้าไม่ใช่ครั้งแรกที่ฉันลืมเทคนิคเหล่านี้) เกี่ยวกับ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 ไบต์

การใช้ฟังก์ชั่นแลมบ์ดาในการทดแทน regex นี่ค่อนข้างคล้ายกับที่ฉันทำในโมดูล 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.