はじめに
個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。
週1くらいのペースで、全10回を目指す予定。
オススメ問題
例
末尾の0を削除してくれ、という問題です。
1450 -> 145
960000 -> 96
1050 -> 105
-1050 -> -105
難易度
分類は 8kyu(最も簡単)ですが、個人的には 7kyu 相当です。
オススメの回答
「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。
条件設定と繰り返し処理
https://www.codewars.com/kata/reviews/570bb3f1c631137326000047/groups/570c6c52f616a83d6e000b0b
function noBoringZeros(n) {
while (n % 10 === 0 && n !== 0) {
n = n / 10
}
return n
}
%
(剰余)と!==
(等しくない)を使用し、丁寧に書かれているコードです。
再帰ではなくwhile
を使用しているため、
- 何が条件か
- どんな処理をしているか
がわかりやすいのがいいですね。
再帰を使ったケースはこちら
正規表現
https://www.codewars.com/kata/reviews/570bb3f1c631137326000047/groups/5711a541b25a4600a10006f2
function noBoringZeros(n) {
return +`${n}`.replace(/0*$/, "");
}
正規表現/0*$/
(行末までの0の繰り返し)にマッチし、""
(無)にreplace
していますね。無駄がない。
ここからは少しむずかしいのですが、
- 数値から文字列への変換にテンプレート記法
${}
を使用 -
+
を最初につけることで、最後に文字列から数値に再変換している
この書き方がスマートでかっこいいです。
難しい部分の話がわかりにくかった方は、こちらの解答もオススメです。
番外編:記号だけでプログラミング
長いので省略します
[][(![]+[])[+!![]]+(!![]+[])[+[]]][([]+[][(![]+[])[+!![]]+(!![]+[])[+[]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+!![]]+(!![]+[])[+[]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!
![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+!![]]+(!![]+[])[+[]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+!![]]+(!![]+[])[+[]]]
)[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[
こんなことが延々と書いてあります。
これでもちゃんと動くんです。
こちらは別記事にまとめました。
おわりに
以上、CodeWarsオススメ問題でした。