Dzień w wyścigach konnych

10

tło

W późnych latach 90-tych / pierwszych 00-tych, kiedy Flash Web Design był tak fajny, że nikt nie mógł żyć bez pełnej witryny Flash lub przynajmniej animowanego widżetu, zostałem zatrudniony do opracowania „przeglądarki wyścigów konnych” we Flashu / ActionScript, w kształcie animacji z lat 80-tych, dzięki czemu odwiedzający stronę mogli nie tylko odczytać wyniki wyścigu, ale także zobaczyć je w ruchomej animacji! ŁAŁ! Imponujący!

Dostarczyli mi plik CSV ze wszystkimi szczegółami wyścigów: kolejnością startu i przyjazdu, nazwami koni, nazwiskami kierowców, nagrodami itp. Moja aplikacja Flash odczytała ten plik dla każdej rasy i wyświetliła wyżej wspomnianą animację.

Obecnie wsparcie Flasha zostało znacznie odrzucone, więc musimy wrócić do ascii-art !

Zadanie

Twoim zadaniem jest stworzenie pełnego programu lub funkcji, która odczyta dane wyścigu w formacie CSV ze standardowego wejścia i wygeneruje ascii-artową reprezentację wyścigu, jak pokazano w poniższym przykładzie.

WEJŚCIE

Dane CSV z 2 polami: 1) zamówienie początkowe; 2) czas przybycia na mecie w formacie 1.13.4(1 minuta, 13 sekund, 4 dziesiąte sekundy). Jeśli raporty czasu Roznaczają, że koń jest wycofany (nie ukończył wyścigu) z powodu incydentu, upadku lub innego powodu. Uwaga: czas przybycia może być taki sam dla 2 lub więcej koni, w tym przypadku dzielą pozycję przybycia.

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

WYNIK

Dla każdego wiersza CSV wygeneruj taki tor wyścigowy:

1_|______________4(1.13.0)___________________________

Tor wyścigowy składa się z:

  • 1 czyli konie zaczynają porządek.
  • _|gdzie _jest odstępnik, a |linia mety.
  • 50 x, _co odpowiada 50 dziesiątym części sekundy.
  • 5(1.13.4)to jest pozycja przybycia, po której następuje godzina przybycia. Musi to być ustawione z uwzględnieniem różnic czasowych między końmi. Na przykład: umieszczasz pierwszego przybywającego na linii mety w czasie 1.11.5, drugiego przybywa o czasie 1.12.1, różnica wynosi 1.12.1 - 1.11.5 = 6dziesiąte sekundy, więc drugi koń powinien być ustawiony na 6. znaku i tak dalej. Jeśli różnica czasu jest większa niż 50 dziesiątych sekund (lub 5 sekund), musisz ustawić konia na końcu. To samo, jeśli koń jest R(wycofany).

Cały tor wyścigowy dla powyższych danych CSV powinien wynosić:

  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

Nie ma potrzeby dodawania F=Finish line, a ostatni wiersz 0123456789...służy wyłącznie wyjaśnieniu celu.

Przypadki testowe

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

Zasady

  • Najkrótszy kod wygrywa.
Mario
źródło
Czy w przykładzie, w którym remis jest piąty, koń 8 nadal nie zajmuje siódmego miejsca?
Jonathan Allan,
Czy możemy założyć, że zawsze będzie to liczba minutowa 1?
ETHprodukcje
@JonathanAllan Zależy to od zasad, w przykładzie, w którym założyłem, że jeśli konie zajmą 5. pozycję, następne zostaną uznane za 6..
Mario,
@ETHproductions Tak, możesz założyć, że minuta to zawsze 1.
Mario
2
Czy możemy również założyć, że zawsze będzie Rkoń niebędący koniem? (Wiem, że to nie jest rozsądne pytanie w prawdziwym życiu, ale to jest kod.)
PurkkaKoodari,

Odpowiedzi:

1

JavaScript (ES6), 261 bajtów

Pobiera tablicę ciągów czasowych "1.ss.t"jako dane wejściowe. Kolejność początkowa jest niejawna.

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

Próbny

Arnauld
źródło
1

Python 2, 282 272 246 bajtów

Podobnie jak w przypadku Arnaulda zakłada się, że dane wejściowe zostały już usunięte z liczby początkowej, ponieważ są niejawne.

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
źródło