编程思维训练趣味任务(十一)

2022-05-24  本文已影响0人  Python_Camp

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 个宝石

上一篇 下一篇

猜你喜欢

热点阅读