Un Spintax {Tarea | Problema | Pregunta}

19

Artículo girando con Spintax

La rotación de artículos es una técnica de optimización de motores de búsqueda mediante la cual los optimizadores de motores de búsqueda publican una versión única de contenido relevante en directorios de artículos, sitios web 2.0 u otras fuentes de backlinks.

Los autores del sitio web lo utilizan ocasionalmente en sus propios sitios, pero generalmente se evita porque la calidad del contenido hilado será inferior a la del contenido escrito a mano. Spinning funciona reescribiendo artículos existentes, o partes de artículos, y reemplazando palabras, frases, oraciones o incluso párrafos enteros específicos con cualquier número de versiones alternativas para proporcionar una variación ligeramente diferente con cada giro.

Este proceso puede ser completamente automatizado o reescrito manualmente. Su trabajo hoy será crear un programa o función que interprete una cadena que contenga Spintax , la sintaxis mediante la cual un programa leería las diferentes opciones disponibles. A continuación se muestra una cadena de ejemplo que usa Spintax:

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

Como puede ver, las secciones de la cadena que se deben 'girar' están encerradas entre llaves, donde el |carácter divide las opciones individuales . Aquí hay algunas oraciones de ejemplo que esto podría producir.

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!

Tu trabajo

Su misión, si elige aceptarla, es crear un programa o función que tome una cadena de entrada que pueda contener o no Spintax , luego imprima 5 versiones de la cadena, seleccionando al azar una de las opciones de cada bloque de opciones. Puedes hacer algunas suposiciones:

  1. No necesitará manejar Spintax anidado ( {This|is {an|one}|example}).
  2. Las |, {y los }caracteres no se producen en ningún otro lugar que no sea dentro de un bloque Spintax.
  3. No necesita verificar si las 5 oraciones de salida son distintas, siempre que el código seleccione opciones utilizando la función de números aleatorios de su idioma.
  4. Puede suponer que la entrada termina con una nueva línea.

Reglas

  1. No hay lagunas estándar.

Pruebas

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#

Una cuarta prueba se puede encontrar aquí.


Este es el , por lo que gana la menor cantidad de bytes.

Kade
fuente
2
Ahora, con un ligero cambio ... ¡libs locas!
Geobits
¿Qué tipos de caracteres podemos esperar en la entrada?
Sp3000
@ Sp3000 Todo desde ASCII 32-127. El único lugar donde {, |, }se va a encontrar en la cadena de entrada es donde hay Spintax.
Kade

Respuestas:

8

Pyth, 18

V5sOMcR\|scR\{cz\}

Pruébalo en línea aquí

Explicación:

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
fuente
1
¡Dios mío, eso fue rápido!
Kade
7

Ruby, 46

Con el indicador de línea de comando -p, ejecute

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

Leer en una cadena con una nueva línea final. Concatenarlo consigo mismo 5 veces, mutarlo en su lugar y generar el resultado. /{(.+?)}/es una expresión regular con un cuantificador perezoso: sin el ?, coincidiría con el extremo izquierdo del extremo {derecho en }lugar del más cercano. $1es una variable mágica que se refiere al primer grupo de captura en cada partida, mientras que el ?|literal se refiere al |personaje. samplees un método de matriz que devuelve un elemento aleatorio.

histocrat
fuente
6

CJam, 25 22 19 18 bytes

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

Este código requiere que la entrada contenga una nueva línea final.

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

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#

En cada iteración, quedan dos fragmentos (uno constante, uno variable) en la pila y se imprimirán cuando el programa salga.

Dennis
fuente
6

Python 3, 110 bytes

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

Regex dividiéndose, como los demás.

Python 3, 121 116 114 bytes

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

Éste realiza los reemplazos apropiados y luego lo evalúa. Si no fuera por escapar de las barras diagonales inversas y los apóstrofes, esto habría resultado más corto.

Por ejemplo, supongamos que tenemos el Spintax

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

