Suivre les listes dans les horaires


25

introduction

Ne détestez-vous pas que quelqu'un télécharge un album que vous aimez sur YouTube, mais la description ne contient qu'une liste de pistes ? Comme ça:

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

Maintenant, vous ne savez pas quand Morning Bell commence, sauf si vous résumez plusieurs fois dans votre tête! Habituellement, une bonne âme viendra et laissera un calendrier pratique dans la section des commentaires (redoutés), qui ressemble à ceci:

(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

spécification

  • Votre tâche consiste à écrire un programme ou une fonction qui prend une liste de pistes en entrée et un calendrier en sortie.

    • Vous pouvez choisir de lire l'entrée de STDIN, ou une chaîne d'arguments, ou une liste d'arguments de lignes. De même, vous pouvez choisir d'imprimer la sortie sur STDOUT, ou renvoyer une chaîne, ou renvoyer une liste de lignes. A défaut, faites tout ce qui a du sens pour votre langue.
  • Vous pouvez supposer que chaque ligne d'entrée a le format (\d+)\. [A-Za-z0-9 ]{1,100} - (\d+):(\d\d). Pour les personnes avec des regex, cela signifie essentiellement que vous pouvez supposer que chaque ligne est bien formatée (comme ci-dessus) et que les titres des chansons ne sont composés que de caractères et d'espaces alphanumériques ASCII et ne dépassent pas 100 octets.

  • La longueur d'une piste est toujours au moins 0:01et pas plus 59:59.
  • Les numéros de piste augmentent l'ordre, en commençant par 1, et en comptant jusqu'à pas plus de 99.
  • La durée totale d'un album ne dépasse pas 9:59:59.

Il s'agit de , donc le code le plus court (en octets) l'emporte.

Cas de test

Votre programme doit effectuer correctement la conversion présentée dans l'introduction (Radiohead's Kid A ). Voici un cas de test plus grand (Sufjan Stevens ' Illinois 1 ) avec de longues chaînes sur lesquelles votre programme devrait également travailler:

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 sortie correcte est:

(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

Classement

Pour que votre score apparaisse sur le tableau, il doit être dans ce format:

# Language, Bytes

1. Toutes mes excuses à Sufjan, dont j'ai dû modifier un peu les noms de pistes pour les adapter au format simple auquel ce problème est limité.


La sortie peut-elle contenir des espaces de fin?
Martin Ender

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

Nan; le format de chaque ligne est (h:mm:ss) Track Namesuivi immédiatement d'une nouvelle ligne.
Lynn,

@LuisMendo N'hésitez pas à démontrer vos goûts musicaux supérieurs dans votre réponse ...?
Lynn,

Hahaha. C'est une bonne motivation supplémentaire pour répondre. BTW J'ai aimé le défi et j'ai voté pour lui
Luis Mendo

Réponses:


12

CJam, 60 57 55 octets

Merci à Sp3000 pour avoir économisé 2 octets.

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

Testez-le ici.

Explication

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 caractères plus -p) 94 octets

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

Courir:

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 octets

C ++ car .. pourquoi pas?

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

Vivre: 212 209 202 189


5

Python 2, 170160 octets

Cela fait un moment que je n'ai pas fait de golf, j'espère que ce n'est pas trop mal: 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'entrée doit être entourée de guillemets et divisée par des retours à la ligne, comme ceci:

"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
Je pense que vous pouvez simplement avoir %dpour le compteur d'heures (si je comprends bien les règles!) Pour -2!
Dom Hastings du

Ajoutez 4 caractères ( inputà raw_input) pour accepter le format exact; sinon je pense que ce n'est pas valide car il suppose des lignes dans un format différent.
RK.

3

Gema, 151 caractères

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

Exemple d'exécution:

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 octets

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

Usage

$ 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 

Quelle version de Python 3 utilisez-vous? Je pensais raw_inputque n'existait que dans Python 2.
Lynn

Fixé. Je suppose que je suis juste habitué à taper "3". @Mauris
Zach Gates

1

awk, 119 101 octets

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

C'est bien plus long que je ne le souhaitais. Le problème est que %Hles heures ne sont pas formatées comme demandé, donc j'avais besoin de calculer les heures moi-même.

Ack, je suis stupide. Les résultats de strftimeétaient incorrects car je devais lui dire d'utiliser l'heure UTC. Cela a coupé 18 octets!

Version 119 octets

{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)}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.