iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

JavaScriptでコードゴルフをやってみよう!

はじめに

こんにちは。 エンジニアのデッサンです。

今日はコードゴルフを社内のみなさんと一緒にやってみようと思います。

コードゴルフとは

まず最初にコードゴルフとは、 お題に対してできるだけ短いコードで実装することを目指すゲームです。

名前はゴルフと同じようにスコアを競うように、プログラムのコード数を競います。

ルール

コードゴルフの基本的なルールは、コードの長さを最小化することを目的としています。 以下を考慮するとコード数の削減に繋げれます。

  1. 変数名や関数名を短くすることでコードを短くする
  2. 三項演算子などを使って条件文を短くする
  3. スペースや改行を最小限に抑える
  4. 配列メソッドを活用してループを避ける(Array - JavaScript | MDN

例題の紹介

では早速やっていきます!

まずやり方を説明するためにも自分だけでやってみます。

例題1

文字列の中に指定文字がいくつあるかを返却する関数

回答1(172バイト)

function getCharCount(str, target) {
    count = 0;
    for (i = 0; i < str.length; i++) {
        if (str[i] === target) {
            count++;
        }
    }
    return count;
}

文字列をを1文字ずつ確認するというベースを作成しました。 このコードをどんどん短くしていこうと思います

回答2(117バイト)

function g(s,t){
    for (c=i=0;i<s.length;i++) {
        if (s[i] === t) {
            c++;
        }
    }
    return c;
}

変数と関数名を短くするなどを行い、大分スリムになりました。

回答3(71バイト)

function g(s,t){for(c=i=0;i<s.length;i++){if s[i]===t){c++;}}return c;}

Minify化して最初の172バイトから71バイトまで減らすことができました。 このように最初に機能を作ってどんどん改善を加えていくとやりやすく感じました。

g=(s,t)=>(c=0,[...s].forEach(v=>v===t && c++),c);

ちなみに調べてみると、 このようにアロー関数などを使う事で 49バイトにまで改善できました。

developer.mozilla.org

簡単に解説すると

  • c:文字ヒット数
  • [...s]:文字列sを配列に分割
  • forEach(v=>v===t && c++):指定文字列と一致した場合にcをカウントアップ
  • 最後のc: 値の返却

いろんな書き方があって勉強になりますね!

では次は皆さんと一緒にやっていきましょう!

例題2

1から100までの数値で以下の条件に該当する場合、
console.logで結果を出力する

・仕様
3の倍数の場合:数値_Aを出力 (例)3_A
5の倍数の場合:数値_Bを出力 (例)5_B

15など両方の条件に該当する場合は両方出力。
データの区切りは改行(\n)とします。

・期待の表示結果
3_A
5_B
6_A
...
15_A
15_B
...
99_A
100_B


私の回答(86バイト)

for(i=1;i<101;i++){if(i%3===0){console.log(i+"_A");}if(i%5===0){console.log(i+"_B");}}

以下、皆さんの回答の抜粋です。

  • 寺氏の回答(68バイト)
for(i=1;i<101;i++)i%3||console.log(i+'_A'),i%5||console.log(i+'_B');

=== 0を使わず||演算子で条件がfalse(jsは0をfalseとして評価する)なら出力。すごい発想ですね!

  • 遠氏の回答(77バイト)
for(i=1;i<101;i++){i%3===0&&console.log(i+'_A');i%5===0&&console.log(i+'_B')}

条件判定がtrueの場合&&で処理を繋げる。勉強になりますね!

  • みよ氏の回答(80バイト)
for(i=1;i<101;i++){if(!(i%3))console.log(i+'_A');if(!(i%5))console.log(i+'_B');}

!で判定を逆にすることで剰余結果が0の場合にif文の処理が実行される。逆転の発想ですごいですね!

参考サイト

いろんな言語がのってました

https://leetcode.com/problemset/

まとめ

コードゴルフは、可読性を犠牲にするため、 実際のプロジェクトで使えることは少ないですが こういった記法もあるんだなという事を知る事は大事ですし 新しい技術やアイデアを学ぶ絶好の機会だと思いました! 機会があれば違う言語でも挑戦してみようと思います!

最後までご覧いただきありがとうございます。 弊社ではエンジニアを募集しております!

この記事を見て気になった方、是非一度カジュアルにお話ししましょう! ご応募心よりお待ちしております!!!

Wantedly / Green