Quelle chanson joue?

33

Inspiré par ce xkcd

enter image description here

Vous travaillez pour Shazam et ils ont un projet pour vous. Certains clients se plaignent de voir leur application occuper trop de place sur leur téléphone. Ils souhaitent donc que vous codiez une version allégée de l'application. Malheureusement, votre code existant ne peut comprendre que le mot "na" et vous devez le faire rapidement. Ce n'est pas grave, nous ferons de notre mieux avec ce que nous avons.

Le défi

Vous devez écrire un programme complet prenant une entrée utilisateur ou un argument en ligne de commande, puis imprimer le titre et l'artiste de la chanson. Étant donné que nous essayons de corriger les clients qui se plaignent de la taille du programme, votre code doit être aussi court que possible. L'entrée sera une chaîne composée entièrement de na, avec un seul espace entre eux. Minuscules / majuscules est arbitraire. Ceci est considéré comme une entrée valide: Na Na nA na NACeci est une entrée invalide: nah nah NA naNa bananaVous devez déterminer la chanson en cours de lecture et l’imprimer exactement dans ce format:

Song: <trackname>
Artist: <artist>

Si l'entrée a exactement 8 na, cela correspond à deux chansons distinctes, vous devez donc les imprimer:

Song: Batman Theme
Artist: Neal Hefti

et

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

Si l'entrée correspond exactement à 10 na, vous devez imprimer:

Song: Katamari Damacy
Artist: Yuu Miyake

Si l'entrée correspond exactement à 11 na, vous devez imprimer:

Song: Hey Jude
Artist: The Beatles

Si la saisie est supérieure ou égale à 12 na, vous devez imprimer

Song: Land Of 1000 Dances
Artist: Wilson Pickett

Enfin, si l'entrée est invalide, s'il y a moins de 8 na ou si l'un des mots n'est pas "na", votre programme ne comprend pas la musique. Donc logiquement, il n'y a qu'une seule chanson possible. Vous devez imprimer:

Song: Africa
Artist: Toto

Comme d'habitude, des failles standard s'appliquent et la réponse la plus courte en octets est gagnante.

