Suntikkan Rickrolls Tekstual

13

Karena rickrolling adalah meme terhebat di Bumi, Anda [tahu aturannya dan saya juga] harus menulis kode terpendek yang secara tekstual dapat rickroll pembaca yang tidak curiga. Biarkan [Anda turun] ada input teks yang berisi huruf, tanda baca, dan spasi. Kapan saja frase [bohong dan sakitkan kamu] dari dua bait pertama muncul dalam teks ...

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

... masukkan sisa garis dalam tanda kurung sesudahnya.

Memasukkan

Input adalah string baris tunggal yang hanya berisi ASCII yang dapat dicetak dengan baris tambahan opsional.

Keluaran

Output adalah string single-line. Setiap kali sekelompok kata (didefinisikan sebagai string input terpecah pada spasi) cocok dengan sekelompok kata dalam baris lirik di atas, masukkan kata-kata yang tersisa dari string ke dalam string, dikelompokkan dalam tanda kurung siku.

Deskripsi Tambahan:

Ini adalah kode-golf , byte paling sedikit menang. Anda dapat menulis suatu program atau fungsi.

  • pencocokan harus tidak peka huruf besar-kecil: we'redikonversi ke we're [no strangers to love]walaupun huruf We'rekapital ditulis dalam lirik.
  • pencocokan harus serakah. Does he know the answer?harus dikonversi menjadi Does he know the [rules and so do I] answer?bukanDoes he know [the rules and so do I] the [rules and so do I] answer?
  • Jika sebuah kata muncul lebih dari satu kali di lirik yang disediakan, pilih salah satu kejadian untuk melengkapi baris.
  • Jika sebuah kata adalah kata terakhir dalam baris lirik, jangan masukkan apa pun setelahnya.
  • Tanda baca dimasukkan sebagai bagian dari "kata." I'madalah satu kata dan tidak dapat dicocokkan I. Demikian pula, you.tidak cocok dengan lirik apa pun karena periode.

Beberapa kata seperti Imuncul berulang kali sepanjang lirik dan juga di akhir baris. Karena aturannya adalah bahwa setiap kemunculan dalam lirik di atas dapat digunakan, dan salah satu kemunculannya adalah di akhir baris, tidak Idiperlukan kecocokan . Pilihan lain Iadalah [just wanna tell you how I'm feeling].

Jika dua pertandingan tumpang tindih, Anda dapat memilih salah satu. Ini berarti bahwa how I'm thinkingdapat menjadi how I'm [feeling] thinking [of]ATAU how [I'm feeling] I'm thinking [of]karena I'mdapat menjadi bagian dari salah satu how I'matau I'm thinking. Namun, jika input teks sederhana I'm thinking, maka outputnya seharusnya I'm thinking [of].

Kasus uji tambahan:

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

Tantangan yang terinspirasi oleh pria ini .

PhiNotPi
sumber
11
ಠ_ಠ
Alex A.
Kasus uji kedua tampaknya salah ( fromharus menjadi from [any other guy]).
Gagang Pintu

Jawaban:

6

gawk, 316 + 377 = 693

Parameter baris perintah pertama adalah nama file lirik (375 byte + 2 untuk doa = 377). Rickrolls semua file lainnya. Mencetak ke 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""}

Tidak disatukan

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

Hasil tes

Memasukkan:

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

Keluaran:

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.
sumber
1. Ini gagal pada test case pertama (ini menempatkan hal-hal di antara whatdan I'm, yang cocok "tidak serakah"). 2. Ini gagal pada test case ketiga (ini mengubah dua spasi menjadi satu). 3. Jika Anda menyimpan lirik dalam file terpisah, Anda perlu menghitung file itu (dan juga +2 untuk memasukkannya dalam awkperintah) dalam jumlah byte Anda.
Gagang Pintu
@ Doorknob Terima kasih. Keserakahan diperbaiki. File lirik tidak menambah jumlah karakter saya karena tidak diubah dan tersedia untuk umum sebelum tantangan dimulai. Saya juga tidak menghitung awkkode sumber.
Rainer P.
Sekarang ini gagal untuk input gonna run(output yang diharapkan gonna run [around and desert you], output aktual gonna [tell a lie and hurt you] run [around and desert you]). Itu juga masih chomps beberapa ruang berturut-turut. Anda perlu menghitung file lirik dalam jumlah byte Anda, karena ini adalah permohonan non-standar awkprogram.
Gagang Pintu
@ Doorknob Ok. Saya menerapkan kembali sebagian besar program dan gawksekarang membutuhkan pemisahan bidang yang mempertahankan ruang. Lewati semua kotak uji sekarang.
Rainer P.
Impresif. Sangat sulit untuk menutupi semua kasus tepi dalam tantangan ini.
Gagang Pintu