Injecter des Rickroll textuels

13

Parce que le rickrolling est le plus grand mème sur Terre, vous [connaissez les règles et moi aussi] devez écrire le code le plus court qui puisse rickroller textuellement le lecteur sans méfiance. Laissez [vous descendre] un texte d'entrée contenant des lettres, des signes de ponctuation et des espaces. Chaque fois qu'une phrase [vous mentir et vous blesser] des deux premières strophes apparaît dans le texte ...

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

... insérez ensuite le reste de la ligne entre parenthèses.

Contribution

L'entrée est une chaîne d'une seule ligne contenant uniquement de l'ASCII imprimable avec une nouvelle ligne de fin facultative.

Production

La sortie est une chaîne à ligne unique. Chaque fois qu'un groupe de mots (défini comme la chaîne d'entrée divisée en espaces) correspond à un groupe de mots dans les lignes des paroles ci-dessus, insérez les mots restants de la ligne dans la chaîne, regroupés entre crochets.

Description supplémentaire:

C'est le code-golf , le moins d'octets gagne. Vous pouvez écrire un programme ou une fonction.

  • la correspondance doit être insensible à la casse: we'reest convertie en we're [no strangers to love]même si elle We'reest en majuscule dans les paroles.
  • l'appariement doit être gourmand. Does he know the answer?devrait être converti en au Does he know the [rules and so do I] answer?lieu deDoes he know [the rules and so do I] the [rules and so do I] answer?
  • Si un mot apparaît plus d'une fois dans les paroles fournies, choisissez l'une des occurrences pour terminer la ligne.
  • Si un mot est le dernier mot de la ligne de paroles, n'insérez rien après.
  • La ponctuation fait partie d'un «mot». I'mest un seul mot et ne peut pas correspondre avec I. De même, you.ne correspond à aucune chanson en raison de la période.

Certains mots comme Iapparaissent plusieurs fois dans les paroles ainsi qu'à la fin d'une ligne. Étant donné que la règle est que toute occurrence dans les paroles ci-dessus peut être utilisée et qu'une de ces occurrences se trouve à la fin d'une ligne, aucune correspondance de In'est nécessaire. L'autre option pour Iest [just wanna tell you how I'm feeling].

Si deux correspondances se chevauchent, vous pouvez en choisir une. Cela signifie que how I'm thinkingpourrait devenir how I'm [feeling] thinking [of]OU how [I'm feeling] I'm thinking [of]puisque le I'mpourrait faire partie de how I'mou I'm thinking. Si, cependant, le texte d'entrée était simplement I'm thinking, alors la sortie devrait l'être I'm thinking [of].

Cas de test supplémentaires:

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."

Défi inspiré par ce mec .

PhiNotPi
la source
11
ಠ_ಠ
Alex A.
Le deuxième cas de test semble être faux ( fromdevrait devenir from [any other guy]).
Poignée de porte

Réponses:

6

gawk, 316 + 377 = 693

Le premier paramètre de ligne de commande est le nom de fichier des paroles (375 octets + 2 pour l'invocation = 377). Rickrolls tous les autres fichiers. Imprime vers 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""}

Non 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""
}

Résultats de test

Contribution:

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

Production:

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.
la source
1. Cela échoue au premier cas de test (il met les choses entre whatet I'm, qui est une correspondance "non gourmande"). 2. Cela échoue au troisième cas de test (il transforme les deux espaces en un). 3. Si vous stockez les paroles dans un fichier séparé, vous devez compter ce fichier (ainsi que +2 pour l'inclure dans la awkcommande) dans votre nombre d'octets.
Poignée de porte
@ Doorknob Merci. La cupidité est fixe. Le fichier des paroles n'ajoute pas à mon nombre de personnages car il est inchangé et était accessible au public avant le début du défi. Je ne compte pas non plus awkle code source de.
Rainer P.
Maintenant, cela échoue pour l'entrée gonna run(sortie attendue, sortie gonna run [around and desert you]réelle gonna [tell a lie and hurt you] run [around and desert you]). Il réduit également plusieurs espaces d'affilée. Vous devez compter le fichier de paroles dans votre nombre d'octets, car il s'agit d'une invocation non standard du awkprogramme.
Poignée de porte
@ Doorknob Ok. J'ai réimplémenté la majeure partie du programme et demande gawkmaintenant une séparation des champs préservant l'espace. Passe tous les cas de test maintenant.
Rainer P.
Impressionnant. Il était très difficile de couvrir tous les cas marginaux dans ce défi.
Poignée de porte