<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5467044167088141182</id><updated>2011-11-28T08:23:37.272+09:00</updated><category term='google wave OT'/><category term='セブアノ'/><category term='セブアノ語'/><title type='text'>言語を楽しもう</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-483894822255437624</id><published>2011-10-01T22:31:00.003+09:00</published><updated>2011-10-01T22:45:53.669+09:00</updated><title type='text'>Go言語でGCJJ2011</title><content type='html'>Golangで解いた。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A問題&lt;br /&gt;&lt;br /&gt;最終カットから1つずつ遡っていく。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package main&lt;br /&gt;&lt;br /&gt;import (&lt;br /&gt; "bufio"&lt;br /&gt; "os"&lt;br /&gt; "strings"&lt;br /&gt; "strconv"&lt;br /&gt; "fmt"&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;func main() {&lt;br /&gt; reader:=bufio.NewReader(os.Stdin)&lt;br /&gt; line,_:=reader.ReadString('\n')&lt;br /&gt; T,_:=strconv.Atoi(strings.TrimSpace(line))&lt;br /&gt; for i:=0;i&amp;lt;T;i++ {&lt;br /&gt;  line,_=reader.ReadString('\n')&lt;br /&gt;   ss := strings.Split(strings.TrimSpace(line), " ")&lt;br /&gt;//  M,_:=strconv.Atoi64(ss[0])&lt;br /&gt;  C,_:=strconv.Atoi(ss[1])&lt;br /&gt;  W,_:=strconv.Atoi64(ss[2])&lt;br /&gt;  ans := W&lt;br /&gt;  A := make([]int64, C, C)&lt;br /&gt;  B := make([]int64, C, C)&lt;br /&gt;  for j:=0;j&amp;lt;C;j++ {&lt;br /&gt;   line,_=reader.ReadString('\n')&lt;br /&gt;   ab := strings.Split(strings.TrimSpace(line), " ")&lt;br /&gt;   a,_:=strconv.Atoi64(ab[0])&lt;br /&gt;   b,_:=strconv.Atoi64(ab[1])&lt;br /&gt;   A[j], B[j] = a, b&lt;br /&gt;  }&lt;br /&gt;  for j:=C-1;j&amp;gt;=0;j-- {&lt;br /&gt;   if ans &amp;lt;= B[j] {&lt;br /&gt;    ans = A[j] + ans - 1&lt;br /&gt;   } else if ans - B[j] &amp;lt; A[j] {&lt;br /&gt;    ans = ans - B[j]&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  fmt.Printf("Case #%d: %d\n", i+1, ans)&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;B問題&lt;br /&gt;&lt;br /&gt;最終日から貪欲法。&lt;br /&gt;sortパッケージを使うときに、&lt;br /&gt;sort.Interfaceに適合するように型を作らないといけないのが&lt;br /&gt;面倒。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package main&lt;br /&gt;&lt;br /&gt;import (&lt;br /&gt; "bufio"&lt;br /&gt; "os"&lt;br /&gt; "strings"&lt;br /&gt; "strconv"&lt;br /&gt; "fmt"&lt;br /&gt; "sort"&lt;br /&gt;)&lt;br /&gt;type Coffee struct {&lt;br /&gt; c, t int64&lt;br /&gt; s int&lt;br /&gt;}&lt;br /&gt;type Coffees []Coffee&lt;br /&gt;&lt;br /&gt;func (c Coffees) Len() int {&lt;br /&gt; return len(c)&lt;br /&gt;}&lt;br /&gt;func (c Coffees) Less(i, j int) bool {&lt;br /&gt; return c[i].s &amp;lt; c[j].s&lt;br /&gt;}&lt;br /&gt;func (c Coffees) Swap(i, j int) {&lt;br /&gt; c[i], c[j] = c[j], c[i]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;type Int64Slice []int64&lt;br /&gt;&lt;br /&gt;func (p Int64Slice) Len() int           { return len(p) }&lt;br /&gt;func (p Int64Slice) Less(i, j int) bool { return p[i] &amp;lt; p[j] }&lt;br /&gt;func (p Int64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;func main() {&lt;br /&gt; reader:=bufio.NewReader(os.Stdin)&lt;br /&gt; line,_:=reader.ReadString('\n')&lt;br /&gt; T,_:=strconv.Atoi(strings.TrimSpace(line))&lt;br /&gt; for i:=0;i&amp;lt;T;i++ {&lt;br /&gt;  line,_=reader.ReadString('\n')&lt;br /&gt;   ss := strings.Split(strings.TrimSpace(line), " ")&lt;br /&gt;  N,_:=strconv.Atoi(ss[0])&lt;br /&gt;  //K,_:=strconv.Atoi64(ss[1])&lt;br /&gt;  ans := uint64(0)&lt;br /&gt;  coffee := make([]Coffee, N, N)&lt;br /&gt;  ts := make([]int64, N+2, N+2)&lt;br /&gt;  for j:=0;j&amp;lt;N;j++ {&lt;br /&gt;   line,_=reader.ReadString('\n')&lt;br /&gt;   s1 := strings.Split(strings.TrimSpace(line), " ")&lt;br /&gt;   a1,_:=strconv.Atoi64(s1[0])&lt;br /&gt;   a2,_:=strconv.Atoi64(s1[1])&lt;br /&gt;   a3,_:=strconv.Atoi(s1[2])&lt;br /&gt;   coffee[j] = Coffee{a1,a2,a3}&lt;br /&gt;   ts[j] = a2&lt;br /&gt;  }&lt;br /&gt;  ts[N] = 0&lt;br /&gt;  ts[N+1] = 0&lt;br /&gt;  sort.Sort(Int64Slice(ts))&lt;br /&gt;  sort.Sort(Coffees(coffee))&lt;br /&gt;  for j:=N;j&amp;gt;=0;j-- {&lt;br /&gt;   t := ts[j+1]-ts[j]&lt;br /&gt;   for k:=N-1;k&amp;gt;=0;k-- {&lt;br /&gt;    if t == 0 { break }&lt;br /&gt;    if coffee[k].t &amp;gt;= ts[j+1] {&lt;br /&gt;     n := coffee[k].c&lt;br /&gt;     if n &amp;gt; t {&lt;br /&gt;      n = t&lt;br /&gt;     }&lt;br /&gt;     coffee[k].c -= n&lt;br /&gt;     t -= n&lt;br /&gt;     ans += uint64(n) * uint64(coffee[k].s)&lt;br /&gt;     //fmt.Printf("ans:%d t:%d %d n:%d k:%d coffee:%v", ans, ts[j+1], ts[j], n, k, coffee[k])&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  fmt.Printf("Case #%d: %d\n", i+1, ans)&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C問題&lt;br /&gt;&lt;br /&gt;試行錯誤の末。&lt;br /&gt;2^n-1の時は特別なケース。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package main&lt;br /&gt;&lt;br /&gt;import (&lt;br /&gt; "bufio"&lt;br /&gt; "os"&lt;br /&gt; "strings"&lt;br /&gt; "strconv"&lt;br /&gt; "fmt"&lt;br /&gt;)&lt;br /&gt;func main() {&lt;br /&gt; reader:=bufio.NewReader(os.Stdin)&lt;br /&gt; line,_:=reader.ReadString('\n')&lt;br /&gt; T,_:=strconv.Atoi(strings.TrimSpace(line))&lt;br /&gt; for i:=0;i&amp;lt;T;i++ {&lt;br /&gt;  line,_=reader.ReadString('\n')&lt;br /&gt;  N,_:=strconv.Atoui64(strings.TrimSpace(line))&lt;br /&gt;  fmt.Printf("Case #%d: %d\n", i+1, keta2(N))&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;func keta2(i uint64) int {&lt;br /&gt; ret := 0&lt;br /&gt; b := false&lt;br /&gt; for i != uint64(0) {&lt;br /&gt;  if i &amp; 1 == uint64(1) {&lt;br /&gt;   if b {&lt;br /&gt;    ret++&lt;br /&gt;   }&lt;br /&gt;  } else {&lt;br /&gt;   b = true&lt;br /&gt;  }&lt;br /&gt;  ret++&lt;br /&gt;  i = i &amp;gt;&amp;gt; 1&lt;br /&gt; }&lt;br /&gt; if b { ret-- }&lt;br /&gt; return ret&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-483894822255437624?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/483894822255437624/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=483894822255437624' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/483894822255437624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/483894822255437624'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2011/10/gogcjj2011.html' title='Go言語でGCJJ2011'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-5086286938065128029</id><published>2010-05-09T23:08:00.003+09:00</published><updated>2010-05-09T23:12:19.777+09:00</updated><title type='text'>Google Code Jam Qualification 2010 C</title><content type='html'>&lt;div&gt;メモ化に手間取った。&lt;/div&gt;&lt;div&gt;コードが長いなあ。&lt;/div&gt;&lt;div&gt;3問解くのに3時間もかかってしまった。1,2時間で解けるはずとGoogleは言っているのに。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;public void run(String file) throws Exception {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Scanner scan = new Scanner(file);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;int T = scan.nextInt();&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;for (int testcase = 0; testcase &lt;&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int R = scan.nextInt();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int k = scan.nextInt();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int N = scan.nextInt();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int[] gs = new int[N];&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;for (int i = 0; i &lt;&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;gs[i] = scan.nextInt();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;long[] memmoney = new long[N];&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int[] memfreq = new int[N];&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;Arrays.fill(memmoney, -1L);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;Arrays.fill(memfreq, -1);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int cur = 0;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int freq = 0;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;long summoney = 0;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int i = 0;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;for (i = 0; i &lt;&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;if (memfreq[cur] == -1) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;memmoney[cur] = summoney;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;memfreq[cur] = freq;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;} else {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;break;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;int cap = k;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;int stop = 0;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;while (cap &gt;= gs[cur] &amp;amp;&amp;amp; stop &lt;&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;cap -= gs[cur];&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;cur = (cur+1) % N;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;stop++;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;freq++;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;summoney += k - cap;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;long ans = 0;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;if (i == R) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;ans = summoney;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;} else {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;int f = freq - memfreq[cur];&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;long fmoney = summoney - memmoney[cur];&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;int repeated = (int)((R - memfreq[cur]) / f);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;int remain = R - memfreq[cur] - (int)((R - memfreq[cur]) / f) * f;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;ans = memmoney[cur] + fmoney * repeated;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;long plus = -1L;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;for (int j = 0; j &lt;&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;if (memfreq[j] == memfreq[cur] + remain) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;plus = memmoney[j] - memmoney[cur];&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;assert(plus &gt;= 0L);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;ans += plus;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;write("Case #" + (testcase+1) + ": " + ans + "\n");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-5086286938065128029?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/5086286938065128029/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=5086286938065128029' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/5086286938065128029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/5086286938065128029'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2010/05/google-code-jam-qualification-2010-c.html' title='Google Code Jam Qualification 2010 C'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-7557901066026112940</id><published>2010-05-09T23:05:00.002+09:00</published><updated>2010-05-09T23:08:21.002+09:00</updated><title type='text'>Google Code Jam Qualification 2010 B</title><content type='html'>紙で計算してみると、t1-t2, t2-t3, t(n-1) - t(n)のgcdをTとして、&lt;br /&gt;t1+yがTの倍数となる最小のyを計算すればよさそうだが、数学的に証明ができない。&lt;br /&gt;まあ、正解だったから、解説が出るまで待ってみよう。&lt;br /&gt;&lt;br /&gt; public void run(String file) throws Exception {&lt;br /&gt;  Scanner scan = new Scanner(file);&lt;br /&gt;  int T = scan.nextInt();&lt;br /&gt;  for (int testcase = 0; testcase &lt; T; testcase++) {&lt;br /&gt;   int N = scan.nextInt();&lt;br /&gt;   BigInteger[] ts = new BigInteger[N];&lt;br /&gt;   for (int i = 0; i &lt; N; i++) {&lt;br /&gt;    ts[i] = new BigInteger(scan.next());&lt;br /&gt;   }&lt;br /&gt;   BigInteger[] ds = new BigInteger[N-1];&lt;br /&gt;   for (int i = 0; i &lt; N-1;i++) {&lt;br /&gt;    ds[i] = ts[i+1].subtract(ts[i]).abs();&lt;br /&gt;   }&lt;br /&gt;   BigInteger gcd = ds[0];&lt;br /&gt;   for (int i =1; i &lt; ds.length;i++) {&lt;br /&gt;    gcd = gcd.gcd(ds[i]);&lt;br /&gt;   }&lt;br /&gt;   //debug(ts, ts[0], gcd);&lt;br /&gt;   BigInteger ans = gcd.subtract(ts[0].mod(gcd)).mod(gcd);&lt;br /&gt;   write("Case #%d: %s\n", testcase+1, ans.toString());&lt;br /&gt;  }&lt;br /&gt; }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-7557901066026112940?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/7557901066026112940/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=7557901066026112940' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/7557901066026112940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/7557901066026112940'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2010/05/google-code-jam-qualification-2010-b.html' title='Google Code Jam Qualification 2010 B'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-2906752809145509705</id><published>2010-05-09T23:02:00.001+09:00</published><updated>2010-05-09T23:04:51.856+09:00</updated><title type='text'>Google Code Jam Qualification 2010 A</title><content type='html'>&lt;div&gt;Aはまずは簡単でした。&lt;/div&gt;&lt;div&gt;ビット演算を使えば綺麗だったか。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;public void run(String file) throws Exception {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Scanner scan = new Scanner(file);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;int T = scan.nextInt();&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;for (int testcase = 0; testcase &lt;&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int N = scan.nextInt();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;int K = scan.nextInt();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;boolean ok = true;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;for (int i = 0; i &lt;&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;if (K % 2 == 1) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;K = K / 2;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;} else {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;ok = false;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;break;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;if (ok) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;write("Case #" + (testcase + 1) + ": ON\n");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;} else {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;write("Case #" + (testcase + 1) + ": OFF\n");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-2906752809145509705?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/2906752809145509705/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=2906752809145509705' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/2906752809145509705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/2906752809145509705'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2010/05/google-code-jam-qualification-2010.html' title='Google Code Jam Qualification 2010 A'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-2582201378177798597</id><published>2009-09-04T23:52:00.001+09:00</published><updated>2009-09-04T23:53:37.383+09:00</updated><title type='text'>Google Code Jam 2009 C    C#でといてみた</title><content type='html'>&lt;div&gt;正直、これで解けるんだと感動。&lt;/div&gt;&lt;div&gt;DPはすごいな。&lt;/div&gt;&lt;div&gt;というか数列か。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    class C&lt;/div&gt;&lt;div&gt;    {&lt;/div&gt;&lt;div&gt;        int NM;&lt;/div&gt;&lt;div&gt;        public void Run()&lt;/div&gt;&lt;div&gt;        {&lt;/div&gt;&lt;div&gt;            List&lt;string&gt; res = new List&lt;string&gt;();&lt;/string&gt;&lt;/string&gt;&lt;/div&gt;&lt;div&gt;            int line = 0;&lt;/div&gt;&lt;div&gt;            //var ss = File.ReadAllLines("C-small-attempt0.in");&lt;/div&gt;&lt;div&gt;            var ss = File.ReadAllLines("testcc.txt");&lt;/div&gt;&lt;div&gt;            NM = ss[0].ToInt();&lt;/div&gt;&lt;div&gt;            line++;&lt;/div&gt;&lt;div&gt;            for (int i = 0; i &lt;&gt;&lt;div&gt;            {&lt;/div&gt;&lt;div&gt;                var str = ss[line];&lt;/div&gt;&lt;div&gt;                var mon = "welcome to code jam";&lt;/div&gt;&lt;div&gt;                line++;&lt;/div&gt;&lt;div&gt;                var len = str.Length;&lt;/div&gt;&lt;div&gt;                var total = new int[mon.Length, len];&lt;/div&gt;&lt;div&gt;                for (int k = 0; k &lt;&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    total[0, k] = str.Substring(0, k + 1).ToCharArray().Count(x =&gt; x == 'w');&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;                for (int j = 1; j &lt;&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    total[j, 0] = 0;&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;                for (int j = 1; j &lt;&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    var sm = mon.Substring(0, j + 1);&lt;/div&gt;&lt;div&gt;                    for (int k = 1; k &lt;&gt;&lt;div&gt;                    {&lt;/div&gt;&lt;div&gt;                        var sstr = str.Substring(0, k + 1);&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;                        int r = total[j, k - 1];&lt;/div&gt;&lt;div&gt;                        if (str[k] == mon[j])&lt;/div&gt;&lt;div&gt;                        {&lt;/div&gt;&lt;div&gt;                            r += total[j - 1, k - 1];&lt;/div&gt;&lt;div&gt;                        }&lt;/div&gt;&lt;div&gt;                        total[j, k] = r % 10000;&lt;/div&gt;&lt;div&gt;                    }&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;                res.Add("Case #{0}: {1}".FormatWith(i + 1, total[mon.Length - 1, str.Length - 1].ToString().PadLeft(4, '0')));&lt;/div&gt;&lt;div&gt;            }&lt;/div&gt;&lt;div&gt;            File.WriteAllLines("Ans.txt", res.ToArray());&lt;/div&gt;&lt;div&gt;            Console.Write(res.ToArray().Join(Environment.NewLine));&lt;/div&gt;&lt;div&gt;            Console.ReadKey();&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-2582201378177798597?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/2582201378177798597/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=2582201378177798597' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/2582201378177798597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/2582201378177798597'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/09/google-code-jam-2009-c-c.html' title='Google Code Jam 2009 C    C#でといてみた'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-3567632885458979421</id><published>2009-09-04T23:50:00.000+09:00</published><updated>2009-09-04T23:52:25.488+09:00</updated><title type='text'>Google Code Jam 2009 B    C#でといてみた</title><content type='html'>&lt;div&gt;長いのが悔しい。&lt;/div&gt;&lt;div&gt;けどわかりやすい再帰。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    class B&lt;/div&gt;&lt;div&gt;    {&lt;/div&gt;&lt;div&gt;        public enum Dir&lt;/div&gt;&lt;div&gt;        {&lt;/div&gt;&lt;div&gt;            Nothing,&lt;/div&gt;&lt;div&gt;            North,&lt;/div&gt;&lt;div&gt;            West,&lt;/div&gt;&lt;div&gt;            East,&lt;/div&gt;&lt;div&gt;            South&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;        public class Cell&lt;/div&gt;&lt;div&gt;        {&lt;/div&gt;&lt;div&gt;            public Dir Direction;&lt;/div&gt;&lt;div&gt;            public int Label;&lt;/div&gt;&lt;div&gt;            public int Alt;&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;        int H;&lt;/div&gt;&lt;div&gt;        int W;&lt;/div&gt;&lt;div&gt;        int T;&lt;/div&gt;&lt;div&gt;        public void Run()&lt;/div&gt;&lt;div&gt;        {&lt;/div&gt;&lt;div&gt;            List&lt;string&gt; res = new List&lt;string&gt;();&lt;/string&gt;&lt;/string&gt;&lt;/div&gt;&lt;div&gt;            int line = 0;&lt;/div&gt;&lt;div&gt;            var ss = File.ReadAllLines("B-large.in");&lt;/div&gt;&lt;div&gt;            T = ss[0].ToInt();&lt;/div&gt;&lt;div&gt;            line++;&lt;/div&gt;&lt;div&gt;            for (int i = 0; i &lt;&gt;&lt;div&gt;            {&lt;/div&gt;&lt;div&gt;                res.Add("Case #{0}:".FormatWith(i + 1));&lt;/div&gt;&lt;div&gt;                int maxlabel = 1;&lt;/div&gt;&lt;div&gt;                var s = ss[line].Split(' ');&lt;/div&gt;&lt;div&gt;                line++;&lt;/div&gt;&lt;div&gt;                H = s[0].ToInt();&lt;/div&gt;&lt;div&gt;                W = s[1].ToInt();&lt;/div&gt;&lt;div&gt;                var map = new Cell[H, W];&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;                for (int h = 0; h &lt;&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    for (int w = 0; w &lt;&gt;&lt;div&gt;                    {&lt;/div&gt;&lt;div&gt;                        map[h, w] = new Cell();&lt;/div&gt;&lt;div&gt;                    }&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;                for (int h = 0; h &lt;&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    var m = ss[line].Split(' ');&lt;/div&gt;&lt;div&gt;                    line++;&lt;/div&gt;&lt;div&gt;                    for (int w = 0; w &lt;&gt;&lt;div&gt;                    {&lt;/div&gt;&lt;div&gt;                        map[h, w].Alt = m[w].ToInt();&lt;/div&gt;&lt;div&gt;                    }&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;                for (int h = 0; h &lt;&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    for (int w = 0; w &lt;&gt;&lt;div&gt;                    {&lt;/div&gt;&lt;div&gt;                        Dir dir;&lt;/div&gt;&lt;div&gt;                        var jibun = map[h, w].Alt;&lt;/div&gt;&lt;div&gt;                        var na = h == 0 ? int.MaxValue : map[h - 1, w].Alt;&lt;/div&gt;&lt;div&gt;                        var wa = w == 0 ? int.MaxValue : map[h, w - 1].Alt;&lt;/div&gt;&lt;div&gt;                        var ea = w == W - 1 ? int.MaxValue : map[h, w + 1].Alt;&lt;/div&gt;&lt;div&gt;                        var sa = h == H - 1 ? int.MaxValue : map[h + 1, w].Alt;&lt;/div&gt;&lt;div&gt;                        var min = new[] { jibun, na, wa, ea, sa }.Min();&lt;/div&gt;&lt;div&gt;                        if (jibun == min)&lt;/div&gt;&lt;div&gt;                            dir = Dir.Nothing;&lt;/div&gt;&lt;div&gt;                        else if (na == min)&lt;/div&gt;&lt;div&gt;                            dir = Dir.North;&lt;/div&gt;&lt;div&gt;                        else if (wa == min)&lt;/div&gt;&lt;div&gt;                            dir = Dir.West;&lt;/div&gt;&lt;div&gt;                        else if (ea == min)&lt;/div&gt;&lt;div&gt;                            dir = Dir.East;&lt;/div&gt;&lt;div&gt;                        else&lt;/div&gt;&lt;div&gt;                            dir = Dir.South;&lt;/div&gt;&lt;div&gt;                        map[h, w].Direction = dir;&lt;/div&gt;&lt;div&gt;                    }&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;                for (int h = 0; h &lt;&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    for (int w = 0; w &lt;&gt;&lt;div&gt;                    {&lt;/div&gt;&lt;div&gt;                        if (map[h, w].Label == 0)&lt;/div&gt;&lt;div&gt;                        {&lt;/div&gt;&lt;div&gt;                            Check(map, h, w, maxlabel);&lt;/div&gt;&lt;div&gt;                            maxlabel++;&lt;/div&gt;&lt;div&gt;                        }&lt;/div&gt;&lt;div&gt;                    }&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;                for (int h = 0; h &lt;&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    var r = new string[W];&lt;/div&gt;&lt;div&gt;                    for (int w = 0; w &lt;&gt;&lt;div&gt;                    {&lt;/div&gt;&lt;div&gt;                        r[w] = ((char)(map[h, w].Label + ((int)'a') - 1)).ToString();&lt;/div&gt;&lt;div&gt;                    }&lt;/div&gt;&lt;div&gt;                    res.Add(r.Join(" "));&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;            }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;            File.WriteAllLines("Ans.txt", res.ToArray());&lt;/div&gt;&lt;div&gt;            Console.Write(res.ToArray().Join(Environment.NewLine));&lt;/div&gt;&lt;div&gt;            Console.ReadKey();&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;        public void Check(Cell[,] map, int h, int w, int label)&lt;/div&gt;&lt;div&gt;        {&lt;/div&gt;&lt;div&gt;            if (map[h, w].Label &gt; 0)&lt;/div&gt;&lt;div&gt;                return;&lt;/div&gt;&lt;div&gt;            map[h, w].Label = label;&lt;/div&gt;&lt;div&gt;            if (h &gt; 0 &amp;amp;&amp;amp; (map[h,w].Direction == Dir.North || map[h - 1, w].Direction == Dir.South))&lt;/div&gt;&lt;div&gt;                Check(map, h - 1, w, label);&lt;/div&gt;&lt;div&gt;            if (w &gt; 0 &amp;amp;&amp;amp; (map[h, w].Direction == Dir.West || map[h, w - 1].Direction == Dir.East))&lt;/div&gt;&lt;div&gt;                Check(map, h, w - 1, label);&lt;/div&gt;&lt;div&gt;            if (h + 1 &lt; direction ="=" direction ="="&gt;&lt;div&gt;                Check(map, h + 1, w, label);&lt;/div&gt;&lt;div&gt;            if (w + 1 &lt; direction ="=" direction ="="&gt;&lt;div&gt;                Check(map, h, w + 1, label);&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-3567632885458979421?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/3567632885458979421/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=3567632885458979421' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/3567632885458979421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/3567632885458979421'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/09/google-code-jam-2009-b-c.html' title='Google Code Jam 2009 B    C#でといてみた'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-4450071211745749740</id><published>2009-09-04T23:47:00.001+09:00</published><updated>2009-09-04T23:50:45.845+09:00</updated><title type='text'>Google Code Jam 2009 A    C#でといてみた</title><content type='html'>&lt;div&gt;正規表現だ。けどなぜか上位者の回答を見ると&lt;/div&gt;&lt;div&gt;ごりごり自分でアルゴリズムを書いている。&lt;/div&gt;&lt;div&gt;問題をすぐ見て思いついてしまうんだろうな。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    class A1&lt;/div&gt;&lt;div&gt;    {&lt;/div&gt;&lt;div&gt;        public static void Run()&lt;/div&gt;&lt;div&gt;        {&lt;/div&gt;&lt;div&gt;            List&lt;string&gt; res = new List&lt;string&gt;();&lt;/string&gt;&lt;/string&gt;&lt;/div&gt;&lt;div&gt;            int line = 0;&lt;/div&gt;&lt;div&gt;            var ss = File.ReadAllLines("b.in");&lt;/div&gt;&lt;div&gt;            var s0 = ss[0].Split(' ');&lt;/div&gt;&lt;div&gt;            var L = s0[0].ToInt();&lt;/div&gt;&lt;div&gt;            var D = s0[1].ToInt();&lt;/div&gt;&lt;div&gt;            var N = s0[2].ToInt();&lt;/div&gt;&lt;div&gt;            List&lt;string&gt; words = new List&lt;string&gt;();&lt;/string&gt;&lt;/string&gt;&lt;/div&gt;&lt;div&gt;            List&lt;string&gt; patterns = new List&lt;string&gt;();&lt;/string&gt;&lt;/string&gt;&lt;/div&gt;&lt;div&gt;            line++;&lt;/div&gt;&lt;div&gt;            for (int i = 0; i &lt;&gt;&lt;div&gt;            {&lt;/div&gt;&lt;div&gt;                words.Add(ss[line]);&lt;/div&gt;&lt;div&gt;                line++;&lt;/div&gt;&lt;div&gt;            }&lt;/div&gt;&lt;div&gt;            for (int i = 0; i &lt;&gt;&lt;div&gt;            {&lt;/div&gt;&lt;div&gt;                string pattern = ss[line];&lt;/div&gt;&lt;div&gt;                line++;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;                pattern = "^" + pattern.Replace('(', '[').Replace(')', ']') + "$";&lt;/div&gt;&lt;div&gt;                int m = 0;&lt;/div&gt;&lt;div&gt;                foreach (var word in words)&lt;/div&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    if (Regex.IsMatch(word, pattern))&lt;/div&gt;&lt;div&gt;                        m++;&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;                res.Add("Case #{0}: {1}".FormatWith(i + 1, m));&lt;/div&gt;&lt;div&gt;            }&lt;/div&gt;&lt;div&gt;            File.WriteAllLines("Ans.txt", res.ToArray());&lt;/div&gt;&lt;div&gt;            Console.Write(res.ToArray().Join(Environment.NewLine));&lt;/div&gt;&lt;div&gt;            Console.ReadKey();&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-4450071211745749740?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/4450071211745749740/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=4450071211745749740' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/4450071211745749740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/4450071211745749740'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/09/google-code-jam-2009-c.html' title='Google Code Jam 2009 A    C#でといてみた'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-2690520550486337006</id><published>2009-08-20T00:09:00.002+09:00</published><updated>2009-08-20T00:11:12.802+09:00</updated><title type='text'>koはakoの省略形</title><content type='html'>koはタガログ語ではng形、akoはang形でまったく違うものですが、&lt;div&gt;セブアノ語では、&lt;/div&gt;&lt;div&gt;akoが1Classで、その省略形がkoです。&lt;/div&gt;&lt;div&gt;2Classはnakoです。&lt;/div&gt;&lt;div&gt;ただ、nakoを省略してもkoになるとある本に書いてありました。&lt;/div&gt;&lt;div&gt;実際上は、akoを省略している場合が多いと思います。&lt;/div&gt;&lt;div&gt;ちょっと混乱しそう。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-2690520550486337006?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/2690520550486337006/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=2690520550486337006' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/2690520550486337006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/2690520550486337006'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/08/koako.html' title='koはakoの省略形'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-567892586785782616</id><published>2009-08-20T00:05:00.001+09:00</published><updated>2009-08-20T00:08:47.218+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='セブアノ語'/><title type='text'>naa と wala</title><content type='html'>Naaはある。&lt;div&gt;Walaはない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Naa koy higala. わたしには友達がいる。&lt;/div&gt;&lt;div&gt;Wala koy higala. わたしには友達がいない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wala は Wa と省略することができます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Naa ka bay higala? あなたはには友達がいますか？&lt;/div&gt;&lt;div&gt;Wa. いないよ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;higala はもともとセブアノ語です。&lt;/div&gt;&lt;div&gt;同じ意味の単語で、スペイン語から来た amigo (男性)、amiga (女性) も使えます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-567892586785782616?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/567892586785782616/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=567892586785782616' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/567892586785782616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/567892586785782616'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/08/naa-wala.html' title='naa と wala'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-3806616220394783156</id><published>2009-07-13T00:49:00.005+09:00</published><updated>2009-07-13T00:59:50.893+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google wave OT'/><title type='text'>Google Wave の 制約</title><content type='html'>waveの中にwaveletがある。&lt;div&gt;waveletにparticipantとそれぞれの権限を決める。&lt;/div&gt;&lt;div&gt;waveletの中にはdocumentがあり、そのdocumentはxml documentとannotationで構成される。&lt;/div&gt;&lt;div&gt;というわけで、&lt;/div&gt;&lt;div&gt;participant(権限含む)とドキュメントの組みをwaveletととしている。&lt;/div&gt;&lt;div&gt;一つのwaveletがwaveの基本単位です。&lt;/div&gt;&lt;div&gt;waveletの中に複数の権限を持つことができません。&lt;/div&gt;&lt;div&gt;これは、OT(Operational Transform)を過度に繁雑にしないためです。&lt;/div&gt;&lt;div&gt;しかし、これには当然制約も出てきます。&lt;/div&gt;&lt;div&gt;Blip(xml documentの中にある)に、inline blipがあるが、それをまったく隠すことはできない。&lt;/div&gt;&lt;div&gt;また、annotationについても同様で、まったく隠すことはできない。&lt;/div&gt;&lt;div&gt;言い換えると、そのデータ自体をほかのwaveletに保存して(waveletにはparticipantとaccess controlがあるから)、そこに全員に公開したくないデータを置くことができるが、それが存在しているという事実はすべての人に明らかとなる。&lt;/div&gt;&lt;div&gt;これはそれほど大きな問題ではないだろうが、一つの制約と言えるのではないだろうか。&lt;/div&gt;&lt;div&gt;htmlでいえば、リンク先のページはパスワードをかけて見せないようにできるが、どこにリンクが張られているかは隠せないということと同じです。&lt;br /&gt;&lt;div&gt;これでいいのかな？&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-3806616220394783156?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/3806616220394783156/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=3806616220394783156' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/3806616220394783156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/3806616220394783156'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/07/google-wave.html' title='Google Wave の 制約'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-5709603589007391431</id><published>2009-03-05T12:43:00.001+09:00</published><updated>2009-03-05T12:45:13.530+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='セブアノ語'/><title type='text'>セブアノ語の疑問詞</title><content type='html'>unsa 何&lt;div&gt;asa, diin どこ&lt;/div&gt;&lt;div&gt;kanus-a いつ&lt;/div&gt;&lt;div&gt;kinsa だれ&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-5709603589007391431?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/5709603589007391431/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=5709603589007391431' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/5709603589007391431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/5709603589007391431'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/03/blog-post_05.html' title='セブアノ語の疑問詞'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-1703866093151553271</id><published>2009-03-02T12:34:00.002+09:00</published><updated>2009-03-02T13:06:56.390+09:00</updated><title type='text'>3Classと2Class</title><content type='html'>Akong ihatag nimo ni.&lt;div&gt;を以前述べました。&lt;/div&gt;&lt;div&gt;タガログの感覚で言うとnimoではなくkanimoを使うような気がしますが、nimoを使うんですね。セブアノではこのように3Classではなく2Classを使うことがよくあります。なぜかは？まだよくわかりません。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-1703866093151553271?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/1703866093151553271/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=1703866093151553271' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/1703866093151553271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/1703866093151553271'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/03/3class2class.html' title='3Classと2Class'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-6139244784362976928</id><published>2009-03-01T22:36:00.002+09:00</published><updated>2009-03-01T22:43:35.063+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='セブアノ'/><title type='text'>リンカー</title><content type='html'>タガログ語のリンカーはnaと-ngですが、&lt;div&gt;セブアノ語のリンカーはngaと-ngです。&lt;/div&gt;&lt;div&gt;つまり、母音で終わるときはタガログ語と同じですが、&lt;/div&gt;&lt;div&gt;子音で終わるときはngaになります。&lt;/div&gt;&lt;div&gt;タガログ語でngaは強調を表す小辞ですので、ちょっと混乱するかもしれません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そして、タガログ語では、yで終わるときはnaになりますが、&lt;/div&gt;&lt;div&gt;セブアノ語では、yで終わるときは-ngになります。&lt;/div&gt;&lt;div&gt;yは半母音ですので、母音としてとらえるか、子音としてとらえるか言語によって違うんですね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;例&lt;/div&gt;&lt;div&gt;Kini maoy tinuod nga balay.&lt;/div&gt;&lt;div&gt;これが本当の家です。&lt;/div&gt;&lt;div&gt;Kita angayng moadto.&lt;/div&gt;&lt;div&gt;私たちは行かなければなりません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-6139244784362976928?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/6139244784362976928/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=6139244784362976928' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/6139244784362976928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/6139244784362976928'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/03/blog-post.html' title='リンカー'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-6962772880894610367</id><published>2009-02-25T13:10:00.001+09:00</published><updated>2009-02-25T13:11:37.244+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='セブアノ'/><title type='text'>Maayo Kaayo</title><content type='html'>私の一番好きなセブアノ語表現は、&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Maayo kaayo.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;とてもよい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;です。&lt;/div&gt;&lt;div&gt;褒め言葉でありながら、韻を踏んでいるのが気持ちいですよ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-6962772880894610367?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/6962772880894610367/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=6962772880894610367' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/6962772880894610367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/6962772880894610367'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/02/maayo-kaayo.html' title='Maayo Kaayo'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-694151389805941769</id><published>2009-02-23T13:59:00.003+09:00</published><updated>2009-02-23T14:04:42.996+09:00</updated><title type='text'>使えるセブアノ語</title><content type='html'>セブアノ語とは、フィリピンのセブ島などで話されている言語です。&lt;div&gt;ビサヤ語の一部です。&lt;/div&gt;&lt;div&gt;私は一カ月ボホル島に行ってセブアノ語を勉強してきたのですが、&lt;/div&gt;&lt;div&gt;フィリピンの方に言わせると、ボホルはセブアノではなくボホラノだといわれます。&lt;/div&gt;&lt;div&gt;実際には方言程度でほとんど変わらないと思うのですが。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;以下、まず覚えておくとよい表現を並べます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lingkod.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;座って。&lt;/div&gt;&lt;div&gt;Akong ihatag nimo ni.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;あなたにこれを差し上げます。&lt;/div&gt;&lt;div&gt;Salamat.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;ありがとう。&lt;/div&gt;&lt;div&gt;Salamat kaayo.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;とてもありがとう。&lt;/div&gt;&lt;div&gt;Maayong buntag.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;おはよう。&lt;/div&gt;&lt;div&gt;Maayong hapon.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;こんにちは。&lt;/div&gt;&lt;div&gt;Maayong gabii.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;こんばんは。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;lingkodは、タガログ語では「仕える、しもべ」という意味があるので最初に聞いた時は&lt;/div&gt;&lt;div&gt;面喰いましたが、よく使う表現です。&lt;/div&gt;&lt;div&gt;maayoは、goodという意味です。&lt;/div&gt;&lt;div&gt;ayoがルートワードですね。&lt;/div&gt;&lt;div&gt;maをつけて形容詞になるのはタガログ語と同じです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-694151389805941769?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/694151389805941769/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=694151389805941769' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/694151389805941769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/694151389805941769'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2009/02/blog-post.html' title='使えるセブアノ語'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-5345980218654535632</id><published>2008-03-13T19:24:00.001+09:00</published><updated>2008-03-13T19:24:23.026+09:00</updated><title type='text'>String.Emptyの意外な使い方</title><content type='html'>String.Emptyは私たちが最もよく使うヌルオブジェクトの一つです。これは "" と同じです。"" と書くより見やすいですね。&lt;br /&gt;String.Emptyの面白い使い方を見つけました。&lt;br /&gt;たとえば、'a'を10個並べた文字列を作りたい場合皆さんでしたらどうされますか？&lt;br /&gt;&lt;br /&gt;    internal sealed class RegexFCD {&lt;br /&gt;        internal static RegexPrefix Prefix(RegexTree tree) {&lt;br /&gt;                            string pref = String.Empty.PadRight(curNode._m, curNode._ch);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;この作り方を見てください。&lt;br /&gt;PadRightとは、指定された文字列の長さになるまである文字でもとの文字列を埋める関数です。&lt;br /&gt;"3.1".PadRight(5, '0')とすれば"3.100"が帰ります。このように数字のゼロ埋めの際によく用いる関数ですが、&lt;br /&gt;上のように用いることができるとはちょっと意外です。&lt;br /&gt;curNode._m個のcurNode._chが並んだ文字列がprefになります。&lt;br /&gt;ですから、先ほどの問題の答えは、&lt;br /&gt;String.Empty.PadRight(10, 'a')&lt;br /&gt;となります。もちろん、&lt;br /&gt;String.Empty.PadLeft(10, 'a')&lt;br /&gt;としてもかまいません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-5345980218654535632?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/5345980218654535632/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=5345980218654535632' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/5345980218654535632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/5345980218654535632'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2008/03/stringempty.html' title='String.Emptyの意外な使い方'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5467044167088141182.post-8440064755584097599</id><published>2008-03-10T19:11:00.001+09:00</published><updated>2008-03-10T19:12:38.084+09:00</updated><title type='text'>ヌルオブジェクトの導入</title><content type='html'>ヌルオブジェクトの導入&lt;br /&gt;&lt;br /&gt;RegexGroupCollection.cs&lt;br /&gt;&lt;br /&gt;namespace System.Text.RegularExpressions {&lt;br /&gt;&lt;br /&gt;    public class Group : Capture {&lt;br /&gt;&lt;br /&gt;        internal static Group   _emptygroup = new Group(String.Empty, new int[0], 0);&lt;br /&gt;&lt;br /&gt;        internal Group GetGroup(int groupnum) {&lt;br /&gt;            if (_captureMap != null) {&lt;br /&gt;                Object o;&lt;br /&gt;&lt;br /&gt;                o = _captureMap[groupnum];&lt;br /&gt;                if (o == null)&lt;br /&gt;                    return Group._emptygroup;&lt;br /&gt;                    //throw new ArgumentOutOfRangeException("groupnum");&lt;br /&gt;&lt;br /&gt;                return GetGroupImpl((int)o);&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                //if (groupnum &gt;= _match._regex.CapSize || groupnum &lt; 0)&lt;br /&gt;                //   throw new ArgumentOutOfRangeException("groupnum");&lt;br /&gt;                if (groupnum &gt;= _match._matchcount.Length || groupnum &lt; 0)&lt;br /&gt;                    return Group._emptygroup;&lt;br /&gt;&lt;br /&gt;                return GetGroupImpl(groupnum);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ここで、ヌルオブジェクトが作られているがどれかわかるでしょうか？&lt;br /&gt;そ う、_emptygroupです。staticで作るのがポイントで、そうすると、Group._emptygroupとクラス名から呼び出すことができ る。this._emptygroupと呼び出すことはしていないことに注意してください。ヌルオブジェクトは一つで十分なので、このようにするのが常套 手段です。&lt;br /&gt;&lt;br /&gt;はじめは例外を投げるコードが描かれているが、Group._emptygroupを返すように変えられています。&lt;br /&gt;なぜでしょうか？&lt;br /&gt;&lt;br /&gt;このGetGroup関数は、以下の2か所で使われています。&lt;br /&gt;        public Group this[int groupnum]&lt;br /&gt;        {&lt;br /&gt;            get {&lt;br /&gt;                return GetGroup(groupnum);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Group this[String groupname] {&lt;br /&gt;            get {&lt;br /&gt;                if (_match._regex == null)&lt;br /&gt;                    return Group._emptygroup;&lt;br /&gt;&lt;br /&gt;                return GetGroup(_match._regex.GroupNumberFromName(groupname));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;2番目のStringが入ってきた場合のプロパティの中身を見てください。&lt;br /&gt;GroupNumberFromNameとは何でしょう？&lt;br /&gt;関数の中身を以下に示します。&lt;br /&gt;&lt;br /&gt;    public class Regex : ISerializable {&lt;br /&gt;&lt;br /&gt;        /*&lt;br /&gt;         * Given a group name, maps it to a group number. Note that nubmered&lt;br /&gt;         * groups automatically get a group name that is the decimal string&lt;br /&gt;         * equivalent of its number.&lt;br /&gt;         *&lt;br /&gt;         * Returns -1 if the name is not a recognized group name.&lt;br /&gt;         */&lt;br /&gt;        /// &lt;devdoc&gt;&lt;br /&gt;        ///    &lt;para&gt;&lt;br /&gt;        ///       Returns a group number that corresponds to a group name.&lt;br /&gt;        ///    &lt;/para&gt;&lt;br /&gt;        /// &lt;/devdoc&gt;&lt;br /&gt;        public int GroupNumberFromName(String name) {&lt;br /&gt;            int result = -1;&lt;br /&gt;&lt;br /&gt;            if (name == null)&lt;br /&gt;                throw new ArgumentNullException("name");&lt;br /&gt;&lt;br /&gt;            &lt;span style="font-weight: bold;"&gt;################################(1)&lt;/span&gt;&lt;br /&gt;            // look up name if we have a hashtable of names&lt;br /&gt;            if (capnames != null) {&lt;br /&gt;                Object ret = capnames[name];&lt;br /&gt;&lt;br /&gt;                if (ret == null)&lt;br /&gt;                    return -1;&lt;br /&gt;&lt;br /&gt;                return(int)ret;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="font-weight: bold;"&gt;################################(2)&lt;/span&gt;&lt;br /&gt;            // convert to an int if it looks like a number&lt;br /&gt;            result = 0;&lt;br /&gt;            for (int i = 0; i &lt; name.Length; i++) {&lt;br /&gt;                char ch = name[i];&lt;br /&gt;&lt;br /&gt;                if (ch &gt; '9' || ch &lt; '0')&lt;br /&gt;                    return -1;&lt;br /&gt;&lt;br /&gt;                result *= 10;&lt;br /&gt;                result += (ch - '0');&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // return int if it's in range&lt;br /&gt;            if (result &gt;= 0 &amp;amp;&amp;amp; result &lt; capsize)&lt;br /&gt;                return result;&lt;br /&gt;&lt;br /&gt;            return -1;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;(1)で、名前付きキャプチャが存在するときにはそのテーブルの中から探しています。&lt;br /&gt;しかし、名前付きキャプチャが存在しないときには(2)で、入ってきたStringが数字かもしれないとしてパースしています。数字だったらその数字を返すのです。&lt;br /&gt;これはいかにも不格好な実装だと思うかもしれません。確かにそうです。&lt;br /&gt;しかしながら、正規表現というのはもともと文字列のみで表現するものです。そのなかに名前でキャプチャされた文字列を取り出す場合と数字で取り出す場合があり、.NETの正規表現ではどちらも同じ表記法を取っているため、致し方ないといえるでしょう。&lt;br /&gt;そうすると、たまたま検索された文字列中にキャプチャされないグループがあった場合、それを検索しようとして例外が発生されてはユーザも困ってしまいます。そのため例外を発生させるのではなく、_emptyGroupというヌルオブジェクトを返すようにしているのです。&lt;br /&gt;この例から、ヌルオブジェクトを使う一つの指針が出てきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;揺れた表記を受け入れるときにヌルオブジェクトを使う&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ちょうど強い型付けのプログラミング言語を使っていて、それくらいわかってよ！と言いたくなる時に動的型付けの言語が恋しくなるように、そんなところで例外を発生させないでよ！というときにヌルオブジェクトを使うといいのです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5467044167088141182-8440064755584097599?l=finitefield-csharp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://finitefield-csharp.blogspot.com/feeds/8440064755584097599/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5467044167088141182&amp;postID=8440064755584097599' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/8440064755584097599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5467044167088141182/posts/default/8440064755584097599'/><link rel='alternate' type='text/html' href='http://finitefield-csharp.blogspot.com/2008/03/blog-post.html' title='ヌルオブジェクトの導入'/><author><name>finitefield</name><uri>http://www.blogger.com/profile/00063299058534708756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
