Eine Spintax {Aufgabe | Problem | Frage}

19

Artikel Spinnen mit Spintax

Article Spinning ist eine Suchmaschinenoptimierungstechnik, mit der Suchmaschinenoptimierer eine eindeutige Version des relevanten Inhalts in Artikelverzeichnissen, Web 2.0-Sites oder anderen Quellen für Backlinks veröffentlichen.

Es wird gelegentlich von Website-Autoren auf ihren eigenen Websites verwendet, jedoch in der Regel vermieden, da die Qualität von gesponnenen Inhalten geringer ist als von Hand geschriebene Inhalte. Beim Drehen werden vorhandene Artikel oder Teile von Artikeln umgeschrieben und bestimmte Wörter, Ausdrücke, Sätze oder sogar ganze Absätze durch eine beliebige Anzahl alternativer Versionen ersetzt, um bei jeder Drehung eine geringfügig andere Variation bereitzustellen.

Dieser Vorgang kann vollständig automatisiert oder manuell umgeschrieben werden. Ihre Aufgabe heute wird es sein, ein Programm oder eine Funktion zu erstellen, die eine Zeichenfolge interpretiert , die Spintax enthält , die Syntax, mit der ein Programm die verschiedenen verfügbaren Optionen liest. Unten ist eine Beispielzeichenfolge, die Spintax verwendet:

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

Wie Sie sehen, sind Abschnitte der Zeichenfolge, die 'gesponnen' werden sollen, in geschweiften Klammern eingeschlossen, wobei die einzelnen Optionen durch das |Zeichen getrennt werden. Hier sind einige Beispielsätze, die dies erzeugen könnte.

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!

Deine Arbeit

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu erstellen, die eine Eingabezeichenfolge verwendet, die Spintax enthalten kann oder nicht , und dann 5 Versionen der Zeichenfolge auszudrucken, wobei Sie zufällig eine der Optionen aus jedem Optionsblock auswählen. Sie können einige Annahmen treffen:

  1. Sie müssen nicht mit verschachteltem Spintax ( {This|is {an|one}|example}) umgehen .
  2. Die Zeichen |, {und }werden an keiner anderen Stelle als in einem Spintax-Block vorkommen.
  3. Sie müssen nicht überprüfen, ob die 5 Ausgabesätze unterschiedlich sind, solange der Code Optionen mithilfe der Zufallszahlenfunktion Ihrer Sprache auswählt.
  4. Sie können davon ausgehen, dass die Eingabe mit einem Zeilenumbruch endet.

Regeln

  1. Keine Standardlücken.

Tests

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#

Ein vierter Test ist hier zu finden .


Das ist , also gewinnt die geringste Anzahl von Bytes.

Kade
quelle
2
Nun, mit einer kleinen Veränderung ... verrückte Bibliotheken!
Geobits
Welche Arten von Zeichen können wir in der Eingabe erwarten?
Sp3000,
@ Sp3000 Alles von ASCII 32-127. Der einzige Ort {, an dem,, in der Eingabezeichenfolge zu finden ist |, }ist der Ort, an dem sich Spintax befindet.
Kade,

Antworten:

8

Pyth, 18

V5sOMcR\|scR\{cz\}

Probieren Sie es hier online aus

Erläuterung:

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
quelle
1
Mein Gott, das war schnell!
Kade,
7

Rubin, 46

-pFühren Sie mit Befehlszeilenflag aus

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

Lesen Sie eine Zeichenfolge mit einem nachgestellten Zeilenumbruch ein. Verketten Sie es fünfmal mit sich selbst, mutieren Sie es an der richtigen Stelle und geben Sie das Ergebnis aus. /{(.+?)}/ist ein regulärer Ausdruck mit einem faulen Quantifizierer: Ohne ?würde er vom linken {zum rechten }statt zum nächsten Quantifizierer passen . $1ist eine magische Variable, die sich auf die erste Erfassungsgruppe in jedem Match ?|bezieht , während sich das Literal auf den |Charakter bezieht . sampleist eine Array-Methode, die ein zufälliges Element zurückgibt.

Histokrat
quelle
6

CJam, 25 22 19 18 Bytes

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

Für diesen Code muss die Eingabe eine abschließende Newline enthalten.

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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#

In jeder Iteration verbleiben zwei Blöcke (eine Konstante, eine Variable) auf dem Stapel und werden gedruckt, wenn das Programm beendet wird.

Dennis
quelle
6

Python 3, 110 Bytes

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

Regex-Aufteilung, wie die anderen.

Python 3, 121 116 114 Bytes

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

Dieser führt die entsprechenden Ersetzungen durch und wertet sie dann aus. Ohne das Entgehen von Backslashes und Apostrophen wäre dies kürzer ausgefallen.

Angenommen, wir haben die Spintax

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

