编程思维训练趣味任务(十一)
CAT-Junior 2015 1st problem
迪斯科DJ有一圈闪烁蓝色或白色的灯。
想写一个程序来自动每秒改变颜色的序列,并尝试以下规则:
image.png在每次改变时,如果在白色和蓝色灯之间,则变成(或保持)蓝色,如果在两个白色或两个蓝色灯之间,则变成(或保持)白色。令人失望的是,当运行程序时,无论起始状态如何,所有的灯都很快地变成了白色,并保持在全部是白灯的状态。如果他的开始模式是如图所示,需要多少秒直到所有的灯都是白色的?
(A) 2 (B) 3 (C) 4 (D) 5 (E) 6
思路解析
这道题容易误解为每秒种变换一个灯!
import copy
start = list('BWWBWWBB')
l = len(start)
end = [''] * l
i,round = 0, 0
# 每秒 8个灯同时变换的方案
while ''.join(end) != 'WWWWWWWW':
if ''.join(start[i%l]+start[(i+2)%l]) in ['WB','BW']:
end[(i+1) % l] = 'B'
elif ''.join(start[i%l]+start[(i+2)%l]) in ['BB','WW']:
end[(i+1) % l] = 'W'
i += 1
round = i//8
if i%8 == 0:
start = copy.copy(end)
print(round,end)
3, ['W', 'W', 'W', 'W', 'W', 'W', 'W', 'W']
继续优化编程逻辑,问题升级为:
在事先并不清楚DJ灯会稳定在全部是白灯的情况下,如何程序判断最终的状态?
# 代码2:事先并不清楚DJ灯最后的状态
while end != start:
print(''.join(start))
print(''.join(end[i%l:(i+3)%l:2]))
# start[i%l]+start[(i+2)%l]
print(i,round)
if ''.join(start[i%l]+start[(i+2)%l]) in ['WB','BW']:
end[(i+1) % l] = 'B'
#time.sleep(0.5)
elif ''.join(start[i%l]+start[(i+2)%l]) in ['BB','WW']:
end[(i+1) % l] = 'W'
#time.sleep(0.5)
i += 1
round = i//8
if i%8 == 0:
start = copy.copy(end)
print('2th solve:',round,end)
同样得到前一个结论!
再看下一个任务:
image.png搜到一篇文章区别辨析jump、leap、spring、hop、bound与skip
He won with a jump of 8.5 metres.
他以8.5米远的一跳赢得了比赛。
a parachute jump
跳伞
Several horses fell at the last jump (= fence or other thing to be jumped over).
好几匹马在最后一道障碍处跌倒了。
leap常可与jump换用,但侧重身体猛力向上升起并朝前急冲的动作,有时含突然的意味。
With one leap he crossed the stream.
他一跃跳过了小溪。
a leap in profits
利润激增
It takes quite a leap of the imagination to believe that it's the same person.
让人相信这是同一个人着实要费一番脑筋。
spring : 更强调有力和弹跳的运动。
With a spring, the cat leapt on to the table.
猫一跃跳上桌子。
hop : 指单脚短跳或双足猛力的动作。也指小鸟、青蛙等的跳。
With his feet tied together he could only move in little hops.
他双脚被捆在了一起,只能小步跳。
bound : 多指向前向上或向下跳跃、奔跳。
With one bound the dog was over the fence.
那条狗一下就跃过了篱笆。
skip : 指两脚交替轻地跳或跨的动作。
She gave a little skip of joy.
她高兴得跳了起来。
She gave a skip and a jump and was off down the street.
她一蹦一跳就顺着马路跑了。
回到原题
英文种的跳有很多表达方式,哈哈
弗雷德Hop,skip,jump的总距离是15米。人们注意到,他的每一跳(hop,skip,jump的统称)都是整数。最后,每一次jump比一次skip远,skip比hop远。有多少种可能的距离组合可以达到15米的结果?(A) 5 (B) 9 (C) 10 (D) 11 (E) 12
译文:你已经发现了传说中的精灵石的藏身之处。它们被埋在等间距的缓存中,每个缓存中有几个精灵石。您在最左边开始收集宝石,想要得到尽可能多的精灵石。然而,你取了n个精灵的缓存,右边的下一个安全缓存将是n个缓存之外。
image.png图示范
例如,如果缓存是2124,并且你取了最左边的2,你也可以取其他的2或4,但不能取它旁边的1。在这种情况下,你取左边的2和4来得到最多结果。对于下面的每一组精灵石存,你可以安全获得的最大精灵石数量是多少?
(10)23653514
(11)1287351114
(12)25238273112731
def recur(s):
s = [int(i) for i in s]
n = len(s)
sub = [0] * len(s)
sub[-1] = s[-1]
ans = 0
for i in range(n-2,-1,-1):
p = s[i]+i
if p < n:
sub[i] = s[i] + max(sub[p:])
else:
sub[i] = max(s[i],sub[i+1])
return sub
roadmap = ['23653514',
'1287351114',
"25238273112731"]
print([max(recur(s)) for s in roadmap])
[10, 12, 16]
(10)23653514 最多能收藏 10 个宝石
(11)1287351114 最多收藏 12 个宝石
(12)25238273112731 最多收藏 16 个宝石