テキストリックロールを注入する


12

リックロールは地球上で最大のミームであるため、あなたは[ルールを知っており、私もそうしている]疑うことを知らない読者をテキストでリックロールできる最短のコードを書くことです。してみましょう[あなたをダウン]の文字、句読点、およびスペースを含む入力テキストがあります。いつでも[嘘とあなたを傷つける]最初の二つのスタンザからフレーズがテキストで表示されます...

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のみを含む単一行の文字列です。

出力

出力は単一行の文字列です。単語のグループ(スペースで分割された入力文字列として定義)が上記の歌詞の行にある単語のグループと一致する場合は、その行の残りの単語を角かっこでグループ化して文字列に挿入します。

追加説明:

これはcode-golfであり、バイト数が最も少なくなります。プログラムまたは関数を作成できます。

  • マッチングはケース・小文字を区別しないようになります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は、歌詞全体および行末に複数回表示されます。ルールでは、上記の歌詞のオカレンスを使用でき、それらのオカレンスの1つは行末にあるため、の一致Iは不要です。の他のオプションはIです[just wanna tell you how I'm feeling]

2つの一致が重複する場合、どちらかを選択できます。これは、またはの一部になる可能性があるため、ORにhow I'm thinkingなる可能性があることを意味します。ただし、入力テキストが単にの場合、出力はである必要があります。how I'm [feeling] thinking [of]how [I'm feeling] I'm thinking [of]I'mhow I'mI'm thinkingI'm thinkingI'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."

この男に触発された挑戦。


10
ಠ_ಠ
アレックスA.

2番目のテストケースは間違っているように見えます(fromなるはずですfrom [any other guy])。
ドアノブ

回答:


5

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

非ゴルフ

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つのスペースを1つに変えます)。3.歌詞を別のファイルに保存する場合awk、バイトカウントでそのファイルをカウントする必要があります(コマンドに含める場合は+2 )。
ドアノブ

@Doorknobありがとう。欲が修正されました。歌詞ファイルは変更されておらず、チャレンジが開始される前に公開されていたため、文字数は増えません。awkのソースコードも数えません。
レイナーP.

現在、これは入力に対して失敗しますgonna run(予想される出力gonna run [around and desert you]、実際の出力gonna [tell a lie and hurt you] run [around and desert you])。また、複数のスペースが連続して途切れることもあります。歌詞ファイルは、awkプログラムの非標準的な呼び出しであるため、バイトカウントで歌詞ファイルをカウントする必要があります。
ドアノブ

@Doorknob OK。プログラムのほとんどを再実装しgawk、スペースを節約するフィールド分離が必要になりました。すべてのテストケースに合格しました。
レイナーP.

印象的。この課題のすべてのエッジケースをカバーすることは非常に困難でした。
ドアノブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.