Um dia nas corridas de cavalos

10

fundo

No final dos anos 90 / primeiros anos 00, quando o Flash Web Design era tão legal que ninguém podia viver sem ter um site completo em Flash ou pelo menos um widget animado, fui contratado para desenvolver um "visualizador de corridas de cavalos" no Flash / Actionscript, na forma de uma animação estilo videogame dos anos 80, para que os visitantes do site pudessem não apenas ler os resultados da corrida, mas pudessem vê-los em uma animação em movimento! UAU! Impressionante!

Eles me forneceram um arquivo CSV com todos os detalhes das corridas: ordem de início e chegada, nomes de cavalos, nomes de pilotos, prêmios, etc. Meu aplicativo Flash leu esse arquivo para cada corrida e exibiu a animação acima.

Atualmente, o suporte ao Flash é significativamente recusado, portanto, devemos voltar à arte ascii !

Tarefa

Sua tarefa é criar um programa ou função completa que leia os dados da corrida no formato CSV a partir da entrada padrão e produza uma representação artística da corrida, como mostra o exemplo abaixo.

ENTRADA

Dados CSV com 2 campos: 1) ordem inicial; 2) hora de chegada ao final no formato 1.13.4(1 minuto, 13 segundos, 4 décimos de segundo). Se o tempo reportar Rsignifica que o cavalo foi retirado (não terminou a corrida) devido a incidente, queda ou outro motivo. Nota: o horário de chegada pode ser o mesmo para 2 ou mais cavalos; nesse caso, eles compartilham a posição de chegada.

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

RESULTADO

Para cada linha CSV, produza uma pista de corrida como esta:

1_|______________4(1.13.0)___________________________

A pista é composta por:

  • 1 qual é o cavalo começa a ordem.
  • _|onde _é um espaçador e a |é a linha de chegada.
  • 50 x _que representa 50 décimos de segundo.
  • 5(1.13.4)essa é a posição de chegada seguida pela hora de chegada. Este deve ser posicionado respeitando as diferenças horárias entre os cavalos. Por exemplo: você posiciona o 1º chegado na linha de chegada no tempo 1.11.5, o segundo chega no tempo 1.12.1, a diferença é 1.12.1 - 1.11.5 = 6décimos de segundo, portanto o segundo cavalo deve ser posicionado no sexto caractere e assim por diante. Se a diferença horária for superior a 50 décimos de segundos (ou 5 segundos), você deverá posicionar o cavalo no final. O mesmo se o cavalo for R(retirado).

Portanto, toda a pista dos dados CSV acima deve 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

Não há necessidade de adicionar F=Finish linee a última linha 0123456789...é apenas para fins de explicação.

Casos de teste

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

Regras

  • O menor código vence.
Mario
fonte
No exemplo em que o quinto está empatado, o cavalo 8 ainda não colocaria o sétimo?
Jonathan Allan
Podemos assumir que o número dos minutos será sempre 1?
ETHproductions
@ JonathanAllan Depende das regras, no exemplo, assumi que se os cavalos compartilharem a 5ª posição, a próxima será considerada a 6ª.
Mario
@ETHproductions Sim, você pode assumir que o minuto é sempre 1.
Mario
2
Além disso, podemos supor que sempre haverá um não Rcavalo? (Eu sei que isto não é uma questão sensível na vida real, mas este é o código.)
PurkkaKoodari

Respostas:

1

JavaScript (ES6), 261 bytes

Toma uma matriz de seqüências de tempo "1.ss.t"como entrada. A ordem inicial está implícita.

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

Demo

Arnauld
fonte
1

Python 2, 282 272 246 bytes

Semelhante a Arnauld, a entrada é assumida como já retirada do número inicial, pois está 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
fonte