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));
}
}
}
関連リンク: