어떤 노래가 재생되고 있습니까?


33

이 xkcd에서 영감을 얻은

여기에 이미지 설명을 입력하십시오

당신은 Shazam을 위해 일하고 그들은 당신을위한 프로젝트를 가지고 있습니다. 일부 고객은 앱이 휴대 전화에서 너무 많은 공간을 차지한다고 불평하고 있으므로 앱의 라이트 버전을 코딩하기를 원합니다. 불행히도 기존 코드는 "na"라는 단어 만 이해할 수 있으며 곧 배송해야합니다. 괜찮습니다. 우리는 우리가 가진 것에 최선을 다할 것입니다.

도전

사용자 입력을 받거나 명령 줄 인수를 사용하여 노래의 제목과 아티스트를 인쇄하는 전체 프로그램을 작성해야합니다. 고객이 프로그램 크기에 대해 불평하는 문제를 해결하려고하므로 코드는 가능한 짧아야합니다. 입력은 전적으로 na로 구성된 문자열이며, 그 사이에 공백이 하나 있습니다. 소문자 / 대문자는 임의적입니다. 이것은 유효한 입력으로 간주됩니다 : Na Na nA na NA이것은 유효하지 않은 입력입니다 : nah nah NA naNa banana어떤 노래가 재생되고 있는지를 결정하고 정확하게이 형식으로 인쇄해야합니다 :

Song: <trackname>
Artist: <artist>

입력이 정확히 8 na 인 경우 두 개의 개별 노래와 일치하므로 두 가지 모두를 인쇄해야합니다.

Song: Batman Theme
Artist: Neal Hefti

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

입력 값이 정확히 10 na 인 경우 다음을 인쇄해야합니다.

Song: Katamari Damacy
Artist: Yuu Miyake

입력 값이 정확히 11 na 인 경우 다음을 인쇄해야합니다.

Song: Hey Jude
Artist: The Beatles

입력 값이 12 이상인 경우 인쇄해야합니다

Song: Land Of 1000 Dances
Artist: Wilson Pickett

마지막으로, 입력이 유효하지 않거나 8 na보다 작거나 단어가 "na"가 아닌 경우 프로그램이 음악을 이해하지 못합니다. 논리적으로 볼 수있는 다른 노래는 하나뿐입니다. 다음을 인쇄해야합니다.

Song: Africa
Artist: Toto

평소와 같이 표준 허점이 적용되고 바이트 단위의 최단 답변이 이깁니다.


2
멋진 배경 이야기!
TanMath

Jude 12 nas 아닙니까? 방금 들어 보았고 (노트 길이 측면에서) quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter12 na초 라고 생각했습니다 .
Arcturus

4
@Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-jude확실히 11
퀸 토피아

1
배트맨은 na na / na na / na na / na nax2 batman입니다. 나는 두 번째로 만화를 보았습니다.
wizzwizz4

2
도전을 바꾸기에는 너무 늦었지만, Katamari Damacy 테마는 "Katamari on the Rocks"라는 제목에 반대해야합니다. 단순히 "Katamari Damacy"로 표시되어서는 안됩니다!
가치 잉크

답변:


7

망막 , 242

온라인으로 사용해보십시오!

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: 

작동 방식 :

IgnoreCase를 플래그 + 그렙 모드 플래그 + 정규식 ^na( na)*$. 입력이 유효하면 그대로 인쇄하십시오. 그렇지 않은 경우 아무것도 인쇄하지 마십시오.

iG`^na( na)*$

무시 플래그 + 일치 모드 플래그 + Regex na. "na"를 세고 숫자를 인쇄하십시오.

iM`na

문자열이 정확히 "8"이면 두 번째 줄로 바꿉니다.

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

문자열이 정확히 "10"이면 두 번째 줄로 바꿉니다.

m`^10$
>Katamari Damacy,Yuu Miyake

문자열이 정확히 "11"이면 두 번째 줄로 바꿉니다.

m`^11$
>Hey Jude,The Beatles

문자열이과 일치 [0-9].+하면 두 번째 줄로 바꿉니다. 이 한 자리 숫자도 마찬가지입니다, 10그리고 11그들은 이미 repaced이나 한 것처럼 위의 대체 문자열의.

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

