设置
假设你给ñ保险丝,1≤ ñ ≤5,每一个都是一米长,其中每个保险丝具有的相关燃烧率ñ每米d小时。
保险丝可以在一端或两端点亮,然后在一端或两端熄灭,重新点亮,重新熄灭等,直到保险丝完全耗尽为止。您可以立即点亮和熄灭保险丝,并且可以观察到保险丝完全耗尽(烧毁)的确切时间。
保险丝不能切断,也不能在除其末端以外的任何地方点亮。
通过测量任意两个保险丝点亮/消耗事件之间的时间,这样的设置允许无限精确的计时系统。例如,给定两个保险丝,其每小时的燃烧速度为1米,则您可以精确地测量45分钟(3/4小时)
- 同时:在两端点亮第一个保险丝,在一端点亮第二个保险丝,并标记时间间隔的开始
- 消耗第一根保险丝的瞬间(30分钟后)点亮第二根保险丝的第二端
- 在消耗第二根保险丝的瞬间(15分钟后)标记时间间隔的结束
挑战
给定小时数t的分数,以及代表n个保险丝的确切烧毁率的n 个分数的集合,编写一个程序或函数,如果可以通过系统性地熔断保险丝来精确地测量t小时,则输出或返回真实值。否则为假值。
程序的输入可以是以下任意一项:
- 形式的命令行参数
TN/TD N1/D1 N2/D2 N3/D3 ...
TN/TD N1/D1 N2/D2 N3/D3 ...
读取stdin
或等效形式的字符串TN/TD N1/D1 N2/D2 N3/D3 ...
作为函数参数传递的形式的字符串["TN/TD", "N1/D1", "N2/D2", "N3/D3", ...]
作为函数参数传递的字符串数组
在所有情况下,t = TN
/ TD
,其中TN
,TD
∈[1,10000]。
同样地,在所有的情况下:燃烧速率为熔丝我 = Ñ 我 / d 我 = N<i>
/ D<i>
,其中N<i>
,D<i>
∈[1,10]∀ 我。
您可能会假设总是有1至5根保险丝(含),并且所有输入均有效且在范围内。您还可以假定所有输入分数均以最低的术语给出。
您可能无法将浮点数与小数部分一起使用来解决此挑战。也就是说,如果您在应用程序中的任何地方使用浮点数,则它们只能采用零值部分的整数值。
计分
这是一个代码高尔夫球挑战,因此以字节为单位的最短合规提交将获胜。
输入/输出示例
input: 29/6 3/2 2/3 3/5 3/7 7/5
output: true
One solution:
- light both ends of fuse 1, mark start of interval
- on fuse 1 consumption: light both ends of fuse 2, light one end of fuse 5
- on fuse 5 consumption: extinguish one end of fuse 2, light both ends of fuse 3,
light both ends of fuse 4
- on fuse 2 consumption: extinguish one end of fuse 3, extinguish both ends of
fuse 4
- on fuse 3 consumption: relight one end of fuse 4
- on consumption of fuse 4: mark end of interval (29/6 hours)
input: 2/1 3/1 5/1 7/1
output: false
input: 5/1 6/1 1/6 9/1 1/9
output: true
One solution:
- light fuse 1 at one end, light fuse 2 at both ends, light fuse 4 at both ends
- on fuse 1 consumption: extinguish one end of fuse 2, mark start of interval
- on fuse 4 consumption: relight one end of fuse 2
- on fuse 2 consumption: mark end of interval (5 hours)
融合愉快!:)