#刘谦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站的相关视频
其实很多步骤都是障眼法,对于最后的结果影响不大。只要别像小尼那样把牌插到最后就行。
最巧妙的地方可以说是“见证奇迹的时刻”这几次移动牌。通过这七次移动牌,将要保留的牌移动到了最后的位置。
关于保留的位置,这里面有一个数学概念叫作:约瑟夫抽杀
在n张牌的情况下,留下的位置为
其中 ,其中的x为能满足该式的最大整数