2024 loong年春晚刘谦魔术 Python

 

#刘谦2024央视春晚魔术

#随机四张牌
#打乱
#对折撕开,两组堆叠
#名字有几个字就将,就将上面的依次移到下面
#拿起最上面的三张插入到,剩下的卡片中间任意位置
#提取最上面的卡藏起来
#最上面卡片,南方人1张、北方人2张、南北方人3张,插入中间任意位置
#最上面卡片男生1张、女生2张,拿起来的扔掉
#“见证奇迹的时刻”,依次从上往下放七张
#“好运留下来”把最上面一张放到最下面,“烦恼丢出去”把最上面的丢掉。

import random

#生成四个0-9之间的整数并且打乱顺序
numbers_raw = random.sample(range(10), 4)
random.shuffle(numbers_raw)
print("生成的四张扑克是:")
print(numbers_raw)

#A与B分别代表撕开后不同半张牌
numbers_tear = []
for i in numbers_raw:
    numbers_tear.append(str(i)+'A')
for i in numbers_raw:
    numbers_tear.append(str(i)+'B')
print("对折撕开,两组堆叠结果:")
print(numbers_tear)

#名字有几个字就将,就将上面的依次移到下面
your_name = input("请输入你的名字:")
your_name_length = len(your_name)
for i in range(your_name_length):
    numbers_tear.append(numbers_tear.pop(0))
print("名字有几个字就将,就将上面的依次移到下面:")
print(numbers_tear)

#拿起最上面的三张插入到,剩下的卡片中间任意位置
numbers_insert = numbers_tear[0:3]
numbers_tear = numbers_tear[3:]
insert_location =  int(input("请输入插入位置:(" + "1-" + str(len(numbers_tear)-1)+ ")"))
while insert_location < 1 or insert_location > len(numbers_tear):
    insert_location =  int(input("输入有误,请重新输入插入位置:(" + "1-" + str(len(numbers_tear)-1)+ ")"))

numbers_inserted = []
for i in range(len(numbers_tear)):
    if i == insert_location:
        for num in numbers_insert:
            numbers_inserted.append(num)
    numbers_inserted.append(numbers_tear[i])
print("拿起最上面的三张插入到,剩下的卡片中间任意位置:")
print(numbers_inserted)

#提取最上面的卡藏起来
numbers_hide = numbers_inserted.pop(0)
print("提取最上面的卡藏起来后的结果:")
print(numbers_inserted)

#最上面卡片,南方人1张、北方人2张、南北方人3张,插入中间任意位置
flag = input("请输入你是哪里人(南:1,北:2,不确定:3):")
while flag != '1' and flag != '2' and flag != '3':
    flag = input("输入有误,请重新输入你是哪里人(南:1,北:2,不确定:3):")
numbers_insert = numbers_inserted[0:int(flag)]
numbers_inserted = numbers_inserted[int(flag):]
insert_location =  int(input("请输入插入位置:(" + "1-" + str(len(numbers_inserted)-1)+ ")"))
while insert_location < 1 or insert_location > len(numbers_inserted):
    insert_location =  int(input("输入有误,请重新输入插入位置:(" + "1-" + str(len(numbers_inserted)-1)+ ")"))

numbers_location = []
for i in range(len(numbers_inserted)):
    if i == insert_location:
        for num in numbers_insert:
            numbers_location.append(num)
    numbers_location.append(numbers_inserted[i])
print("最上面卡片,南方人1张、北方人2张、南北方人3张,插入其余中间任意位置:")
if flag == '1':
    print("你选择南方人1")
if flag == '2':
    print("你选择北方人2")
if flag == '3':
    print("你选择南北方人3")
print(numbers_location)

#最上面卡片男生1张、女生2张,拿起来的扔掉
flag = input("请输入你是男生还是女生(男:1,女:2):")
while flag != '1' and flag != '2':
    flag = input("输入有误,请重新输入你是男生还是女生(男:1,女:2):")
numbers_throw = []
for i in range(int(flag)):
    numbers_throw.append(numbers_location.pop(0))

print("最上面卡片男生1张、女生2张,拿起来的扔掉:")
if flag == '1':
    print("你选择男生1")
if flag == '2':
    print("你选择女生2")
print(numbers_location)

#“见证奇迹的时刻”,依次从上往下放七张
for i in range(7):
    numbers_location.append(numbers_location.pop(0))
print("见证奇迹的时刻:")
print(numbers_location)

#“好运留下来”把最上面一张放到最下面,“烦恼丢出去”把最上面的丢掉。
while len(numbers_location) > 1:
    print("好运留下来:")
    numbers_location.append(numbers_location.pop(0))
    print(numbers_location)
    print("烦恼丢出去:")
    numbers_throw.append(numbers_location.pop(0))
    print(numbers_location)

#展示藏起来的牌
print("展示藏起来的牌:")
print(numbers_hide)
print("展示最后剩下来的牌:")
print(numbers_location)

关于这个魔术背后的数学逻辑其实还是比较简单的,如果您感兴趣可以参考B站的相关视频

【揭秘】刘谦春晚魔术背后是什么数学原理?_哔哩哔哩_bilibili

你应该站在哪个位置,才能活到最后?_哔哩哔哩_bilibili 

其实很多步骤都是障眼法,对于最后的结果影响不大。只要别像小尼那样把牌插到最后就行。

最巧妙的地方可以说是“见证奇迹的时刻”这几次移动牌。通过这七次移动牌,将要保留的牌移动到了最后的位置。

关于保留的位置,这里面有一个数学概念叫作:约瑟夫抽杀

在n张牌的情况下,留下的位置为2a+1

其中n=2^{x}+a ,其中的x为能满足该式的最大整数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值