위와 일치하는 것이 없으면 문자열은 여전히 ​​숫자로 시작합니다. 기본값은 아프리카 토토입니다.

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

자리 표시 자 교체 >,Song:Artist:.

>
Song: 
,
$nArtist: 

5

자바 스크립트 (ES6), 276 바이트

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

설명

입력은 선택적으로 하나의 후행 공백을 포함 할 수 있습니다.

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
)

테스트


이것은 9 na에서는 작동하지 않으며 kamari를 출력합니다.
Rɪᴋᴇʀ

@RikerW 수정되었습니다. 쉼표를 잊어 버렸습니다 ...
user81655

4

PowerShell, 278 바이트

  • 여백을 처리 할 수 ​​있습니다
  • 정규 표현식이 없습니다!
  • 암시 적 타입 캐스팅 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'/')}

언 골프

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

용법

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

내 다른 제출물보다 더 길지만 이것은 간단하고 거의 골치가 없어서 어쨌든 포함 시켰습니다.

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

작동 방식 :

입력이 유효하면 그대로 인쇄하십시오. 그렇지 않은 경우 아무것도 인쇄하지 마십시오.

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

단어를 세어보세요.

wc -w

간단한 테이블까지 표정 Song:과는 Artist:변수에 보관됩니다.

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

시간이 오래 걸린다는 것을 알고 있지만 정규 표현식을로 단축 할 수 있습니다 ^(na ?)+$.
케빈 크루이 ssen

1

파이썬 453 440 406 380 바이트

편집 : 13 바이트를 줄인 Cyoce에게 감사드립니다!

편집 : Cyoce에 다시 한번 감사드립니다!

편집 : RainerP 덕분에. 잘못된 경우에 알고리즘을 적용하는 데 도움이되었습니다.

이것은 파이썬 프로그램의 초안입니다. 나는 확실히 300-400 바이트로 골프를 칠 수 있다고 생각합니다. 그러나 곧 작동합니다.

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]

여기를보십시오!


긴 목록 대신"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

또한 : 대신 if i not in ["n","a"," "]: ...당신이 사용할 수 있다고 생각합니다 if i not in 'na ': .... 또한 if f==0: somecode; else: somemorecode감소 될 수있다 if f: somemorecode; else: somecode(0 Falsy이다)
Cyoce

더 많은 것 (이 모든 것을 하나로 묶어야했을 것입니다) : 당신은 "\nArtist:"세 번 있습니다. 변수를 설정하십시오 (예 : 문자열 리터럴 대신 A="\nArtist:"사용) A. 로도 마찬가지입니다 "Song:". 또한, 나는 if 문의 맨 위로 이동하여 다음과 같이 변경할 수 있다고 생각 합니다.if n<8or n==9:f=10if n!=8:f=10
Cyoce

프로그램이 유효하지 않은 입력을 감지하지 못했습니다. 출력은 Batman Theme대신 Africana na na nan na na na na.
Rainer P.

@RainerP. 고마워요 ... 뭔가 빠졌음을 알았습니다 ... 이제 업데이트 된 알고리즘을 개발 중입니다
TanMath

1

줄리아, 325 바이트

아마 더 골프를 쳤다.

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

시간이 오래 걸린다는 것을 알고 있지만 정규 표현식을로 단축 할 수 있습니다 ^(na ?)+$.
케빈 크루이 ssen

또한, 검사하여 조금 짧게 할 수 <>대신을 ==: &&(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"). 주 제외 : 나는 당신의 아바타를 좋아합니다. 지난 주 SAO 시청을 마쳤습니다. ;)
Kevin Cruijssen 8:20에

1

녹, 501 477 바이트

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

언 골프

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

편집 : 불필요한 to_string 및 type 주석을 제거했습니다.


1

펄 5 -pa , 248 바이트

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

온라인으로 사용해보십시오!


1

펄 5 , 312 292 바이트

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

온라인으로 사용해보십시오!

언 골프 드 :

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

1

C (GCC) , 403 (395) 370 365 바이트

ceilingcat 덕분에 -8-5 바이트

최대한 간단합니다.

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

온라인으로 사용해보십시오!


0

자바 8, 353 바이트

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

설명:

온라인으로 사용해보십시오.

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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.