Hangi şarkıyı çalıyor?


33

Bu xkcd'den ilham alındı

görüntü tanımını buraya girin

Shazam için çalışıyorsun ve senin için bir projeleri var. Bazı müşteriler, uygulamalarında, telefonlarında çok fazla yer kapladığından şikayet ediyorlar, bu nedenle uygulamanın bir lite sürümünü kodlamanızı istiyorlar. Ne yazık ki, mevcut kodunuz yalnızca "na" kelimesini anlayabilir ve yakında göndermeniz gerekir. Sorun değil, elimizdekilerle en iyisini yapacağız.

Meydan okuma

Kullanıcı girişi veya komut satırı argümanı alan tam bir program yazmalı ve şarkının başlığını ve sanatçısını yazdırmalısınız. Müşterileri program boyutundan şikayetçi bulmaya çalıştığımızdan, kodunuz mümkün olduğu kadar kısa olmalıdır. Giriş, tamamen na'den oluşan ve aralarında tek bir boşluk bulunan bir dize olacaktır. Küçük harf / büyük harf keyfidir. Bu geçerli bir girdi olarak kabul edilir: Na Na nA na NABu geçersiz bir girdidir: nah nah NA naNa bananaHangi şarkının çalınacağını belirlemeniz ve tam olarak bu biçimde yazdırmanız gerekir:

Song: <trackname>
Artist: <artist>

Giriş tam olarak 8 na ise, bu iki ayrı şarkı ile eşleşir, bu yüzden ikisini de yazdırmanız gerekir:

Song: Batman Theme
Artist: Neal Hefti

ve

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

Giriş tam olarak 10 na ise, şunu yazdırmalısınız:

Song: Katamari Damacy
Artist: Yuu Miyake

Giriş tam olarak 11 na ise, şunu yazdırmalısınız:

Song: Hey Jude
Artist: The Beatles

Giriş 12 veya daha fazla na ise, yazdırmanız gerekir.

Song: Land Of 1000 Dances
Artist: Wilson Pickett

Son olarak, eğer girdi geçersizse, 8 ’den daha az karakter vardır veya kelimelerden herhangi biri na na’ değilse, programınız müziği anlayamaz. Bu yüzden mantıklı, olabileceği tek bir şarkı daha var. Yazdırmanız gerekir:

Song: Africa
Artist: Toto

Her zaman olduğu gibi standart boşluklar uygulanır ve bayt cinsinden en kısa cevap kazanır.


2
harika bir arka plan hikayesi!
TanMath

Hey Jude 12 nas değil mi? Ben sadece dinledim ve quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter12 nas olan (nota uzunlukları açısından) olduğunu düşündüm .
Arcturus,

4
@Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-judekesinlikle 11
quintopia

1
Batman na na / na na / na na / na nax2 batman. Karikatürü ikinci kez gördüğümde farkettim.
wizzwizz4

2
Mücadeleyi değiştirmek için 3 yıl geç kaldı, ancak Katamari Damacy temasının "Kayalar Üzerindeki Katamari" (veya bir saf iseniz, resmen "Kayalar Üzerindeki Katamari ~ Ana Tema") olduğunu itiraz etmeliyim. sadece "Katamari Damacy" olarak listelenmemelidir!
Değer Mürekkep

Yanıtlar:


7

Retina , 242

Çevrimiçi deneyin!

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: 

Nasıl çalışır:

IgnoreCase bayrağı + Grep modu bayrağı + Regex ^na( na)*$. Giriş geçerliyse, olduğu gibi yazdırın. Değilse, hiçbir şey yazdırmayın.

iG`^na( na)*$

IgnoreCase bayrağı + Maç modu bayrağı + Regex na . "Na" s sayın ve numarayı yazdırın.

iM`na

Dize tam olarak "8" ise, ikinci satırla değiştirin.

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

Dize tam olarak "10" ise, ikinci satırla değiştirin.

m`^10$
>Katamari Damacy,Yuu Miyake

Dize tam olarak "11" ise, ikinci satırla değiştirin.

m`^11$
>Hey Jude,The Beatles

Dize eşleşirse, [0-9].+ikinci satırla değiştirin. Bu, tek haneli sayılar için geçerli değildir 10ve11 bunlar önceden düzeltildiği gibi veya yukarıdaki değiştirme dizgilerinden herhangi biri için de geçerlidir.

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

