क्या गाना बज रहा है?


33

इस xkcd से प्रेरित है

यहाँ छवि विवरण दर्ज करें

आप शाज़म के लिए काम करते हैं और उनके पास आपके लिए एक परियोजना है। कुछ ग्राहक अपने ऐप के बारे में शिकायत कर रहे हैं कि उनके फ़ोन में बहुत अधिक जगह है, इसलिए वे चाहते हैं कि आप ऐप के लाइट संस्करण को कोड करें। दुर्भाग्य से, आपका मौजूदा कोड केवल "ना" शब्द को समझ सकता है, और आपको जल्द ही जहाज करना होगा। यह ठीक है, हमने जो प्राप्त किया है, उसके साथ हम सबसे अच्छा करेंगे।

चुनौती

आपको एक पूर्ण प्रोग्राम लिखना होगा जो उपयोगकर्ता इनपुट लेता है, या कमांड लाइन तर्क लेता है, और गीत का शीर्षक और कलाकार प्रिंट करता है। चूंकि हम प्रोग्राम आकार के बारे में शिकायत करने वाले ग्राहकों को ठीक करने की कोशिश कर रहे हैं, इसलिए आपका कोड यथासंभव छोटा होना चाहिए। इनपुट एक स्ट्रिंग होगी जिसमें पूरी तरह से ना के साथ एक सिंगल स्पेस होगा, जिसके बीच में सिंगल स्पेस होगा। लोअरकेस / अपरकेस मनमाना है। इसे एक मान्य इनपुट माना जाता है: 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 या अधिक na का है, तो आपको प्रिंट करना होगा

Song: Land Of 1000 Dances
Artist: Wilson Pickett

अंत में, यदि इनपुट अमान्य है, तो 8 से कम na के हैं, या कोई भी शब्द "na" नहीं है, आपका प्रोग्राम संगीत को समझने में विफल है। इसलिए तार्किक रूप से, केवल एक अन्य गीत है जो संभवतः हो सकता है। आपको प्रिंट करना होगा:

Song: Africa
Artist: Toto

हमेशा की तरह, मानक कमियां लागू होती हैं, और बाइट्स में सबसे कम जवाब जीतता है।


2
महान पृष्ठभूमि की कहानी!
तनमठ

अरे यार 12 naएस नहीं है? मैंने सिर्फ इसे सुना और मुझे लगा कि यह (नोट की लंबाई के संदर्भ में) है quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarter, जो 12 naएस है।
आर्कटिकस

4
@ एम्पोरा 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
इस चुनौती को बदलने में 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 मोड ध्वज + Regex ^na( na)*$। यदि इनपुट वैध है, तो इसे प्रिंट करें। यदि नहीं, तो कुछ भी नहीं छापें।

iG`^na( na)*$

IgnoreCase ध्वज + मैच मोड ध्वज + Regex 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जैसा कि वे पहले ही निरस्त कर दिए गए हैं और न ही उपरोक्त प्रतिस्थापन स्ट्रिंग्स में से कोई भी।

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

यदि उपरोक्त में से कोई भी मेल नहीं खाता है, तो स्ट्रिंग अभी भी एक संख्या से शुरू होती है। टोटो, अफ्रीका के लिए डिफ़ॉल्ट।

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

प्लेसहोल्डर बदलें >और ,से Song:और Artist:

>
Song: 
,
$nArtist: 

5

जावास्क्रिप्ट (ईएस 6), 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

@ रिकरव फिक्स्ड। मैं एक कॉमा भूल गया ...
user81655

4

पॉवरशेल, 278 बाइट्स

  • व्हॉट्सएप की किसी भी राशि को संभाल सकते हैं
  • कोई regex जो भी!
  • अवैध टाइपकास्टिंग 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
    )
}

प्रयोग

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

श + कोरुटिल्स, 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

पायथन 453 440 406 380 बाइट्स

संपादित करें: 13 बाइट्स को कम करने के लिए साइओस को धन्यवाद!

संपादित करें: Cyoce को फिर से धन्यवाद!

EDIT: रेनरपी को धन्यवाद। कुछ अवैध मामलों पर एल्गोरिथ्म को लागू करने में मेरी मदद करने के लिए।

यह पायथन कार्यक्रम का एक मोटा मसौदा है। मेरा मानना ​​है कि यह निश्चित रूप से गोल्फ हो सकता है, शायद 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है
Cyoce

और भी (मुझे इन सभी को एक, ओह अच्छी तरह से रखना चाहिए): आपके पास "\nArtist:"तीन बार है। एक चर सेट करने का प्रयास करें, उदाहरण के लिए A="\nArtist:", फिर Aस्ट्रिंग शाब्दिक के स्थान पर उपयोग करना । उसी के साथ किया जा सकता है "Song:"। इसके अलावा, मुझे लगता है कि if n<8or n==9:f=10अगर बयानों के शीर्ष पर ले जाया जा सकता है और बदल दिया जाएगाif n!=8:f=10
Cyoce

आपका प्रोग्राम अमान्य इनपुट का पता लगाने में विफल है। आउटपुट है Batman Themeके बजाय Africaके लिए na na na nan na na na na
रेनर पी।

@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 ?)+$
केविन क्रूज़सेन

इसके अलावा, चेक का उपयोग करके थोड़ा छोटा किया जा सकता <है और >बजाय ==: &&(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 देखना समाप्त किया। ;)
केविन क्रूज़सेन

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

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

संपादित करें: एक अनावश्यक tostring हटा दिया और एनोटेशन टाइप करें



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

इसे ऑनलाइन आज़माएं!

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

मैं कुछ मामलों में चूक गया, अब एक फिक्स पर काम कर रहा हूं
pslessard

1

C (gcc) , 403 395 370 365 बाइट्स

-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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.