Welches Lied spielt?

33

Inspiriert von dieser xkcd

Bildbeschreibung hier eingeben

Du arbeitest für Shazam und sie haben ein Projekt für dich. Einige Kunden beschweren sich darüber, dass ihre App zu viel Speicherplatz auf ihrem Telefon belegt. Sie möchten daher, dass Sie eine Lite-Version der App codieren. Leider kann Ihr bestehender Code nur das Wort "na" verstehen, und Sie müssen bald versenden. Das ist okay, wir werden das Beste aus dem machen, was wir haben.

Die Herausforderung

Sie müssen ein vollständiges Programm schreiben, das eine Benutzereingabe oder ein Befehlszeilenargument akzeptiert, und den Titel und den Interpreten des Songs drucken. Da wir versuchen, Kunden zu beheben, die sich über die Programmgröße beschweren, muss Ihr Code so kurz wie möglich sein. Die Eingabe ist eine Zeichenfolge, die ausschließlich aus na besteht und zwischen denen ein Leerzeichen steht. Klein- / Großbuchstaben sind beliebig. Dies wird als gültige Eingabe angesehen: Na Na nA na NADies ist eine ungültige Eingabe: nah nah NA naNa bananaSie müssen bestimmen, welches Lied abgespielt wird, und es in genau diesem Format ausdrucken:

Song: <trackname>
Artist: <artist>

Wenn die Eingabe genau 8 nas ist, entspricht dies zwei separaten Titeln, sodass Sie beide drucken müssen:

Song: Batman Theme
Artist: Neal Hefti

und

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

Wenn die Eingabe genau 10 nas beträgt , müssen Sie Folgendes drucken:

Song: Katamari Damacy
Artist: Yuu Miyake

Wenn die Eingabe genau 11 ist, müssen Sie Folgendes drucken:

Song: Hey Jude
Artist: The Beatles

Bei einer Eingabe von 12 oder mehr muss gedruckt werden

Song: Land Of 1000 Dances
Artist: Wilson Pickett

Wenn die Eingabe ungültig ist, weniger als 8 Na's vorhanden sind oder eines der Wörter nicht "na" ist, kann Ihr Programm die Musik nicht verstehen. Logischerweise gibt es nur ein anderes Lied, das es möglicherweise sein könnte. Sie müssen drucken:

Song: Africa
Artist: Toto

Wie üblich gelten Standardlücken, und die kürzeste Antwort in Bytes gewinnt.

DJMcMayhem
quelle
2
tolle Hintergrundgeschichte!
TanMath
Ist das nicht Hey Jude 12 nas? Ich habe es einfach angehört und dachte, es sei (in Bezug auf die Notenlänge) quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter, was 12 nas sind.
Arcturus
4
@Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-judedefinitiv 11
Quintopia
1
Batman ist na na / na na / na na / na nax2 batman. Mir ist aufgefallen, dass ich den Comic zum zweiten Mal gesehen habe.
wizzwizz4
2
Es ist 3 Jahre zu spät, um die Herausforderung zu ändern, aber ich muss einwenden, dass das Katamari Damacy-Thema "Katamari on the Rocks" heißt (oder wenn Sie Purist sind, ist es offiziell "Katamari on the Rocks ~ Hauptthema") sollte nicht nur als "Katamari Damacy" aufgeführt werden!
Wert Tinte

Antworten:

7

Retina , 242

Probieren Sie es 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: 

Wie es funktioniert:

IgnoreCase-Flag + Grep-Modus-Flag + Regex ^na( na)*$. Wenn die Eingabe gültig ist, drucken Sie sie so wie sie ist. Wenn nicht, drucken Sie nichts.

iG`^na( na)*$

IgnoreCase-Flag + Match-Modus-Flag + Regex na. Zähle die "na" und drucke die Zahl aus.

iM`na

Wenn der String genau "8" ist, ersetzen Sie ihn durch die zweite Zeile.

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

Wenn der String genau "10" ist, ersetzen Sie ihn durch die zweite Zeile.

m`^10$
>Katamari Damacy,Yuu Miyake

Wenn der String genau "11" ist, ersetzen Sie ihn durch die zweite Zeile.

m`^11$
>Hey Jude,The Beatles

Wenn die Zeichenfolge übereinstimmt [0-9].+, ersetzen Sie sie durch die zweite Zeile. Dies ist weder wahr für einstellige Zahlen, 10und 11wie sie bereits haben repaced noch eine der oben genannten Ersatzsaiten.

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

