Lagu apa yang sedang diputar?

33

Terinspirasi oleh xkcd ini

masukkan deskripsi gambar di sini

Anda bekerja untuk Shazam dan mereka punya proyek untuk Anda. Beberapa pelanggan mengeluh tentang aplikasi mereka yang menghabiskan terlalu banyak ruang di ponsel mereka, sehingga mereka ingin Anda membuat kode versi aplikasi yang ringan. Sayangnya, kode Anda yang ada hanya dapat memahami kata "na", dan Anda harus segera mengirimnya. Tidak apa-apa, kami akan melakukan yang terbaik dengan apa yang kami punya.

Tantangan

Anda harus menulis program lengkap yang mengambil input pengguna, atau mengambil argumen baris perintah, dan mencetak judul dan artis lagu tersebut. Karena kami berusaha memperbaiki pelanggan yang mengeluh tentang ukuran program, kode Anda harus sesingkat mungkin. Input akan berupa string yang seluruhnya terdiri dari na, dengan satu spasi di antara mereka. Huruf kecil / huruf besar bersifat arbitrer. Ini dianggap sebagai input yang valid: Na Na nA na NAIni adalah input yang tidak valid: nah nah NA naNa bananaAnda harus menentukan lagu apa yang diputar dan mencetaknya persis format ini:

Song: <trackname>
Artist: <artist>

Jika inputnya persis 8 na, ini cocok dengan dua lagu yang terpisah, jadi Anda harus mencetak keduanya:

Song: Batman Theme
Artist: Neal Hefti

dan

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

Jika inputnya persis 10 na, Anda harus mencetak:

Song: Katamari Damacy
Artist: Yuu Miyake

Jika inputnya persis 11 na, Anda harus mencetak:

Song: Hey Jude
Artist: The Beatles

Jika inputnya 12 atau lebih banyak, Anda harus mencetak

Song: Land Of 1000 Dances
Artist: Wilson Pickett

Terakhir, jika input tidak valid, ada kurang dari 8 na, atau ada kata-kata yang tidak "na", program Anda gagal memahami musik. Jadi secara logis, hanya ada satu lagu lain yang mungkin. Anda harus mencetak:

Song: Africa
Artist: Toto

Seperti biasa, celah standar berlaku, dan jawaban terpendek dalam byte akan menang.

DJMcMayhem
sumber
2
cerita latar belakang yang bagus!
TanMath
Bukankah Hey Jude 12 nas? Saya hanya mendengarkannya dan saya pikir itu (dalam hal panjang note) quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter, yaitu 12 nadetik.
Arcturus
4
@ Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-judepasti 11
quintopia
1
Batman adalah na na / na na / na na / na nax2 batman. Saya perhatikan bahwa kedua kalinya saya melihat komik.
wizzwizz4
2
Sudah 3 tahun terlambat untuk mengubah tantangan, tetapi saya harus menolak bahwa tema Katamari Damacy berjudul "Katamari on the Rocks" (atau jika Anda seorang purist, ini secara resmi "Katamari on the Rocks ~ Main Theme") dan dengan demikian seharusnya tidak hanya didaftar sebagai "Katamari Damacy"!
Nilai Tinta

Jawaban:

7

Retina , 242

Cobalah 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: 

Bagaimana itu bekerja:

Bendera IgnoreCase + Grep mode flag + Regex ^na( na)*$. Jika inputnya valid, cetaklah apa adanya. Jika tidak, cetak apa-apa.

iG`^na( na)*$

Bendera IgnoreCase + Mode pencocokan bendera + Regex na. Hitung "na" dan cetak nomornya.

iM`na

Jika string persis "8", ganti dengan baris kedua.

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

Jika string persis "10", ganti dengan baris kedua.

m`^10$
>Katamari Damacy,Yuu Miyake

Jika string persis "11", ganti dengan baris kedua.

m`^11$
>Hey Jude,The Beatles

Jika string cocok [0-9].+, ganti dengan baris kedua. Ini tidak berlaku untuk angka satu digit, 10dan 11karena mereka telah diganti atau pun string pengganti di atas.

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

