@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点ってどんなのなんだろう。
と思ってみてみると難しい…。