
ジョジョのプッチ神父が、落ち着きたい時に「素数を数える」というのが頭にこびりついて、プログラミングでも素数を考えると思考が整うのかどうかいつも考えてしまいます。
前にも素数プログラムを簡単に書いてみたんですが、もっと簡単にかけないかと考えてみて、今回AIに聞いてみて出てきたプログラムをちゃんと理解して、自分の思考に取り込んでみたいと思います。
以前のブログ :
[アルゴリズム] 1から100までの素数を取得(JavaScript編)
ChatGPTに聞いてみた
- javascriptで素数を求める短いコードを書いて。
- 最短を狙ったJavaScriptで素数を求めるコードの一例を、以下に示します
(ES6構文使用):
p=n=>n<2?0:!([...Array(n-2)].some((_,i)=>n%(i+2)==0))
解説(※必要なら):
n<2?0: → 2未満は素数ではない。
[...Array(n-2)] → 2からn-1までのループを生成。
.some((_,i)=>n%(i+2)==0) → 割り切れる数があるか確認。
! → 割り切れなければ素数。
使用例:
console.log(p(7)); // true
console.log(p(10)); // false
むむ、なかなか見かけない書き方だし、some関数はこれまで使ったことないぞ・・・
some関数
リファレンスサイト :
Array.prototype.some()
このページをみるとsome関数の内容が理解できました。
配列の中の少なくとも 1 つの要素が合格するかどうかを判定する関数ですね。
ということは、順番に処理をしていって、最初にtrueになればbreakするような仕様だと勝手に理解できました。
書き方は、sortや、mapと同様のArray(配列)処理と同じような書き方なので、この点はさほど難しくなさそうですね。
ちなみに、変数は、以下の通りで、JSのArray関数に慣れていれば理解しやすいんですが、慣れていない人であれば、まずはsortやmapを理解した方がいいかもですね。
some( (element, index, array) => {判定処理})
内容理解
pという変数に、アルゴリズムを閉じ込めている関数定義になっているようですね。
アロー関数(=>の箇所)と、数値比較が入っているため、こういう短縮記述は慣れないと本当に頭パニックになります。
AIの解説でも書かれている通り、2で割り切れるまたは、2で割り切れる以外の数値が素数なので、処理効率化のためにちゃんとその処理が入っているのもありがたいですね。
そして、よくみると、三項演算子になっていますね。
分解すると、以下の通りです。
p=n => {
n<2 ? 0 : !([...Array(n-2)].some((_,i)=>n%(i+2)==0))
}
あとがき
ES仕様とはいえ、Javascriptのネイティブ関数を使いこなすとこんなに短いコードで素数の計算ができてしまうのは、なかなか驚きです。
AIにコードを作ってもらうのも便利ですが、それをちゃんと理解しておくという事が、エンジニアにとっては、非常に重要なスキルアップだと、改めて感じてしまいました。
もしかして、こうして作ってもらったコードをそのままコピペしているエンジニアがいるとしたら、かなりヤバい仕事しているかもしれませんね。
0 件のコメント:
コメントを投稿