Quale canzone sta suonando?


33

Ispirato da questo xkcd

inserisci qui la descrizione dell'immagine

Lavori per Shazam e hanno un progetto per te. Alcuni clienti si lamentano del fatto che la loro app occupi troppo spazio sul telefono, quindi desiderano che tu codifichi una versione ridotta dell'app. Sfortunatamente, il tuo codice esistente può solo capire la parola "na" e dovrai spedirlo presto. Va bene, faremo il meglio con quello che abbiamo.

La sfida

È necessario scrivere un programma completo che accetta l'input dell'utente o accetta un argomento della riga di comando e stampare il titolo e l'artista della canzone. Poiché stiamo cercando di correggere i clienti che si lamentano delle dimensioni del programma, il codice deve essere il più breve possibile. L'input sarà una stringa composta interamente da na, con un solo spazio tra di loro. Le lettere minuscole / maiuscole sono arbitrarie. Questo è considerato un input valido: Na Na nA na NAQuesto è un input non valido: nah nah NA naNa bananaè necessario determinare quale brano è in riproduzione e stamparlo esattamente in questo formato:

Song: <trackname>
Artist: <artist>

Se l'ingresso è esattamente 8 na, questo corrisponde a due brani separati, quindi è necessario stampare entrambi:

Song: Batman Theme
Artist: Neal Hefti

e

Song: Na Na Hey Hey Kiss Him Goodbye
Artist: Steam

Se l'input è esattamente di 10 na, è necessario stampare:

Song: Katamari Damacy
Artist: Yuu Miyake

Se l'input è esattamente 11 na, è necessario stampare:

Song: Hey Jude
Artist: The Beatles

Se l'input è 12 o più na, è necessario stampare

Song: Land Of 1000 Dances
Artist: Wilson Pickett

Infine, se l'ingresso non è valido, ci sono meno di 8 na o una delle parole non è "na", il programma non riesce a capire la musica. Quindi logicamente, c'è solo un'altra canzone che potrebbe essere. È necessario stampare:

Song: Africa
Artist: Toto

Come al solito, si applicano scappatoie standard e vince la risposta più breve in byte.


2
grande storia di fondo!
TanMath,

Hey Jude 12 nas non è? L'ho appena ascoltato e ho pensato che fosse (in termini di lunghezze delle note) quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter, che è di 12 nas.
Arcturus,

4
@Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-judesicuramente l'11
quintopia il

1
Batman è na na / na na / na na / na nax2 batman. Ho notato che la seconda volta che ho visto il fumetto.
wizzwizz4,

2
È troppo tardi di 3 anni per cambiare la sfida, ma devo obiettare che il tema Katamari Damacy si intitola "Katamari on the Rocks" (o se sei un purista, è ufficialmente "Katamari on the Rocks ~ Main Theme") e quindi non dovrebbe essere elencato solo come "Katamari Damacy"!
Value Ink

Risposte:


7

Retina , 242

Provalo online!

iG`^na( na)*$
iM`na
m`^8$
>Batman Theme,Neal Hefti$n>Na Na Hey Hey Kiss Him Goodbye,Steam
m`^10$
>Katamari Damacy,Yuu Miyake
m`^11$
>Hey Jude,The Beatles
[0-9].+
>Land Of 1000 Dances,Wilson Pickett
m`^[0-9]
>Africa,Toto
>
Song: 
,
$nArtist: 

Come funziona:

Flag IgnoreCase + Flag modalità Grep + Regex ^na( na)*$. Se l'input è valido, stampalo così com'è. In caso contrario, non stampare nulla.

iG`^na( na)*$

Flag IgnoreCase + Flag modalità corrispondenza + Regex na. Contare i "na" e stampare il numero.

iM`na

Se la stringa è esattamente "8", sostituirla con la seconda riga.

m`^8$
>Batman Theme,Neal Hefti$n>Na Na Hey Hey Kiss Him Goodbye,Steam

Se la stringa è esattamente "10", sostituirla con la seconda riga.

m`^10$
>Katamari Damacy,Yuu Miyake

Se la stringa è esattamente "11", sostituirla con la seconda riga.

