Lacak daftar ke tabel waktu


25

pengantar

Tidakkah Anda membencinya ketika seseorang mengunggah album yang Anda sukai ke YouTube, tetapi uraiannya hanya berisi daftar lagu ? Seperti ini:

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

Sekarang Anda tidak tahu kapan Morning Bell dimulai kecuali jika Anda menjumlahkan beberapa kali di kepala Anda! Biasanya, beberapa jiwa baik akan datang dan meninggalkan tabel waktu yang berguna di bagian komentar (ditakuti), yang terlihat seperti ini:

(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

Spesifikasi

  • Tugas Anda adalah menulis program atau fungsi yang menggunakan daftar lagu sebagai input dan tabel waktu sebagai output.

    • Anda dapat memilih untuk membaca input dari STDIN, atau string argumen, atau daftar baris argumen. Demikian pula, Anda dapat memilih untuk mencetak output ke STDOUT, atau mengembalikan string, atau mengembalikan daftar baris. Jika gagal, lakukan apa pun yang masuk akal untuk bahasa Anda.
  • Anda dapat menganggap setiap baris input memiliki format (\d+)\. [A-Za-z0-9 ]{1,100} - (\d+):(\d\d). Untuk regex-gangguan, ini pada dasarnya berarti Anda dapat mengasumsikan setiap baris diformat dengan baik (seperti di atas) dan judul lagu hanya terdiri dari karakter dan spasi ASCII alfanumerik , dan panjangnya tidak lebih dari 100 byte.

  • Panjang lintasan selalu setidaknya 0:01dan tidak lebih dari59:59 .
  • Nomor trek meningkat urutan, mulai dari 1, dan menghitung hingga tidak lebih dari99 .
  • Total panjang album tidak lebih dari 9:59:59.

Ini adalah , jadi kode terpendek (dalam byte) menang.

Kasus cobaan

Program Anda harus benar melakukan konversi yang disajikan dalam pendahuluan (Radiohead's Kid A ). Ini adalah test case yang lebih besar (Sufjan Stevens ' Illinois 1 ) dengan string panjang yang juga harus dikerjakan oleh program Anda

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

Output yang benar adalah:

(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

Papan peringkat

Agar skor Anda muncul di papan tulis, itu harus dalam format ini:

# Language, Bytes

1. Permintaan maaf kepada Sufjan, yang nama treknya luar biasa, saya harus sedikit berbelit-belit agar sesuai dengan format sederhana masalah ini terbatas.


Bisakah output mengandung spasi tambahan?
Martin Ender

1
Radiohead dan Sufjan Stevens? Meh :-P
Luis Mendo

Nggak; format untuk setiap baris (h:mm:ss) Track Name, segera diikuti oleh baris baru.
Lynn

@LuisMendo Merasa bebas untuk menunjukkan selera musik superior Anda dalam jawaban Anda ...?
Lynn

Ha ha ha. Itu motivasi tambahan yang baik untuk dijawab. BTW Saya menyukai tantangan dan saya telah memutarnya
Luis Mendo

Jawaban:


12

CJam, 60 57 55 byte

Terima kasih kepada Sp3000 untuk menghemat 2 byte.

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

Uji di sini.

Penjelasan

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
goddammit Martin
cjfaure

6

Perl, (93 karakter plus -p) 94 byte

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

Untuk berlari:

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 byte

C ++ karena .. kenapa tidak?

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

Hidup: 212 209 202 189


5

Python 2, 170 160 Bytes

Sudah lama sejak saya bermain golf, semoga ini tidak terlalu buruk: 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])

Input harus dikelilingi oleh tanda kutip, dan dipisah dengan baris baru, seperti:

"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
Saya pikir Anda hanya dapat memiliki %duntuk penghitung jam (jika saya mengerti aturan dengan benar!) Untuk -2!
Dom Hastings

Tambahkan 4 karakter ( inputke raw_input) untuk menerima format yang tepat; kalau tidak saya percaya itu tidak valid karena mengasumsikan garis dalam format yang berbeda.
RK.

3

Gema, 151 karakter

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

Contoh dijalankan:

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

3

Python 2, 207 206 byte

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

Pemakaian

$ 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 

Versi Python 3 apa yang Anda gunakan? Saya pikir raw_inputhanya ada di Python 2.
Lynn

Tetap. Saya kira saya hanya terbiasa mengetik "3". @Mauris
Zach Gates

1

awk, 119 101 byte

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

Ini jauh lebih lama daripada yang saya inginkan. Masalahnya adalah %Htidak memformat jam seperti yang diminta, jadi saya harus menghitung sendiri jam.

Ack, saya bodoh. Hasilnya strftimesalah karena saya harus meminta waktu UTC. Itu memotong 18 byte!

Versi 119 byte

{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)}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.