C#
codeiq

CodeIQ「進捗いいわけマーク」問題に参加しました。

「進捗いいわけマーク」問題の公開期限が終了したということで、自分の提出コードを公開したいと思います。利用言語はC#。ここ2-3か月C#の勉強中のため、腕試し的に解いてみました。

using System;
using System.Linq;

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

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

        var mid = x / 2;
        var matrix = Enumerable.Range(0, x).Select((i) => Enumerable.Repeat(".", x).ToList()).ToList();
        foreach (var i in Enumerable.Range(0, x))
        {
            foreach (var j in Enumerable.Range(0, x))
            {
                if (j == mid || ((i == 0 || i == x - 1) && (j == mid - 1 || j == mid + 1)))
                {
                    matrix[i][j] = "i";
                }
            }
        }

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

まず.で埋められたn×nの二次元配列を準備し、その要素をすべてなめながら、適切な位置iに置き換えるというロジックになります。ただ改めて見返してみると――もうちょっと書きようがあったような気がします(´・ω・`) とくに「二次元配列の要素をすべて探索する」部分は計算量が$O(n^2)$になるということもあり、見直したい。今回はnの制約が1-100と小さかったからTLEしませんでしたが……。

あとはLINQをもう少しうまく使いこなしたいですね。上記のコードだと二次元配列の生成と初期化ぐらいにしかLINQを利用していません。LINQは高機能でかつ可読性にも優れているので、活用してきたいですね。まあC#初心者ということで許してください(´・ω・`)

お断り:CodeIQの解答を公開するのはサービスの性質上、基本的にはNGですが、出題者が了承する場合はOK--という運用というか風潮があります。今回は出題者である@tbpgrさんのOKが出ているため、解答を公開しています。