ナベアツのコードゴルフにチャレンジしてみた!

プログラミング
スポンサーリンク

はじめに

今回は、ナベアツのプログラムのコードゴルフにチャレンジしてみたのでコードを紹介したいと思います。

コード紹介

ナベアツとは

世界のナベアツという芸人が行った以下の条件になるときにアホになるというものです。

  • 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問題については過去にやっているので、興味ある方はそっちを見てください。

Fizz-Buzz問題を解いてみた!
今日はネットでFizz-Buzz問題という面白そうなものを見つけた。 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:nn.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]を定義して、01かで選択させる
  • 3が付く数値の検出で剰余演算子を使わないようにするために、3進数へ変換して文字列化を行った後に末尾が0かどうかを判定させる

おわりに

皆さんいかがでしたでしょうか。コードゴルフは普段使わないようなテクニック、言語仕様を学ぶきっかけになるので、気分転換にチャレンジしてみるのもいいかもしれませんね。

コメント

タイトルとURLをコピーしました