赛马的一天


10

背景

上世纪90年代末/ 00年代初,Flash Web Design非常酷,以至没有一个完整的Flash网站或至少没有动画小部件的人都无法生存,我受雇在Flash / Actionscript中开发“赛马查看器”,以80年代电子游戏风格的动画形式呈现,因此网站的访问者不仅可以阅读比赛结果,还可以通过动态动画观看比赛结果!哇!令人印象深刻!

他们向我提供了一个CSV文件,其中包含所有比赛的详细信息:开始和到达的顺序,赛马名称,车手姓名,奖品等。我的Flash应用程序为每次比赛读取该文件,并显示上述动画。

如今,Flash支持已大大下降,因此我们必须恢复为ascii-art

任务

您的任务是创建一个完整的程序或函数,以从标准输入中读取CSV格式的比赛数据,并输出该比赛的ascii艺术表示形式,如下例所示。

输入

带有2个字段的CSV数据:1)开始顺序;2)到达完成时间的时间格式1.13.4(1分钟,13秒,十分之四秒)。如果时间报告R表明该马由于事件,跌倒或其他原因而退赛(未完成比赛)。注意:两匹或更多匹马的到达时间可能相同,在这种情况下,它们共享到达位置。

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 x _表示十分之一秒。
  • 5(1.13.4)即到达位置,然后是到达时间。这必须考虑到马之间的时差。例如:您将第一个到达的时间定位在终点线上1.11.5,第二个到达的时间1.12.1,相差1.12.1 - 1.11.5 = 6十分之一秒,因此第二匹马应定位在第6个字符上,依此类推。如果时间差超过十分之一秒(或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's

@JonathanAllan这取决于规则,在本示例中,我假设如果马匹排名第五,那么下一个将被认为是第六。
马里奥

@ETHproductions是的,您可以假设分钟始终是1。–
Mario

2
另外,我们是否可以假设总是有非R赛马?(我知道这不是现实生活中的明智问题,但这是代码。)
PurkkaKoodari,2016年

Answers:


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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.