C♯の勉強

C♯4.0 で TopCoder の過去問を解きます。

Div2Easy

TopCoder SRM593: RaiseThisBarn

切り分け方を全通り試す。 public class RaiseThisBarn { public int calc(string str) { int ans = 0; for (int i = 1; i < str.Length; i++) { string left = str.Substring(0, i); string right = str.Substring(i); if (left.Replace(".", "") == right.…

TopCoder SRM592: LittleElephantAndBooks

pages をソートした配列を A とすると、 A[0],...,A[number-2],A[number] が2番目に最小な本の選び方になる。 public class LittleElephantAndBooks { public int getNumber(int[] pages, int number) { return pages .OrderBy(p => p) .Where((p, index) =…

TopCoder SRM582: ShoutterDiv2

全探索。クエリ式を使うと作業用ローカル変数が減って、幸せな気持ちになれます。 public class ShoutterDiv2 { public int count(int[] s, int[] t) { int n = s.Length; return (from i in Enumerable.Range(0, n) from j in Enumerable.Range(0, n) where…

TopCoder SRM582: SemiPerfectSquare

全探索 public class SemiPerfectSquare { public string check(int N) { return (from a in Enumerable.Range(1, N) from b in Enumerable.Range(1, N) where a < b && a * b * b == N select 1).Any() ? "Yes" : "No"; } }

TopCoder SRM 583: SwappingDigits

総当りするだけ。 クエリ式の let を使ってみた 入力文字は数字だけなので、StringComparer.Ordinalで文字列比較する必要はない。しかし基本的に文字列ソートはこれを使う癖をつけたほうが良さそうなので一応付けてる。 public class SwappingDigits { stati…

TopCoder SRM581: BlackAndWhiteSolitaire

"BWBW..." と "WBWB..." の2通りとの差分の最小値を出せばよい。 public class BlackAndWhiteSolitaire { public int minimumTurns(string cardFront) { int cost = cardFront.Select((c, index) => (c == 'B' ^ (index % 2 == 0)) ? 1 : 0).Sum(); return …

TopCoder SRM 584: TopFox

こういうCROSS JOIN系の処理は、クエリ式のほうがメソッド形式より簡単に書ける。 public class TopFox { public IEnumerable<string> cand(string s) { return Enumerable.Range(1, s.Length).Select(i => s.Substring(0, i)); } public int possibleHandles(string</string>…

TopCoder SRM 585: LISNumberDivTwo

seq[i] >= seq[i+1] になっている部分が LISNumber の切れ目になるので、その箇所の個数に1足したものが答え。Zip() の段階で 1 か 0 に変換して Sum() すれば短く書けることに気づいた。 public class LISNumberDivTwo { public int calculate(int[] seq) …

TopCoder SRM 591: TheArithmeticProgression

a, b, c それぞれの変数を変更した場合の差分の最小値を出す。 public class TheArithmeticProgression { public double minimumChange(int a, int b, int c) { return Enumerable.Min(new[]{ Math.Abs(c - (b + b - a)), Math.Abs(a - (b + b - c)), Math.A…

TopCoder SRM 586: TeamsSelection

問題文交互に最も preference が高い選手を選んでいく。 public class TeamsSelection { public string simulate(int[] preference1, int[] preference2) { int n = preference1.Length; var result = Enumerable.Repeat(' ', n).ToArray(); for (int i = 0;…

TopCoder SRM 587: InsertZ

問題文やるだけ。 goal から 'z' を除いたものが init と等しいかどうかを判定する。 public class InsertZ { public string canTransform(string init, string goal) { return goal.Replace("z", "") == init ? "Yes" : "No"; } }

TopCoder SRM 590: FoxAndGomoku

問題文全探索 public class FoxAndGomoku { static public bool Between(long a, long x, long b) { return a <= x && x < b; } static public int[] dx = { 0, 1, 1, -1}; static public int[] dy = { 1, 0, 1, 1 }; public string win(string[] board) { i…

TopCoder SRM 588: KeyDungeonDiv2

問題文Count() を使うだけ public class KeyDungeonDiv2 { public int countDoors(int[] doorR, int[] doorG, int[] keys) { return Enumerable.Range(0, doorR.Length) .Count(index => Math.Max(doorR[index] - keys[0], 0) + Math.Max(doorG[index] - key…

TopCoder SRM 589: GooseTattarrattatDiv2

問題文最も使用されている文字に寄せればいいので、文字列の長さからそれぞれの文字の使用回数を引けばよい。 public class GooseTattarrattatDiv2 { public int getmin(string S) { return S.Length - Enumerable.Range('a', 26) .Select(c => S.Where(c2 =…