Yukarıdakilerin hiçbiri eşleşmediyse, dize hala bir sayı ile başlar. Varsayılan olarak Toto, Afrika.

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

Yer tutucuları değiştirin >ve ,tarafından Song:ve Artist:.

>
Song: 
,
$nArtist: 

5

JavaScript (ES6), 276 bayt

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

açıklama

Giriş isteğe bağlı olarak bir sondaki boşluk içerebilir.

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
)

Ölçek


Bu 9 na için işe yaramaz, kamari çıkarır.
Rɪᴋᴇʀ

@RikerW Sabit. Bir virgül unuttum ...
user81655 23

4

PowerShell, 278 bayt

  • Herhangi bir boşluk miktarını kaldırabilir
  • Hiçbir regex yok!
  • Kapalı tip tahmini 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
    )
}

kullanım

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

Diğer sunumlarımdan daha uzun sürse de, bu basit ve neredeyse hiç sağlam değildi, bu yüzden yine de ekledim.

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

Nasıl çalışır:

Giriş geçerliyse, olduğu gibi yazdırın. Değilse, hiçbir şey yazdırmayın.

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

Kelimeleri sayın.

wc -w

Basit arama tablosu Song:ve Artist:değişkenlerde tutulur.

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

Bir süre geçtiğini biliyorum, ancak regex kısaltılabilir ^(na ?)+$.
Kevin Cruijssen

1

Python 453 440 406 380 bayt

EDIT: 13 byte'ı düşürdüğü için Cyoce'ye teşekkürler!

EDIT: Cyoce'ye tekrar teşekkürler!

DÜZENLE: RainerP sayesinde. Bazı geçersiz durumlarda algoritmayı geliştirmeme yardım ettiğim için.

Bu bir Python programının kaba bir taslağıdır. Kesinlikle, belki de 300-400 byte'a kadar golf oynayabileceğine inanıyorum. Ama yakında bunun üzerinde çalışacak.

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]

Burada dene!


Bu uzun liste yerine, kullanın"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

Ayrıca: yerine if i not in ["n","a"," "]: ...kullanabileceğine inanıyorum if i not in 'na ': .... Buna ek olarak, if f==0: somecode; else: somemorecodeindirgenebilir if f: somemorecode; else: somecode(0 Falsy olan)
Cyoce

Daha da fazlası (hepsini bir araya getirmeliydim, oh peki): "\nArtist:"üç kez var. değişkeni ayarlamayı deneyin, örneğin A="\nArtist:", Atam anlamıyla dizenin yerine onu kullanarak . Aynı şey yapılabilir "Song:". Ayrıca, ben düşünüyorum o if n<8or n==9:f=10takdirde tabloların üstüne taşındı ve değiştirilebilirif n!=8:f=10
Cyoce

Programınız geçersiz girdi algılayamıyor. Çıktı olduğu Batman Themeyerine Africaiçin na na na nan na na na na.
Rainer P.

@RainerP. Teşekkürler ... Bir şeylerin eksik olduğunu biliyordum ... Şimdi güncellenmiş bir algoritma üzerinde çalışıyorum
TanMath

1

Julia, 325 bayt

Muhtemelen daha fazla golf oynayabilirdi.

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

Bir süre geçtiğini biliyorum, ancak regex kısaltılabilir ^(na ?)+$.
Kevin Cruijssen

Ayrıca, kontrol kullanarak biraz kısaltılabilir <ve >yerine ==: &&(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"). Konu dışı: Avatarını beğendim. Geçen hafta SAO izlemeyi bitirdim. ;)
Kevin Cruijssen

1

Pas, 501 477 bayt

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

Düzenleme: gereksiz bir to_string kaldırıldı ve açıklama yazın


1

Perl 5 -pa , 248 bayt

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

Çevrimiçi deneyin!


1

Perl 5 , 312 292 bayt

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

Çevrimiçi deneyin!

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

Şimdi bazı düzeltmeler üzerinde çalışarak bazı vakaları kaçırdım
pslessard

1

C (gcc) , 403 395 370 365 bayt

-Katıcı sayesinde -8 -5 bayt

Olabildiğince doğrudan ileri.

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

Çevrimiçi deneyin!


0

Java 8, 353 bayt

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

Açıklama:

Çevrimiçi deneyin.

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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.