Injizieren Sie Rickrolls in Textform

12

Weil Rickrolling das größte Mem der Welt ist, müssen Sie [die Regeln kennen und ich auch] den kürzesten Code schreiben, der den ahnungslosen Leser textuell rickrollieren kann. Lassen Sie [Sie unten] ein Eingabe Text sein , die Buchstaben, Satzzeichen und Leerzeichen enthält. Immer wenn eine Phrase aus den ersten beiden Strophen im Text erscheint ...

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

... setzen Sie danach den Rest der Zeile in eckige Klammern.

Eingang

Die Eingabe ist eine einzeilige Zeichenfolge, die nur druckbares ASCII mit optionalem Zeilenumbruch enthält.

Ausgabe

Die Ausgabe ist eine einzeilige Zeichenfolge. Jedes Mal, wenn eine Gruppe von Wörtern (definiert als die auf Leerzeichen aufgeteilte Eingabezeichenfolge) mit einer Gruppe von Wörtern in den Zeilen des obigen Textes übereinstimmt, fügen Sie die verbleibenden Wörter der Zeile in die Zeichenfolge ein, die in eckigen Klammern angegeben sind.

Zusätzliche Beschreibung:

Das ist Code-Golf , die wenigsten Bytes gewinnen. Sie können ein Programm oder eine Funktion schreiben .

  • Bei Übereinstimmungen sollte die Groß- und Kleinschreibung nicht beachtet werden: we'rewird konvertiert, we're [no strangers to love]obwohl We'rein den Texten Groß- und Kleinschreibung verwendet wird .
  • Matching sollte gierig sein. Does he know the answer?sollte konvertiert werden zu Does he know the [rules and so do I] answer?stattDoes he know [the rules and so do I] the [rules and so do I] answer?
  • Wenn ein Wort in den angegebenen Texten mehrmals vorkommt, wählen Sie eines der Vorkommen aus, um die Zeile zu vervollständigen.
  • Wenn ein Wort das letzte Wort in der Textzeile ist, fügen Sie nichts danach ein.
  • Interpunktion wird als Teil eines "Wortes" eingefügt. I'mist ein einzelnes Wort und kann nicht mit übereinstimmen I. In ähnlicher Weise you.passt es wegen der Periode nicht zu irgendeinem Text.

Einige Wörter wie Ierscheinen mehrmals im gesamten Text sowie am Ende einer Zeile. Da die Regel lautet, dass jedes Vorkommen in den obigen Texten verwendet werden kann und eines dieser Vorkommen am Ende einer Zeile steht, ist kein Abgleich von Ierforderlich. Die andere Option für Iist [just wanna tell you how I'm feeling].

Wenn sich zwei Übereinstimmungen überschneiden, können Sie eine auswählen. Dies bedeutet, dass how I'm thinkingdies zu how I'm [feeling] thinking [of]OR werden könnte, how [I'm feeling] I'm thinking [of]da das I'mTeil von entweder how I'moder sein könnte I'm thinking. Wenn jedoch der Eingabetext einfach war I'm thinking, dann sollte die Ausgabe sein I'm thinking [of].

Zusätzliche Testfälle:

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

Herausforderung von diesem Kerl inspiriert .

PhiNotPi
quelle
10
ಠ_ಠ
Alex A.
Zweiter Testfall scheint falsch zu sein ( fromsollte werden from [any other guy]).
Türklinke

Antworten:

5

Gawk, 316 + 377 = 693

Der erste Befehlszeilenparameter ist der Dateiname des Liedtextes (375 Byte + 2 für Aufruf = 377). Rickrolls alle anderen Dateien. Druckt nach 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""}

Ungolfed

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

Testergebnisse

Eingang:

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

Ausgabe:

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.
quelle
1. Dies scheitert am ersten Testfall (es setzt Dinge zwischen whatund I'm, was "nicht gierig" ist). 2. Damit ist der dritte Testfall nicht erfolgreich (die beiden Leerzeichen werden zu einem). 3. Wenn Sie den Text in einer separaten Datei speichern, müssen Sie diese Datei (sowie +2, um sie in den awkBefehl aufzunehmen) in Ihre Byteanzahl aufnehmen.
Türklinke
@Doorknob Danke. Die Gier ist behoben. Die Liedtextdatei wird nicht zu meiner Anzahl an Charakteren hinzugefügt, da sie unverändert ist und vor Beginn der Herausforderung öffentlich verfügbar war. Ich zähle auch nicht den awkQuellcode.
Rainer P.
Jetzt schlägt dies für die Eingabe gonna run(erwartete Ausgabe gonna run [around and desert you], tatsächliche Ausgabe gonna [tell a lie and hurt you] run [around and desert you]) fehl . Es werden auch immer noch mehrere Leerzeichen in einer Reihe verarbeitet. Sie müssen die Lyrics-Datei in Ihrer Byteanzahl zählen, da dies ein nicht standardmäßiger Aufruf des awkProgramms ist.
Türklinke
@Doorknob Ok. Ich habe den größten Teil des Programms neu implementiert und benötige gawkjetzt für die platzsparende Feldtrennung. Besteht jetzt alle Testfälle.
Rainer P.
Beeindruckend. Es war sehr schwierig, alle Randfälle dieser Herausforderung abzudecken.
Türklinke