Iniettare Rickroll testuali


13

Poiché il rickrolling è il meme più grande sulla Terra, tu [conosci le regole e anche io] devi scrivere il codice più breve che può riscrivere testualmente il lettore ignaro. Lascia che [tu giù] ci sia un testo di input che contiene lettere, punteggiatura e spazi. Ogni volta che nel testo compare una frase [menti e ferito] delle prime due stanze ...

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

... inserire successivamente il resto della linea tra parentesi.

Ingresso

L'input è una stringa a riga singola contenente solo ASCII stampabile con newline finale opzionale.

Produzione

L'output è una stringa a riga singola. Ogni volta che un gruppo di parole (definito come stringa di input suddivisa in spazi) corrisponde a un gruppo di parole nelle righe del testo sopra, inserire le parole rimanenti della riga nella stringa, raggruppate tra parentesi quadre.

Descrizione aggiuntiva:

Questo è code-golf , vince meno byte. È possibile scrivere un programma o una funzione.

  • la corrispondenza non dovrebbe fare distinzione tra maiuscole e minuscole: we'reviene convertita in we're [no strangers to love]anche se We'reè maiuscola nei testi.
  • la corrispondenza dovrebbe essere avida. Does he know the answer?dovrebbe essere convertito in Does he know the [rules and so do I] answer?invece diDoes he know [the rules and so do I] the [rules and so do I] answer?
  • Se una parola appare più di una volta nei testi forniti, scegli una delle occorrenze per completare la riga.
  • Se una parola è l'ultima parola nella riga del testo, non inserire nulla dopo di essa.
  • La punteggiatura è inclusa come parte di una "parola". I'mè una singola parola e non può corrispondere a I. Allo stesso modo, you.non corrisponde ad alcun testo a causa del periodo.

Alcune parole come Iappaiono più volte nel testo e alla fine di una riga. Poiché la regola è che qualsiasi ricorrenza nei testi sopra può essere usata, e una di quelle occorrenze si trova alla fine di una riga, non Iè necessaria la corrispondenza di . L'altra opzione per Iè [just wanna tell you how I'm feeling].

Se due partite si sovrappongono, puoi sceglierne una. Ciò significa che how I'm thinkingpotrebbe diventare how I'm [feeling] thinking [of]OR how [I'm feeling] I'm thinking [of]poiché I'mpotrebbe essere parte di uno how I'mo I'm thinking. Se, tuttavia, il testo di input era semplicemente I'm thinking, l'output dovrebbe essere I'm thinking [of].

Casi di prova aggiuntivi:

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

Sfida ispirata a questo tipo .


11
ಠ_ಠ
Alex A.

Il secondo caso di test sembra essere sbagliato ( fromdovrebbe diventare from [any other guy]).
Maniglia della porta

Risposte:


6

gawk, 316 + 377 = 693

Il primo parametro della riga di comando è il nome file del testo (375 byte + 2 per invocazione = 377). Rickrolls tutti gli altri file. Stampa su 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""
}

Risultati del test

Ingresso:

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

Produzione:

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. Questo fallisce il primo caso di test (mette le cose tra whate I'm, che è una corrispondenza "non avida"). 2. Questo fallisce il terzo caso di test (trasforma i due spazi in uno). 3. Se si memorizzano i testi in un file separato, è necessario contare quel file (oltre a +2 per includerlo nel awkcomando) nel conteggio dei byte.
Maniglia della porta

@Doorknob Grazie. L'avidità è fissa. Il file dei testi non si aggiunge al mio conteggio dei personaggi poiché è inalterato ed era pubblicamente disponibile prima dell'inizio della sfida. Non conto awkneanche il codice sorgente.
Rainer P.

Ora questo non riesce per l'input gonna run(output previsto gonna run [around and desert you], output effettivo gonna [tell a lie and hurt you] run [around and desert you]). Trita anche più spazi di fila. Devi contare il file dei testi nel conteggio dei byte, in quanto si tratta di un richiamo non standard del awkprogramma.
Maniglia della porta

@Doorknob Ok. Ho reimplementato la maggior parte del programma e gawkora richiedo la separazione dei campi che preserva lo spazio. Passa tutti i casi di test ora.
Rainer P.

Degno di nota. In questa sfida è stato molto difficile coprire tutti i casi limite.
Maniglia della porta
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.