gpt4 book ai didi

Javascript这个扑克直检测功能可以优化吗?

转载 作者:行者123 更新时间:2023-12-02 23:53:50 25 4
gpt4 key购买 nike

希望优化我的代码以获得更快的速度。目前,该代码可检测任何一手牌,并需要大约 350 毫秒来执行 32000 次迭代。然而,检测直道的功能似乎占用了最大的单个时间 block ,约为 160 毫秒,因此寻找是否有任何方法可以进一步优化它。

整个代码最初是用 php 编写的,因为这是我最熟悉的,但尽管 php 7 的速度有所提升,但它似乎仍然比 javascript 慢。但我在转换为 javascript 时发现,许多 php 的内置函数并不存在于 javascript 中,这导致了不可预见的速度下降。总体而言,它仍然比原始 php 代码更快,但我想看看它是否可以进一步优化。也许答案是否定的,但我想我还是要检查一下。

我编写了函数 rangearrays_equal,因为它们要么在 javascript 中缺失,要么无法正常工作。

function straight(handval) {
if (arrays_equal(handval.slice(0, 4),[2, 3, 4, 5]) && handval[handval.length-1] == 14) {//if is Ace 2345
return [4,14];
}
else {//if normal straight
for (let i = handval.length - 5; i >= 0; i--) {
let subhand = handval.slice(i, i + 5);
if (arrays_equal(subhand, range(subhand[0], subhand[subhand.length-1]))) {
return [4,subhand[4]];
}
} return [0]
}
}

function arrays_equal(a,b) { return !!a && !!b && !(a<b || b<a); }

function range(start, end) {
let arr = [];
for (let i = start; i <= end; i++) {
arr.push(i);
}
return arr;
}

Handval 是一个由 5-7 个元素组成的简单数组,其中的数字从 2-14 表示卡片,例如它可以是 [6,8,4,11,13,2][8,4,13,8,10]

编辑:使用以下代码同时调用该函数并进行排序:

straight(handval.slice(0).sort(sortNumber));

function sortNumber(a,b) { return a - b; }

最佳答案

您可以从右到左计算连续数字的数量:

 function straight(handval) {
if([2, 3, 4, 5].every((el, i) => handval[i] === el) && handval[handval.length-1] === 14)
return [4, 14];

let count = 1;
for(let i = handval.length - 1; i >= 1; i -= 1) {
if(handval[i] === handval[i - 1] + 1) {
count += 1;
if(count === 5) return [ 4, handval[i + 3] ];
} else {
count = 1;
}
}

return [0];
}

这要快得多:

1) 不会在每次迭代时创建中间数组,就像您使用 rangeslice

所做的那样

2) 不会将数组作为字符串进行比较,这需要进行类型转换和字符串比较,这比比较两个数字要慢得多

3) 它不会单独检查所有 3 个范围(1 - 5、2 - 6、3 - 7),而是在一次运行中完成所有这些操作,因此它仅迭代 5 个位置,而不是 3 x 5。

关于Javascript这个扑克直检测功能可以优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55510443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com