首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AoCG2021剩余:递归战斗

AoCG2021剩余:递归战斗
EN

Code Golf用户
提问于 2021-12-26 23:26:37
回答 4查看 291关注 0票数 5

这个挑战是为代码2021的出现计划的两个挑战之一,但不符合25天的时间表。

日2020日22相关,第2部分。

格斗是一个简单的两人纸牌游戏与一副牌。每张卡片上都会写一个唯一的正整数。游戏进行如下:

  • 洗牌和分割牌,使每个玩家都有自己的牌。
  • 每一轮..。
    • 两位玩家都抽他们的顶级牌。牌号较高的人赢了一轮。胜利者把两张牌都放在自己牌的底部,这样胜利者的牌就在另一张牌之上。

  • 如果一个玩家拥有所有的牌,那么他就赢了。

递归战斗是战斗的一个变体。唯一的区别是如何决定每一轮的赢家。

  • 在任何一位玩家处理一张牌之前,如果这场比赛中的前一轮在同一玩家的甲板上有相同顺序的相同的牌,则该游戏立即以第一名玩家的胜利而结束。其他游戏的前几轮则不被考虑。(这可以防止无限的递归战斗游戏。)
  • 否则,这一轮的牌必须是在一个新的配置,球员开始每一轮抽签他们的牌顶牌正常。如果两位玩家的牌中剩余的牌至少与他们刚刚抽出的牌的值一样多,那么这一轮的胜利者将通过玩一款新的“递归战斗”游戏来确定,即每个玩家从自己的牌面(不包括抽到的牌)的顶部拿到多张牌到“子游戏”。当子游戏结束时,牌被退回到甲板上,就像子游戏之前一样,并且父游戏继续进行战斗:子游戏的胜利者(=这一轮的胜者)把两张牌放在他们自己的牌的底部,这样胜利者的牌就在另一张牌之上。
  • 否则,至少有一位玩家在他们的牌中不能有足够的牌来回收;这一轮的胜利者是拥有高价值牌的玩家。

请注意,在此版本中,胜利者卡的价值可能低于其他卡。

让我们称这两名玩家为1和2,在开始时给两名玩家的甲板,确定玩家1是否会赢得“递归战斗”游戏。

这两个甲板是作为价值清单写在每一张卡片上。你可以选择哪一边将是甲板的顶部。保证两个甲板都是非空的,并且所有的数字都是唯一的正整数.

对于输出,可以选择

  • 使用您的语言约定输出真实/错误(允许交换),或
  • 使用两个不同的固定值分别表示真(肯定)或假(负)。

适用标准的密码-高尔夫规则。以字节为单位的最短代码获胜。

测试用例

P1赢得

代码语言:javascript
运行
复制
P1's deck, P2's deck (first number at the top)
[43, 19], [2, 29, 14] (by infinite loop prevention)
[10, 8, 2] [4, 3, 5, 6, 9, 1, 7]
[2, 1, 10, 8] [7, 6, 5, 3, 9, 4]
[2, 1, 7, 8, 9, 4, 5, 6] [10, 3]

P2赢得

代码语言:javascript
运行
复制
P1's deck, P2's deck (first number at the top)
[9, 2, 6, 3, 1], [5, 8, 4, 7, 10]
[6, 2, 1, 8, 9, 4], [7, 3, 10, 5]
[4, 6, 2, 1, 3], [8, 10, 7, 9, 5]
[7, 4, 9, 2, 6, 1, 3], [10, 8, 5]
EN

回答 4

Code Golf用户

发布于 2021-12-27 15:59:28

木炭,114个字节

代码语言:javascript
运行
复制
⊞υ⟦⟧≔⟦✂θ⟧ηWυ«≔№§υ±¹θε⊞§υ±¹✂θ¿›⬤θ∧κ›Lκ§κ⁰ε«⊞υ⟦⟧⊞η✂θUMθ✂κ¹⊕§κ⁰»«¿›⬤θκε≔‹§θ⁰§θ¹ε«≔∧⊟υ¬§θ⁰ε≔⊟ηθ»F²⊞§θε§§θ⁺λε⁰UMθΦκν»»ε

在网上试试!链接是详细的代码版本。将输入作为一对列表,如果玩家2获胜,则输出-,如果玩家1获胜,则不输出任何输入。说明:木炭实际上并不做递归,所以这里有一种迭代方法。

代码语言:javascript
运行
复制
⊞υ⟦⟧

开始跟踪以前看到的位置,为顶级游戏。

代码语言:javascript
运行
复制
≔⟦✂θ⟧η

为顶级游戏创建一个虚拟的“呼叫游戏状态”。

代码语言:javascript
运行
复制
Wυ«

重复,直到所有游戏都解决了。

代码语言:javascript
运行
复制
≔№§υ±¹θε

看看这个位置是否在这个游戏中被看到了。

代码语言:javascript
运行
复制
⊞§υ±¹✂θ

保存此位置的(浅)副本到此游戏。

代码语言:javascript
运行
复制
¿›⬤θ∧κ›Lκ§κ⁰ε«

如果递归游戏是可能的,那么:

代码语言:javascript
运行
复制
⊞υ⟦⟧

开始跟踪以前看到的子游戏的位置。

代码语言:javascript
运行
复制
⊞η✂θ

将呼叫游戏状态保存到子游戏中。

代码语言:javascript
运行
复制
UMθ✂κ¹⊕§κ⁰

为子游戏创建状态。

代码语言:javascript
运行
复制
»«¿›⬤θκε

否则,如果这是一个新的位置,而且双方都有扑克牌,那么.

代码语言:javascript
运行
复制
≔‹§θ⁰§θ¹ε

..。看看谁能赢得这个职位。

代码语言:javascript
运行
复制
«≔∧⊟υ¬§θ⁰ε≔⊟ηθ»

否则,移除此游戏先前看到的位置,查看玩家1是否因卡用完而丢失,并恢复呼叫游戏状态。

代码语言:javascript
运行
复制
F²⊞§θε§§θ⁺λε⁰

将胜利者和输家的上牌附加到胜者的手上。

代码语言:javascript
运行
复制
UMθΦκν

把他们从两位球员的手上移开。

代码语言:javascript
运行
复制
»»ε

输出是否2号玩家获胜。

票数 2
EN

Code Golf用户

发布于 2022-01-04 04:12:35

Python3,264个字节:

代码语言:javascript
运行
复制
k=lambda x,y,a,b,h,r:([a,[y,x]+a][r],[[x,y]+b,b][r],h+[[a+[x],b+[y]]])
def f(a,b,h=[]):  
 if[a,b]in h:return 1
 if not all([a,b]):return len(a)>0
 x,y=a.pop(),b.pop()
 if x<=len(a)and y<=len(b):return f(*k(x,y,a,b,h,f(a[-x:],b[-y:])))
 return f(*k(x,y,a,b,h,x>y))

在网上试试!

票数 2
EN

Code Golf用户

发布于 2021-12-29 03:41:31

Scala,150个字节

代码语言:javascript
运行
复制
(a,b,s)=>if(a.isEmpty)2 else if(b.isEmpty|s(a->b))1 else if(a(0)>b(0))f(a.tail:+a(0):+b(0),b.tail,s+(a->b)) else f(a.tail,b.tail:+b(0):+a(0),s+(a->b))

在Scastie上试试

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/240168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档