Jika tidak ada yang di atas cocok, string masih dimulai dengan angka. Default untuk Toto, Afrika.

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

Ganti placeholder >dan ,dengan Song:dan Artist:.

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

Penjelasan

Input secara opsional dapat mengandung satu ruang tambahan.

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
)

Uji

pengguna81655
sumber
Ini tidak berfungsi untuk 9 na, ini menghasilkan kamari.
Rɪᴋᴇʀ
@RikerW Diperbaiki. Saya lupa koma ...
user81655
4

PowerShell, 278 byte

  • Dapat menangani jumlah spasi apa pun
  • Tidak ada regex apa pun!
  • FTW typecasting tersirat!
@{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'/')}

Tidak disatukan

@{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
    )
}

Pemakaian

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

sh + coreutils, 290

Meskipun lebih lama dari pada pengajuan saya yang lain, yang ini mudah dan tidak banyak diserang, jadi saya tetap memasukkannya.

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

Bagaimana itu bekerja:

Jika inputnya valid, cetaklah apa adanya. Jika tidak, cetak apa-apa.

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

Hitung kata-katanya.

wc -w

Tabel pencarian sederhana, Song:dan Artist:disimpan dalam variabel.

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.
sumber
Saya tahu sudah lama, tapi regex bisa disingkat ^(na ?)+$.
Kevin Cruijssen
1

Python 453 440 406 380 byte

EDIT: Terima kasih kepada Cyoce karena mengurangi 13 byte!

EDIT: Terima kasih lagi untuk Cyoce!

EDIT: Terima kasih kepada RainerP. untuk membantu saya meningkatkan algoritma pada kasus-kasus tertentu yang tidak valid.

Ini adalah konsep kasar dari program Python. Saya percaya itu pasti bisa golf, mungkin 300-400 byte. Tapi akan segera dikerjakan.

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]

Coba di sini!

TanMath
sumber
Alih-alih daftar panjang itu, gunakan"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
Juga: bukannya if i not in ["n","a"," "]: ...saya percaya Anda bisa menggunakan if i not in 'na ': .... Selain itu, if f==0: somecode; else: somemorecodedapat dikurangi menjadi if f: somemorecode; else: somecode(0 adalah Falsy)
Cyoce
Bahkan lebih (saya harus meletakkan ini semua dalam satu, oh well): Anda memiliki "\nArtist:"tiga kali. coba atur variabel, misalnya A="\nArtist:", lalu gunakan Asebagai ganti string literal. Hal yang sama bisa dilakukan dengan "Song:". Juga, saya pikir itu if n<8or n==9:f=10bisa dipindahkan ke atas pernyataan if dan diubah menjadiif n!=8:f=10
Cyoce
Program Anda gagal mendeteksi input yang tidak valid. Output Batman Themebukan Africauntuk na na na nan na na na na.
Rainer P.
@RainerP. Terima kasih ... Saya tahu saya kehilangan sesuatu ... Saya sekarang sedang bekerja pada algoritma yang diperbarui
TanMath
1

Julia, 325 byte

Mungkin bisa bermain golf lebih lanjut.

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
sumber
Saya tahu sudah lama, tapi regex bisa disingkat ^(na ?)+$.
Kevin Cruijssen
Juga, pemeriksaan dapat dipersingkat sedikit dengan menggunakan <dan >bukan ==: &&(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"). Di luar topik: Saya suka Avatar Anda. Selesai menonton SAO minggu lalu. ;)
Kevin Cruijssen
1

Karat, 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)}

Tidak disatukan

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: menghapus to_string yang tidak perlu dan ketik anotasi

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

Cobalah online!

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

Cobalah online!

Tidak Disatukan:

$_ = 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
sumber
Saya melewatkan beberapa kasus, mengerjakan perbaikan sekarang
pslessard
1

C (gcc) , 403 395 370 365 byte

-8 -5 bytes berkat ceilingcat

Cukup lurus ke depan.

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

Cobalah online!

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

Penjelasan:

Cobalah 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
sumber