Отслеживание списков в расписании

25

Введение

Разве вы не ненавидите, когда кто-то загружает понравившийся вам альбом на YouTube, но описание содержит только список треков ? Так:

1. Everything in Its Right Place - 4:11
2. Kid A - 4:44
3. The National Anthem - 5:50
4. How to Disappear Completely - 5:55
5. Treefingers - 3:42
6. Optimistic - 5:16
7. In Limbo - 3:31
8. Idioteque - 5:09
9. Morning Bell - 4:29
10. Motion Picture Soundtrack - 6:59

Теперь вы не знаете, когда начинается Morning Bell, если вы не суммируете кучу раз в своей голове! Обычно приходит какая-то добрая душа и оставляет удобный график в разделе (страшных) комментариев, который выглядит примерно так:

(0:00:00) Everything in Its Right Place
(0:04:11) Kid A
(0:08:55) The National Anthem
(0:14:45) How to Disappear Completely
(0:20:40) Treefingers
(0:24:22) Optimistic
(0:29:38) In Limbo
(0:33:09) Idioteque
(0:38:18) Morning Bell
(0:42:47) Motion Picture Soundtrack

Спецификация

  • Ваша задача - написать программу или функцию, которая принимает список дорожек в качестве входных данных и таблицу времени в качестве выходных данных.

    • Вы можете прочитать входные данные из STDIN, или строку аргумента, или список аргументов строки. Точно так же вы можете распечатать вывод в STDOUT, или вернуть строку, или вернуть список строк. В противном случае делайте все, что имеет смысл для вашего языка.
  • Вы можете предположить, что каждая строка ввода имеет формат (\d+)\. [A-Za-z0-9 ]{1,100} - (\d+):(\d\d). Для регулярных выражений это, по сути, означает, что вы можете предположить, что каждая строка хорошо отформатирована (как указано выше), а названия песен состоят только из буквенно-цифровых символов и пробелов ASCII и имеют длину не более 100 байт.

  • Длина трека всегда не меньше 0:01и не больше 59:59.
  • Номера треков увеличиваются в порядке, начиная с 1и считая не более чем 99.
  • Общая длина альбома не более 9:59:59.

Это , поэтому выигрывает самый короткий код (в байтах).

Прецедент

Ваша программа должна правильно выполнить преобразование, представленное во введении ( Ребенок Radiohead ). Вот более крупный тестовый сценарий ( Иллинойс Суфьяна Стивенса 1 ) с длинными строками, с которыми ваша программа также должна работать:

1. Concerning the UFO Sighting Near Highland Illinois - 2:08
2. The Black Hawk War - 2:14
3. Come On Feel the Illinoise - 6:45
4. John Wayne Gacy Jr - 3:19
5. Jacksonville - 5:24
6. A Short Reprise for Mary Todd Who Went Insane but for Very Good Reasons - 0:47
7. Decatur or Round of Applause for Your Stepmother - 3:03
8. One Last Whoo Hoo for the Pullman - 0:06
9. Chicago - 6:04
10. Casimir Pulaski Day - 5:53
11. To the Workers of the Rock River Valley Region - 1:40
12. The Man of Metropolis Steals Our Hearts - 6:17
13. Prairie Fire That Wanders About - 2:11
14. A Conjunction of Drones Simulating the Way - 0:19
15. The Predatory Wasp of the Palisades Is Out to Get Us - 5:23
16. They Are Night Zombies They Are Neighbors They Have Come Back from the Dead Ahhhh - 5:09
17. Lets Hear That String Part Again Because I Dont Think They Heard It All the Way Out in Bushnell - 0:40
18. In This Temple as in the Hearts of Man for Whom He Saved the Earth - 0:35
19. The Seers Tower - 3:53
20. The Tallest Man the Broadest Shoulders - 7:02
21. Riffs and Variations on a Single Note - 0:46
22. Out of Egypt into the Great Laugh of Mankind and I Shake the Dirt from My Sandals as I Run - 4:21

Правильный вывод:

