Codegolf – Какая Песня Играет?

  • Автор темы Vfvfymrf1
  • Обновлено
  • 23, Oct 2024
  • #1

Вдохновлено это xkcd

codegolf – Какая песня играет?

Вы работаете в Shazam, и у них есть для вас проект. Некоторые клиенты жалуются, что их приложение занимает слишком много места на телефоне, поэтому они хотят, чтобы вы написали облегченную версию приложения. К сожалению, ваш существующий код понимает только слово «на», и вам скоро придется его выпустить. Ничего страшного, мы сделаем все возможное, используя то, что у нас есть.

Вызов

Вы должны написать полную программу, которая принимает вводимые пользователем данные или принимает аргумент командной строки и печатает название и исполнителя песни. Поскольку мы пытаемся исправить жалобы клиентов на размер программы, ваш код должен быть как можно короче. Входными данными будет строка, полностью состоящая из символов na с одним пробелом между ними. Нижний/верхний регистр произволен. Это считается допустимым вводом:

 
 
 
 
 
 
 Song: Africa
Artist: Toto
 
This is an invalid input: Song: Land Of 1000 Dances Artist: Wilson Pickett Вы должны определить, какая песня играет, и распечатать ее именно в таком формате:

Song: Hey Jude Artist: The Beatles

Если вход точно 8 нет, это соответствует двум отдельным песням, поэтому вы должны вывести обе:

Song: Katamari Damacy Artist: Yuu Miyake

и

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

Если вход точно 10 штук, вы должны напечатать:

Song: Batman Theme Artist: Neal Hefti

Если вход точно 11 дней, вы должны напечатать:

Song: <trackname> Artist: <artist>

Если введено 12 или более значений na, вы должны вывести

nah nah NA naNa banana

Наконец, если введенные данные недействительны, имеется менее 8 символов na или какое-либо из слов не имеет значения «na», ваша программа не сможет понять музыку. Логично, что это может быть только одна песня. Вы должны распечатать:

Na Na nA na NA

Как обычно, применяются стандартные лазейки, и побеждает самый короткий ответ в байтах.

#код-гольф #колмогоров-сложность See More

Vfvfymrf1


Рег
20 Mar, 2020

Тем
85

Постов
214

Баллов
639
  • 26, Oct 2024
  • #2

Сетчатка, 242

Попробуйте онлайн!

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 "song artist" 

Как это работает:

Флаг IgnoreCase + флаг режима Grep + регулярное выражение „ŽŸŒá . If the input is valid, print it as is. If not, print nothing.

"africa0 Toto\nbatman theme0Neal Hefti0ÿ hey hey kiss him goodbye0 steam\n\nKatamari damarcy0Yuu Miyake\nhey Jude0 the beatles\nland of 2 dances0 wilson pickett"

Флаг IgnoreCase + Флаг режима сопоставления + Regex “‹…0Toto ߃›Ì0Neal Hefti0ÿ¤·¤··—„š‚¿bye0ÁÜ\n\nKatamariÊÖacy0Yuu Miyake\n¤· Jude0€€ÊÄ\nˆÑ€‚ 2–›s0¦‹šèett“ . Count the "na"s and print the number.

l # Convert the (implicit) input-string to lowercase # # Split it on spaces (if there are any) „naQ # Check for each word if it's equal to "na" (1 if truthy; 0 if falsey) W # Push its minimum, without popping the list itself * # Multiply that to all integers # (if any word wasn't "na", the entire list now only contains 0s) O # Sum this list to get the amount of "na"s 5Ý # Push the list [0,1,2,3,4,5] 8+ # Add 8 to each: [8,9,10,11,12,13] @ # Check for each if the sum is larger than or equal to this value # (1 if sum>=n, 0 if sum<n) O # Sum to get the amount of truthy values I # Push the input-string 5£ # Pop and only leave its first 5characters (if it's a valid string, # this will be "na na" - with variable casing) “‹…0Toto ߃›Ì0Neal Hefti0ÿ¤·¤··—„š‚¿bye0ÁÜ KatamariÊÖacy0Yuu Miyake ¤· Jude0€€ÊÄ ˆÑ€‚ 2–›s0¦‹šèett“ # Push dictionary string "africa0 Toto\nbatman theme0Neal Hefti0ÿ hey hey kiss him goodbye0 steam\n\nKatamari damarcy0Yuu Miyake\nhey Jude0 the beatles\nland of 2 dances0 wilson pickett", # where the `ÿ` is automatically replaced with the 5-char string ¶¡ # Split this string on newlines 0δ¡ # And then split each inner string on 0s # [["africa"," Toto"], # ["batman theme","Neal Hefti","na na hey hey kiss him goodbye"," steam"], # [], # ["Katamari damarcy","Yuu Miyake"], # ["hey Jude"," the beatles"], # ["land of 2 dances"," wilson pickett"]] 2₄: # Replace the 2 with 1000 ¬ # Get the first pair (without popping): ["africa"," Toto"] 2ǝ # Insert it at (0-based) index 2, replacing the empty list „ŽŸŒá # Push dictionary string "song artist" # # Split it on spaces: ["song","artist"] Þ # Cycle this list infinitely: ["song","artist","song","artist",...] r # Reverse the values on the stack è # Modulair 0-based index the sum of truthy values into the list of lists of # artist(s)/song(s), so 6 will wrap back to the first item δ # Map over each string inside each inner list: ð Û # And trim all leading spaces ø # Create pairs with the infinitely cycled list, where it will only create # as many pairs as the smallest list (so either 2 or 4 in this case) „: ý # Join each inner pair with ": " delimiter » # Then join everything by newlines ™ # And finally titlecase each word in the string # (after which the result is output implicitly)

