Inyectar Rickrolls textuales

13

Debido a que el rickrolling es el mejor meme en la Tierra, usted [conoce las reglas y yo también] debe escribir el código más corto que pueda rickroll textualmente al lector desprevenido. Deje que [abajo] haya un texto de entrada que contenga letras, signos de puntuación y espacios. Cada vez que aparece una frase [mentir y lastimarte] de las dos primeras estrofas en el texto ...

We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

... inserte el resto de la línea entre paréntesis después.

Entrada

La entrada es una cadena de línea única que contiene solo ASCII imprimible con nueva línea final opcional.

Salida

La salida es una cadena de una sola línea. Cada vez que un grupo de palabras (definido como la cadena de entrada dividida en espacios) coincida con un grupo de palabras en las líneas de las letras de arriba, inserte las palabras restantes de la línea en la cadena, agrupadas entre corchetes.

Descripción adicional:

Este es el código de golf , gana menos bytes. Puede escribir un programa o función.

  • la correspondencia debe ser insensible a mayúsculas y minúsculas: we'rese convierte a we're [no strangers to love]pesar de que We'reestá en mayúscula en las letras
  • el emparejamiento debe ser codicioso. Does he know the answer?debe convertirse en Does he know the [rules and so do I] answer?lugar deDoes he know [the rules and so do I] the [rules and so do I] answer?
  • Si una palabra aparece más de una vez en la letra proporcionada, elija cualquiera de las apariciones para completar la línea.
  • Si una palabra es la última palabra en la línea de la letra, no inserte nada después.
  • La puntuación se incluye como parte de una "palabra". I'mes una sola palabra y no puede coincidir con I. Del mismo modo, you.no coincide con ninguna letra debido al período.

Algunas palabras como Iaparecen varias veces a lo largo de la letra, así como al final de una línea. Dado que la regla es que se puede usar cualquier ocurrencia en las letras anteriores, y una de esas ocurrencias está al final de una línea, no Ies necesario que coincida . La otra opción para Ies [just wanna tell you how I'm feeling].

Si se superponen dos coincidencias, puede elegir cualquiera de las dos. Esto significa que how I'm thinkingpodría convertirse en how I'm [feeling] thinking [of]OR how [I'm feeling] I'm thinking [of]ya que I'mpodría ser parte de cualquiera how I'mo I'm thinking. Sin embargo, si el texto de entrada era simple I'm thinking, entonces la salida debería ser I'm thinking [of].

Casos de prueba adicionales:

I don't know what I'm doing with my life.
is converted to
I [just wanna tell you how I'm feeling] don't know [the rules and so do I] what I'm [thinking of] doing with my life.
Many additional solutions are possible, since words like `I` appear multiple times.


Will someone please save me from these memes?
is converted to
Will someone please save me from [any other guy] these memes?


Two strangers walked into a bar.  One said "hello."  The other said "goodbye."
is converted to
Two strangers [to love] walked into a [lie and hurt you] bar.  One said "hello."  The [rules and so do I] other [guy] said "goodbye."

Desafío inspirado en este tipo .

PhiNotPi
fuente
11
ಠ_ಠ
Alex A.
El segundo caso de prueba parece estar equivocado ( fromdebería llegar a ser from [any other guy]).
Pomo de la puerta

Respuestas:

6

gawk, 316 + 377 = 693

El primer parámetro de línea de comando es el nombre de archivo de la letra (375 bytes + 2 para invocación = 377). Rickrolls todos los demás archivos. Imprime a stdout.

BEGIN{FPAT="[^ ]+ *";OFS=""}func d(a){b=tolower(a);sub(/ *$/,"",b);return b}FNR==NR{for(s=$0;NF;$0=s=$0){for(i=1;i<NF;i++){k=k $i;$i="";v[d(k)]="["$0"] "}$0=s;k=$1=""}next}{for(s=$0;NF;$0=s=$0){for(j=NF;(--j)>0&&!(d($0) in v);$(j+1)="");k=v[d($0)];if($0!~/ $/)k=" "k;printf($0 k);for($0=s;j-->=0;$(j+2)="");}print""}

Sin golf

BEGIN{FPAT="[^ ]+ *";OFS=""}
func d(a){b=tolower(a);sub(/ *$/,"",b);return b}
FNR==NR{
  for(s=$0;NF;$0=s=$0){
    for(i=1;i<NF;i++)
    {
      k=k $i;
      $i="";
      v[d(k)]="["$0"] "
    }
    $0=s;
    k=$1=""
  }
  next
}
{
  for(s=$0;NF;$0=s=$0){
    for(j=NF;(--j)>0&&!(d($0) in v);$(j+1)="");
    k=v[d($0)];
    if($0!~/ $/)k=" "k;
    printf($0 k);
    for($0=s;j-->=0;$(j+2)="");
  }
  print""
}

Resultados de la prueba

Entrada:

we're
We're
Does he know the answer?
I
how I'm thinking
I'm thinking
I don't know what I'm doing with my life.
Will someone please save me from these memes?
Two strangers walked into a bar.  One said "hello."  The other said "goodbye."
gonna run

Salida:

we're [no strangers to love] 
We're [no strangers to love] 
Does he know the [rules and so do I] answer? 
I [just wanna tell you how I'm feeling] 
how I'm [feeling] thinking [of] 
I'm thinking [of] 
I [just wanna tell you how I'm feeling] don't know [the rules and so do I] what I'm [thinking of] doing with my life. 
Will someone please save me from [any other guy] these memes? 
Two strangers [to love] walked into a [lie and hurt you] bar.  One said "hello."  The [rules and so do I] other [guy] said "goodbye." 
gonna run [around and desert you] 
Rainer P.
fuente
1. Esto falla el primer caso de prueba (pone las cosas entre whaty I'm, que es una coincidencia "no codiciosa"). 2. Esto falla el tercer caso de prueba (convierte los dos espacios en uno). 3. Si almacena la letra en un archivo separado, debe contar ese archivo (así como también +2 para incluirlo en el awkcomando) en su conteo de bytes.
Pomo de la puerta
@Doorknob Gracias. La codicia es fija. El archivo de letras no se agrega a mi recuento de caracteres, ya que no se modificó y estuvo disponible públicamente antes de que comenzara el desafío. Tampoco cuento awkel código fuente.
Rainer P.
Ahora esto falla para la entrada gonna run(salida esperada gonna run [around and desert you], salida real gonna [tell a lie and hurt you] run [around and desert you]). También todavía muerde múltiples espacios en una fila. Debe contar el archivo de letras en el recuento de bytes, ya que es una invocación no estándar del awkprograma.
Pomo de la puerta
@Doorknob Ok. Reimplementé la mayor parte del programa y necesito gawkahora la separación del campo para preservar el espacio. Pasa todos los casos de prueba ahora.
Rainer P.
Impresionante. Fue muy difícil cubrir todos los casos extremos en este desafío.
Pomo de la puerta