Sehari di Pacuan Kuda

10

Latar Belakang

Kembali di akhir 90-an / 00-an pertama ketika Desain Web Flash sangat keren sehingga tidak ada yang bisa hidup tanpa memiliki situs web Flash penuh, atau setidaknya widget animasi, saya disewa untuk mengembangkan "penampil pacuan kuda" di Flash / Actionscript, dalam bentuk animasi gaya videogame 80-an, sehingga pengunjung situs tidak hanya bisa membaca hasil balapan, tetapi mereka bisa melihatnya dalam animasi bergerak! WOW! Impresif!

Mereka memberi saya file CSV dengan semua detail balapan: urutan mulai dan kedatangan, nama kuda, nama pengemudi, hadiah, dll. Aplikasi Flash saya membaca file itu untuk setiap balapan dan menampilkan animasi yang disebutkan di atas.

Saat ini dukungan Flash ditolak secara signifikan, jadi kami harus kembali ke ascii-art !

Tugas

Tugas Anda adalah membuat program atau fungsi lengkap yang membaca data balapan dalam format CSV dari input standar dan menghasilkan representasi ascii-art dari balapan seperti yang ditunjukkan pada contoh di bawah ini.

MEMASUKKAN

Data CSV dengan 2 bidang: 1) mulai pesanan; 2) waktu kedatangan di Selesai dalam format 1.13.4(1 menit, 13 detik, 4 persepuluh detik). Jika laporan waktu Rberarti bahwa kuda itu Retreated (tidak menyelesaikan lomba) karena insiden, jatuh atau alasan lainnya. Catatan: Waktu kedatangan bisa sama untuk 2 kuda atau lebih, dalam hal ini mereka berbagi posisi kedatangan.

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

KELUARAN

Untuk setiap baris CSV, tampilkan pacuan kuda seperti ini:

1_|______________4(1.13.0)___________________________

Jalur pacuan kuda ini disusun oleh:

  • 1 yang merupakan urutan mulai kuda.
  • _|Dimana _spacer dan |garis finish.
  • 50 x _yang mewakili 50 persepuluh detik.
  • 5(1.13.4)itu adalah posisi kedatangan diikuti oleh waktu kedatangan. Ini harus diposisikan dengan menghormati perbedaan waktu antara kuda. Sebagai contoh: Anda memposisikan 1 tiba pada garis Finish pada waktu 1.11.5, yang kedua tiba pada waktu 1.12.1, perbedaannya adalah 1.12.1 - 1.11.5 = 6sepersepuluh detik, sehingga kuda kedua harus diposisikan pada karakter ke-6, dan seterusnya. Jika perbedaan waktu lebih dari 50 persepuluh detik (atau 5 detik), Anda harus meletakkan kuda di ujung. Sama jika kudanya R(mundur).

Jadi seluruh arena pacuan kuda untuk data CSV di atas harus:

  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

Tidak perlu menambahkan F=Finish line, dan baris terakhir 0123456789...hanya untuk menjelaskan tujuan.

Uji kasus

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

Aturan

  • Kode terpendek menang.
Mario
sumber
Dalam contoh di mana 5 diikat, bukankah kuda 8 masih menempati posisi ke 7?
Jonathan Allan
Bolehkah kita berasumsi bahwa angka menit akan selalu 1?
ETHproduk
@ JonathanAllan Tergantung pada aturan, pada contoh saya berasumsi bahwa jika kuda berbagi posisi ke-5, selanjutnya akan dianggap ke-6.
Mario
@ETHproductions Ya Anda dapat menganggap bahwa menitnya selalu 1.
Mario
2
Juga, dapatkah kita berasumsi bahwa akan selalu ada non- Rkuda? (Saya tahu ini bukan pertanyaan yang masuk akal dalam kehidupan nyata, tapi ini kode.)
PurkkaKoodari

Jawaban:

1

JavaScript (ES6), 261 byte

Mengambil array string waktu "1.ss.t"sebagai input. Urutan awal tersirat.

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
sumber
1

Python 2, 282 272 246 byte

Mirip dengan Arnauld input diasumsikan sudah dilucuti dari angka awal karena implisit.

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
sumber