改进算法

This commit is contained in:
枫谷剑仙 2023-08-18 20:20:57 +08:00
parent 1ea8fb3cc8
commit d4ff5fdeb3
2 changed files with 51 additions and 13 deletions

View File

@ -3001,12 +3001,13 @@ const specialSearchFunctions = (function() {
function:cards=>cards.filter(card=>{
function is3x3(sk)
{
const lineNum = 0b111;
for (let si=0;si<3;si++)
{
if (sk[si] === sk[si+1] && sk[si] === sk[si+2] && //3行连续相等
(si>0?(sk[si-1] & sk[si]) ===0:true) && //如果上一行存在,并且无交集(and为0)
(si+2<4?(sk[si+3] & sk[si]) ===0:true) && //如果下一行存在,并且无交集(and为0)
(sk[si] === 7 || sk[si] === 7<<1 || sk[si] === 7<<2 || sk[si] === 7<<3) //如果这一行满足任意2珠并联二进制111=十进制7
(sk[si] >= lineNum && Math.isPowerOfTwo(sk[si] / lineNum)) //如果这一行满足大于等于0b111并且除以0b111的倍数为2的幂因为<<1等于乘以2
)
return true;
}
@ -3027,6 +3028,37 @@ const specialSearchFunctions = (function() {
return fragment;
}
},
/*{name:"Create L shape",otLangName:{chs:"L",cht:"L"},
function:cards=>cards.filter(card=>{
function isL(sk)
{
const lineNum = 0b111;
for (let si=0;si<3;si++)
{
if (sk[si] === sk[si+1] && sk[si] === sk[si+2] && //3行连续相等
(si>0?(sk[si-1] & sk[si]) ===0:true) && //如果上一行存在,并且无交集(and为0)
(si+2<4?(sk[si+3] & sk[si]) ===0:true) && //如果下一行存在,并且无交集(and为0)
(sk[si] >= lineNum && Math.isPowerOfTwo(sk[si] / lineNum)) //如果这一行满足大于等于0b111并且除以0b111的倍数为2的幂因为<<1等于乘以2
)
return true;
}
return false;
}
const searchTypeArray = [176];
const skill = getCardActiveSkill(card, searchTypeArray);
return skill && is3x3(skill.params);
}),
addition:card=>{
const searchTypeArray = [176];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return;
const sk = skill.params;
const fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode(`3×3`));
fragment.appendChild(createOrbsList(sk[5]));
return fragment;
}
},*/
{name:"Create a vertical",otLangName:{chs:"产竖",cht:"產豎"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [127];
@ -3091,17 +3123,14 @@ const specialSearchFunctions = (function() {
function isRow(skill)
{
const sk = skill.params;
if (skill.type === 128) //普通横
{return true;}
else if (skill.type === 71) //花火
{return sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined).length === 1}
else if (skill.type === 176) //特殊形状
{
for (let si=0;si<5;si++)
{
if ((sk[si] & 63) === 63)
return true;
}
if (skill.type === 128) {//普通横
return true;
}
else if (skill.type === 71) {//花火
return sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined).length === 1
}
else if (skill.type === 176) {//特殊形状
return sk.some(n=>(n & 0b111111) === 0b111111)
}
return false;
}

View File

@ -265,7 +265,16 @@ Array.prototype.nodeJoin = function(separator)
Math.randomInteger = function(max, min = 0) {
return this.floor(this.random() * (max - min + 1) + min);
}
Math.isPowerOfTwo = function(n) {
if (Number.isInteger(0) && n > 0)
return (n & (n - 1)) === 0;
else
return false;
}
Number.prototype.notNeighbour = function() {
const num = this.valueOf();
return ~num & (num << 1 | num >> 1);
}
//将二进制flag转为数组
function flags(num) {
const arr = [];