はじめに
今回は、ナベアツのプログラムのコードゴルフにチャレンジしてみたのでコードを紹介したいと思います。
コード紹介
ナベアツとは
世界のナベアツという芸人が行った以下の条件になるときにアホになるというものです。
- 3の倍数のときに
Aho
と表示する - 文字列に3が付く場合に
Aho
と表示する
これをプログラムで表して、次のようなテキストを表示させます。
1, 2, Aho, 4, 5, Aho, 7, 8, Aho, 10, 11, Aho, Aho, …
ちなみに、FizzBuzz問題というが元ネタにあります。こちらは以下のような条件です。
- 3の倍数のときに
Fizz
と表示する - 5の倍数のときに
Buzz
と表示する - 3と5の倍数の時に
FizzBuss
と表示する
順番に表示すると以下のようになります。
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, …
こちらのFizz-Buzz問題については過去にやっているので、興味ある方はそっちを見てください。
コードゴルフなコード
色々な短いコードがありますが、Rubyだと簡単に短いコードを作れそうだったので、Rubyで挑戦してみました。Ruby Onlineで実行できますので是非張り付けてみてください。
- 46バイト
1.upto(40){|n|puts n%3==0||n.to_s[?3]?:Aho:n}
- 43バイト(文字列部分の表示でゴミが出る可能性がある)
1.upto(40){|n|p n%3==0||n.to_s[?3]?:Aho:n}
工夫点は次のようになっています。
- Ahoという文字列はダブルクォーテーションでくくる必要があるが、
:
のシンボルを使用することで1バイト削減 3
という文字列が存在するかは、n.to_s["3"]
でも可能だが、?
をつけて文字リテラル化して1バイト削減- ちなみにこれが微妙なところで
n.to_s[:3]?:Aho:n
やn.to_s[?3]??Aho:n
はコンパイルエラーが起きる
- ちなみにこれが微妙なところで
- 繰り返し文は最も短くなる
upto
を選択- Rubyでは繰り返し文の書き方が色々あるのだが最も短いのを選択
参考
約束の地 – Ruby で ?(はてな、ハテナ、クエスチョンマーク)の後ろに文字を書いた場合の戻り値(返り値)は文字リテラルになる
@siman – RubyのコードゴルフのTips
ユニークなコード
Codegolfのコード以外にもユニークなコードも作ってみましたので紹介します。目指すは極力使用する演算子の種類を減らし(今回は条件演算子のみ)かつ短いコードを作るという形でチャレンジしてみました。
- 70バイト
1.upto(40){|n|puts [n,:Aho][(n.to_s()[?3]?1:(n.to_s(3)[-1][?0]?1:0))]}
短いコードを作るコードゴルフの工夫点に加えてさらに次のようになっています。
- 論理演算子
||
を使わないように、配列[n,:Aho]
を定義して、0
か1
かで選択させる 3
が付く数値の検出で剰余演算子を使わないようにするために、3進数へ変換して文字列化を行った後に末尾が0かどうかを判定させる
おわりに
皆さんいかがでしたでしょうか。コードゴルフは普段使わないようなテクニック、言語仕様を学ぶきっかけになるので、気分転換にチャレンジしてみるのもいいかもしれませんね。
コメント