About us       情シスのじかんとは?

生成AI×Pythonでコードゴルフにチャレンジしてみました!(Python編) –おつまみとしてのソースコード第2皿

ユニークで面白い、意外なアイディアが詰め込まれているソースコードの世界をおつまみ感覚で紹介するのが、情シスのじかんの「おつまみとしてのソースコード」です!週末も近づき、ちょっと一息つきたくなる木曜日の夕方にお届けしていきます。

みなさんは、「コードゴルフ」というプログラミングの競技をご存じでしょうか?
コードゴルフとは、与えられた題目(アルゴリズム)を最短の文字数で書く競技のことです。ソースコードは必ずしも短ければよいというものではないですが、なるべくスマートなソースコードを書けるようになりたい、というのはエンジニアの共通の想いですよね。

おつまみとしてのソースコードの第二回は「コードゴルフ×生成AI」。昔から一部のエンジニアの間で親しまれているコードゴルフについて、生成AIにアイディアを聞いてみよう!という試みです。

さて、今話題の生成AIは、一体どんなアイディアを提供してくれるのでしょうか?エンジニア仲間とのアイスブレイクや、一人でまったりする時間のお供に、ぜひご覧ください!

         

コードゴルフとは

まず、コードゴルフとはどのようなものか、もう少し詳しく紹介しておきましょう。
コードゴルフとは、与えられたアルゴリズムを、可能な限り短い文字数のソースコードで記述する競技のことです。C++やJava、Pythonなどのメジャーな言語を中心にコンテストが開催されており、オンラインでは「Anarchy Golf」や「AtCoder」など、多くのサイトで行われています。
そんなコードゴルフですが、今回はPythonを使用言語として、生成AI(Gemini)を使いチャレンジしていきます!

言葉で説明してもイメージしづらいと思いますので、まずはコードゴルフの実例を見てみましょう。

コードゴルフの例題 Hello World!問題

「Hello World! 」と出力させるソースコードは、エンジニアなら1度は書いたことがあるのではないでしょうか?
1行出力するだけでは工夫の余地がないので、ここでは以下のように、5回繰り返して出力する問題を設定して、コードゴルフの例を見てみましょう。

では、さっそくソースコードを見ていきましょう。一般的なソースコードと、コードゴルフで短くした例についてPythonに聞いてみました。

・一般的なPythonコード(whileループバージョン):

・一般的なPythonコード(forループバージョン):

・コードゴルフで短くした例:

Whileループ、forループ、コードゴルフの順でどんどんソースコードが短くなっています!
コードゴルフのソースコードでは、print()関数をうまく使ってソースコードを短くしていますね。このように、文法や関数を効果的に使うことで、文字数を極限まで短くするのがコードゴルフのコツです。

生成AI×Pythonでコードゴルフにチャレンジ!

それでは、実際に生成AIを使ってコードゴルフにチャレンジしていきましょう!コードゴルフの題目として有名な「FizzBuzz問題」「回文判定」と「素数判定」の3つについて、生成AIを使ってソースコードを作成していきます。

題目① FizzBuzz問題

まずは1つ目の題目、FizzBuzz問題にチャレンジしていきましょう!
FizzBuzz問題は、コードゴルフの入門的な問題としてよく用いられます。内容としては、1から100までの数を順に表示し、3の倍数のときは”Fizz”、5の倍数のときは”Buzz”、両方で割り切れるときは”FizzBuzz”と表示する、という問題です。
では一般的なソースコードと、コードゴルフで短くした例について生成AIに聞いてみましょう。

・一般的なPythonコード:

・コードゴルフで短くした例:

なるほど、かなり短くなっていますね!コードゴルフでは文字数を極限まで削減するために、改行や空白もなるべく使わないのがセオリーです。可読性は落ちますが、目的のアルゴリズムを実装しつつ、ソースコードが効果的に削減されているのが分かります。

題目② 回文判定

