Spintax {Görev | Sorun | Soru}


19

Makale Spintax ile Eğirme

Makale döndürme , arama motoru optimizasyonlarının makale dizinleri, web 2.0 siteleri veya geri bağlantılar için diğer kaynaklarda ilgili içeriğin benzersiz bir sürümünü yayınladığı bir arama motoru optimizasyon tekniğidir.

Web sitesi yazarları tarafından bazen kendi sitelerinde kullanılır, ancak eğrilen içeriğin kalitesi elle yazılmış içerikten daha düşük olacağından genellikle önlenir. Eğirme, mevcut makaleleri veya makalelerin bazı bölümlerini yeniden yazarak ve her bir döndürmede biraz farklı bir varyasyon sağlamak için belirli kelimeleri, ifadeleri, cümleleri veya hatta tüm paragrafları herhangi bir sayıda alternatif sürümle değiştirerek çalışır.

Bu işlem tamamen otomatik veya manuel olarak yeniden yazılabilir. Bugünkü işiniz , bir programın mevcut farklı seçenekleri okuyacağı sözdizimi olan Spintax içeren bir dizeyi yorumlayan bir program veya işlev oluşturmak olacaktır. Spintax kullanan bir örnek dize aşağıdadır:

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

Gördüğünüz gibi, dizginin 'döndürülecek' bölümleri, bireysel seçeneklerin |karakterle bölündüğü kıvırcık parantez içine alınır . İşte bunun üretebileceği bazı örnek cümleler.

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!

Senin işin

Göreviniz, kabul etmeyi seçerseniz, Spintax içerebilecek veya içermeyebilecek bir giriş dizesi alan bir program veya işlev oluşturmak , daha sonra her seçenek bloğundan seçimlerden birini rastgele seçerek dizenin 5 sürümünü yazdırmaktır . Birkaç varsayım yapabilirsiniz:

  1. İç içe Spintax ( {This|is {an|one}|example}) işlemek zorunda kalmayacaksınız .
  2. |, {Ve }karakterler başka bir yerde başka bir Spintax blok içinde daha gerçekleşmeyecek.
  3. Kod, dilinizin rasgele sayı işlevini kullanarak seçenekleri seçtiği sürece, 5 çıkış tümcesinin farklı olup olmadığını kontrol etmenize gerek yoktur.
  4. Girişin bir satırsonu ile biteceğini varsayabilirsiniz.

kurallar

  1. Standart boşluklar yok.

Testler

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#

Dördüncü bir test burada bulunabilir .


Bu , bu yüzden en az sayıda bayt kazanır.


2
Slightimdi, ufak bir deđiţiklikle ... deli ţifreler!
Geobits

Girişte ne tür karakterler bekleyebiliriz?
Sp3000

@ Sp3000 ASCII'den her şey 32-127. Tek yer {, |, }Spintax olduğu yerde giriş dizesi bulunabilir gidiyor olduğunu.
Kade

Yanıtlar:


8

Pyth, 18

V5sOMcR\|scR\{cz\}

Buradan çevrimiçi deneyin

Açıklama:

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
Tanrım, bu hızlıydı!
Kade

7

Yakut, 46

Komut satırı işaretiyle -pçalıştırın

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

Sondaki satırsonu olan bir dizede okuyun. Kendisine 5 kez bitiştirin, yerinde mutasyona uğrayın ve sonucu alın. /{(.+?)}/tembel nicelik belirtecine sahip düzenli bir ifadedir: olmadan, en yakın olan yerine ?en soldaki {ile en sağdakiyle eşleşir }. $1her maçtaki ilk yakalama grubuna atıfta bulunan sihirli bir değişkendir, ?|değişmez |karakter ise karakteri ifade eder . samplerastgele bir öğe döndüren bir dizi yöntemidir.


6

CJam, 25 22 19 18 bayt

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

Bu kod, girişin sondaki bir yeni satır içermesini gerektirir.

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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#

Her yinelemede, yığın üzerinde iki parça (bir sabit, bir değişken) kalır ve program çıktığında yazdırılır.


6

Python 3, 110 bayt

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

Regex bölme, diğerleri gibi.

Piton 3, 121 116 114 bayt

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

Bu uygun değişiklikleri yapar ve değerlendirir. Ters eğik çizgiler ve kesme işaretlerinden kaçmak olmasaydı, bu daha kısa olurdu.

