这个挑战是为代码2021的出现计划的两个挑战之一,但不符合25天的时间表。
与日2020日22相关,第2部分。
格斗是一个简单的两人纸牌游戏与一副牌。每张卡片上都会写一个唯一的正整数。游戏进行如下:
递归战斗是战斗的一个变体。唯一的区别是如何决定每一轮的赢家。
请注意,在此版本中,胜利者卡的价值可能低于其他卡。
让我们称这两名玩家为1和2,在开始时给两名玩家的甲板,确定玩家1是否会赢得“递归战斗”游戏。
这两个甲板是作为价值清单写在每一张卡片上。你可以选择哪一边将是甲板的顶部。保证两个甲板都是非空的,并且所有的数字都是唯一的正整数.
对于输出,可以选择
适用标准的密码-高尔夫规则。以字节为单位的最短代码获胜。
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]
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]
发布于 2021-12-27 15:59:28
⊞υ⟦⟧≔⟦✂θ⟧ηWυ«≔№§υ±¹θε⊞§υ±¹✂θ¿›⬤θ∧κ›Lκ§κ⁰ε«⊞υ⟦⟧⊞η✂θUMθ✂κ¹⊕§κ⁰»«¿›⬤θκε≔‹§θ⁰§θ¹ε«≔∧⊟υ¬§θ⁰ε≔⊟ηθ»F²⊞§θε§§θ⁺λε⁰UMθΦκν»»ε
在网上试试!链接是详细的代码版本。将输入作为一对列表,如果玩家2获胜,则输出-
,如果玩家1获胜,则不输出任何输入。说明:木炭实际上并不做递归,所以这里有一种迭代方法。
⊞υ⟦⟧
开始跟踪以前看到的位置,为顶级游戏。
≔⟦✂θ⟧η
为顶级游戏创建一个虚拟的“呼叫游戏状态”。
Wυ«
重复,直到所有游戏都解决了。
≔№§υ±¹θε
看看这个位置是否在这个游戏中被看到了。
⊞§υ±¹✂θ
保存此位置的(浅)副本到此游戏。
¿›⬤θ∧κ›Lκ§κ⁰ε«
如果递归游戏是可能的,那么:
⊞υ⟦⟧
开始跟踪以前看到的子游戏的位置。
⊞η✂θ
将呼叫游戏状态保存到子游戏中。
UMθ✂κ¹⊕§κ⁰
为子游戏创建状态。
»«¿›⬤θκε
否则,如果这是一个新的位置,而且双方都有扑克牌,那么.
≔‹§θ⁰§θ¹ε
..。看看谁能赢得这个职位。
«≔∧⊟υ¬§θ⁰ε≔⊟ηθ»
否则,移除此游戏先前看到的位置,查看玩家1是否因卡用完而丢失,并恢复呼叫游戏状态。
F²⊞§θε§§θ⁺λε⁰
将胜利者和输家的上牌附加到胜者的手上。
UMθΦκν
把他们从两位球员的手上移开。
»»ε
输出是否2号玩家获胜。
发布于 2022-01-04 04:12:35
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))
发布于 2021-12-29 03:41:31
(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))
https://codegolf.stackexchange.com/questions/240168
复制相似问题