【パズサバ】エヴァの試験管実験 攻略

ルール

  • いわゆる「試験管パズル」
  • 空きがある複数色の試験管に対して溢れない範囲で移すことは可能だが、同色の液体が対象の試験管の一番上に位置している必要がある
    • 例えば「空/赤/黄」の試験管に青色を移すことはできない

GitHub

https://github.com/kuking/WaterSortPuzzleSolver

このコードを使うと与えられた試験管パズルの問題に対しての解を求めることができる。

「?」試験管について

パズサバの試験管パズルのLV6以降(?)は、試験管の最も上部にある(空気と触れる)層以外の色がマスクされているため、アルゴリズムに与える問題を作るのが難しい。

function arrayShuffle(array) {
    for(let i = (array.length - 1); 0 < i; i--){
      let r = Math.floor(Math.random() * (i + 1));
      let tmp = array[i];
      array[i] = array[r];
      array[r] = tmp;
    }
    return array;
  }

function process() {
    var colors = [
        "VIOLET",
        "PINK",
        "DRED",
        "RED",
        "ORANGE",
        "YELLOW",
        "BROWN",
        "GRAY",
        "WHITE",
        "DGREEN",
        "LGREEN",
        "BGREEN",
        "DBLUE",
        "LBLUE",
        "LPINK",
    ]
    ["YELLOW","BGREEN","GRAY"].forEach(unusedColor => {
        colors = colors.filter(n => n !== unusedColor)
    })
    var current = [
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        ["AIR","AIR","AIR","AIR"],
        ["AIR","AIR","AIR","AIR"],
    ]
    
    let numbersByColor = {}
    colors.forEach(color => {
        numbersByColor[color] = 0;
    })
    
    let totalCapacity = 0
    current.forEach(bottle => {
        totalCapacity += 4 - bottle.length;
        bottle.forEach(liquid => {
                numbersByColor[liquid] += 1
        })
    })
    for (var j = 0; j < current.length; j++) {
        console.log(`bottle: ${j+1}`)
        if(current[j].length >= 4) {
            continue
        }
        for (var i = 0; i < 4 - current[j].length; i++) {
            let currentBottleLastColor = current[j][current[j].length-1]
            colors = arrayShuffle(colors);
            for (var k = 0; k < colors.length; k++ ) {
                if (current[j].length >= 4) {
                    continue;
                }
                if (currentBottleLastColor === colors[k]) {
                    continue;
                }
                if (numbersByColor[colors[k]] < 4) {
                    ++numbersByColor[colors[k]]
                    current[j].push(colors[k])
                    console.log(`push ${colors[k]}`)
                    continue
                }
            }
        }
    }
    return current;
}

let tryCount = 0;
while(1) {
    tryCount++;
    var result = process();
    // AIRは2本あるとする
    var lastBottle = result[result.length - 3];
    if (lastBottle[3]) {
        break;
    }
}
result.forEach(bottle => {
    console.log(`{${bottle[0]},${bottle[1]},${bottle[2]},${bottle[3]}},`)
})

※colors,current変数は適宜変更する

こんな感じのjsを実行して不明色をランダムに埋めた配列を用意して、main.goの問題にあたる箇所をリプレースしていけば良い。
ただしオリジナルのソースでは色が足りないため、structs.goも含めて適宜調整して使う。

これで問題9までなら時間内にクリアできるようになる。問題10は課金しなきゃ無理。