Seguimiento de listados a horarios

25

Introducción

¿No odias cuando alguien sube un álbum que te gusta a YouTube, pero la descripción solo contiene una lista de canciones ? Me gusta esto:

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

¡Ahora no sabe cuándo comienza Morning Bell a menos que sume un montón de veces en su cabeza! Por lo general, una buena alma vendrá y dejará una tabla de tiempo útil en la sección de comentarios (temida), que se parece a esto:

(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

Especificación

  • Su tarea es escribir un programa o función que tome una lista de pistas como entrada y una tabla de tiempo como salida.

    • Puede elegir leer la entrada de STDIN, o una cadena de argumentos, o una lista de líneas de argumentos. Del mismo modo, puede elegir imprimir la salida en STDOUT, o devolver una cadena, o devolver una lista de líneas. De lo contrario, haga lo que tenga sentido para su idioma.
  • Puede suponer que cada línea de entrada tiene el formato (\d+)\. [A-Za-z0-9 ]{1,100} - (\d+):(\d\d) . Para las personas con problemas de expresión regular, esto esencialmente significa que puede asumir que cada línea está bien formateada (como se indicó anteriormente) y que los títulos de las canciones consisten solo en caracteres y espacios alfanuméricos ASCII , y no tienen más de 100 bytes de longitud.

  • La longitud de una pista siempre es al menos 0:01y no más 59:59.
  • Los números de pista están en orden creciente, comenzando desde 1 y hasta no más de 99.
  • La duración total de un álbum no es más de 9:59:59 .

Esto es , por lo que gana el código más corto (en bytes).

Caso de prueba

Su programa debe realizar correctamente la conversión presentada en la introducción (Radiohead's Kid A ). Aquí hay un caso de prueba más grande (Sufjan Stevens ' Illinois 1 ) con cadenas largas en las que su programa también debería funcionar:

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

La salida correcta es:

(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

Tabla de clasificación

Para que su puntaje aparezca en el tablero, debe estar en este formato:

# Language, Bytes

1. Disculpas a Sufjan, cuyos asombrosos nombres de pistas tuve que cambiar un poco para que encajen en el formato simple al que se limita este problema.

Lynn
fuente
¿Puede la salida contener espacios finales?
Martin Ender
1
Radiohead y Sufjan Stevens? Meh :-P
Luis Mendo
No; El formato para cada línea es (h:mm:ss) Track Name, seguido inmediatamente por una nueva línea.
Lynn
@LuisMendo Siéntete libre de demostrar tus gustos musicales superiores en tu respuesta ...?
Lynn
Jajaja. Esa es una buena motivación adicional para responder. Por cierto, me gustó el desafío y lo he votado
Luis Mendo

Respuestas:

12

CJam, 60 57 55 bytes

Gracias a Sp3000 por guardar 2 bytes.

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

Pruébalo aquí.

Explicació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.
}/
Martin Ender
fuente
16
maldita sea Martin
cjfaure
6

Perl, (93 caracteres más -p) 94 bytes

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

Correr:

perl -pe 's!\d+\. (.+) - (\d+:(\d+))!sprintf"(%d:%02d:%02d) $1",$n/3600,$n%3600/60,$n%60,$n+=$3+60*$2!e' <<< '<input>'
Dom Hastings
fuente
5

C ++, 212 209 202 189 bytes

C ++ porque ... ¿por qué 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;}}

Vivir: 212 209 202 189

Wendelbsilva
fuente
5

Python 2, 170160 Bytes

Ha pasado un tiempo desde que hice un golf, espero que esto no sea tan malo: 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])

La entrada debe estar entre comillas y dividida por nuevas líneas, así:

"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"
Kade
fuente
44
¡Creo que puedes tener %del contador de horas (si entiendo las reglas correctamente!) Para -2!
Dom Hastings
Agregue 4 caracteres ( inputa raw_input) para aceptar el formato exacto; de lo contrario, creo que no es válido, ya que supone líneas en un formato diferente.
RK.
3

Gema, 151 caracteres

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

Ejecución de muestra:

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
hombre trabajando
fuente
3

Python 2, 207 206 bytes

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 
Puertas de Zach
fuente
¿Qué versión de Python 3 estás usando? Pensé que raw_inputsolo existía en Python 2.
Lynn
Fijo. Supongo que estoy acostumbrado a escribir "3". @Mauris
Zach Gates
1

awk, 119101 bytes

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

Esto es mucho más de lo que quería que fuera. El problema es que %Hno formatea las horas como se solicitó, por lo que necesitaba calcular las horas yo mismo.

Ack, soy estúpido. Los resultados de strftimeestaban equivocados porque necesitaba decirle que usara la hora UTC. ¡Eso cortó 18 bytes!

Versión de 119 bytes

{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
fuente