Azureはじめました

Windows Azureで業務システムを組んでみる日記

ジョンジョンボビプログラムできたよー


    public partial class Form1 : Form {
        private void form1_DoubleClick(object sender, EventArgs e) {
            JohnBon.Jovi();
        }
    }
    public class JohnBon {
        private enum JBJToken { ボ, ン, ジョ, ヴィ }
        private static int[] answer = new JBJToken[] { JBJToken.ジョ, JBJToken.ン, JBJToken.ボ, JBJToken.ン, JBJToken.ジョ, JBJToken.ヴィ }
            .Cast<int>().Reverse().ToArray();
        public static void Jovi() {
            Random jbjRandom = new Random();
            int tokenCount = Enum.GetValues(typeof(JBJToken)).Length;
            //initial 
            List<int> list = Enumerable.Range(0, answer.Length).Select(i => jbjRandom.Next(tokenCount)).ToList();
            while (!answer.SequenceEqual(list.Take(answer.Length))) {
                list.Insert(0, jbjRandom.Next(tokenCount));
            }
            foreach (JBJToken t in list.Cast<JBJToken>().Reverse()) {
                Console.Write(t.ToString() + "・");
            }
            Console.WriteLine();

            Console.WriteLine(string.Format("{0} Bon Jovis", list.Count));
            Console.WriteLine(@"
_人人人人人人人人人人人人人人_
> You Give Love a Bad Name <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄");
        }
    }

f:id:twisted0517:20140603172529p:plain

╭( ・ㅂ・)و やったー

もちょっと短く

        public static void Jovi() {
            Random jbjRandom = new Random();
            int tokenCount = Enum.GetValues(typeof(JBJToken)).Length;
            //initial 
            List<int> list = Enumerable.Range(0, answer.Length).Select(i => jbjRandom.Next(tokenCount)).ToList();
            while (!answer.SequenceEqual(list.Take(answer.Length))) {
                list.Insert(0, jbjRandom.Next(tokenCount));
            }
            Console.Write(string.Join("・", list.Cast<JBJToken>().Reverse().Select(t => t.ToString()).ToArray()));
            Console.WriteLine(string.Format(@"

{0} Bon Jovis

_人人人人人人人人人人人人人人_
> You Give Love a Bad Name <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄", list.Count));
        }

Consoleへの出力を先にLINQ使って文字列にすることで1行に。

解説(いらない

  • トークンを数値と文字の媒介にするために列挙型に。
  • IEnumerable<T>.SequenceEqual()で答え合わせ。
  • 最新の6*1個のトークンを切り出すためにIEnumerable.Take()を使う。ただTakeでは末尾から取れないんでリストを逆順に作っとく
  • 出力する段ではリストを再度逆順にしてキャストしてからSelectでstring配列にしてstring.Join()で結合

╭( ・ㅂ・)و

*1:answer.Length