刘谦在春晚让两个半张扑克牌合在一起的时候,我就知道其中必然有数学的奥妙。
假设我们初始卡牌为1,2,3,4。对半撕开后我们定义扑克牌为:
1(1) 2(1) 3(1) 4(1)
1(2) 2(2) 3(2) 4(2)
按照刘谦的魔术,你需要把所有牌叠到一起,你可以选择把(2)压到(1)上,或者把(1)压到(2)上,这里洪爵选择把(1)压到(2)上,现在的卡牌顺序为:
1(1) 2(1) 3(1) 4(1) 1(2) 2(2) 3(2) 4(2)
现在放上面3张到中间
4(1) 1(1) 2(1) 3(1) 1(2) 2(2) 3(2) 4(2)
然后藏起来最上面那张,所以这个步骤之后,无论你之前选择怎么压,藏起来的要么是4(1)要么是4(2)。洪爵这里藏起来的是4(1)
藏起来: 4(1)
1(1) 2(1) 3(1) 1(2) 2(2) 3(2) 4(2)
接下来刘谦魔术需要自问自己是南方人还是北方人,南方人把最上面1张牌放中间,北方人放2张,不知道的放3张hh。这一步其实没有什么所谓,因为我们需要的牌依然在最后一张,前面的牌都是要扔掉的,所以无关顺序,这个南北方人相当于迷惑我们的操作。
这个时候比较精彩的是,对于男女生来说,扔掉的卡牌的数量不一样,女生扔掉2张,男生扔掉一张,那么我们可以表示为:
男神们 x x x x x 4(2)
女神们 x x x x 4(2)
男生还剩下6张牌,女生剩下5张牌。
男生需要的牌4(2)在偶数位,女生的在奇数位置。
那么 见证奇迹的时刻,需要7次把最上面的牌放到最下面,真的见证时刻了,
男神们 x x x x 4(2) x
女神们 x x 4(2) x x
男生和女生所需要的牌都在奇数位置,接下面就是保留好运,丢掉霉运,保留的是奇数,扔掉的是偶数。
只要确保4(2)在最后一轮被留下来即可。
最后…尼格买提hhh,小表情太到位了。
这里附上洪爵手敲的源码:
public class Main {
public static void main(String[] args) {
List<Integer> originCards = Arrays.asList(1, 2, 3, 4);
System.out.print("-----初始卡牌:----- ");
for (Integer originCard : originCards) {
System.out.print(originCard + " ");
}
System.out.println();
System.out.println("-----对撕一半后现在的卡牌为:-----");
List<String> cardPart1 = new ArrayList<>();
originCards.forEach(originCard -> cardPart1.add(originCard + "(1)"));
List<String> cardPart2 = new ArrayList<>();
originCards.forEach(originCard -> cardPart2.add(originCard + "(2)"));
cardPart1.forEach(card -> System.out.print(card + " "));
System.out.println();
cardPart2.forEach(card -> System.out.print(card + " "));
System.out.println();
System.out.println("-----请问您发财的小手是想把(1)放在上面, 还是(2)放在上面?(输入1或2)");
Scanner in = new Scanner(System.in);
int position = in.nextInt();
Deque<String> deque = new LinkedList<>();
if (position == 1) {
deque.addAll(cardPart1);
deque.addAll(cardPart2);
} else if (position == 2) {
deque.addAll(cardPart2);
deque.addAll(cardPart1);
} else {
System.out.println("不符合预期");
return;
}
System.out.println("您的卡牌从上到下顺序为:");
deque.forEach(card -> System.out.print(card + " "));
System.out.println();
System.out.println("现在放3张到中间");
String card2 = deque.removeLast();
for (int i = 0; i < 3; i ++) {
String card1 = deque.removeFirst();
deque.addLast(card1);
}
deque.addLast(card2);
System.out.println("您的卡牌从上到下顺序为:");
deque.forEach(card -> System.out.print(card + " "));
System.out.println();
System.out.println("您现在要把第一张, 即" + deque.removeFirst() + "藏起来");
System.out.println("您的卡牌从上到下顺序为:");
deque.forEach(card -> System.out.print(card + " "));
System.out.println();
System.out.println("您的另一半卡牌一直在最后一个位置没有变化");
System.out.println("您是北方人输入2(放2张到中间)还是南方人输入1(放1张到中间), 不确定输入3(放3张到中间)");
int region = in.nextInt();
card2 = deque.removeLast();
for (int i = 0; i < region; i ++) {
String card1 = deque.removeFirst();
deque.addLast(card1);
}
deque.addLast(card2);
System.out.println("您的卡牌当前从上到下顺序为:");
deque.forEach(card -> System.out.print(card + " "));
System.out.println();
System.out.println("您的另一半卡牌一直在最后一个位置没有变化");
System.out.println("您是女神 输入2(从上到下扔2张), 还是男神 输入1(从上到下扔1张)?");
int gold = in.nextInt();
for (int i = 0; i < gold; i++) {
deque.removeFirst();
}
System.out.println("您的卡牌当前从上到下顺序为:");
deque.forEach(card -> System.out.print(card + " "));
System.out.println();
System.out.println("现在连续放7张牌到底下");
for (int i = 0; i < 7; i++) {
deque.add(deque.removeFirst());
}
System.out.println("您的卡牌当前从上到下顺序为:");
deque.forEach(card -> System.out.print(card + " "));
System.out.println();
System.out.println("现在才是最关键的步骤, 我们可以发现我们的另一张牌一直在奇数位置");
System.out.println("男生扔掉1张剩下6张 移动7次变奇数 女生剩下5张 移动7次依然奇数不变");
System.out.println("只要确保需要的牌在最后一轮被留下来即可");
}
}
【b站和微信都可搜Knight洪爵,求求关注捏,干货多多】