ようこそ。睡眠不足なプログラマのチラ裏です。

FizzBuzz問題と世界のナベアツ

※後にHaskellで書いたネタはこちら→Haskellで世界のナベアツ問題
※後にPowerShellで書いたネタはこちら→PowerShellで世界のナベアツ問題

FizzBuzz問題とは

1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」とプリント、5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

というものである。
プログラマの基本的な素養をみるための、簡単な練習問題である。

世界のナベアツとは

渡辺 鐘(わたなべ あつむ)は放送作家で、お笑いコンビ・ジャリズムのボケ担当。
2007年後半から「世界のナベアツ」というキャラクターで、ネタ番組「レッドカーペット」や「あらびき団」などに出演。

主な持ちネタは、

・「3の倍数と3の付く数字だけアホになります」
・「3の倍数と3の付く数字だけアホになり、8の倍数だけ気持ち良くなります」

というものである。



なにやらFizzBuzz問題と酷似しているっぽい。
そこで、世界のナベアツをプログラミングしてみた。


汎用世界のナベアツ ダウンロード右クリックで保存



using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;

namespace WindowsApplication1
{
   //世界のナベアツクラス 
   public class Nabeatsu : INotifyPropertyChanged
    {
        #region メンバ   
                private static int baiAho;
                private static int hukumuAho;
                private static int baiAhan;
                private static bool useAhan;
        #endregion

        #region コンストラクタ
                public Nabeatsu(int bAho,int hAho,int hAhan){
                    baiAho = bAho;
                    hukumuAho = hAho;
                    baiAhan = hAhan;
                }
        #endregion

        #region プロパティ
                public int BaiAho{
                    get{
                        return baiAho;
                    }
                    set{
                        baiAho = value;
                        NotifyPropertyChanged("BaiAho");
                    }
                }
            
                public int HukumuAho{
                    get{
                        return hukumuAho;            
                    }
                    set{
                        hukumuAho = value;
                        NotifyPropertyChanged("HukumuAho");
                    }
                }

                public int BaiAhan
                {
                    get{
                        return baiAhan;
                    }
                    set{
                        baiAhan = value;
                        NotifyPropertyChanged("BaiAhan");
                    }
                }
                
                public bool UseAhan{
                    get{
                        return useAhan;
                    }
                    set{
                        useAhan = value;
                        NotifyPropertyChanged("UseAhan");
                    }
                }
        #endregion

        #region イテレータブロック(反復子)
                public IEnumerable<string> FromTo(int from, int to)
                {
                    if (from <= to) {
                        while (from <= to)
                        {
                            yield return NetaYarimasu(from++);
                        }
                    }else{
                        //fromの方がでかく設定されちゃった場合
                        while (to <= from)
                        {
                            yield return NetaYarimasu(from--);
                        }
                    }
                
                }
        #endregion
                
        #region メソッド        
                private static string NetaYarimasu(int value){
                    const string aho = "アホ";
                    const string ahan = "あはん";
                    
                    StringBuilder sb = new StringBuilder();
                    
                    if (IsAho(value)){
                        sb.Append(aho);                
                    }

                    if (useAhan){
                        if (IsAhan(value))
                        {
                            sb.Append(ahan);
                        }
                    }
                    sb.Append(value.ToString());
                    return sb.ToString();
                }
                
                private static bool IsAho(int value){
                    //ゼロは倍数じゃないですよ
                    if (value == 0) return false;
                    
                    return value %baiAho == 0 ? true : value.ToString().IndexOf(hukumuAho.ToString()) >= 0 ? true : false;
                }

                private static bool IsAhan(int value){
                    //ゼロは倍数じゃないですよ
                    if (value == 0) return false;

                    return value % baiAhan == 0 ? true : false;      
                }
        #endregion

        #region INotifyPropertyChangedの実装

                    public event PropertyChangedEventHandler PropertyChanged;

                    protected virtual void NotifyPropertyChanged(string propertyName)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                    }
        #endregion
        }
}

クライアント側の実装は省きます。なんの変哲もない雑なプログラムだが、
イテレータブロック(反復子)を使っていて、且つ逆順も提供している点と、
INotifyPropertyChangedインターフェイスを実装し、
コントロールとデータバインド可能なプロパティを提供しているところに若干の工夫が。
しかしまぁ、たいしたロジックではないとはいえ、ノーミスでこれを脳内実行するのは結構難しいのでは。
世界のナベアツの脳の回路はすげーなと、感心せざるを得ないだろう常考