次に2つ目の題目、回文判定のソースコードを作成していきましょう。
回文判定は、ご存じの通り、前から読んでも後ろから読んでも、同じ音になる文のことです。そのため、実装のポイントは、文字列を逆から読み込み、元の文字列と比較して同じであるかを判定する部分をいかに工夫するかにかかっています。

では早速、一般的なソースコードとコードゴルフのソースコードを比較してみます。

・一般的なソースコード:

・コードゴルフで短くした例:

驚くほどシンプルになりましたね!「コードゴルフで短くした例」のソースコードでは、ラムダ関数を用いて関数定義を行うことで文字数を減らしています。また、スライスを使うことで効率的に文字列を逆順に並び替え、元の文字列と比較しています。
実際に処理を実行してみると、コードゴルフで短くしたソースコードでも回文であることが判定できます。生成AI、見事です。

題目③ 素数判定

最後に3つ目の題目、素数判定について生成AIを使って実装していきましょう。
素数判定は、素数の特徴を踏まえ、以下の2つのポイントに基づいて実装するのが基本です。

・平方根までのチェック

素数の約数は、必ずその数の平方根以下の数と、その数で割った商のペアで存在します。そのため、平方根までの数で割り切れるかどうかを調べれば十分です。

・全ての余りが0でない

もし、与えられた値が素数でなければ、2から平方根までの間に必ず約数が存在し、nをその約数で割った余りは0になります。

では、生成AIのアイディアを検証していきましょう。

・一般的なソースコード:

・コードゴルフで短くした例:

スペースや改行を使用しないだけでなく、関数名も1文字で定義し、可能な限り文字数を少なくする工夫が散りばめられています。また、all関数やジェネレーター式なども活用し、素数判定に必要なポイントを実現しています。すごいですね!

まとめ

奥の深いコードゴルフの世界を覗くことができたでしょうか?著者の所感ですが、コードゴルフについて生成AIに問いかけると、「興味深い質問ですね!」など、心なしか生成AIが前のめりで回答をしてくれたような気がします。生成AIにとっても面白いと感じるテーマなのかもしれませんね!

コードゴルフのソースコードは、必ずしも効率の良い処理を実現するものではありません。しかし、一般的なソースコードを書いていては思いつかない、あっと驚くアイディアが使われていたりして、興味深い世界であることがわかります。
これを機に、みなさまもコードゴルフにチャレンジしてはいかがでしょうか?

著者:羽守ゆき
大学を卒業後、大手IT企業に就職。システム開発、営業を経て、企業のデータ活用を支援するITコンサルタントとして10年超のキャリアを積む。官公庁、金融、メディア、メーカー、小売など携わったプロジェクトは多岐にわたる。現在もITコンサルタントに従事するかたわら、ライターとして活動中。
 
 

特集|仕事で疲れた脳みそをリフレッシュ♬
おつまみとしてのソースコード

木曜日の夕方に仕事で疲れた脳みそをリフレッシュしたいとき、一人でゆっくりしたい夜、ちょっとした空き時間に、気軽に「つまめる」ソースコードの話題をお届けします。

まるで隠れ家バーでマスターが語るウンチクのように、普段は見過ごしがちなコードの奥深さや、思わず「へぇ〜!」と唸るようなユニークなアイデア、クスッと笑える小ネタを、ソースコードの世界を熟知した「情シスのじかん」がご紹介します。

コードを書くのが大好きなエンジニアさんも、ソースコードはちょっと苦手…という情シス部門の方も、この特集を読めば、きっとソースコードの新たな一面を発見できるはず。

業務効率化のヒントになるTipsや、セキュリティ対策に役立つ情報も盛りだくさん。

さあ、あなたも「おつまみとしてのソースコード」で、技術の世界をもっと身近に、もっと楽しく感じてみませんか?

本特集はこちら

参照元

 

関連記事Related article

       

情シスのじかん公式InstagramInstagram

       

情シスのじかん公式Instagram

30秒で理解!フォローして『1日1記事』インプットしよう!

おすすめ記事Recommended articles

close close