m`^11$
>Hey Jude,The Beatles

Se la stringa corrisponde [0-9].+, sostituirla con la seconda riga. Ciò non vale né per i numeri a una sola cifra 10e 11poiché sono già stati sostituiti né per nessuna delle stringhe di sostituzione di cui sopra.

[0-9].+
>Land Of 1000 Dances,Wilson Pickett

Se nessuna delle precedenti corrisponde, la stringa inizia comunque con un numero. Predefinito a Toto, in Africa.

m`^[0-9]
>Africa,Toto

Sostituire i segnaposto >e ,con Song:e Artist:.

>
Song: 
,
$nArtist: 

5

JavaScript (ES6), 276 byte

alert(`Song: `+([,`Batman Theme,Neal Hefti
Song: Na Na Hey Hey Kiss Him Goodbye,Steam`,,`Katamari Damacy,Yuu Miyake`,`Hey Jude,The Beatles`,`Land Of 1000 Dances,Wilson Pickett`][+prompt(i=0).replace(/na( |$)/gi,_=>++i)&&(i>11?4:i-7)]||`Africa,Toto`).replace(/,/g,`
Artist: `))

Spiegazione

L'input può contenere facoltativamente uno spazio finale.

alert(                 // output the result
  `Song: `+([          // insert the "Song:" label
      ,                // set the first element to undefined in case input is empty

      // Songs
      `Batman Theme,Neal Hefti
Song: Na Na Hey Hey Kiss Him Goodbye,Steam`,
      ,
      `Katamari Damacy,Yuu Miyake`,
      `Hey Jude,The Beatles`,
      `Land Of 1000 Dances,Wilson Pickett`

    ][
      +                // if the input string was made up only of "na"s, the replace would
                       //     return a string containing only digits, making this return a
                       //     number (true), but if not, this would return NaN (false)
        prompt(        // get the input string
          i=0          // i = number of "na"s in input string
        ).replace(     // replace each "na" with a number
          /na( |$)/gi, // find each "na"
          _=>++i       // keep count of the "na"s and replace with a (non-zero) number
        )
      &&(i>11?4:i-7)   // select the song based on the number of "na"s
    ]
      ||`Africa,Toto`  // default to Africa
  ).replace(/,/g,`
Artist: `)             // insert the "Artist:" label
)

Test


Questo non funziona per 9 na, produce kamari.
Rɪᴋᴇʀ

@RikerW Risolto. Ho dimenticato una virgola ...
user81655,

4

PowerShell, 278 byte

  • Può gestire qualsiasi quantità di spazio bianco
  • Nessuna regex di sorta!
  • Typwelling implicito FTW!
@{8='Batman Theme/Neal Hefti','Na Na Hey Hey Kiss Him Goodbye/Steam'
10='Katamari Damacy/Yuu Miyake'
11='Hey Jude/The Beatles'
12='Land Of 1000 Dances/Wilson Pickett'}[[math]::Min($args.Count*!($args|?{$_-ne'na'}),12)]|%{'Song: {0}
Artist: {1}'-f($_+'Africa/Toto'*!$_-split'/')}

Ungolfed

@{8='Batman Theme/Neal Hefti','Na Na Hey Hey Kiss Him Goodbye/Steam' # array
10='Katamari Damacy/Yuu Miyake'
11='Hey Jude/The Beatles'
12='Land Of 1000 Dances/Wilson Pickett'} # Hashtable of songs
[   # Get value by key from hashtable
    # If key is invalid, silently return null value

    [math]::Min( # Clamp max value to 12
        $args.Count* # Multiply count of argumens
                     # true/false will be cast to 1/0
            ! # Negate result of expression
              # Will cast empty array to 'false'
              # and non-empty array to 'true'
            (
                # Return non-empty array if input arguments
                # contain anything other than 'na'
                $args | Where-Object {$_ -ne 'na'} 
            ),
        12
    )
] | ForEach-Object { # Send value from hashtable down the pipeline,
                     # This allows to process arrays in hasthable values
    'Song: {0}
    Artist: {1}' -f ( # Format string
        $_+ # Add to current pipeline variable
            'Africa/Toto'*!$_ # If pipeline variable is empty,
                              # then add default song to it
                              # Example: 'Test'*1 = 'Test'
                              #          'Test'*0 = null
        -split '/' # Split string to array for Format operator
    )
}

uso

PS > .\WhatSong.ps1 na na na na na na na na
Song: Batman Theme
Artist: Neal Hefti
Song: Na Na Hey Hey Kiss Him Goodbye
Artist: Steam

