在力扣上看见有两个老哥分享了春晚刘谦魔术的模拟实现和代码实现, 参考他们的文章后写了此文
参考文章: https://leetcode.cn/circle/discuss/hzkbAV/
- 简单叙述魔术过程
- 打乱扑克牌顺序 抽四张牌 (ABCD)
- 对折撕成两半 将一堆放在另一堆派底 (ABCDabcd)
- 名字几个字就将牌顶的一张牌放到牌底 (DabcdABC)
- 拿起最上面三张 插进牌堆中间(此时最上面和最下面的牌是相同的) (cdADabBC)
- 拿起最上面一张 放在一旁 (dADabBC)
- 南方人从牌顶拿起一张 北方人拿两张 不确定南北方人拿三张 插到牌堆中间 (DabdABC)
- 男生从上面拿一张 女生拿两张扔掉 (abdABC bdABC)
- s=len("见证奇迹的时刻") 将 s 张牌从牌顶放到派底 (bdABCa ABCbd)
- 循环: 一张从牌顶放牌底 下一张丢掉 直到还剩一张牌 (C)
- 这张牌和旁边的牌是相同的 (C=c)
注: 解释一下插入牌堆中间的操作, 比如有三张牌, 那么中间位置就有两个, 分别是第一, 第二张牌之间以及第二, 第三张牌之间
- py 代码
名字, 南北方人, 男女生区别在代码中写死
随即插入牌堆中间通过随机函数 random.randint 实现
# 抽四张牌 对折撕成两半 将一堆放在另一堆派底
s = 'ABCDabcd'
print('抽四张牌 对折撕成两半 将一堆放在另一堆派底: ' + '\n' + s)
# 名字几个字就将牌顶的几张牌放到牌底
nameLen = 3 % len(s)
t = ''
t=s[nameLen:]+s[:nameLen]
print('名字几个字就将牌顶的几张牌放到牌底: ' + '\n' + t)
# 拿起最上面三张 插进牌堆中间
temp, origin = t[:3], t[3:]
r = random.randint(1, len(origin)-1)
t = origin[:r]+temp+origin[r:]
print('拿起最上面三张 插进牌堆中间: ' + '\n' + t)
# 拿起最上面一张 放在一旁
ans_1 = t[0]
t = t[1:]
print('拿起最上面一张 放在一旁: ' + '\n' + t)
# 南方人从牌顶拿起一张 北方人拿两张 不确定南北方人拿三张 插到牌堆中间
areaNum = 2
temp, origin = t[:areaNum], t[areaNum:]
r = random.randint(1, len(origin)-1)
t = origin[:r]+temp+origin[r:]
print('南方人从牌顶拿起一张 北方人拿两张 不确定南北方人拿三张 插到牌堆中间: ' + '\n' + t)
# 男生从上面拿一张 女生拿两张扔掉
sexNum = 1
t = t[sexNum:]
print('男生从上面拿一张 女生拿两张扔掉: ' + '\n' + t)
# 将7张牌从牌顶放到派底 (s=len("见证奇迹的时刻"))
n = len("见证奇迹的时刻") % len(t)
t = t[n:] + t[:n]
print('将7张牌从牌顶放到派底 (s=len("见证奇迹的时刻")): ' + '\n' + t)
# 循环: 一张从牌顶放牌底 下一张丢掉 直到还剩一张牌
while(len(t) > 1):
t = t[1:] + t[:1]
t = t[1:]
print('结果是: ')
print(t + "=" + ans_1)
- 代码执行结果
- 实验总结
根据实验结果我们可以看到, 执行"拿起最上面三张牌插入牌堆中间"操作后, 牌堆最上面和最下面的牌是一张牌, 随后将最上面的牌放在一旁后, 后面的操作只要把另一张牌保留到最后就可以了.
小尼失败是因为没有将三张牌插进牌堆中间, 插进牌堆最后导致牌底与藏起来那张不是同一张了.
CHATGPT:
这段代码在逻辑上是可执行的,但存在一些问题和潜在的优化点:
随机数生成问题: 代码中使用了 random.randint(1, len(origin)-1) 生成一个随机数来确定插入牌的位置,但并没有导入 random 模块,因此代码会抛出异常。需要在代码开头导入 random 模块,例如 import random。
未处理空牌情况: 在一些操作中,如果剩余牌数不足以满足操作的要求,可能会导致错误。需要在进行操作前先检查剩余牌数是否足够。
循环条件问题: 循环的结束条件 len(t) > 1 在某些情况下可能会导致无限循环,因为操作过程中未考虑到可能导致牌数减少的情况。可能需要修改循环条件以确保循环能够正常结束。
代码可读性和可维护性: 代码中使用了很多硬编码的数字和字符串,降低了代码的可读性和可维护性。建议将这些值提取为常量或者参数,以便于修改和理解代码。
优化可能性:
可以考虑封装一些重复的操作逻辑为函数,提高代码的复用性。
可以优化算法,减少不必要的操作,提高效率。
可以增加错误处理逻辑,使代码更加健壮。
总的来说,这段代码在逻辑上是可执行的,但存在一些问题需要修复和优化。
灵魂评论~发送~
看个思路就行了, debug 自己来 [狗头]