Введіть текстові Rickrolls


13

Оскільки рикклінг - це найбільший мем на Землі, ви [знаєте правила і так я] - ви повинні написати найкоротший код, який може текстурно прокрутити нічого не підозрілого читача. Нехай [ви вниз] є вхідний текст, який містить літери, розділові знаки та пробіли. Кожен раз, коли в тексті з’явиться фраза [брехати і нашкодити вам] з перших двох строф ...

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

Виклик, натхненний цим чуваком .


11
ಠ_ಠ
Alex A.

Схоже, другий тестовий випадок є неправильним ( fromповинен стати from [any other guy]).
Дверна ручка

Відповіді:


6

гаук, 316 + 377 = 693

Перший параметр командного рядка - це ім'я файлу пісні (375 байт + 2 для виклику = 377). Rickrolls всі інші файли. Друкує до 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""}

Безумовно

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тепер потребую розділення поля, що зберігає простір. Зараз проходить усі тестові справи.
Райнер П.

Вражає. Було дуже важко висвітлити всі крайні справи у цьому виклику.
Дверна ручка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.