Если строка равна ровно «8», замените ее второй строкой.

l#„naQW*O5Ý8+@OI5£“‹…0Toto ߃›Ì0Neal Hefti0ÿ¤·¤··—„š‚¿bye0ÁÜ KatamariÊÖacy0Yuu Miyake ¤· Jude0€€ÊÄ ˆÑ€‚ 2–›s0¦‹šèett“¶¡0δ¡2₄:¬2ǝ„ŽŸŒá#ÞrèðδÛø„: ý»™

Если строка равна ровно «10», замените ее второй строкой.

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"

Если строка равна ровно «11», замените ее второй строкой.

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

Если строка соответствует ; sh $THE_FILE na na na na na na na Song: Batman Theme Artist: Neil Hefti Song: Na Na Hey Kiss Him Goodbye Artist: Steam , replace by the second line. This is neither true for single digit numbers, uudecode -p<<<'begin-base64 0 - /Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4AE9AIRdACmbycaLOYv90Azj3HBohRZGa6a5FikeJU+8JbGlB4f9wmi2aQ+mn81aypMRM4nEKPxW439Z2C4WfGeyrREjk427H1GrCRUMHdth+9lVBDiPfCaD8WpStyS0MtJenHKB+tou8rD9INq0yw9IPXuQe7zLM3p14ZDFO8UoJp66scd4bKQAAACSwUb7ERvesgABoAG+AgAARAEAGbHEZ/sCAAAAAARZWg== ===='|unxz|sed -n $#s/,/\\n/gp|grep .||echo $'Song: Land Of 1000 Dances\nArtist: Wilson Pickett' и 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,l=0,j=1;for(;*s;s+=3-!s[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]);} as they already have been repaced nor any of the above replacement strings.

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

Если ничего из вышеперечисленного не соответствует, строка все равно начинается с цифры. По умолчанию — Тото, Африка.

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

Замените заполнители $_=/^(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 и -pa к 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); } and 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)} .

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

JavaScript (ES6), 276 байт

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]

Объяснение

Ввод может содержать один конечный пробел.

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

Тест

Artist: Song:
 

Demkiller


Рег
03 Jul, 2013

Тем
81

Постов
196

Баллов
651
  • 26, Oct 2024
  • #3

PowerShell, 278 байт

  • Может обрабатывать любое количество пробелов
  • Никакого регулярного выражения!
  • Неявное приведение типов FTW!
wc -w

Негольфед

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

Использование

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

ш + coreutils, 290

Хотя этот материал длиннее, чем другие мои материалы, он прост и практически не требует гольфа, поэтому я все равно включил его.

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

Как это работает:

Если введенные данные верны, распечатайте их как есть. Если нет, ничего не печатать.

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

Посчитайте слова.

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

Простая таблица поиска, <input type="text" id="input" value="na na Na na NA na na nA" /> <button onclick="solution()">Go</button> <pre id="result"></pre> and var prompt = () => input.value; var alert = (text) => result.textContent = text; var solution = () => { 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 ) ||answer||

Python 453 440 406 380 байт

РЕДАКТИРОВАТЬ: Спасибо Cyoce за сокращение 13 байт!

РЕДАКТИРОВАТЬ: Еще раз спасибо Cyoce!

РЕДАКТИРОВАТЬ: Спасибо Райнеру П. за помощь в улучшении алгоритма в некоторых недопустимых случаях.

Это черновой вариант программы на Python. Я считаю, что его можно определенно разбить, может быть, до 300-400 байт. Но скоро над этим поработаем.

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

Попробуйте здесь!

 

Andreev1968


Рег
04 Sep, 2006

Тем
62

Постов
203

Баллов
533
  • 26, Oct 2024
  • #4

Юлия, 325 байт

Вероятно, можно было бы играть в гольф и дальше.

> Song: , $nArtist: ||answer||

Ржавчина, 501 477 байт

Artist:

Негольфед

Song:

Изменить: удалены ненужные to_string и аннотации типа.

 

Дмитрий Дрозд


Рег
28 Oct, 2020

Тем
71

Постов
187

Баллов
562
  • 26, Oct 2024
  • #6

Antilopa


Рег
05 Nov, 2013

Тем
91

Постов
213

Баллов
678
  • 26, Oct 2024
  • #7

UNIX Shell, 394 байта

10

Тест:

[0-9].+

Наверное, можно было бы оптимизировать, но мне эта идея просто понравилась :)

 

Bial79


Рег
16 Apr, 2012

Тем
72

Постов
187

Баллов
557
  • 26, Oct 2024
  • #8

Java 8, 353 байта

m`^11$ >Hey Jude,The Beatles

Объяснение:

Попробуйте онлайн.

m`^10$ >Katamari Damacy,Yuu Miyake ||answer||

05AB1E, 148 байты

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

Попробуйте онлайн или проверьте еще несколько тестовых примеров.

Объяснение:

iM`na

См. мой совет по 05AB1E (раздел Как пользоваться словарем?) чтобы понять, почему na is iG`^na( na)*$ and ^na( na)*$ is 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: .

 

Алексей16


Рег
09 Mar, 2006

Тем
79

Постов
227

Баллов
662
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно