我的个人解法->
// 判断迁移数组的总和是否为 15
function filcheck(ar) {
return ar.reduce((x, k) => {
return x + k
}, 0) === 15;
}
function entrance() {
// 定义原数据数组
var constArr = [3, 5, 7];
// 定义初始迁移数据数组
var arrReserver = [0, 0, 0];
// 奇偶数定义 回合制玩家判断
var odvar = 0;
// 循环判断条件
while (!filcheck(arrReserver)) {
// 当数组中的所有元素已被移除后直接跳出循环
if (arrReserver.length === 1) break;
// 生成数组中的随机下标
var arrIdx = Math.floor(Math.random() * (constArr.length));
// 两数组同位置上元素的偏差 代表还剩多少物件
var bxa = constArr[arrIdx] - arrReserver[arrIdx];
// 当剩余数量为 0 时 移除该行
if (bxa === 0) {
constArr.splice(arrIdx, 1);
arrReserver.splice(arrIdx, 1);
continue;
}
// 迁移数据数组对应行数量添加
arrReserver[arrIdx] += Math.floor((Math.random() * (bxa)) + 1);
// 代表玩家本身
odvar++;
}
// 利用回合制进行判断是哪位玩家失败
return odvar % 2 === 0 ? "player1" : "player2";
}
1
gossip 2021-10-14 22:07:03 +08:00
我不是程序员哈,这个用博弈论中逆向归纳即可,最后结论是,只要我先拿,我一定有必胜策略
|
2
Xs0ul 2021-10-14 22:10:22 +08:00 via Android
具体的实现没看,但是 hardcore 这些数值在函数内而不是作为参数传进来,可能不够“优雅”
|
3
zxCoder 2021-10-14 22:24:33 +08:00 1
这是 nim 博弈吧
虽然我理解不了什么叫做分成三行,每行还能自上而下 hhhhh |
4
cairnechen 2021-10-14 22:32:20 +08:00
不知道你们有没有看过一个小说叫天才基本法,里面有这个
|
5
MoYi123 2021-10-15 10:03:44 +08:00
from functools import cache
@cache def dp(one, two, three, pos): ____if one + two + three == 0: ________return pos ____for i in range(1, one + 1): ________if dp(one - i, two, three, not pos) == pos: ____________return pos ____for i in range(1, two + 1): ________if dp(one, two - i, three, not pos) == pos: ____________return pos ____for i in range(1, three + 1): ________if dp(one, two, three - i, not pos) == pos: ____________return pos ____return not pos # True 是 player1,False 是 player2 print(dp(3, 5, 7, True)) 一般来说这种题目都是考算法吧. 所以答案应该是求胜者,而不是用 random 模拟这个游戏. 给一个时间复杂度是 O(n3)的解法. |
6
Junzhou 2021-10-15 14:00:33 +08:00
这不就是博弈吗? nyist oj 上 取石子
|
7
flyingghost 2021-10-15 17:33:13 +08:00
到底是什么岗位?
就只有我一个人觉得这是一道普通编程题,要求实现的不是玩游戏策略算法而只是实现游戏规则,考察的是候选者的代码基础工程能力而不是算法能力吗? |
8
wzzb 2021-10-15 17:38:06 +08:00
nim 博弈,通常取胜条件是"没有物品可取的选手失败" normal nim,你这个取胜条件是"取走最后一个物品的选手失败" misere nim ;
将问题一般化,给定 int 数组,表示 n 堆物品的数量,A/B 选手轮流操作,每次可从任意堆中取走任意数量的物品(最少 1 个,不可不取),取走最后一个物品的落败,判断是否先手必胜; 判断条件是: - 1.每一堆的数量都是 1,异或和为 0 - 2.至少一堆数量大于 1,异或和不为 0 |
9
zxCoder 2021-10-15 20:47:56 +08:00
@flyingghost 严格来说这是一道数学题,也确实是一道算法题,你说考察工程能力说明这道题你做错了...
|