短いjavascriptで最大公約数を出す

短いjavascriptで最大公約数をどのように出しているのか考えました。

下記のサイトにあるjavascriptで考えました。
「mebee javascript 最大公約数を求める」
https://mebee.info/2021/04/26/post-26097/

mebeeサンプル

最大公約数

    <!DOCTYPE html>
    <html lang="ja">
    <head>
      <meta charset="utf-8">
      <title>mebeeサンプル</title>
    </head>
    
    <script>
      function hoge() {
        // ランダムな2桁の配列を生成
        const arr = new Array(2).fill().map(x => ~~(Math.random() * 100));
    
        // 生成した配列を表示
        disp(arr, "rand");
    
        // 最大公約数を計算する関数
        const f = (x, y) => y ? f(y, x % y) : x;    
    
        // 最大公約数
        result.innerHTML = f(arr[0],arr[1]);
      }
    
      //フロントに表示する関数
      function disp(arr, id) {
        let text = [];
    
        // 配列を利用してfor文を作成
        [...arr].forEach((x, i) => text.push('<li>' + arr[i] + '</li>'))
    
        //innerHTMLを使用して表示    
        document.getElementById(id).innerHTML = text.join('');
      }
    
      window.onload = () => {
        // クリックイベントを登録
        btn.onclick = () => { hoge(); }; // document.getElementById('btn');を省略    
      }
    </script>
    
    <body>
      <div>
        <p id="result">最大公約数</p>
        <ul id="rand"></ul>
        <button id="btn">実行</button>
      </div>
    </body>
    </html>





        // ランダムな2桁の配列を生成
        const arr = new Array(2).fill().map(x => ~~(Math.random() * 100));

    変数arr に 0 ~ 99 の数をランダムに2つ代入する

    ■ new Array(2) → 長さが2の配列

    ■ fill() → 
    第一引数 … 設定する値
    第二引数 … 開始インデックス(デフォルト 0 )
    第三引数 … 終了インデックス(デフォルト array.length)
    (例)const array = [1, 2, 3, 4, 5]; の場合
    array.fill(4) → [4, 4, 4, 4, 4]
    array.fill(6, 2) → [1, 2, 3, 6, 6]
    array.fill(9, 1, 3) → [1, 9, 9, 9, 5]

    ■ map() → 配列の要素すべてに関数を呼び出して、新しい配列を生成する
    (例)const array = [1, 3, 7, 12]; の場合
    const map = array.map(x => x * 2);
    → const map = [2, 6, 14, 24];

    ■ ~~ → 小数の切り捨て
    (例)~~(3.8) → 3



    // 最大公約数を計算する関数
        const f = (x, y) => y ? f(y, x % y) : x;    

    アロー関数(関数を簡単にしたもの)を使用している
    (例)
    【関数】
    function (a) {
      return a + 100;
    }
    【アロー関数】
    (a) => {
      return a + 100;
    }

    function f(x, y) {
      y ? f(y, x % y) : x;
    }

    x % y → x / y のあまり
    ? : → 条件演算子、if文のショートカット

    ■ y ? f(y, x % y) : x;
    y が、真なら f(y, x % y) を、偽なら x を返す

    偽 → false, 0, -0, 0n, "", null, undefined, NaN
    真 → 偽を除くすべての値

    (例)x = 10, y = 5の場合
    y が 5(真)なので f(y, x%y) を返す
    → y が 0(偽)なので x を返す
    → 結果)5



    // 配列を利用してfor文を作成
        [...arr].forEach((x, i) => text.push('<li>' + arr[i] + '</li>'))

    配列arr の各要素に対して、実行する
    配列text に'<li>' + arr[i] + '</li>' を追加する

    ■ [...arr] → [arr[0], arr[1]]
    ... → 配列を展開する
    (例)const arr = [1, 2, 3];
    console.log(...arr) → 1 2 3
    console.log([...arr]) → [1, 2, 3]

    ■ forEach() → 与えられた関数を配列の各要素に対して1回ずつ実行する
    第一引数 … 要素の値
    第二引数 … 要素のインデックス
    第三引数 … 走査(先頭から順に見ていく)されている配列

    ■ push → 要素を追加する
    (例)let text = [1, 2, 3];
    text.push(4, 5, 6); 
    console.log(text); → [1, 2, 3, 4, 5, 6]



    //innerHTMLを使用して表示    
        document.getElementById(id).innerHTML = text.join('');

    ■ join → 配列の全要素を連結させた文字列を作成して返す
    区切り文字はデフォルトでカンマ
    (例)let text = ['a', 'b', 'c'];
    console.log(text.join()) → a,b,c
    console.log(text.join('')) → abc
    console.log(text.join('-')) → a-b-c



    window.onload = () => {
        // クリックイベントを登録
        btn.onclick = () => { hoge(); }; // document.getElementById('btn');を省略    
    }

    btn がクリックされたら、関数hoge を実行する

    ■ window.onload = 関数; → ページ全体が、cssや画像などすべてを読み込んだときに関数を実行する

    ■ document.getElementById → html で id が指定されている場合、省略可能

    buttanタグに onclick="hoge()" を追加しても同じ



    javascriptのif文とfor文を使って最大公約数を出してみたい

    今まで自分が勉強してきたことを使って、最大公約数を出してみたいと思い考えました。とても長くなったので、短い書き方も勉強したいです。

    自分の持っている知識だけで考えてみました。

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です