День на скачки


10

Фон

Ще в кінці 90-х / перших 00-х, коли веб-дизайн Flash був настільки крутим, що ніхто не міг жити, не маючи повного веб-сайту Flash або хоча б анімованого віджета, мене взяли на роботу, щоб розробити "глядача кінських скачок" у Flash / Actionscript, у формі анімації у стилі відеограми 80-х, тому відвідувачі сайту могли не лише прочитати результати гонок, але й побачити їх у рухливій анімації! ОЦЕ ТАК! Вражає!

Вони надали мені файл CSV з усіма деталями перегонів: порядком старту та прибуття, іменами коней, іменами водіїв, призами і т. Д. Мій додаток Flash прочитав цей файл для кожної гонки і відобразив вищезазначену анімацію.

В даний час підтримка Flash суттєво знижується, тому ми повинні повернутися до ascii-art !

Завдання

Ваше завдання - створити повну програму або функцію, яка зчитує дані гонки у форматі CSV зі стандартного вводу та видає ascii-art представлення гонки, як показано в прикладі нижче.

ВХОД

Дані CSV з 2 полями: 1) порядок початку; 2) час прибуття на Фініш у форматі 1.13.4(1 хвилина, 13 секунд, 4 десятих секунди). Якщо звіти про час Rозначають, що кінь відступає (не закінчив змагання) через інцидент, падіння чи іншу причину. Примітка. Час прибуття може бути однаковим для 2 або більше коней, у цьому випадку вони поділяють положення прильоту.

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

ВИХІД

Для кожного рядка CSV виведіть такий іподром:

1_|______________4(1.13.0)___________________________

Бігова доріжка складається з:

  • 1 який порядок початку коней.
  • _|де _розпірка і |є фінішна лінія.
  • 50 х, _що становить 50 десятих частин секунди.
  • 5(1.13.4)тобто позиція прибуття, що супроводжується часом прибуття. Це повинно розташовуватися з урахуванням різниці в часі між конями. Наприклад: ви розміщуєте 1-го прибутого на Фініші строку 1.11.5, другий прибуває в часі 1.12.1, різниця - 1.12.1 - 1.11.5 = 6десяті частини секунди, тому другий кінь повинен бути розміщений на 6-му символі тощо. Якщо різниця в часі більше 50 десятих секунд (або 5 секунд), ви повинні розташувати коня в кінці. Те саме, якщо кінь R(Відступив).

Таким чином, весь гоночний трек для даних CSV повинен бути:

  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

Не потрібно додавати F=Finish lineі останній рядок, 0123456789...який призначений лише для пояснення мети.

Тестові справи

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

Правила

  • Найкоротший код виграє.

У прикладі, де зв'язано 5-е місце, невже кінь 8 все ще не стане 7-м?
Джонатан Аллан

Можемо припустити, що число хвилин завжди буде 1?
ETHproductions

@JonathanAllan Це залежить від правил, у прикладі я припускав, що якщо коні поділять 5-ту позицію, наступною вважатиметься 6-а.
Маріо

@ETHproductions Так, ви можете припустити, що хвилина завжди 1.
Маріо

2
Чи можемо ми припустити, що завжди буде Rкінь? (Я знаю, що це не розумне питання в реальному житті, але це код.)
PurkkaKoodari

Відповіді:


1

JavaScript (ES6), 261 байт

Приймає масив тимчасових рядків "1.ss.t"як вхідний. Порядок запуску неявний.

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

Демо


1

Python 2, 282 272 246 байт

Як і у Arnauld, вхід вважається позбавленим від вихідного числа, оскільки він неявний.

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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.