Un día en las carreras de caballos

10

Antecedentes

A finales de los 90 / primeros 00's cuando Flash Web Design era tan genial que nadie podía vivir sin tener un sitio web Flash completo, o al menos un widget animado, me contrataron para desarrollar un "visor de carreras de caballos" en Flash / Actionscript, en forma de animación de videojuego de los años 80, para que los visitantes del sitio no solo puedan leer los resultados de la carrera, ¡sino que también puedan verlo en una animación en movimiento! ¡GUAUU! ¡Impresionante!

Me proporcionaron un archivo CSV con todos los detalles de las carreras: orden de inicio y llegada, nombres de caballos, nombres de conductores, premios, etc. Mi aplicación Flash leyó ese archivo para cada carrera y mostró la animación mencionada anteriormente.

Hoy en día, la compatibilidad con Flash se ha reducido significativamente, por lo que debemos volver al ascii-art .

Tarea

Su tarea es crear un programa o función completa que lea los datos de la carrera en formato CSV a partir de la entrada estándar y genere una representación ascii-art de la carrera como se muestra en el siguiente ejemplo.

ENTRADA

Datos CSV con 2 campos: 1) orden de inicio; 2) hora de llegada al Finish en el formato 1.13.4(1 minuto, 13 segundos, 4 décimas de segundo). Si los informes de tiempo Rsignifican que el caballo se retiró (no terminó la carrera) debido a un incidente, caída u otra razón. Nota: La hora de llegada podría ser la misma para 2 o más caballos, en este caso comparten la posición de llegada.

1,1.13.4
2,1.13.0
3,R
4,1.12.7
5,1.11.5
6,1.13.4
7,1.12.1
8,1.17.9

SALIDA

Para cada fila CSV, genera una pista de carreras como esta:

1_|______________4(1.13.0)___________________________

La pista está compuesta por:

  • 1 que es el orden de inicio de los caballos.
  • _|donde _hay un espaciador y |es la línea de meta.
  • 50 x _que representa 50 décimas de segundo.
  • 5(1.13.4)esa es la posición de llegada seguida de la hora de llegada. Esto debe colocarse respetando las diferencias de tiempo entre los caballos. Por ejemplo: coloca el 1 ° llegado en la línea de meta en el momento 1.11.5, el segundo llega en el momento 1.12.1, la diferencia es 1.12.1 - 1.11.5 = 6décimas de segundo, por lo que el segundo caballo debe colocarse en el 6 ° carácter, y así sucesivamente. Si la diferencia de tiempo es más de 50 décimas de segundo (o 5 segundos), debe colocar el caballo al final. Lo mismo si el caballo está R(Retirado).

Entonces, toda la pista de carreras para los datos CSV anteriores debería ser:

  F=Finish line
1_|____________________________5(1.13.4)_____________
2_|______________4(1.13.0)___________________________
3_|__________________________________________________R
4_|___________3(1.12.7)______________________________
5_1(1.11.5)__________________________________________
6_|____________________________5(1.13.4)_____________
7_|_____2(1.12.1)____________________________________
8_|__________________________________________________6(1.17.9)
  012345678901234567890123456789012345678901234567890

No es necesario agregar F=Finish line, y la última línea 0123456789...es solo para explicar el propósito.

Casos de prueba

RACE:
1,1.14.9
2,R
3,R
4,1.14.2
5,1.15.2
6,1.15.3
7,1.15.3

RACE:
1,1.13.6
2,1.13.8
3,R,
4,1.15.9
5,1.13.8
6,R,
7,1.14.4
8,1.15.6
9,1.14.1
10,1.13.9
11,1.13.2
12,1.14.3
13,1.15.0

RACE:
1,1.13.4
2,1.13.0
3,R
4,1.12.7
5,1.11.5
6,1.13.4
7,1.12.1
8,1.17.9

RACE:
1,1.17.3
2,1.20.4
3,1.17.0
4,1.18.8
5,1.18.5
6,1.18.4
7,1.18.4
8,1.17.8
9,1.18.3
10,1.18.7
11,R

RACE:
1,1.17.5
2,R
3,1.17.7
4,1.16.9
5,1.16.1
6,1.18.9

RACE:
1,1.12.8
2,1.13.0
3,1.13.2
4,1.12.7
5,1.11.5
6,1.13.0
7,1.12.1
8,1.12.8

Reglas

  • El código más corto gana.
Mario
fuente
En el ejemplo en el que el quinto está empatado, ¿el caballo 8 no colocaría el séptimo?
Jonathan Allan
¿Podemos suponer que el número de minutos siempre será 1?
ETHproductions
@JonathanAllan Depende de las reglas, en el ejemplo supuse que si los caballos comparten la quinta posición, la siguiente se considerará sexta.
Mario
@ETHproductions Sí, puede suponer que el minuto es siempre 1.
Mario
2
Además, ¿podemos suponer que siempre habrá un no Rcaballo? (Sé que esta no es una pregunta sensata en la vida real, pero este es el código).
PurkkaKoodari

Respuestas:

1

JavaScript (ES6), 261 bytes

Toma una serie de cadenas de tiempo "1.ss.t"como entrada. El orden de inicio es implícito.

a=>a.map((t,i)=>(u='_',++i>9?'':' ')+i+u+u.repeat(x=(x=t>'9'?50:t.slice(2)*10-s[0].slice(2)*10)>50?50:x,p=s.indexOf(t)+1+`(${t})`).replace(u,'|')+(x<50?p:'')+u.repeat((x=50-p.length-x)>0?x:0)+(x>0?'':t>'9'?t:p),s=a.filter((v,i)=>a.indexOf(v)==i).sort()).join`
`

Manifestación

Arnauld
fuente
1

Python 2, 282 272 246 bytes

Similar a Arnauld, se supone que la entrada ya está eliminada del número inicial, ya que es implícita.

H=input().split("\n")
T=[float(c[2:])if c[2:]else 99for c in H]
P=[min(int(10*(t-min(T))),50)for t in T]
S=sorted(list(set(T)))
i=0
u="_"
for h,p,t in zip(H,P,T):i+=1;s=S.index(t)+1;print`i`+u+"|"*(s>1)+u*p+[h,"%d(%s)"%(s,h)][t<99]+u*(41-p+(s<2))
Karl Napf
fuente