Spintax {Zadanie | Problem | Pytanie}

19

Artykuł Spinning ze Spintax

Spinanie artykułów to technika optymalizacji pod kątem wyszukiwarek, dzięki której optymalizatorzy wyszukiwarek publikują unikalną wersję odpowiednich treści w katalogach artykułów, witrynach Web 2.0 lub innych źródłach linków zwrotnych.

Czasami są używane przez autorów stron na ich własnych stronach, ale zwykle unika się ich, ponieważ jakość wirowanych treści będzie niższa niż ręcznie napisanych. Przędzenie polega na przepisaniu istniejących artykułów lub części artykułów i zastąpieniu określonych słów, zwrotów, zdań, a nawet całych akapitów dowolną liczbą alternatywnych wersji, aby zapewnić nieco inną odmianę przy każdym obrocie.

Ten proces może być całkowicie zautomatyzowany lub przepisany ręcznie. Twoim zadaniem dzisiaj będzie stworzenie programu lub funkcji, która interpretuje ciąg znaków zawierający Spintax , składnię, za pomocą której program odczytuje różne dostępne opcje. Poniżej znajduje się przykładowy ciąg wykorzystujący Spintax:

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

Jak widać, sekcje ciągu, które mają być „wirowane”, są zamknięte w nawiasy klamrowe, w których poszczególne opcje są podzielone przez |znak. Oto kilka przykładowych zdań, które mogą się pojawić.

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!

Twoja praca

Twoim zadaniem, jeśli zdecydujesz się to zaakceptować, jest stworzenie programu lub funkcji, która pobierze ciąg wejściowy, który może zawierać Spintax , ale może go nie wydrukować , a następnie wydrukuje 5 wersji ciągu, losowo wybierając jedną z opcji z każdego bloku opcji. Możesz poczynić kilka założeń:

  1. Nie będziesz musiał obsługiwać zagnieżdżonej Spintax ( {This|is {an|one}|example}).
  2. Te |, {oraz }znaków nie wystąpią inne niż gdziekolwiek indziej w bloku Spintax.
  3. Nie musisz sprawdzać, czy 5 zdań wyjściowych jest odrębnych, o ile kod wybiera opcje za pomocą funkcji liczb losowych w Twoim języku.
  4. Możesz założyć, że dane wejściowe kończą się nową linią.

Zasady

  1. Brak standardowych luk.

Testy

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#

Czwarty test można znaleźć tutaj.


To jest , więc wygrywa najmniejsza liczba bajtów.

Kade
źródło
2
Teraz, z niewielką zmianą ... szalone liby!
Geobits
Jakiego rodzaju znaków możemy się spodziewać na wejściu?
Sp3000,
@ Sp3000 Wszystko z ASCII 32-127. Jedynym miejscem, gdzie {, |, }zostanie znaleziona w ciągu wejściowego jest tam, gdzie jest Spintax.
Kade,

Odpowiedzi:

8

Pyth, 18 lat

V5sOMcR\|scR\{cz\}

Wypróbuj online tutaj

Wyjaśnienie:

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
źródło
1
Mój Boże, to było szybkie!
Kade
7

Ruby, 46

Z flagą wiersza polecenia -puruchom

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

Przeczytaj ciąg z końcowym znakiem nowej linii. Połącz to z sobą 5 razy, zmutuj na miejscu i wyślij wynik. /{(.+?)}/jest wyrażeniem regularnym z leniwym kwantyfikatorem: bez ?tego pasowałby {do skrajnej lewej do skrajnej prawej }zamiast najbliższej. $1to magiczna zmienna odnosząca się do pierwszej grupy przechwytywania w każdym meczu, natomiast ?|literał odnosi się do |postaci. sampleto metoda tablicowa zwracająca losowy element.

histocrat
źródło
6

CJam, 25 22 19 18 bajtów

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

Ten kod wymaga, aby dane wejściowe zawierały znak nowej linii.

Wypróbuj online w interpretatorze CJam .

Jak to działa

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#

W każdej iteracji na stosie pozostają dwie porcje (jedna stała, jedna zmienna) i zostaną wydrukowane po wyjściu z programu.

Dennis
źródło
6

Python 3, 110 bajtów

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

Podział Regex, podobnie jak inne.

Python 3, 121 116 114 bajtów

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

Ten dokonuje odpowiednich zamian, a następnie ocenia. Gdyby nie ucieczka przed odwrotnymi ukośnikami i apostrofami, byłoby to krótsze.

Załóżmy na przykład, że mamy Spintax

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

