Metinli Rickroll'ları enjekte et


13

Rickrolling dünyadaki en büyük mem olduğundan, [kuralları biliyorsunuz ve ben de] şüphesiz okuyucuyu metin olarak geri alabilen en kısa kodu yazmak zorundasınız. Let [aşağı] harfleri, noktalama ve boşluk içeren bir giriş metin olması. Metinde ilk iki stanzadan bir [yalan söyleme ve incinme] ifadesi belirdiğinde ...

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

... daha sonra hattın geri kalanını parantez içine alın.

Giriş

Giriş yalnızca isteğe bağlı son satır içeren yazdırılabilir ASCII içeren tek satırlık bir dizedir.

Çıktı

Çıktı tek satırlık bir dizedir. Bir kelime grubunun (boşluklarda bölünmüş giriş dizesi olarak tanımlanır) yukarıdaki şarkı sözlerinin satırlarındaki bir kelime grubuyla eşleştiği her seferinde, satırın kalan kelimelerini köşeli parantez içinde gruplanan dizeye ekleyin.

Ek açıklama:

Bu kod golf , en az bayt kazanır. Bir program veya işlev yazabilirsiniz .

  • Eşleştirme harf duyarsız olmalıdır: we'redönüştürülür we're [no strangers to love]rağmen We'reşarkı sözleri harf olur.
  • eşleştirme açgözlü olmalıdır. yerine Does he know the answer?dönüştürülmeliDoes 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?
  • Bir kelime sağlanan şarkı sözlerinde birden fazla görünüyorsa, satırı tamamlamak için tekrarlardan birini seçin.
  • Bir kelime lirik satırdaki son sözcükse, arkasından bir şey eklemeyin.
  • Noktalama işaretleri bir "sözcüğün" parçası olarak eklenir. I'mtek bir kelimedir ve ile eşleşemez I. Benzer şekilde, you.dönem nedeniyle herhangi bir şarkı sözü ile eşleşmiyor.

Gibi bazı kelimeler Işarkı sözleri boyunca ve bir satırın sonunda birden çok kez görünür. Kural, yukarıdaki şarkı sözlerindeki herhangi bir oluşumun kullanılabileceğinden ve bu oluşumlardan birinin bir satırın sonunda olması nedeniyle eşleştirmeye Igerek yoktur. Diğer seçenek Iise [just wanna tell you how I'm feeling].

İki eşleşme çakışırsa, ikisinden birini seçebilirsiniz. Bu araç how I'm thinkinghaline gelebilir how I'm [feeling] thinking [of]VEYA how [I'm feeling] I'm thinking [of]beri I'mbirinin olabileceğini parçası how I'mveya I'm thinking. Bununla birlikte, giriş metni basitse I'm thinking, çıktı olmalıdır I'm thinking [of].

Ek test durumları:

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

Bu adamdan esinlenilen meydan okuma .


11
ಠ_ಠ
Alex A.

İkinci test durumu yanlış gibi görünüyor ( fromolması gerekir from [any other guy]).
Kapı tokmağı

Yanıtlar:


6

gawk, 316 + 377 = 693

İlk komut satırı parametresi, şarkı sözlerinin dosya adıdır (çağırma için 375 bayt + 2 = 377). Diğer tüm dosyaları kaydeder. İçin yazdırır 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""
}

Test sonuçları

Giriş:

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

Çıktı:

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. Bu ilk test senaryosunda başarısız olur ( whatve I'm"açgözlü olmayan" eşleşme arasına bir şey koyar ). 2. Bu üçüncü test senaryosunu geçemez (iki boşluğu bire dönüştürür). 3. Şarkı sözlerini ayrı bir dosyada awksaklarsanız, bayt sayınızda o dosyayı (ve komuta dahil etmek için +2 ) saymanız gerekir.
Kapı tokmağı

@Doorknob Teşekkürler. Hırs sabittir. Şarkı sözü dosyası değiştirilmediğinden ve sayı başlamadan önce herkese açık olduğundan karakter sayımı eklemiyor. awkKaynak kodunu da saymıyorum .
Rainer P.

Şimdi bu giriş için başarısız oluyor gonna run(beklenen çıktı gonna run [around and desert you], gerçek çıktı gonna [tell a lie and hurt you] run [around and desert you]). Aynı zamanda arka arkaya birden fazla alanı da kesiyor. awkProgramın standart dışı bir çağrılması olduğu için bayt sayınızdaki şarkı sözleri dosyasını saymanız gerekir .
Kapı tokmağı

@Doorknob Tamam. Programın çoğunu yeniden uyguladım ve gawkşimdi alan koruma alanı ayırma için gerekliyim. Tüm test senaryolarını şimdi geçiyor.
Rainer P.

Etkileyici. Bu meydan okumadaki tüm uç olayları kapsamak çok zordu.
Kapı tokmağı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.