Введите текстовые Rickrolls

13

Поскольку rickrolling является величайшим мемом на Земле, вы [знаете правила и я тоже] должны написать кратчайший код, который может текстуально прокручивать ничего не подозревающего читателя. Пусть [вас вниз] будет входной текст, который содержит буквы, знаки пунктуации и пробелы. Каждый раз, когда в тексте появляется фраза [обмани и обижай] из первых двух строф ...

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

... вставьте оставшуюся часть строки в скобки.

вход

Ввод - это строка из одной строки, содержащая только печатный ASCII с необязательным завершающим переводом строки.

Выход

Вывод - однострочная строка. Каждый раз, когда группа слов (определенная как входная строка, разделенная на пробелы) совпадает с группой слов в строках вышеприведенного текста, вставьте оставшиеся слова строки в строку, сгруппированные в квадратных скобках.

Дополнительное описание:

Это код-гольф , побеждает меньше байтов. Вы можете написать программу или функцию.

  • соответствие должно быть без учета регистра: we'reпреобразуется в, we're [no strangers to love]даже если We'reв тексте используется заглавная буква.
  • соответствие должно быть жадным. Does he know the answer?следует преобразовать Does he know the [rules and so do I] answer?вместоDoes he know [the rules and so do I] the [rules and so do I] answer?
  • Если слово присутствует в предоставленной лирике более одного раза, выберите любое из вхождений, чтобы завершить строку.
  • Если слово является последним словом в лирической строке, не вставляйте ничего после него.
  • Пунктуация включена как часть слова. I'mявляется одним словом и не может соответствовать I. Точно так же, you.не соответствует ни одной лирике из-за периода.

Некоторые слова, такие как Iпоявляются несколько раз в тексте, а также в конце строки. Так как правило состоит в том, что может использоваться любое вхождение в вышеупомянутой лирике, и одно из этих вхождений находится в конце строки, сопоставление Iне требуется. Другой вариант для Iэто [just wanna tell you how I'm feeling].

Если два совпадения перекрываются, вы можете выбрать один из них. Это означает , что how I'm thinkingможет стать how I'm [feeling] thinking [of]или how [I'm feeling] I'm thinking [of]с момента I'mможет быть частью либо how I'mили I'm thinking. Если, однако, входной текст был просто I'm thinking, то вывод должен быть I'm thinking [of].

Дополнительные тестовые случаи:

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

Задача, вдохновленная этим чуваком .

PhiNotPi
источник
11
ಠ_ಠ
Alex A.
Второй контрольный пример оказывается неправильным ( fromдолжен стать from [any other guy]).
Ручка двери

Ответы:

6

gawk, 316 + 377 = 693

Первый параметр командной строки - это имя файла песни (375 байт + 2 для вызова = 377). Рикроллирует все остальные файлы. Печать на 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""
}

Результаты теста

Входные данные:

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

Выход:

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] 
Райнер П.
источник
1. Это терпит неудачу в первом тестовом примере (он помещает вещи между whatи I'm, что является «не жадным» соответствием). 2. Это не проходит третий тестовый пример (он превращает два пробела в один). 3. Если вы храните текст песни в отдельном файле, вам нужно сосчитать этот файл (а также +2 для включения его в awkкоманду) в счетчике байтов.
Ручка двери
@ Doorknob Спасибо. Жадность исправлена. Файл лирики не добавляет к моему количеству персонажей, так как он не изменился и был общедоступным до начала испытания. Я не считаю awkисходный код тоже.
Райнер П.
Теперь это терпит неудачу для ввода gonna run(ожидаемый вывод gonna run [around and desert you], фактический вывод gonna [tell a lie and hurt you] run [around and desert you]). Это также все еще разбивает несколько пробелов подряд. Вам нужно посчитать файл лирики в вашем числе байтов, так как это нестандартный вызов awkпрограммы.
Ручка двери
@ Doorknob Хорошо. Я переопределил большую часть программы и gawkтеперь требую для сохранения места разделения поля. Сейчас проходит все тесты.
Райнер П.
Впечатляет. Было очень трудно охватить все крайние случаи в этом вызове.
Дверная ручка