C#
codeiq

CodeIQ「進捗ヴェリーグッドマーク」問題に参加しました

CodeIQ「進捗ヴェリーグッドマーク」問題の公開が終了したということで、自分の解答を公開したいと思います。なおCodeIQはそのサービスの都合上、解答の公開は基本的にNG。ただ今回は出題者の@tbpgrさんの許可が出ているということもあり、解答を公開しています。

Program.cs
using System;
using System.Linq;

public class Program
{
    public static void Main(string[] args)
    {
        var n = int.Parse(Console.ReadLine());
        var ans = Draw(n);
        Console.WriteLine(ans);
    }

    public static string Draw(int n)
    {
        if (n % 2 == 0)
        {
            return "invalid";
        }

        var matrix = Enumerable.Range(0, n).Select(i => Enumerable.Repeat(".", n).ToList()).ToList();
        foreach (var i in Enumerable.Range(0, n))
        {
            var j = i / 2;
            matrix[i][j] = matrix[i][n - j - 1] =  "v";
        }


        return string.Join(System.Environment.NewLine, matrix.Select(row => string.Join("", row)));
    }
}

まずは二次元配列を文字列.で初期化したあと、適当な要素を文字列部分でvで上書きする――というシンプルなロジックになっています。もう少しC#らしい書き方があるような気もしますが、C#初心者としては満足な出来上がりです。

次にテストコード。かなり雑、というかコピペで作った感満載(´・ω・`) 正直なところNUnitがよくわかっておらず、雰囲気で使っている面は多々あります。鍛錬が足りぬ(´・ω・`)

ProgramTest.cs
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Tests
{
    [TestClass()]
    public class ProgramTests
    {
        [TestMethod()]
        public void DrawTest1()
        {
            Assert.AreEqual("v", Program.Draw(1));
        }

        [TestMethod()]
        public void DrawTest2()
        {
            Assert.AreEqual("invalid", Program.Draw(2));
        }

        [TestMethod()]
        public void DrawTest3()
        {
            var expected = "v.v?v.v?.v.".Replace("?", System.Environment.NewLine);
            Assert.AreEqual(expected, Program.Draw(3));
        }

        [TestMethod()]
        public void DrawTest5()
        {

            var expected = "v...v?v...v?.v.v.?.v.v.?..v..".Replace("?", System.Environment.NewLine);
            Assert.AreEqual(expected, Program.Draw(5));
        }
    }
}

関連リンク: