Una giornata alle corse di cavalli


10

sfondo

Alla fine degli anni 90 / primi 00 quando Flash Web Design era così bello che nessuno poteva vivere senza un sito Web Flash completo o almeno un widget animato, sono stato assunto per sviluppare un "visualizzatore di corse di cavalli" in Flash / Actionscript, sotto forma di un'animazione in stile videogioco anni '80, quindi i visitatori del sito non solo potevano leggere i risultati della gara, ma potevano vederla in un'animazione commovente! WOW! Degno di nota!

Mi hanno fornito un file CSV con tutti i dettagli delle gare: ordine di partenza e arrivo, nomi dei cavalli, nomi dei piloti, premi, ecc. La mia app Flash ha letto quel file per ogni gara e ha mostrato l'animazione sopra menzionata.

Oggi il supporto di Flash è notevolmente diminuito, quindi dobbiamo tornare a ascii-art !

Compito

Il tuo compito è quello di creare un programma o una funzione completi che leggano i dati della gara in formato CSV dall'input standard e producano una rappresentazione ascii-art della gara, come mostrato nell'esempio seguente.

INGRESSO

Dati CSV con 2 campi: 1) inizio ordine; 2) orario di arrivo al traguardo nel formato 1.13.4(1 minuto, 13 secondi, 4 decimi di secondo). Se il tempo Rindica che il cavallo è ritirato (non ha terminato la corsa) a causa di incidenti, cadute o altri motivi. Nota: l'orario di arrivo potrebbe essere lo stesso per 2 o più cavalli, in questo caso condividono la posizione di arrivo.

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

PRODUZIONE

Per ogni riga CSV, genera una pista come questa:

1_|______________4(1.13.0)___________________________

La pista è composta da:

  • 1 quale è l'ordine di inizio dei cavalli.
  • _|dove si _trova un distanziatore e |il traguardo.
  • 50 x _che rappresenta 50 decimi di secondo.
  • 5(1.13.4)questa è la posizione di arrivo seguita dall'ora di arrivo. Questo deve essere posizionato rispettando le differenze di tempo tra i cavalli. Ad esempio: posiziona il 1 ° arrivato sul traguardo alla volta 1.11.5, il secondo arriva alla volta 1.12.1, la differenza è di 1.12.1 - 1.11.5 = 6decimi di secondo, quindi il secondo cavallo dovrebbe essere posizionato al 6 ° carattere e così via. Se la differenza di tempo è superiore a 50 decimi di secondo (o 5 secondi) è necessario posizionare il cavallo alla fine. Lo stesso se il cavallo è R(ritirato).

Quindi l'intera pista per i dati CSV sopra dovrebbe essere:

  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

Non è necessario aggiungere F=Finish linee l'ultima riga 0123456789...è solo a scopo esplicativo.

Casi test

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

Regole

  • Il codice più corto vince.

Nell'esempio in cui il 5 ° è legato, il cavallo 8 non si posizionerebbe comunque al 7 °?
Jonathan Allan,

Possiamo supporre che il numero dei minuti sarà sempre 1?
ETHproductions

@JonathanAllan Dipende dalle regole, nell'esempio ho assunto che se i cavalli condividessero la 5a posizione, la successiva verrà considerata 6a.
Mario,

@ETHproductions Sì, puoi presumere che il minuto sia sempre 1.
Mario

2
Inoltre, possiamo supporre che ci sarà sempre un non- Rcavallo? (So ​​che questa non è una domanda ragionevole nella vita reale, ma questo è un codice.)
PurkkaKoodari,

Risposte:


1

JavaScript (ES6), 261 byte

Accetta una matrice di stringhe di tempo "1.ss.t"come input. L'ordine di partenza è implicito.

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`
`

dimostrazione


1

Python 2, 282 272 246 byte

Simile ad Arnauld, si presume che l'input sia già rimosso dal numero iniziale poiché è implicito.

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))
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.