<- Back to list

codewars | JS で Sum of Digits / Digital Root

codewarsJavaScript

こんにちは。このブログを作ったのは8月初旬(つまり2週間前)ですが、その間に就職先が決まりました🎉
5月末に前職を退職したので、ちょうど丸3ヶ月無職だったわけですが、無事、就職できて嬉しいです。

今後バックエンドをやることになるので、プログラミングの基礎知識を上げていこうと思い、スーパーエンジニアの友達に教えてもらった Codewars を始めました。 競プロのように問題を解いていくやつです。自分の解いたものをメモとともに残しておきます。

今回の問題:JS | Sum of Digits / Digital Root

Digital Root とは

ようするに各数字の和を1の位になるまで足し続けるやつです。

問題

Given n, take the sum of the digits of n. If that value has more than one digit, continue reducing in this way until a single-digit number is produced. The input will be a non-negative integer.

16 --> 1 + 6 = 7 942 --> 9 + 4 + 2 = 15 --> 1 + 5 = 6 132189 --> 1 + 3 + 2 + 1 + 8 + 9 = 24 --> 2 + 4 = 6 493193 --> 4 + 9 + 3 + 1 + 9 + 3 = 29 --> 2 + 9 = 11 --> 1 + 1 = 2

私の回答

function digital_root(n) { let sum = n; let arr = []; while(sum > 9) { // 1の位になるまで繰り返す arr = sum.toString().split(''); // 整数を文字列にしてから、1文字づつばらして配列に入れる sum = arr.reduce((a, b) => parseInt(a) + parseInt(b)); // reduce で回して数値として足し算する } return sum; }

こちらの記事を参考にさせてもらいました:

Best Practice #1 の回答

function digital_root(n) { return (n - 1) % 9 + 1; }

これは、数学の式を知っているなら素直にこう書けるのでしょうね・・・👀

自分は全く知らなかったので目からウロコです🐠

Best Practice #2 の回答

function digital_root(n) { if (n < 10) return n; return digital_root( n.toString().split('').reduce(function(acc, d) { return acc + +d; }, 0)); }

自分の回答とだいたい一緒ですが、

{ return acc + +d; }

+d ってなんでしょう?

これは、文字列を数値に変換する + 、 Unary plus です。

でも、 acc は文字列のままなのでは?と思うのですが、array.reduce()initialValue の第2引数に、 0 が入っているから文字列ではなく数値として評価されているようです(第2引数に 0 をいれない場合は、文字列を返している)。

うーん、パット見わからなかったけど勉強になりました。array.reduce() の第2引数をあんまり意識したことがなかったので心に留めておきたいと思います。