Bài hát nào đang phát?


33

Lấy cảm hứng từ xkcd này

nhập mô tả hình ảnh ở đây

Bạn làm việc cho Shazam và họ có một dự án cho bạn. Một số khách hàng phàn nàn về việc ứng dụng của họ chiếm quá nhiều dung lượng trên điện thoại của họ, vì vậy họ muốn bạn viết mã phiên bản rút gọn của ứng dụng. Thật không may, mã hiện tại của bạn chỉ có thể hiểu từ "na" và bạn phải giao hàng sớm. Không sao đâu, chúng tôi sẽ làm tốt nhất với những gì chúng tôi có.

Các thách thức

Bạn phải viết một chương trình đầy đủ lấy đầu vào của người dùng hoặc lấy đối số dòng lệnh và in tiêu đề và nghệ sĩ của bài hát. Vì chúng tôi đang cố gắng khắc phục khách hàng phàn nàn về quy mô chương trình, mã của bạn phải càng ngắn càng tốt. Đầu vào sẽ là một chuỗi bao gồm toàn bộ na, với một khoảng trống giữa chúng. Chữ thường / chữ hoa là tùy ý. Đây được coi là đầu vào hợp lệ: Na Na nA na NAĐây là đầu vào không hợp lệ: nah nah NA naNa bananaBạn phải xác định bài hát nào đang phát và in ra theo định dạng chính xác này:

Song: <trackname>
Artist: <artist>

Nếu đầu vào chính xác là 8 na, thì bài hát này khớp với hai bài hát riêng biệt, vì vậy bạn phải in cả hai:

Song: Batman Theme
Artist: Neal Hefti

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

Nếu đầu vào chính xác là 10 na, bạn phải in:

Song: Katamari Damacy
Artist: Yuu Miyake

Nếu đầu vào chính xác là 11 na, bạn phải in:

Song: Hey Jude
Artist: The Beatles

Nếu đầu vào là 12 na trở lên, bạn phải in

Song: Land Of 1000 Dances
Artist: Wilson Pickett

Cuối cùng, nếu đầu vào không hợp lệ, có ít hơn 8 na hoặc bất kỳ từ nào không phải là "na", chương trình của bạn không hiểu được âm nhạc. Vì vậy, về mặt logic, chỉ có một bài hát khác mà nó có thể có thể. Bạn phải in:

Song: Africa
Artist: Toto

Như thường lệ, các sơ hở tiêu chuẩn được áp dụng và câu trả lời ngắn nhất tính theo byte sẽ thắng.


2
câu chuyện nền tuyệt vời!
TanMath

Không phải là Jude 12 nas sao? Tôi chỉ nghe nó và tôi nghĩ rằng nó (về độ dài ghi chú) quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter, là 12 nagiây.
Arcturus

4
@Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-judechắc chắn 11
quintopia

1
Người dơi là na na / na na / na na / na nax2 batman. Tôi nhận thấy rằng lần thứ hai tôi thấy truyện tranh.
wizzwizz4

2
Đã 3 năm quá muộn để thay đổi thử thách, nhưng tôi phải phản đối rằng chủ đề Damam Katamari có tựa đề "Katamari on the Rocks" (hoặc nếu bạn là người theo chủ nghĩa thuần túy, thì chính thức là "Katamari on the Rocks ~ Main Theme") và do đó không nên được liệt kê là "Damam Katamari"!
Mực giá trị

Câu trả lời:


7

Võng mạc , 242

Hãy thử trực tuyến!

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: 

Làm thế nào nó hoạt động:

Cờ IgnoreCase + cờ chế độ Grep + Regex ^na( na)*$. Nếu đầu vào là hợp lệ, in nó như là. Nếu không, không in gì cả.

iG`^na( na)*$

Cờ IgnoreCase + Cờ chế độ khớp + Regex na. Đếm số "na" và in số.

iM`na

Nếu chuỗi chính xác là "8", hãy thay thế bằng dòng thứ hai.

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

Nếu chuỗi chính xác là "10", hãy thay thế bằng dòng thứ hai.

m`^10$
>Katamari Damacy,Yuu Miyake

Nếu chuỗi chính xác là "11", hãy thay thế bằng dòng thứ hai.

m`^11$
>Hey Jude,The Beatles

