Wstrzykiwanie tekstowych rickrolli

13

Ponieważ rickrollowanie jest największym memem na Ziemi, [znasz zasady i ja też] masz napisać najkrótszy kod, który tekstowo może przekierować niczego niepodejrzewającego czytelnika. Niech [was w dół] będzie tekst wejściowy zawierający litery, znaki interpunkcyjne i spacje. Za każdym razem, gdy w tekście pojawia się wyrażenie [kłam i skrzywdź cię] z pierwszych dwóch zwrotek ...

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

... wstaw resztę wiersza w nawiasach później.

Wejście

Dane wejściowe to łańcuch jednowierszowy zawierający tylko drukowalny ASCII z opcjonalnym końcowym znakiem nowej linii.

Wynik

Dane wyjściowe to ciąg jednowierszowy. Za każdym razem, gdy grupa słów (zdefiniowana jako ciąg wejściowy podzielony na spacje) pasuje do grupy słów w liniach powyższych tekstów, wstaw pozostałe słowa linii do łańcucha, zgrupowane w nawiasach kwadratowych.

Dodatkowy opis:

To jest golf golfowy , wygrywa najmniej bajtów. Możesz napisać program lub funkcję.

  • w dopasowaniu powinna być rozróżniana wielkość liter: we'rejest konwertowany na, we're [no strangers to love]mimo że We'rejest pisany wielkimi literami.
  • pasowanie powinno być zachłanne. Does he know the answer?należy przekonwertować na Does he know the [rules and so do I] answer?zamiastDoes he know [the rules and so do I] the [rules and so do I] answer?
  • Jeśli słowo pojawia się więcej niż jeden raz w podanych tekstach, wybierz jedno z wystąpień, aby uzupełnić wiersz.
  • Jeśli słowo jest ostatnim słowem w wierszu lirycznym, nie wstawiaj niczego po nim.
  • Interpunkcja jest częścią „słowa”. I'mjest pojedynczym słowem i nie może się z nim równać I. Podobnie you.nie pasuje do żadnego tekstu z powodu okresu.

Niektóre słowa Ipojawiają się wielokrotnie w całym tekście, a także na końcu wiersza. Ponieważ reguła jest taka, że ​​można użyć dowolnego wystąpienia w powyższych tekstach, a jedno z tych wystąpień znajduje się na końcu wiersza, dopasowanie nie Ijest konieczne. Inną opcją Ijest [just wanna tell you how I'm feeling].

Jeśli dwa mecze pokrywają się, możesz wybrać jedno z nich. Oznacza to, że how I'm thinkingmoże stać się how I'm [feeling] thinking [of]OR, how [I'm feeling] I'm thinking [of]ponieważ I'mmoże być częścią jednego how I'mlub I'm thinking. Jeśli jednak tekst wejściowy był po prostu I'm thinking, wynik powinien być I'm thinking [of].

Dodatkowe przypadki testowe:

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

Wyzwanie inspirowane tym kolesiem .

PhiNotPi
źródło
11
ಠ_ಠ
Alex A.
Drugi przypadek testowy wydaje się nieprawidłowy ( frompowinien się stać from [any other guy]).
Klamka

Odpowiedzi:

6

ziewać, 316 + 377 = 693

Pierwszym parametrem wiersza poleceń jest nazwa pliku tekstowego (375 bajtów + 2 dla wywołania = 377). Rickrolls wszystkie inne pliki. Drukuje do 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""}

Nie golfił

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

Wyniki testów

Wejście:

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

Wynik:

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.
źródło
1. Nie udaje się to w pierwszym przypadku testowym (stawia rzeczy pomiędzy whati I'm, co jest „niepochodne” dopasowaniem). 2. Nie udaje się to w trzecim przypadku testowym (zamienia dwie spacje w jedną). 3. Jeśli przechowujesz słowa w osobnym pliku, musisz policzyć ten plik (a także +2 za włączenie go do awkpolecenia) w swojej liczbie bajtów.
Klamka
@Doorknob Thanks. Chciwość jest naprawiona. Plik tekstów nie dodaje się do mojej liczby postaci, ponieważ jest niezmieniony i był publicznie dostępny przed rozpoczęciem wyzwania. Nie liczę też awkkodu źródłowego.
Rainer P.
Teraz to się nie udaje dla wejścia gonna run(oczekiwane wyjście gonna run [around and desert you], rzeczywiste wyjście gonna [tell a lie and hurt you] run [around and desert you]). Ciągle również ciągnie wiele spacji z rzędu. Musisz policzyć plik tekstów piosenek w liczbie bajtów, ponieważ jest to niestandardowe wywołanie awkprogramu.
Klamka
@Doorknob Ok. Ponownie wdrożyłem większość programu i wymagam gawkteraz separacji pól w celu zaoszczędzenia miejsca. Przechodzi teraz wszystkie przypadki testowe.
Rainer P.
Imponujący. W tym wyzwaniu bardzo trudno było objąć wszystkie przypadki krawędzi.
Klamka