かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

競技プログラミングの問題をしてみた

chomado.com

@chomadoさんの参加したという競技プログラミングの問題を解いてみました。 たまには頭の体操。

B問題

英小文字からなる 12 個の文字列 S1, S2, …, S12 が入力されます。
これらの文字列のうち、文字 r が含まれるものの個数を数えてください。

ちょまどさんと、ほぼ一緒ですね。 データ読み込むInput関数もLINQにしてみたくらい

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var count = Input()
                .Where(x => x.Contains("r"))
                .Count();
            Console.WriteLine(count);
        }

        private static IEnumerable<string> Input() => Enumerable.Range(1, 12).Select(_ => Console.ReadLine());
    }
}

C問題

あなたはスーパーハッカーです。高橋君を攻撃対象に定めたあなたは、
 高橋君のパソコンのパスワードに関して次の事実を突き止めました。

長さは N 文字である。
a, b, c 以外の文字は含まれない。
 高橋君のパソコンのパスワードの候補として考えられる文字列をすべて列挙してしまいましょう。 

ちょまどさんは再帰でスッキリ解いてました。 私はLINQを使ってみました。 SelectManyを指定された回数-1回繰り返して文字列を合成していってます。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var source = new[] { "a", "b", "c" }.AsEnumerable();
            Func<string, IEnumerable<string>> process = x => source.Select(y => $"{x}{y}");

            var num = int.Parse(Console.ReadLine());
            var result = source;
            foreach (var _ in Enumerable.Range(1, num - 1))
            {
                result = result.SelectMany(process);
            }

            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
        }
    }
}

D問題

高橋君は 1 以上 N 以下のすべての整数を十進表記で一回ずつ紙に書きました。
この作業で、高橋君は 1 という数字を何個書いたでしょうか。
using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var num = int.Parse(Console.ReadLine());
            var count = Enumerable.Range(1, num)
                .SelectMany(x => x.ToString().ToCharArray())
                .Count(x => x == '1');
            Console.WriteLine(count);
        }
    }
}

アルゴリズム的にはちょまどさんと同じなので20点になりそうだ…。 100点ってどんなのなんだろう。

と思ってみてみると難しい…。

abc029.contest.atcoder.jp