[TIL] 2020. 12. 05


質問の概要:数値入力を受信し、各位置を変換して値を返します。


(問題)関数digpow(n,p)に数字を入力し、各位置にp平方、(p+1)平方、(p+2)平方を加え、各項目を加算します.では、出てきた総和をnで割ったときの整数は戻ります.そうでなければ-1は戻ります.
同じ質問でも、答えがこんなに違うかもしれないことを知っています.私が提案した答えは、
function digPow(n, p){
  let arr = [...String(n)].map(el => parseInt(el));
  let powArr = [];
  for (let i = 0 ; i < arr.length ; i++) {
    powArr.push(arr[i] ** (p+i));
  }
  let result = powArr.reduce((acc, cur) => (acc+cur)) / n;
  if (Number.isInteger(result)) {
    return result;
  } 
  return -1;
}
// 0. n -> String -> 배열 -> 각 요소를 정수로 전환
// 1. 1stNum ** p
// 2. 2ndNum ** p+1
// 3. 3rdNum ** p+2
// ... finally, return acc / n
上記の問題は以下の部分に分けることができます.
  • に入力されたnは、各位置を要素とする配列に設定される.
  • String(n).split('')
  • [...String(n)]
  • 各要素を反映指数の数に変換する.この数は1つずつ加算されるのでreduce法は使いにくいが,Referenceソリューションでは.powarrに新しい要素をあげました.
  • ここでは、reduce代表例のacc+curを適用する.
  • の整数の場合は、-1を返します.
  • 解決策から学んだこと

    function digPow(n, p) {
      var x = String(n).split("").reduce((s, d, i)
    					=> s + Math.pow(d, p + i), 0)
      return x % n ? -1 : x / n
    }
  • reduceメソッドの拡張性
  • 簡潔なコードは感心させられる.私の9行のソリューションは2行で表されます.reduce法をもっと理解してこそ,そのように解くことができる.
  • の3つの演算子
  • を使用
    この過程で、%演算子が表すBoolean値を再認識しました.

    したがって、ソリューションに残りがある場合はtrue;-1、falseの値が返されます.