Nếu chuỗi khớp [0-9].+, thay thế bằng dòng thứ hai. Điều này không đúng với các số có một chữ số 1011vì chúng đã được lặp lại cũng như bất kỳ chuỗi thay thế nào ở trên.

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

Nếu không có cái nào ở trên khớp, chuỗi vẫn bắt đầu bằng một số. Mặc định là Toto, Châu Phi.

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

Thay thế chỗ dành sẵn >,bởi Song: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: `))

Giải trình

Đầu vào có thể tùy ý chứa một dấu cách.

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
)

Kiểm tra


Điều này không hoạt động trong 9 na, nó xuất ra kamari.
Rɪᴋᴇʀ

@RikerW Đã sửa. Tôi đã quên dấu phẩy ...
user81655

4

PowerShell, 278 byte

  • Có thể xử lý bất kỳ số lượng khoảng trắng
  • Không có regex nào!
  • FTW đánh máy ngầm!
@{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'/')}

Bị đánh cắp

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

Sử dụng

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

Mặc dù dài hơn so với đệ trình khác của tôi, bài này rất đơn giản và khá vô dụng, vì vậy tôi đã bao gồm nó.

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

Làm thế nào nó hoạt động:

Nếu đầu vào là hợp lệ, in nó như là. Nếu không, không in gì cả.

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

Đếm các từ.

wc -w

Bảng tra cứu đơn giản, Song:Artist:được giữ trong các biến.

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

Tôi biết đó là một thời gian, nhưng regex có thể được rút ngắn ^(na ?)+$.
Kevin Cruijssen

1

Python 453 440 406 380 byte

EDIT: Cảm ơn Cyoce vì đã giảm 13 byte!

EDIT: Một lần nữa xin cảm ơn Cyoce!

EDIT: Cảm ơn RainerP. đã giúp tôi áp dụng thuật toán vào một số trường hợp không hợp lệ.

Đây là bản nháp sơ bộ của chương trình Python. Tôi tin rằng nó có thể được chơi chắc chắn, có thể tới 300-400 byte. Nhưng sẽ làm việc trên đó sớm.

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]

Thử ở đây!


Thay vì danh sách dài đó, hãy sử dụng"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

Ngoài ra: thay vì if i not in ["n","a"," "]: ...tôi tin rằng bạn có thể sử dụng if i not in 'na ': .... Ngoài ra, if f==0: somecode; else: somemorecodecó thể giảm xuống if f: somemorecode; else: somecode(0 là Falsy)
Cyoce

Thậm chí nhiều hơn (đáng lẽ tôi nên đặt tất cả những thứ này thành một, ồ tốt): bạn có "\nArtist:"ba lần. hãy thử đặt một biến, ví dụ A="\nArtist:", sau đó sử dụng Athay cho chuỗi ký tự. Điều tương tự có thể được thực hiện với "Song:". Ngoài ra, tôi nghĩ rằng if n<8or n==9:f=10có thể được chuyển lên đầu câu lệnh if và đổi thànhif n!=8:f=10
Cyoce

Chương trình của bạn không phát hiện đầu vào không hợp lệ. Đầu ra là Batman Themethay vì Africacho na na na nan na na na na.
Rainer P.

@RainerP. Cảm ơn bạn ... Tôi biết tôi đã bỏ lỡ điều gì đó ... Tôi hiện đang làm việc với một thuật toán được cập nhật
TanMath

1

Julia, 325 byte

Có lẽ có thể được chơi golf hơn nữa.

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

Tôi biết đó là một thời gian, nhưng regex có thể được rút ngắn ^(na ?)+$.
Kevin Cruijssen

Ngoài ra, kiểm tra có thể được rút ngắn một chút bằng cách sử dụng <>thay vì ==: &&(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: Tôi thích Avatar của bạn. Xem xong SAO tuần trước. ;)
Kevin Cruijssen

1

Rỉ 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)}

Bị đánh cắp

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

Chỉnh sửa: đã xóa một chú thích to_ chuỗi và loại không cần thiết


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

Hãy thử trực tuyến!


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

Hãy thử trực tuyến!

Ung dung:

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

Tôi đã bỏ lỡ một số trường hợp, đang sửa lỗi ngay bây giờ
pslessard

1

C (gcc) , 403 395 370 365 byte

-8 -5 byte nhờ trần

Khá nhiều như thẳng về phía trước có thể.

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

Hãy thử trực tuyến!


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

Giải trình:

Hãy thử trực tuyến.

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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.