Wenn keine der oben genannten Übereinstimmungen vorliegt, beginnt die Zeichenfolge weiterhin mit einer Zahl. Standardeinstellung ist Toto, Afrika.

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

Ersetzen Sie die Platzhalter >und ,durch Song:und Artist:.

>
Song: 
,
$nArtist: 
Rainer P.
quelle
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: `))

Erläuterung

Die Eingabe kann optional ein Leerzeichen enthalten.

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
)

Prüfung

user81655
quelle
Dies funktioniert nicht für 9 Na's, es gibt Kamari aus.
28.
@RikerW behoben. Ich habe ein Komma vergessen ...
user81655
4

PowerShell, 278 Byte

  • Kann mit beliebig vielen Leerzeichen umgehen
  • Kein Regex!
  • Implizite Typumwandlung 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
    )
}

Verwendung

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
quelle
1

sh + coreutils, 290

Obwohl länger als meine andere Vorlage, ist diese unkompliziert und ziemlich ungolfed, also habe ich sie trotzdem aufgenommen.

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

Wie es funktioniert:

Wenn die Eingabe gültig ist, drucken Sie sie so wie sie ist. Wenn nicht, drucken Sie nichts.

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

Zähle die Wörter.

wc -w

Einfache Nachschlagetabelle, Song:und Artist:werden in Variablen gehalten.

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.
quelle
Ich weiß, es ist schon eine Weile her, aber die Regex kann auf verkürzt werden ^(na ?)+$.
Kevin Cruijssen
1

Python 453 440 406 380 Bytes

EDIT: Danke an Cyoce für die Reduzierung von 13 Bytes!

EDIT: Nochmals vielen Dank an Cyoce!

EDIT: Danke an RainerP. für die Verbesserung des Algorithmus in bestimmten ungültigen Fällen.

Dies ist ein grober Entwurf eines Python-Programms. Ich glaube, es kann definitiv Golf gespielt werden, vielleicht auf 300-400 Bytes. Aber daran wird bald gearbeitet.

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]

Versuch es hier!

TanMath
quelle
Verwenden "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(',')
Sie
Also: statt if i not in ["n","a"," "]: ...ich glaube du kannst benutzen if i not in 'na ': .... Zusätzlich if f==0: somecode; else: somemorecodekann reduziert werden if f: somemorecode; else: somecode(0 Falsy)
Cyoce
Noch mehr (ich hätte das alles in einem zusammenfassen sollen, na ja): Sie haben "\nArtist:"drei Mal. Versuchen Sie, eine Variable festzulegen A="\nArtist:", indem Sie beispielsweise Aanstelle des Zeichenfolgenliteral verwenden. Das gleiche kann man mit machen "Song:". Ich denke auch, dass if n<8or n==9:f=10dies an die Spitze der if-Anweisungen if n!=8:f=10
verschoben
Ihr Programm erkennt ungültige Eingaben nicht. Die Ausgabe erfolgt Batman Themestatt Africafür na na na nan na na na na.
Rainer P.
@RainerP. Vielen Dank ... Ich wusste, dass ich etwas vermisst habe ... Ich arbeite jetzt an einem aktualisierten Algorithmus
TanMath
1

Julia, 325 Bytes

Wahrscheinlich könnte weiter Golf gespielt werden.

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
quelle
Ich weiß, es ist schon eine Weile her, aber die Regex kann auf verkürzt werden ^(na ?)+$.
Kevin Cruijssen
Die Prüfungen können auch etwas gekürzt werden, indem <und >anstelle von ==: verwendet werden &&(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: Ich mag deinen Avatar. Letzte Woche war ich mit dem Anschauen von SAO fertig. ;)
Kevin Cruijssen
1

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

Bearbeiten: unnötige to_string entfernt und Anmerkungen eingegeben

dragonite44
quelle
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

Probieren Sie es online!

Xcali
quelle
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

Probieren Sie es 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
quelle
Ich habe einige Fälle verpasst und arbeite jetzt an einer Lösung
pslessard
1

C (gcc) , 403 395 370 365 Bytes

-8 -5 Bytes dank Ceilingcat

Ziemlich unkompliziert.

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

Probieren Sie es online!

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

Erläuterung:

Probieren Sie es online aus.

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
quelle