Örneğin, Spintax'ımız olduğunu varsayalım

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

.translateGerçekleştirdiği vermek için birkaç dönüşüm:

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

4

Perl, 50

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

49karakterler +1için -p.

İlk $_olarak 5 cümleyi ayarlayarak çalışır . Sonra her { | | }grup için arama yaptığımız global bir arama ve değiştirme yapar . Grubu ayırır |ve değiştirme için rastgele bir öğe seçer.

Şununla çalıştır:

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=5birkaç bayt kaydeder.
Dennis

4

Devekuşu v0.7.0 , 27 karakter

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

Açıklama:

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

(not: 0.7.0 sürümü, bu soru gönderildikten sonra yapıldı, ancak bu sürümü oluşturan tüm taahhütler, bu sorular gönderilmeden önce itildiği için cevap hala geçerlidir.)


4

Pip, 25 22 20 bayt

Partiye geç, ama işte benim. Girdiyi alıntılanması gerekebilecek bir komut satırı argümanı olarak alır.

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

Açıklama:

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 bayt (ancak geçerli bir gönderim değil)

L5PRC_Ma^`}|{`^'|

Bu soru gönderildikten sonra güncellenen Pip'in en son sürümünü gerektirir. RC (rastgele seçim) operatörü bir süre planlanmıştı, ancak şimdiye kadar onu uygulamak için hiç uğraşmadım. : ^ (

Pip hakkında daha fazla bilgi edinin


1
Ciddi anlamda? Golf yarışmaları kazanmak için kendi dilinizi mi yazıyorsunuz?
Chloe

3
@Chloe: CJam , GS2 , Devekuşu , pyg , Pyth , Retina ve rs bu sitenin kullanıcıları tarafından icat edilen golf dilleridir.
Dennis

3

JavaScript ES6, 86 84 bayt

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

Bu, girdinin sonunda bir satırsonu olmasını bekler. Giriş 5 kez tekrarlanarak ve ardından her bir Spintax dizesini rastgele bir sözcükle değiştirerek başlar, bu |karakterleri bölerek ve sonra 0 ile sonuçta oluşan eksi 1 uzunluğu arasında rastgele bir sayı seçerek elde edilir. durumda, |0sadece daha kısa bir yoludur Math.floor. Etiketli şablon dizelerini hatırlattığı için vihan1086'ya teşekkürler.

Aşağıdaki Yığın Parçacığı, golf edilmemiş ve kolayca test edilebilir kod içerir.

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>


|0eşit Math.floordeğildir Math.round. İstediğiniz gibi olmasına rağmen Math.roundeşit olmayan dağıtım sağlayacaktır.
George Reith

@GeorgeReith Haklısın, zemin koymak istedim ama yanlışlıkla yuvarlaklaştırmak istedim. Teşekkürler
NinjaBearMonkey

2

Perl, 82 bayt

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

2

Python 2, 139 bayt

Giriş dizesi etrafındaki tırnak işaretleri için iki bayt eklendi. Bunlar gerekli değilse bana bildirin.

Burada deneyin

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 bayt

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

Diş telleri içindeki dizeleri bulur {}ve bunları boru karakterine bölerek oluşturulan dizelerden rastgele bir öğe ile değiştirir. (Beş cümlenin basılacağını biraz geç farkettim: P)


1

Bash: 144134 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

Örnek çalışma:

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
Sen kullanarak birkaç byte kaydedebilirsiniz w()(...)yerine w(){...}, (boşluk ortadan kaldırmak için izin verir) printfyerine echo -nve yerine kıvırcık parantez dove done.
Dennis

Teşekkürler, @Dennis. Tekrar. (Ne yazık ki bu hileleri ilk kez unutmuyorum.) printfBir şey yanlış anlamadığım sürece, “%” içeren girdi dizgisinde başarısız olur.
manatwork

1

Javascript, 143143 bayt

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 bayt

Normal rejenerasyonda lambda fonksiyonunun kullanılması. Bu, Spintax modülümde https://github.com/AceLewis/spintax'ta yaptığımla biraz benzer, ancak iç içe Spintax veya karakterlerden kaçmakla ilgilenmez.

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

Girişin yeni bir satırla biteceğini varsaymazsanız 104 bayt olur.

import re,random
print(re.sub("{(.*?)}",lambda x:random.choice(x.group(1).split('|')),(input()+'\n')*5))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.