Spintax {작업 | 문제 | 질문}


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
자, 약간의 변화로 ... 미친 라이브러리!
Geobits 2016 년

입력에서 어떤 유형의 문자를 기대할 수 있습니까?
Sp3000

@ Sp3000 ASCII 32-127의 모든 것. 유일한 장소 {, |, }Spintax이 곳에 입력 문자열에서 찾을 수 예정이다.
Kade

답변:


8

피스, 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

파이썬 3, 110 바이트

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

다른 것과 마찬가지로 정규식 분할.

파이썬 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

펄, 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

핍, 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 , Ostrich , pyg , Pyth , Retinars모두이 사이트의 사용자가 발명 한 골프 언어입니다.
데니스

3

자바 스크립트 ES6, 86 84 바이트

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

이것은 입력에 후행 줄 바꿈이있을 것으로 예상합니다. 입력을 5 번 반복 한 다음 각 Spintax 문자열을 임의의 단어로 바꾸고 시작합니다.이 단어는 |문자 를 분리 한 다음 0과 결과 배열의 길이에서 1을 뺀 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>


|0Math.floornot 과 같습니다 Math.round. 그것이 Math.round고르지 않은 분포를 제공하기 를 원하는 것입니다.
George Reith 2016 년

@GeorgeReith 당신 말이 맞아요, 난 바닥을 씌우려고했지만 실수로 둥글게 했어요. 감사합니다
NinjaBearMonkey

2

펄, 82 바이트

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

2

파이썬 2, 139 바이트

입력 문자열 주위에 따옴표로 2 바이트를 추가했습니다. 이것이 필요하지 않은 경우 알려주십시오.

여기 사용해보십시오

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

자바 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

강타 : (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대신의 중괄호 dodone.
Dennis

감사합니다, @Dennis. 다시. (이 트릭을 잊어 버린 것은 처음이 아닙니다.)와 관련하여 printf, "%"를 포함하는 입력 문자열에서는 무언가를 잘못 이해하지 않으면 실패합니다.
manatwork 2016 년

1

자바 스크립트, 143142 바이트

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

파이썬 3, 97 바이트

정규식 대체에서 람다 함수 사용. 이것은 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.