Das .translateführt ein paar Umbauten durch, um zu geben:

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

Perl, 50

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

49Zeichen +1für -p.

Es funktioniert, indem zuerst $_die 5 Sätze eingestellt werden. Dann wird ein globales Suchen und Ersetzen durchgeführt, bei dem nach jeder { | | }Gruppe gesucht wird . Es teilt die Gruppe auf |und wählt ein zufälliges Element für die Ersetzung aus.

Laufen mit:

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
quelle
$_ x=5spart ein paar Bytes.
Dennis
4

Strauß v0.7.0 , 27 Zeichen

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

Erläuterung:

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

(Hinweis: Die Version 0.7.0 wurde nach dem Veröffentlichen dieser Frage erstellt, die Antwort ist jedoch weiterhin gültig, da alle Commits, aus denen diese Version besteht, vor dem Veröffentlichen dieser Frage verschoben wurden.)

Türknauf
quelle
4

Pip, 25 22 20 Bytes

Spät zur Party, aber hier ist meins. Übernimmt Eingaben als Befehlszeilenargument, das möglicherweise in Anführungszeichen gesetzt werden muss.

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

Erläuterung:

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 Bytes (aber keine gültige Übermittlung)

L5PRC_Ma^`}|{`^'|

Erfordert die neueste Version von Pip, die nach dem Veröffentlichen dieser Frage aktualisiert wurde. Der RC-Operator (zufällige Auswahl) war für einige Zeit geplant, aber ich bin erst jetzt dazu gekommen, ihn umzusetzen. : ^ (

Erfahren Sie mehr über Pip

DLosc
quelle
1
Ernst? Sie schreiben Ihre eigene Sprache, um Golfwettbewerbe zu gewinnen?
Chloe
3
@Chloe: CJam , GS2 , Strauß , Pyg , Pyth , Retina und rs sind alle Golf - Sprachen , die von den Nutzern dieser Website erfunden.
Dennis
3

JavaScript ES6, 86 84 Bytes

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

Dies setzt voraus, dass die Eingabe eine nachgestellte Newline enthält. Es beginnt damit, die Eingabe fünfmal zu wiederholen und dann jede Spintax-Zeichenfolge durch ein zufälliges Wort zu ersetzen, das durch Aufteilen der |Zeichen und anschließende Auswahl einer Zufallszahl zwischen 0 und der Länge des resultierenden Arrays minus 1 erhalten wird Fall |0ist nur eine kürzere Art und Weise zu tun Math.floor. Vielen Dank an vihan1086, der mich an markierte Template-Strings erinnert hat.

Das folgende Stapel-Snippet enthält unbenutzten und leicht testbaren Code.

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
quelle
|0ist gleichbedeutend mit Math.floornicht Math.round. Dies ist jedoch genau das, was Sie möchten Math.round, um eine ungleichmäßige Verteilung zu erreichen.
George Reith
@GeorgeReith Du hast recht, ich wollte Boden legen, aber versehentlich herumlegen. Danke
NinjaBearMonkey
2

Perl, 82 Bytes

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

Python 2, 139 Bytes

Zwei Bytes für Anführungszeichen um die Eingabezeichenfolge hinzugefügt. Wenn diese nicht benötigt werden, lassen Sie es mich wissen.

Probieren Sie es hier aus

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
quelle
1

Java, 243 215 242 234 Bytes

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

Findet Zeichenfolgen in geschweiften Klammern {}und ersetzt sie durch ein zufälliges Element aus dem Array von Zeichenfolgen, die durch Aufteilen durch das Pipe-Zeichen erstellt wurden. (Mir war etwas zu spät klar, dass fünf Sätze gedruckt werden mussten: P)

TNT
quelle
1

Bash: 144 138 Zeichen

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

Probelauf:

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!
Mann bei der Arbeit
quelle
1
Sie können mit ein paar Bytes speichern w()(...)statt w(){...}(erlaubt Leerzeichen zu beseitigen), printfstatt echo -nund geschweiften Klammern statt dound done.
Dennis
Vielen Dank, @Dennis. Nochmal. (Leider ist es nicht das erste Mal, dass ich diese Tricks vergesse.) Diesbezüglich printfwürde dies bei Eingabezeichenfolgen mit "%" fehlschlagen, sofern ich nichts falsch verstanden habe.
Manatwork
1

Javascript, 143 142 Bytes

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
quelle
1

Python 3, 97 Bytes

Verwendung einer Lambda-Funktion bei der Regex-Substitution. Dies ähnelt der Vorgehensweise in meinem Spintax-Modul https://github.com/AceLewis/spintax, es wird jedoch nicht mit verschachtelter Spintax oder dem Entkommen von Zeichen gearbeitet.

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

Wenn Sie nicht annehmen, dass die Eingabe mit einem Zeilenumbruch endet, sind es 104 Byte.

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