El .translaterealiza algunas conversiones para dar:

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

Perl, 50

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

49personajes +1para -p.

Funciona al establecer primero $_las 5 oraciones. Luego realiza una búsqueda y reemplazo global, donde buscamos cada { | | }grupo. Divide al grupo |y elige un elemento aleatorio para el reemplazo.

Corre con:

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
fuente
$_ x=5Guarda algunos bytes.
Dennis
4

Avestruz v0.7.0 , 27 caracteres

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

Explicación:

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

(nota: la versión 0.7.0 se realizó después de que se publicó esta pregunta, pero la respuesta sigue siendo válida ya que todas las confirmaciones que conformaron esa versión se enviaron antes de que se publicara esta pregunta).

Pomo de la puerta
fuente
4

Pip, 25 22 20 bytes

Tarde a la fiesta, pero aquí está la mía. Toma la entrada como un argumento de línea de comando, que puede necesitar ser citado.

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

Explicación:

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 (pero no un envío válido)

L5PRC_Ma^`}|{`^'|

Requiere la última versión de Pip, actualizada después de que se publicó esta pregunta. El operador RC (elección aleatoria) se planeó durante algún tiempo, pero nunca llegué a implementarlo hasta ahora. : ^ (

Aprenda más sobre Pip

DLosc
fuente
1
¿Seriamente? ¿Escribes tu propio idioma para ganar concursos de golf?
Chloe
3
@Chloe: CJam , GS2 , Avestruz , pyg , Pyth , Retina y rs son idiomas de golf inventados por los usuarios de este sitio.
Dennis
3

JavaScript ES6, 86 84 bytes

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

Esto espera que la entrada tenga una nueva línea final. Comienza repitiendo la entrada 5 veces, y luego reemplazando cada cadena Spintax con una palabra aleatoria, que se obtiene dividiendo los |caracteres y luego eligiendo un número aleatorio entre 0 y la longitud de la matriz resultante menos 1. En este caso, |0es solo una forma más corta de hacerlo Math.floor. Gracias a vihan1086 por recordarme las cadenas de plantillas etiquetadas.

El Fragmento de pila a continuación contiene código sencillo y fácilmente comprobable.

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>

NinjaOsoMono
fuente
|0es equivalente a Math.floorno Math.round. Aunque eso es lo que desea, ya Math.roundque proporcionaría una distribución desigual.
George Reith
@GeorgeReith Tienes razón, quise poner piso pero accidentalmente lo puse. Gracias
NinjaBearMonkey
2

Perl, 82 bytes

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

Python 2, 139 bytes

Se agregaron dos bytes para las comillas alrededor de la cadena de entrada. Si no son necesarios, hágamelo saber.

Pruébalo aquí

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

Encuentra cadenas dentro de llaves {}y las reemplaza con un elemento aleatorio de la matriz de cadenas creadas dividiéndolas por el carácter de la tubería. (Me di cuenta demasiado tarde que había que imprimir cinco oraciones: P)

TNT
fuente
1

Bash: 144 138 caracteres

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

Ejecución de muestra:

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!
hombre trabajando
fuente
1
Puede guardar algunos bytes utilizando en w()(...)lugar de w(){...}(permite eliminar espacios en blanco), en printflugar de echo -ny llaves en lugar de doy done.
Dennis
Gracias @ Dennis. De nuevo. (Lamentablemente, no es la primera vez que olvido estos trucos). Respecto a printfeso, fallaría en la cadena de entrada que contiene "%", a menos que haya entendido mal algo.
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
fuente
1

Python 3, 97 bytes

Usando una función lambda en la sustitución de expresiones regulares. Esto es algo similar a cómo lo hice en mi módulo Spintax https://github.com/AceLewis/spintax, sin embargo, no trata con Spintax anidado o escapar de los personajes.

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

Si no asume que la entrada termina con una nueva línea, será de 104 bytes.

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