กำลังเล่นเพลงอะไร


33

แรงบันดาลใจจากxkcd นี้

ป้อนคำอธิบายรูปภาพที่นี่

คุณทำงานให้กับแซมและพวกเขามีโครงการสำหรับคุณ ลูกค้าบางรายบ่นว่าแอพของพวกเขาใช้พื้นที่มากเกินไปในโทรศัพท์ของพวกเขาดังนั้นพวกเขาต้องการให้คุณเขียนโค้ดแอพเวอร์ชัน lite น่าเสียดายที่รหัสที่มีอยู่ของคุณสามารถเข้าใจคำว่า "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 หรือมากกว่าของ na คุณต้องพิมพ์

Song: Land Of 1000 Dances
Artist: Wilson Pickett

สุดท้ายถ้าอินพุตไม่ถูกต้องมีน้อยกว่า 8 na หรือคำใด ๆ ที่ไม่ใช่ "na" โปรแกรมของคุณไม่สามารถเข้าใจเพลงได้ ดังนั้นเหตุผลมีเพียงหนึ่งเพลงอื่น ๆ ที่อาจเป็นได้ คุณต้องพิมพ์:

Song: Africa
Artist: Toto

ตามปกติจะใช้ช่องโหว่มาตรฐานและคำตอบที่สั้นที่สุดในหน่วยไบต์จะเป็นผู้ชนะ


2
เรื่องราวเบื้องหลังที่ยอดเยี่ยม!
TanMath

นี่ไม่ใช่ Hey Jude 12 naหรือ ฉันเพิ่งฟังมันและฉันคิดว่ามันเป็น (ในแง่ของความยาวโน้ต) quarter quarter quarter quarter / eighth sixteenth sixteenth quarter-quarter-quarter / eighth sixteenth quarter-quarter-quarterซึ่งเป็น 12 naวินาที
Arcturus

4
@Ampora onnnnnnnnne-one-three-one-a-two-threeeeeeeeeee-one-a-two-threeeeeeee-hey-judeแน่นอน 11
quintopia

1
แบทแมนเป็นx2na na / na na / na na / na na batmanฉันสังเกตเห็นว่าครั้งที่สองที่ฉันเห็นการ์ตูน
wizzwizz4

2
มันสายเกินไปที่จะเปลี่ยนความท้าทายเป็นเวลา 3 ปี แต่ฉันต้องคัดค้านว่าธีม Katamari Damacy มีชื่อว่า "Katamari on the Rocks" (หรือถ้าคุณเป็นคนเจ้าระเบียบมันเป็นทางการ "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 ธง + Grep ธงโหมด + ^na( na)*$Regex หากอินพุตถูกต้องให้พิมพ์ตามที่เป็นอยู่ ถ้าไม่พิมพ์อะไร

iG`^na( na)*$

IgnoreCase ธง + Match ธงโหมด + naRegex นับ "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

หากไม่ตรงกับข้างต้นสตริงยังคงเริ่มต้นด้วยตัวเลข เริ่มต้นที่ Toto, แอฟริกา

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

คำอธิบาย

อินพุตอาจเป็นทางเลือกหนึ่งที่มีพื้นที่ต่อท้าย

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 นา แต่มันส่งผลให้คามาริ
Rɪᴋᴇʀ

@RikerW แก้ไข ฉันลืมเครื่องหมายจุลภาค ...
user81655

4

PowerShell ขนาด 278 ไบต์

  • สามารถจัดการกับช่องว่างจำนวนเท่าใดก็ได้
  • ไม่มี regex ใด ๆ !
  • typecasting 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

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

ฉันรู้ว่ามันใช้เวลานาน แต่ regex สามารถย่อให้สั้นลง^(na ?)+$ได้
Kevin Cruijssen

1

Python 453 440 406 380 ไบต์

แก้ไข:ขอบคุณ Cyoce สำหรับการลด 13 ไบต์!

แก้ไข:ขอบคุณ 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 ': ...แทน นอกจากนี้if f==0: somecode; else: somemorecodeสามารถลดลงเป็นif f: somemorecode; else: somecode(0 เป็นเท็จ)
Cyoce

ยิ่งกว่านั้น (ฉันควรจะใส่สิ่งเหล่านี้ไว้ในที่เดียวดีมาก): คุณมี"\nArtist:"สามครั้ง ลองตั้งค่าตัวแปรเช่นA="\nArtist:"จากนั้นใช้Aแทนตัวอักษรสตริง "Song:"เช่นเดียวกับที่สามารถทำได้ด้วย นอกจากนี้ฉันคิดว่าif n<8or n==9:f=10สามารถย้ายไปด้านบนของคำสั่ง if และเปลี่ยนเป็นif n!=8:f=10
Cyoce

โปรแกรมของคุณตรวจสอบอินพุตที่ไม่ถูกต้อง เอาท์พุทเป็นBatman ThemeแทนสำหรับAfrica na na na nan na na na na
Rainer P.

@RainerP ขอบคุณ ... ฉันรู้ว่าฉันขาดอะไรบางอย่างไป ... ตอนนี้ฉันกำลังทำงานกับอัลกอริทึมที่ได้รับการอัปเดต
TanMath

1

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

ฉันรู้ว่ามันใช้เวลานาน แต่ regex สามารถย่อให้สั้นลง^(na ?)+$ได้
Kevin Cruijssen

นอกจากนี้การตรวจสอบสามารถสั้นลงเล็กน้อยโดยใช้<และ>แทนที่จะเป็น==: &&(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

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

แก้ไข: ลบคำอธิบายประกอบ to_string และประเภทคำอธิบายที่ไม่จำเป็นออก



1

Perl 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

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.