Tieni traccia degli elenchi per gli orari


25

introduzione

Non lo odi quando qualcuno carica un album che ti piace su YouTube, ma la descrizione contiene solo un elenco di brani ? Come questo:

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

Ora non sai quando Morning Bell inizia a meno che tu non abbia un sacco di volte in testa! Di solito, una buona anima viene e lascia un utile calendario nella sezione dei commenti (temuti), che assomiglia a questo:

(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

specificazione

  • Il tuo compito è scrivere un programma o una funzione che accetta un elenco di tracce come input e una tabella dei tempi come output.

    • È possibile scegliere di leggere l'input da STDIN, una stringa di argomenti o un elenco di righe di argomenti. Allo stesso modo, è possibile scegliere di stampare l'output su STDOUT, oppure restituire una stringa o restituire un elenco di righe. In caso contrario, fai tutto ciò che ha senso per la tua lingua.
  • Puoi presumere che ogni riga di input abbia il formato (\d+)\. [A-Za-z0-9 ]{1,100} - (\d+):(\d\d). Per i disabili con regex, ciò significa essenzialmente che si può presumere che ogni riga sia ben formattata (come sopra) e che i titoli dei brani siano costituiti solo da caratteri e spazi ASCII alfanumerici e non siano più lunghi di 100 byte.

  • La lunghezza di una traccia è sempre almeno 0:01e non più di 59:59.
  • I numeri dei brani stanno aumentando l'ordine, a partire da 1e contando fino a non più di 99.
  • La lunghezza totale di un album non è superiore a 9:59:59.

Questo è , quindi vince il codice più breve (in byte).

Caso di prova

Il programma dovrebbe eseguire correttamente la conversione presentata nell'introduzione (Radiohead's Kid A ). Ecco un caso di test più ampio (Sufjan Stevens ' Illinois 1 ) con stringhe lunghe su cui dovrebbe funzionare anche il tuo programma:

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

L'output corretto è:

(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

Classifica

Affinché il tuo punteggio appaia sul tabellone, dovrebbe essere in questo formato:

# Language, Bytes

1. Chiedo scusa a Sufjan, i cui incredibili nomi delle tracce ho dovuto manipolare un po 'per adattarli al formato semplice a cui questo problema è limitato.


L'output può contenere spazi finali?
Martin Ender,

1
Radiohead e Sufjan Stevens? Meh :-P
Luis Mendo,

No; il formato per ogni riga è (h:mm:ss) Track Name, seguito immediatamente da una nuova riga.
Lynn,

@LuisMendo Sentiti libero di dimostrare i tuoi gusti musicali superiori nella tua risposta ...?
Lynn,

Hahaha. Questa è una buona motivazione aggiuntiva per rispondere. A proposito, mi è piaciuta la sfida e l'ho votata
Luis Mendo il

Risposte:


12

CJam, 60 57 55 byte

Grazie a Sp3000 per aver salvato 2 byte.

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

Provalo qui.

Spiegazione

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
dannazione Martin
cjfaure,

6

Perl, (93 caratteri più -p) 94 byte

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

Correre:

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 ++ perché .. perché no?

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

Vivere: 212 209 202 189


5

Python 2, 170 160 byte

È passato un po 'di tempo da quando ho giocato a golf, speriamo che non sia poi così male: 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])

L'input deve essere racchiuso tra virgolette e diviso per newline, in questo modo:

"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
Penso che tu possa avere solo %dil contatore delle ore (se ho capito bene le regole!) Per -2!
Dom Hastings,

Aggiungi 4 caratteri ( inputa raw_input) per accettare il formato esatto; altrimenti credo che non sia valido poiché assume linee in un formato diverso.
RK.

3

Gema, 151 personaggi

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

Esecuzione di esempio:

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

uso

$ 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 

Quale versione di Python 3 stai usando? Pensavo raw_inputesistesse solo in Python 2.
Lynn,

Fisso. Immagino di essere abituato a digitare "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]}

Questo è molto più lungo di quanto volessi. Il problema è che %Hnon formatta le ore come richiesto, quindi ho dovuto calcolare le ore da solo.

Ack, sono stupido. I risultati distrftime erano sbagliati perché avevo bisogno di dirgli di usare l'ora UTC. Quello ha tagliato 18 byte fuori!

Versione a 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)}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.