PS > .\WhatSong.ps1 Na na na na na na na na na Na
Song: Katamari Damacy
Artist: Yuu Miyake

PS > .\WhatSong.ps1 Na na na na na na na na na BanaNa
Song: Africa
Artist: Toto

1

sh + coreutils, 290

Anche se più a lungo della mia altra presentazione, questo è semplice e praticamente non golfato, quindi l'ho incluso comunque.

grep -Ei "^na( na)*$"|wc -w|awk '{s="Song: ";a="\nArtist: ";p=s"Africa"a"Toto"}$1==8{p=s"Batman Theme"a"Neal Hefti\n"s"Na Na Hey Hey Kiss Him Goodbye"a"Steam"}$1>9{p=s"Katamari Damacy"a"Yuu Miyake"}$1>10{p=s"Hey Jude"a"The Beatles"}$1>11{p=s"Land Of 1000 Dances"a"Wilson Pickett"}{print p}'

Come funziona:

Se l'input è valido, stampalo così com'è. In caso contrario, non stampare nulla.

grep -Ei "^na( na)*$"

Conta le parole.

wc -w

Tabella di ricerca semplice Song:e Artist:mantenuta in variabili.

awk '
    {s="Song: ";a="\nArtist: ";p=s"Africa"a"Toto"}
    $1==8{p=s"Batman Theme"a"Neal Hefti\n"s"Na Na Hey Hey Kiss Him Goodbye"a"Steam"}
    $1>9{p=s"Katamari Damacy"a"Yuu Miyake"}
    $1>10{p=s"Hey Jude"a"The Beatles"}
    $1>11{p=s"Land Of 1000 Dances"a"Wilson Pickett"}
    {print p}
'

So che è passato un po 'di tempo, ma il regex può essere abbreviato ^(na ?)+$.
Kevin Cruijssen,

1

Python 453 440 406 380 byte

EDIT: Grazie a Cyoce per la riduzione di 13 byte!

EDIT: Grazie ancora a Cyoce!

EDIT: grazie a RainerP. per avermi aiutato a migliorare l'algoritmo in alcuni casi non validi.

Questa è una bozza di un programma Python. Credo che possa essere sicuramente giocato a golf, forse a 300-400 byte. Ma ci lavoreremo presto.

f=0
S='Song:'
A='\nArtist:'
l="Batman Theme,Neal Hefti,Na Na Hey Kiss Him Goodbye,Steam,Katamari Damacy,Yuu Miyake,Hey Jude,Beatles,Land of the 1000 Dances,Wilson Pickett,Africa,Toto".split(',')
s=raw_input().lower()+" "
n=s.count("na ")
n*=n*3==len(s)
if n>11:f=8
if n==10:f=4
if n==11:f=6
if n<8or n==9:f=10
if f:print S+l[f]+A+l[f+1]
else:print S+l[0]+A+l[1]+"\n"+S+l[2]+A+l[3]

Prova qui!


Invece di quella lunga lista, usa"Batman Theme,Neal Hefti,Na Na Hey Kiss Him Goodbye,Steam,Katamari Damacy,Yuu Miyake,Hey Jude,Beatles,Land of the 1000 Dances,Wilson Pickett,Africa,Toto".split(',')
Cyoce il

Inoltre: invece di if i not in ["n","a"," "]: ...credo che tu possa usare if i not in 'na ': .... Inoltre, if f==0: somecode; else: somemorecodepuò essere ridotto a if f: somemorecode; else: somecode(0 è Falsy)
Cyoce il

Ancora di più (avrei dovuto metterli tutti in uno, vabbè): hai "\nArtist:"tre volte. prova a impostare una variabile, ad esempio A="\nArtist:", quindi usando Aal posto della stringa letterale. Lo stesso si può fare con "Song:". Inoltre, penso che if n<8or n==9:f=10possa essere spostato in cima alle istruzioni if ​​e modificato inif n!=8:f=10
Cyoce,

Il tuo programma non riesce a rilevare input non validi. L'output è Batman Themeinvece di Africaper na na na nan na na na na.
Rainer P.

@RainerP. Grazie ... sapevo che mi mancava qualcosa ... Ora sto lavorando a un algoritmo aggiornato
TanMath,

1

Julia, 325 byte

Probabilmente potrebbe essere ulteriormente giocato a golf.