DJMcMayhem
la source
2
belle histoire de fond!
TanMath
Hey Jude 12 nan'est-il pas? Je viens de l'écouter et je pensais que c'était le cas (en termes de longueur des notes) quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter, ce qui correspond à 12 nas.
Arcturus
4
@Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-judecertainement 11
quintopia
1
Batman est na na / na na / na na / na nax2 batman. J'ai remarqué que la deuxième fois que j'ai vu la bande dessinée.
wizzwizz4
2
Il est 3 ans trop tard pour changer de défi, mais je dois objecter que le thème de Katamari Damacy est intitulé "Katamari sur les rochers" (ou si vous êtes un puriste, c'est officiellement "Katamari sur les rochers ~ thème principal") et donc ne devrait pas simplement être répertorié comme "Katamari Damacy"!
Value Ink

Réponses:

7

Rétine , 242

Essayez-le en ligne!

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: 

Comment ça marche:

Indicateur IgnoreCase + indicateur de mode Grep + Regex ^na( na)*$. Si l'entrée est valide, imprimez-la telle quelle. Sinon, n'imprimez rien.

iG`^na( na)*$

Indicateur IgnoreCase + Indicateur de mode de correspondance + Regex na. Comptez les "na" et imprimez le nombre.

iM`na

Si la chaîne est exactement "8", remplacez-la par la deuxième ligne.

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

Si la chaîne est exactement "10", remplacez-la par la deuxième ligne.

m`^10$
>Katamari Damacy,Yuu Miyake

Si la chaîne est exactement "11", remplacez-la par la deuxième ligne.

m`^11$
>Hey Jude,The Beatles

Si la chaîne correspond [0-9].+, remplacez-la par la deuxième ligne. Ce n'est pas vrai pour les nombres à un chiffre, 10et 11comme ils ont déjà été remplacés, ni aucune des chaînes de remplacement ci-dessus.

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

Si aucun des éléments ci-dessus ne correspond, la chaîne commence toujours par un nombre. Par défaut, Toto, Afrique.

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

Remplacez les espaces réservés >et ,par Song:et Artist:.

>
Song: 
,
$nArtist: 
Rainer P.
la source
5

JavaScript (ES6), 276 octets

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: `))

Explication

L'entrée peut éventuellement contenir un espace de fin.

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
)

Tester

utilisateur81655
la source
Cela ne fonctionne pas pour 9 na, il sort kamari.
Rɪᴋᴇʀ
@RikerW Fixé. J'ai oublié une virgule ...
user81655
4

PowerShell, 278 octets

  • Peut gérer n'importe quelle quantité d'espace
  • Aucune regex que ce soit!
  • Typecasting implicite 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
    )
}

Usage

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
beatcracker
la source
1

sh + coreutils, 290

Quoique plus long que mon autre mémoire, celui-ci est simple et peu gai, alors je l’ai inclus quand même.

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

Comment ça marche:

Si l'entrée est valide, imprimez-la telle quelle. Sinon, n'imprimez rien.

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

Comptez les mots.

wc -w

Table de consultation simple, Song:et Artist:sont conservés dans des variables.

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}
'
Rainer P.
la source
Je sais que ça fait un moment, mais on peut raccourcir la regex ^(na ?)+$.
Kevin Cruijssen
1

Python 453 440 406 380 octets

EDIT: Merci à Cyoce pour la réduction de 13 octets!

EDIT: Merci encore à Cyoce!

MODIFIER: Merci à RainerP. pour m'aider à améliorer l'algorithme sur certains cas non valides.

Ceci est un brouillon d'un programme Python. Je crois qu'il peut être joué au golf, peut-être à 300-400 octets. Mais travaillera sur cela bientôt.

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]

Essayez ici!

TanMath
la source
Au lieu de cette longue liste, utilisez"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
Aussi: au lieu de if i not in ["n","a"," "]: ...je crois que vous pouvez utiliser if i not in 'na ': .... De plus, if f==0: somecode; else: somemorecodepeut être réduit à if f: somemorecode; else: somecode(0 est Falsy)
Cyoce
Encore plus (j'aurais dû mettre tout cela en un, eh bien): vous avez "\nArtist:"trois fois. essayez de définir une variable, par exemple A="\nArtist:", puis utilisez-la Aà la place du littéral chaîne. La même chose peut être faite avec "Song:". De plus, je pense que cela if n<8or n==9:f=10peut être déplacé en haut de la déclaration if et remplacé parif n!=8:f=10
Cyoce
Votre programme ne parvient pas à détecter une entrée invalide. La sortie est Batman Themeau lieu de Africapour na na na nan na na na na.
Rainer P.
@RainerP. Merci ... je savais qu'il me manquait quelque chose ... Je travaille maintenant sur un algorithme mis à jour
TanMath
1

Julia, 325 bytes

Probably could be golfed further.

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")
nyuszika7h
la source
I know it's been a while, but the regex can be shortened to ^(na ?)+$.
Kevin Cruijssen
Also, the checks can be shortened a bit by using < and > instead of ==: &&(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"). Off-topic: I like your Avatar. Finished watching SAO last week. ;)
Kevin Cruijssen
1

Rust, 501 477 bytes

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);
}

Edit: removed an unnecessary to_string and type annotations

dragonite44
la source
1

Perl 5 -pa, 248 bytes

$_=/^(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

Try it online!

Xcali
la source
1

Perl 5, 312 292 bytes

$_=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

Try it 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 $_
pslessard
la source
I missed some cases, working on a fix now
pslessard
1

C (gcc), 403 395 370 365 bytes

-8 -5 bytes thanks to ceilingcat

Pretty much as straight-forward as can be.

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]);}

Try it online!

gastropner
la source
0

Java 8, 353 bytes

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

Explanation:

Try it 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"
Kevin Cruijssen
la source