Do .translatewykonuje kilka konwersje dać:

print('I '+choice(['like','hate'])+' '+choice(['Python','C'])+'.')
Sp3000
źródło
4

Perl, 50

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

49znaki +1dla -p.

Działa, ustawiając najpierw $_na 5 zdań. Następnie wykonuje globalne wyszukiwanie i zamienia, gdzie szukamy każdej { | | }grupy. Dzieli grupę |i wybiera losowy element do zamiany.

Biegnij z:

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
źródło
$_ x=5oszczędza kilka bajtów.
Dennis
4

Struś v0.7.0 , 27 znaków

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

Wyjaśnienie:

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

(uwaga: wydanie 0.7.0 zostało opublikowane po opublikowaniu tego pytania, ale odpowiedź jest nadal aktualna, ponieważ wszystkie zatwierdzenia składające się na to wydanie zostały wypchnięte przed opublikowaniem tego pytania).

Klamka
źródło
4

Pip, 25 22 20 bajtów

Późno na przyjęcie, ale tu jest moje. Pobiera dane wejściowe jako argument wiersza polecenia, który może wymagać cytowania.

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

Wyjaśnienie:

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 bajtów (ale nie jest to poprawne przesłanie)

L5PRC_Ma^`}|{`^'|

Wymaga najnowszej wersji Pipa, zaktualizowanej po opublikowaniu tego pytania. Operator RC (wybór losowy) był planowany przez jakiś czas, ale do tej pory nie wdrożyłem go do wdrożenia. : ^ (

Dowiedz się więcej o Pip

DLosc
źródło
1
Poważnie? Piszesz swój własny język, aby wygrywać zawody golfowe?
Chloe
3
@Chloe: CJam , GS2 , Ostrich , pyg , Pyth , Retina i rs są językami gry w golfa wymyślonymi przez użytkowników tej strony.
Dennis
3

JavaScript ES6, 86 84 bajtów

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

Oczekuje to, że dane wejściowe będą miały końcowy znak nowej linii. Zaczyna się od powtórzenia danych wejściowych 5 razy, a następnie zastąpienia każdego ciągu Spintax losowym słowem, które uzyskuje się przez podzielenie |znaków, a następnie wybranie losowej liczby między 0 a długością wynikowej tablicy minus 1. W tym przypadek |0jest tylko krótszym sposobem Math.floor. Dzięki vihan1086 za przypomnienie mi o oznaczonych ciągach szablonów.

Poniższy fragment stosu zawiera niepoznany i łatwy do przetestowania kod.

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
źródło
|0jest równoważne Math.floornie Math.round. Chociaż to jest to, co chcesz, ponieważ Math.roundzapewni nierówną dystrybucję.
George Reith,
@GeorgeReith Masz rację, chciałem położyć podłogę, ale przypadkowo się rozłożyłem. Dzięki
NinjaBearMonkey,
2

Perl, 82 bajty

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

Python 2, 139 bajtów

Dodano dwa bajty dla cytatów wokół ciągu wejściowego. Jeśli nie są potrzebne, daj mi znać.

Wypróbuj tutaj

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
źródło
1

Java, 243 215 242 234 bajty

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

Znajduje ciągi w nawiasach klamrowych {}i zastępuje je losowym elementem z szeregu ciągów utworzonych przez podział przez znak potoku. (Trochę za późno zdałem sobie sprawę, że trzeba wydrukować pięć zdań: P)

TNT
źródło
1

Bash: 144 138 znaków

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

Przykładowy przebieg:

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!
człowiek w pracy
źródło
1
Możesz zapisać kilka bajtów, używając w()(...)zamiast w(){...}(pozwala wyeliminować białe znaki), printfzamiast echo -nnawiasów klamrowych zamiast doi done.
Dennis
Dziękuję @Dennis. Jeszcze raz. (Niestety nie pierwszy raz zapominam o tych sztuczkach.) Jeśli chodzi o to printf, to nie udałoby się na wejściowym łańcuchu zawierającym „%”, chyba że coś źle zrozumiałem.
manatwork
1

JavaScript, 143 142 bajtów

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
źródło
1

Python 3, 97 bajtów

Używanie funkcji lambda w podstawianiu wyrażeń regularnych. Jest to trochę podobne do tego, jak to zrobiłem w moim module Spintax https://github.com/AceLewis/spintax, jednak nie dotyczy zagnieżdżonego Spintaxa ani ucieczki od znaków.

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

Jeśli nie zakładasz, że wejście kończy się znakiem nowej linii, to będzie to 104 bajty.

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