どの曲が再生されていますか?


33

このxkcdに触発された

ここに画像の説明を入力してください

あなたはシャザムで働いており、彼らはあなたのためのプロジェクトを持っています。一部の顧客は、アプリが携帯電話で多くのスペースを占有していることに不満を持っているため、アプリのライトバージョンをコーディングしてほしいと考えています。残念ながら、既存のコードは「na」という単語しか理解できないため、すぐに出荷する必要があります。それは大丈夫です、私たちは持っているもので最善を尽くします。

チャレンジ

ユーザー入力またはコマンドライン引数を取る完全なプログラムを作成し、曲のタイトルとアーティストを印刷する必要があります。プログラムのサイズについて不満を持っているお客様を修正しようとしているため、コードはできるだけ短くする必要があります。入力はnaのみで構成された文字列であり、その間に単一のスペースがあります。小文字/大文字は任意です。これは有効な入力と見なされます:Na Na nA na NAこれは無効な入力です:nah nah NA naNa bananaどの曲が再生されているかを判断し、正確に次の形式で出力する必要があります。

Song: <trackname>
Artist: <artist>

入力が正確に 8 naの場合、これは2つの別個の曲に一致するため、両方を印刷する必要があります。

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以上のnaの場合、印刷する必要があります

Song: Land Of 1000 Dances
Artist: Wilson Pickett

最後に、入力が無効であるか、naが8個未満であるか、いずれかの単語が「na」ではない場合、プログラムは音楽を理解できません。論理的には、他の歌はたった1つしかありません。印刷する必要があります:

Song: Africa
Artist: Toto

通常どおり、標準の抜け穴が適用され、バイト単位の最短回答が優先されます。


2
素晴らしい背景ストーリー!
TanMath

Hey Jude 12 nasではありませんか?私はそれを聞いたところ、それは(音符の長さに関して)quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter12 na秒であると思いました。
アークトゥルス

4
@Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-jude間違いなく11
quintopia

1
バットマンはna na / na na / na na / na nax2 batmanです。コミックを二度目に見たことに気づきました。
wizzwizz4

2
チャレンジを変えるのに3年も遅すぎますが、塊魂のテーマが「塊の岩」と題されていることに異議を唱える必要がありますただ「塊魂」としてリストされるべきではありません!
バリューインク

回答:


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フラグ+をGrepモードフラグ+正規表現^na( na)*$。入力が有効な場合は、そのまま印刷します。そうでない場合は、何も印刷しません。

iG`^na( na)*$

IgnoreCaseフラグ+一致モードフラグ+正規表現na。「na」を数え、数字を印刷します。

iM`na

文字列が正確に「8」の場合、2行目で置き換えます。

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

文字列が正確に「10」の場合、2行目で置き換えます。

m`^10$
>Katamari Damacy,Yuu Miyake

文字列が正確に「11」の場合、2行目で置き換えます。

m`^11$
>Hey Jude,The Beatles

文字列が一致する場合、[0-9].+2行目で置き換えます。これは、1桁の数のためでもない真実である、1011彼らはすでにrepacedも上記の置換文字列のいずれかされているよう。

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

上記のいずれにも一致しない場合、文字列はまだ数字で始まります。デフォルトはアフリカのトトです。

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

プレースホルダを交換>して,によってSong:Artist:

>
Song: 
,
$nArtist: 

5

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

説明

オプションで、入力に末尾スペースを1つ含めることができます。

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 ?)+$
ケビンクルーッセン

1

Pythonの453 440 406 380バイト

編集: 13バイトを削減してくれたCyoceに感謝します!

編集: Cyoceに再び感謝します!

編集: RainerPに感謝します。特定の無効なケースでアルゴリズムを改善する手助けをしてくれました。

これはPythonプログラムの大まかなドラフトです。おそらく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 ': ...。さらに、(0は偽です)にif f==0: somecode; else: somemorecode減らすことができますif f: somemorecode; else: somecode
チョイス

さらに(これらをすべて1つにまとめる必要があります):"\nArtist:"3回あります。たとえばA="\nArtist:"、変数を設定してAから、文字列リテラルの代わりに使用してみてください。同じことをで行うことができます"Song:"。また、私は考えているif n<8or n==9:f=10if文の先頭に移動し、に変更することができますif n!=8:f=10
Cyoce

プログラムは無効な入力の検出に失敗します。出力はのBatman Theme代わりにAfricaなりna na na nan na na na naます。
レイナー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 ?)+$
ケビンクルーッセン

また、:の代わりに<and を使用して、チェックを少し短くすることができます。トピック外:私はあなたのアバターが好きです。先週、SAOの視聴を終了しました。;)>==&&(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")
ケビンクルーイッセン

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

Perl -pa 5、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

パール5312の 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

Java 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.