数学パズルをJavaScriptで解いてみたよ2

問題

4桁の並んでいる数字の各桁の間に四則演算の演算子を入れて計算することにします。

できあがった式を計算した結果、「元の数の桁を逆から並べた数字」と同じになるものを考えます。

なお、式の計算は数学の順序で行います。

1000から9999のうち、上記を満たす数を求めてください。

(演算子を入れない場所があっても良いですが、最低でも一つは入れるものとします。)

調べたこと

  • JavaScriptで、配列の特定の位置に値を追加するのはどうやるんだっけ(失敗だった)

実装

const addOpesToNumArr = (numArr, ope1, ope2, ope3) => {
  const copy = [...numArr]
  copy.splice(1, 0, ope1)
  copy.splice(3, 0, ope2)
  copy.splice(5, 0, ope3)
  return copy
}

const hasAtLeastOneOpe = (ope1, ope2, ope3) =>
  ope1 !== '' || ope2 !== '' || ope3 !== ''

const getReversedStr = (str) => [...str].reverse().join('')

const main = () => {
  const opeArr = ['', '+', '-', '*', '/']
  let result = []

  for (let i = 1000; i <= 9999; i++) {
    opeArr.forEach((o1) => {
      opeArr.forEach((o2) => {
        opeArr.forEach((o3) => {
          const numberArr = [...i.toString()]
          const numberWithOpe = addOpesToNumArr(numberArr, o1, o2, o3).join('')
          const calculated = eval(numberWithOpe)
          const reservedCalculated = getReversedStr(calculated.toString())

          if (
            hasAtLeastOneOpe(o1, o2, o3) &&
            i.toString() === reservedCalculated
          ) {
            result.push(i)
          }
        })
      })
    })
  }

  return result
}

console.log(main())

spliceを使ったのは失敗でした。

わかりにくくなったのと、破壊的な関数なのであまり使わない方がよかったです。

単純に arr[0] + ope1 + arr[1] + ope2 …みたいな方が可読性も良いと思います。

あと、ネストされたfor文は久しぶりに書きました。