(0:00:00) Concerning the UFO Sighting Near Highland Illinois
(0:02:08) The Black Hawk War
(0:04:22) Come On Feel the Illinoise
(0:11:07) John Wayne Gacy Jr
(0:14:26) Jacksonville
(0:19:50) A Short Reprise for Mary Todd Who Went Insane but for Very Good Reasons
(0:20:37) Decatur or Round of Applause for Your Stepmother
(0:23:40) One Last Whoo Hoo for the Pullman
(0:23:46) Chicago
(0:29:50) Casimir Pulaski Day
(0:35:43) To the Workers of the Rock River Valley Region
(0:37:23) The Man of Metropolis Steals Our Hearts
(0:43:40) Prairie Fire That Wanders About
(0:45:51) A Conjunction of Drones Simulating the Way
(0:46:10) The Predatory Wasp of the Palisades Is Out to Get Us
(0:51:33) They Are Night Zombies They Are Neighbors They Have Come Back from the Dead Ahhhh
(0:56:42) Lets Hear That String Part Again Because I Dont Think They Heard It All the Way Out in Bushnell
(0:57:22) In This Temple as in the Hearts of Man for Whom He Saved the Earth
(0:57:57) The Seers Tower
(1:01:50) The Tallest Man the Broadest Shoulders
(1:08:52) Riffs and Variations on a Single Note
(1:09:38) Out of Egypt into the Great Laugh of Mankind and I Shake the Dirt from My Sandals as I Run

Leaderboard

Чтобы ваш счет отображался на доске, он должен быть в следующем формате:

# Language, Bytes

1. Извиняюсь перед Суфджаном, чьи удивительные названия треков мне пришлось немного исказить, чтобы они соответствовали простому формату, которым ограничена эта проблема.

Линн
источник
Может ли вывод содержать конечные пробелы?
Мартин Эндер,
1
Radiohead и Суфьян Стивенс? Мех :-P
Луис Мендо
Нет; формат для каждой строки (h:mm:ss) Track Name, сопровождаемый немедленно новой строкой .
Линн
@ LuisMendo Не стесняйтесь продемонстрировать свои превосходные музыкальные вкусы в своем ответе ...?
Линн
Хахаха. Это хорошая дополнительная мотивация для ответа. Кстати, мне понравился вызов, и я проголосовал за него
Луис Мендо

Ответы:

12

CJam, 60 57 55 байт

Спасибо Sp3000 за сохранение 2 байта.