p(s,a)=println("Song: $s\nArtist: $a");ismatch(r"^(na )*na$",ARGS[1])&&(c=length(split(ARGS[1],"na"))-1)==8?(p("Batman Theme","Neal Hefti"),p("Na Na Hey Hey Kiss Him Goodbye","Steam")):c==10?p("Katamari Damacy","Yuu Miyake"):c==11?p("Hey Jude","The Beatles"):c>=12?p("Land Of 1000 Dances","Wilson Pickett"):p("Africa","Toto")

So che è passato un po 'di tempo, ma il regex può essere abbreviato ^(na ?)+$.
Kevin Cruijssen,

Inoltre, i controlli possono essere accorciati un po 'utilizzando <e >, invece di ==: &&(c=length(split(ARGS[1],"na"))-1)<9?(p("Batman Theme","Neal Hefti"),p("Na Na Hey Hey Kiss Him Goodbye","Steam"))c>11?p("Land Of 1000 Dances","Wilson Pickett"):c>10?p("Hey Jude","The Beatles"):c>9?p("Katamari Damacy","Yuu Miyake"):p("Africa","Toto"). Fuori tema: mi piace il tuo avatar. Ho finito di guardare SAO la scorsa settimana. ;)
Kevin Cruijssen,

1

Ruggine, 501 477 byte

fn main(){let(mut i,mut n)=(String::new(),0);let(s,a);std::io::stdin().read_line(&mut i);i=i.trim().to_lowercase();let o=i.split(" ");for w in o{if w!="na"{n=0;break}else{n+=1}}match n{8=>{println!("Song: Batman Theme\nArtist: Neal Hefti");s="Na Na Hey Hey Kiss Him Goodbye";a="Steam"}10=>{s="Katamari Damacy";a="Yuu Miyake"}11=>{s="Hey Jude";a="The Beatles"}_=>{if n>=12{s="Land Of 1000 Dances";a="Wilson Pickett"}else{s="Africa";a="Toto"}}}print!("Song: {}\nArtist: {}",s,a)}

Ungolfed

fn main() {
    let (mut input_string, mut na_counter) = (String::new(), 0);
    let (song_name, artist_name);

    std::io::stdin().read_line(&mut input_string);
    input_string = input_string.trim().to_lowercase();
    let output = input_string.split(" ");

    for word in output {
        if word != "na" {
            na_counter = 0;
            break;
        } else {
            na_counter += 1;
        }
    }

    match na_counter {
        8 => {
            println!("Song: Batman Theme\nArtist: Neal Hefti");
            song_name = "Na Na Hey Hey Kiss Him Goodbye";
            artist_name = "Steam";
        }
        10 => {
            song_name = "Katamari Damacy";
            artist_name = "Yuu Miyake";
        }
        11 => {
            song_name = "Hey Jude";
            artist_name = "The Beatles";
        }
        _ => {
            if na_counter >= 12 {
                song_name = "Land Of 1000 Dances";
                artist_name = "Wilson Pickett";
            } else {
                song_name = "Africa";
                artist_name = "Toto";
            }
        }
    }

    print!("Song: {}\nArtist: {}", song_name, artist_name);
}

Modifica: rimosso un to_string non necessario e digitare annotazioni


1

Perl 5 -pa , 248 byte

$_=/^(na ?)+$/&&(@F==8?",Batman Theme;Neal Hefti,Na Na Hey Hey Kiss Him Goodbye;Steam":@F==10?"Katamari Damacy;Yuu Miyake":@F==11?",Hey Jude;The Beatles":@F>11?",Land Of 1000 Dances;Wilson Pickett":0)||",Africa;Toto";s/;/
Artist: /gm;s/,/
Song: /gm

Provalo online!


1

Perl 5 , 312 292 byte

$_=lc<>;$n="(na ?)";/^(na ){7}na$|(na ){9,}na/ or$_="%Africa&Toto";s/$n{12,}/%Land Of 1000 Dances&Wilson Pickett/;s/$n{11}/%Hey Jude&The Beatles/;s/$n{10}/%Katamari Damacy&Yuu Miyake/;s/$n{8}/%Batman Theme&Neal Hefti\n%Na Na Hey Hey Kiss Him Goodbye&Steam/;s/&/\nArtist: /g;s/%/Song: /g;print

Provalo online!

Ungolfed:

$_ = lc <STDIN>;
$_ =~ /^(na ){7}na$|(na ){9,}na/ or $_ = "%Africa&Toto";
$_ =~ s/(na ?){12,}/%Land Of 1000 Dances&Wilson Pickett/;
$_ =~ s/(na ?){11}/%Hey Jude&The Beatles/;
$_ =~ s/(na ?){10}/%Katamari Damacy&Yuu Miyake/;
$_ =~ s/(na ?){8}/%Batman Theme&Neal Hefti\n%Na Na Hey Hey Kiss Him Goodbye&Steam/;
$_ =~ s/&/\nArtist: /g;
$_ =~ s/%/Song: /g;
print $_

Ho perso alcuni casi, lavorando su una correzione ora
pslessard

1

C (gcc) , 403 395 370 365 byte

-8 -5 byte grazie a ceilingcat

Praticamente il più semplice possibile.

f(char*s){int*a[]={"Neal Hefti","Steam","Yuu Miyake","The Beatles","Wilson Pickett","Toto","Batman Theme","Na Na Hey Hey Kiss Him Goodbye","Katamari Damacy","Hey Jude","Land Of 1000 Dances","Africa"},i=1,l=0,j=1;for(;*s;s+=s[2]?3:2)i=(*s|32)^'n'|(s[1]|32)^97|s[2]>32,l++;for(i=i?5:l^8?l^10?l^11?l>11?4:5:3:2:j++;j--;)printf("Song: %s\nArtist: %s\n",a[6+i--],a[i]);}

Provalo online!


0

Java 8, 353 byte

s->{int n=s.split(" ").length,b=s.matches("(na ?)+")?1:0;s="Africa";return"Song: "+(b>0?n<8?s:n<9?"Batman Theme\nArtist: Neal Hefti\nSong: Na Na Hey Hey Kiss Him Goodbye":n>11?"Land of 1000 Dances":n>10?"Hey Jude":n>9?"Katamari Damacy":"":s)+"\nArtist: "+(b>0?n<8?"Toto":n<9?"Steam":n>11?"Wilson Pickett":n>10?"The Beatles":n>9?"Yuu Miyake":"":"Toto");}

Spiegazione:

Provalo online.

s->{                             // Method with String as both parameter and return-type
  int n=s.split(" ").length,     //  The amount of words when split by spaces
      b=s.matches("(na ?)+")?1:0;//  Whether the input matches the regex "^(na ?)+$"
  s="Africa";                    //  Set the input we no longer need to "Africa"
  return"Song: "                 //  Return "Song: "
    +(b>0?                       //   +If the input matched the regex:
       n<8?                      //     If there are less than 8 "na"'s: 
        s                        //      Append "Africa"
       :n<9?                     //     Else-if there are exactly 8 "na"'s:
        "Batman Theme\nArtist: Neal Hefti\nSong: Na Na Hey Hey Kiss Him Goodbye"
                                 //      Append the String above
       :n>11?                    //     Else-if there are 12 or more "na"'s:
        "Land of 1000 Dances"    //      Append "Land of 1000 Dances"
       :n>10?                    //     Else-if there are exactly 11 "na"'s:
        "Hey Jude"               //      Append "Hey Jude"
       :n>9?                     //     Else-if there are exactly 10 "na"'s:
        "Katamari Damacy"        //      Append "Katamari Damacy"
       :                         //     Else (there are exactly 9 "na"'s):
        ""                       //      Append nothing
      :                          //    Else:
       s)                        //     Append "Africa"
    +"\nArtist: "                //   +Append a new-line and "Artist: "
    +(b>0?                       //   +If the input matched the regex:
       n<8?                      //     If there are less than 8 "na"'s:
        "Toto"                   //      Append "Toto"
       :n<9?                     //     Else-if there are exactly 8 "na"'s:
        "Steam"                  //      Append "Steam"
       :n>11?                    //     Else-if there are 12 or more "na"'s:
        "Wilson Pickett"         //      Append "Wilson Pickett"
       :n>10?                    //     Else-if there are exactly 11 "na"'s:
        "The Beatles"            //      Append "The Beatles"
       :n>9?                     //     Else-if there are exactly 10 "na"'s:
        "Yuu Miyake"             //      Append "Yuu Miyake"
       :                         //     Else (there are exactly 9 "na"'s):
        ""                       //      Append nothing
      :                          //    Else:
       "Toto");}                 //     Append "Toto"
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.