C#
Pythonの辞書の代替になるコンテナはDictionaryです。Problem 27を考えてみましょう。Pythonならこんな感じです。 from itertools import * import time memo = { } def IsPrime(n): if n < 2: return False elif n in memo: return memo[n] b = all(n % p !…
Pythonのsetの代替になるコンテナはHashSetとSortedSetがあります。Problem 29の小規模超ナイーブ版で考えてみましょう。Pythonならこんな感じです。 N = 10 s = set(a ** b for a in xrange(2, N + 1) for b in xrange(2, N + 1)) print len(s) HashSetを使…
ListはPythonのリストにあたるものです。C++のvectorにあたるといったほうがわかりやすいかもしれません。 using System; using System.Collections.Generic; // おまじない using System.Linq; class list_test { static void Main(string[] args) { var sw…
タイトルは、英語ではiterator block、日本語公式サイトでは反復子ブロックと呼んでいるようです(方法 : 整数リストの反復子ブロックを作成する (C#))。反復子ブロックはPythonでいうジェネレータのようなものです。例としてProblem 2を考えてみましょう。…
ここで時間計測をしてみましょう。 using System; using System.Linq; class e001 { static void Main(string[] args) { var sw = new System.Diagnostics.Stopwatch(); sw.Start(); const int N = (int)1e9; var s = Enumerable.Range(1, N - 1). Where(n =…
前回はPythonの N = 1000 print sum(ifilter(lambda n: n % 3 == 0 or n % 5 == 0, xrange(1, N))) をC#で書くと、 const int N = 1000; var s = Enumerable.Range(1, N - 1). Where(n => n % 3 == 0 || n % 5 == 0).Sum(); Console.WriteLine(s); となるの…
Problem 1をPythonでふつうに書くとこうなるのでした。 N = 1000 print sum(n for n in xrange(1, N) if n % 3 == 0 or n % 5 == 0) ジェネレータ式ではなく関数で書いてみると、 print sum(ifilter(lambda n: n % 3 == 0 or n % 5 == 0, xrange(1, N))) こ…
次のコードを見てください。 using System; class lambda_test { static void Main(string[] args) { Func<int,int> f = (x) => x + 1; // ラムダ式 Console.WriteLine(f(1)); // 2 } } このfの定義がラムダ式です。型はFuncとなっています。引数がint一つで返り値がi</int,int>…
例えば、Problem 1ですが、Pythonでふつうに書くとこうでしょう。 N = 1000 print sum(n for n in xrange(1, N) if n % 3 == 0 or n % 5 == 0) 実質1行で書けます。しかし、Pythonは書きやすいけど遅いんですよね。C++の200倍くらい遅いことがあります。PyPy…