qN/{T60bZ0e["(%d:%02d:%02d) "e%\S/1>)':/60bT+:T;W<S*N}/

Проверьте это здесь.

объяснение

qN/{      e# Read input and split into lines.
  T60b    e# Push T (initially zero, we use this to keep track of the total time in
          e# seconds), and convert it to base 60.
  Z0e[    e# Pad it with zeroes to 3 digits to get hours, minutes, seconds.
  "(%d:%02d:%02d) "e%
          e# Get the (h:mm:ss) part using a format string.
  \S/     e# Pull up the current line, split on spaces.
  1>      e# Discard the first segment, i.e. the track number.
  )':/    e# Pull off the last segment, i.e. the time, and split on colons.
  60b     e# Interpret the two parts as base-60 digits to get the amount of seconds
          e# for the track.
  T+:T;   e# Add this to T and discard it.
  W<      e# Discard the last segment of the remaining string (the hyphen).
  S*N     e# Join the song name back together with spaces and push a line feed.
}/
Мартин Эндер
источник
16
черт возьми, Мартин
cjfaure
6

Perl, (93 символа плюс -p) 94 байта

s!\d+\. (.+) - (\d+:(\d+))!sprintf"(%d:%02d:%02d) $1",$n/3600,$n%3600/60,$n%60,$n+=$3+60*$2!e

Бежать:

perl -pe 's!\d+\. (.+) - (\d+:(\d+))!sprintf"(%d:%02d:%02d) $1",$n/3600,$n%3600/60,$n%60,$n+=$3+60*$2!e' <<< '<input>'
Дом Гастингс
источник
5

C ++, 212 209 202 189 байт

C ++ потому что .. почему бы и нет?

#include<iostream>
long d,t,u;main(){std::string a,b(8,0);while(getline(std::cin>>t>>a[0],a,'-')>>t>>b[0]>>u){strftime(&b[0],9,"%T",gmtime(&d));b[0]='(';std::cout<<b+")"+a+'\n';d+=t*60+u;}}

Прямой эфир: 212 209 202 189

wendelbsilva
источник
5

Python 2, 170 160 байт

Прошло много времени с тех пор, как я сделал гольф, надеюсь, это не так уж плохо: P

t=0
for i in input().split('\n'):i=i.split(' - ');print'(%d:%02d:%02d)'%(t/3600,t%3600/60,t%60),i[0].split('. ')[1];k=i[-1].split(':');t+=int(k[0])*60+int(k[1])

Входные данные должны быть заключены в кавычки и разделены символами новой строки, например:

"1. Concerning the UFO Sighting Near Highland Illinois - 2:08\n2. The Black Hawk War - 2:14\n3. Come On Feel the Illinoise - 6:45\n4. John Wayne Gacy Jr - 3:19\n5. Jacksonville - 5:24\n6. A Short Reprise for Mary Todd Who Went Insane but for Very Good Reasons - 0:47\n7. Decatur or Round of Applause for Your Stepmother - 3:03\n8. One Last Whoo Hoo for the Pullman - 0:06\n9. Chicago - 6:04\n10. Casimir Pulaski Day - 5:53\n11. To the Workers of the Rock River Valley Region - 1:40\n12. The Man of Metropolis Steals Our Hearts - 6:17\n13. Prairie Fire That Wanders About - 2:11\n14. A Conjunction of Drones Simulating the Way - 0:19\n15. The Predatory Wasp of the Palisades Is Out to Get Us - 5:23\n16. They Are Night Zombies They Are Neighbors They Have Come Back from the Dead Ahhhh - 5:09\n17. Lets Hear That String Part Again Because I Dont Think They Heard It All the Way Out in Bushnell - 0:40\n18. In This Temple as in the Hearts of Man for Whom He Saved the Earth - 0:35\n19. The Seers Tower - 3:53\n20. The Tallest Man the Broadest Shoulders - 7:02\n21. Riffs and Variations on a Single Note  - 0:46\n22. Out of Egypt into the Great Laugh of Mankind and I Shake the Dirt from My Sandals as I Run - 4:21"
Када
источник
4
Я думаю, что вы можете просто %dза счетчик часов (если я правильно понимаю правила!) Для -2!
Дом Гастингс
Добавьте 4 символа ( inputк raw_input), чтобы принять точный формат; в противном случае я считаю, что это недопустимо, так как предполагает наличие строк в другом формате.
РК.
3

Гема, 151 персонажа

\B=@set{t;}
<D>. * - <D>\:<D>=(@div{$t;3600}:@fill-right{00;@div{@mod{$t;3600};60}}:@fill-right{00;@mod{$t;60}}) *@set{t;@add{@add{$t;$4};@mul{$3;60}}}

Образец прогона:

bash-4.3$ gema '\B=@set{t;};<D>. * - <D>\:<D>=(@div{$t;3600}:@fill-right{00;@div{@mod{$t;3600};60}}:@fill-right{00;@mod{$t;60}}) *@set{t;@add{@add{$t;$4};@mul{$3;60}}}' tracklist.txt
(0:00:00) Concerning the UFO Sighting Near Highland Illinois
(0:02:08) The Black Hawk War
(0:04:22) Come On Feel the Illinoise
(0:11:07) John Wayne Gacy Jr
(0:14:26) Jacksonville
(0:19:50) A Short Reprise for Mary Todd Who Went Insane but for Very Good Reasons
(0:20:37) Decatur or Round of Applause for Your Stepmother
(0:23:40) One Last Whoo Hoo for the Pullman
(0:23:46) Chicago
(0:29:50) Casimir Pulaski Day
manatwork
источник
3

Python 2, 207 206 байт

h=m=s=0
for i in raw_input().splitlines():
 print("(%d:%.2d:%.2d) "%(h,m,s),i.split('-')[0].split('. ')[1])
 t=i.split('-')[1].split(':')
 m+=int(t[0]);s+=int(t[1]);r=s//60;s-=r*60;m+=r;r=m//60;m-=r*60;h+=r

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

$ python test.py
'1. Concerning the UFO Sighting Near Highland Illinois - 2:08\n2. The Black Hawk War - 2:14\n3. Come On Feel the Illinoise - 6:45'
(0:00:00) Concerning the UFO Sighting Near Highland Illinois 
(0:02:08) The Black Hawk War 
(0:04:22) Come On Feel the Illinoise 
Зак Гейтс
источник
Какую версию Python 3 вы используете? Я думал, что raw_inputсуществует только в Python 2.
Линн
Исправлена. Я думаю, я просто привык набирать «3». @Mauris
Зак Гейтс,
1

awk, 119 101 байт

{split($NF,t,":");$1=$(--NF)="";--NF;print"("substr(strftime("%H:%M:%S",s,1),2)")"$0;s+=t[1]*60+t[2]}

Это намного дольше, чем я хотел. Проблема в том %H, что часы не форматируются так, как запрошено, поэтому мне нужно было самому рассчитать часы.

Я тупой. Результаты strftimeоказались неверными, потому что мне нужно было указать время UTC. Это отрезало 18 байтов!

119-байтовая версия

{split($NF,t,":");$1=$(--NF)="";--NF;print"("(h||0)":"strftime("%M:%S",s)")"$0;s=(r=s+t[1]*60+t[2])%3600;h=int(r/3600)}
kirbyfan64sos
источник