<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Latest comments for language 'xtal' on doukaku.org</title><link>http://ja.doukaku.org/lang/xtal/</link><description>Latest comments for language 'xtal' on doukaku.org(long)</description><language>ja</language><lastBuildDate>Sat, 22 Nov 2008 20:31:30 -0000</lastBuildDate><item><title>matyr's comment on 正整数のゲーデル数化？
</title><link>http://ja.doukaku.org/comment/4675/</link><description>



&lt;a href="http://ja.doukaku.org/100/"&gt;正整数のゲーデル数化？&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/100/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/100/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  nobreak&amp;nbsp;便利。
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;doukaku100: fun(n){
  primes: fiber(){
    yield 2;
    for(n: 3;; n += 2)
      for(d, m : 3, math::sqrt(n); d &amp;lt; m; d += 2)
        if(n % d == 0) break; nobreak yield n;
  }
  r: 1;
  n.to_s.split(&amp;quot;&amp;quot;).zip(primes){|d, p| r *= math::pow(p, d.to_i); }
  return r;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/4675/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/4675/</guid></item><item><title>matyr's comment on 自然数の分割
</title><link>http://ja.doukaku.org/comment/4597/</link><description>



&lt;a href="http://ja.doukaku.org/89/"&gt;自然数の分割&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/89/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/89/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  fiber&amp;nbsp;を使って書き換えてみる。
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;(|n, m|{ c: callee; m--;
  return fiber{
    if(m &amp;lt; 1) yield [n];
    else (n + 1).times{|x| c(x, m){ yield [n - x] ~ it; } }
  }
})(5, 3).join(&amp;quot;\n&amp;quot;).p;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/4597/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/4597/</guid></item><item><title>matyr's comment on 自然数の分割
</title><link>http://ja.doukaku.org/comment/4572/</link><description>



&lt;a href="http://ja.doukaku.org/89/"&gt;自然数の分割&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/89/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/89/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;(|n, m|{
  if(m &amp;lt;= 1) return [[n]];
  r: [];
  (n + 1).times{|x| callee(x, m - 1){ r.push_back([n - x] ~ it); } }
  return r;
})(5, 3){ it.p; }
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/4572/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/4572/</guid></item><item><title>matyr's comment on ２進数の記述
</title><link>http://ja.doukaku.org/comment/4571/</link><description>



&lt;a href="http://ja.doukaku.org/98/"&gt;２進数の記述&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/98/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/98/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  0b&amp;nbsp;か&amp;nbsp;0B&amp;nbsp;で始めると２進整数リテラル。
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;0b1010.p;
// =&amp;gt; 10

0B0110_1001.p;
// =&amp;gt; 105 (アンダーバーは無視される)
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/4571/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/4571/</guid></item><item><title>miyamuko's comment on 九九の表示
</title><link>http://ja.doukaku.org/comment/3140/</link><description>



&lt;a href="http://ja.doukaku.org/62/"&gt;九九の表示&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/62/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/62/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;%f はフォーマット文字列を定義するリテラルです。
formatter は引数を3つ取る関数になります。
%(hogehoge)d とすることで名前付きにすることも できます。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;mul: fun(n, m) fiber {
    n.times.map(|i| i+1).each{|i|
        m.times.map(|j| j+1).each{|j|
            yield i, j, i * j;
        }
    }
}

formatter: %f[%d * %d = %2d];
mul(9, 9) {|i,j,s|
    formatter(i, j, s).p;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/3140/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/3140/</guid></item><item><title>miyamuko's comment on 重複する要素を取り除く
</title><link>http://ja.doukaku.org/comment/2876/</link><description>



&lt;a href="http://ja.doukaku.org/56/"&gt;重複する要素を取り除く&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/56/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/56/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;配列の要素を [その要素、*残りの要素] に map して
「残りの要素」に「その要素」が含まれていなければ yield します。
&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Iterator::skip: method(n) {
    n.times { this { break; } }
}
Iterator::window: method(start, length) {
    this.skip(start);
    return this.take(length);
}

only_uniq: fun(arr) fiber {
    len: arr.length;
    iters: range(0, len).map(|i| arr.cycle.window(i, len).to_a);
    iters {|it,rest|
        if (rest.select(|e| e == it).to_a.empty) {
            yield it;
        }
    }
}

only_uniq([3, 1, 4, 1, 5, 9, 2, 6, 5]).to_a.p;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2876/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2876/</guid></item><item><title>miyamuko's comment on 仲間はずれの判定
</title><link>http://ja.doukaku.org/comment/2700/</link><description>



&lt;a href="http://ja.doukaku.org/53/"&gt;仲間はずれの判定&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/53/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/53/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;辞書などを使った回答はもうずいぶん出ているので違ったアプローチで書いたら、
ずいぶん長くなってしまいました。。

実装はひとつづつ要素を見ながら状態遷移していくものです。
each_classify で状態遷移を観察することができます。

無限列にも適用可能です。
もちろん本当に無限にある場合は「その他」以外では答えを出せないのですが、
無限列の最初の n 個の仲間はずれを判定できます。
&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Classify: class {
    - _iter;
    - _state: &amp;quot;homo&amp;quot;;
    - _majority: null;
    - _minority: null;

    initialize: method(_iter) {}

    + classify: method(n: null) {
        return each_classify(n).to_a.back;
    }

    + each_classify: method(n: null) fiber {
        iter: n ? _iter.take(n) : _iter;
        iter.with_index {|i,it|
            this.(_state)(i, it);
            if (_state == &amp;quot;hetero&amp;quot;) {
                break;
            }
        }
    }

    - homo: method(i, it) {
        if (_majority &amp;amp;&amp;amp; _majority != it) {
            _minority = it;
            if (i &amp;lt; 2) {
                _state = &amp;quot;quasi_homo0&amp;quot;;
                yield [&amp;quot;?&amp;quot;, _majority, _minority];
            } else {
                _state = &amp;quot;quasi_homo&amp;quot;;
                yield [&amp;quot;quasi_homo&amp;quot;, _majority, _minority];
            }
        } else {
            _majority = it;
            yield [&amp;quot;homo&amp;quot;, it];
        }
    }

    - quasi_homo0: method(i, it) {
        if (it == _majority || it == _minority) {
            if (it == _minority) {
                _majority, _minority = _minority, _majority;
            }
            yield [&amp;quot;quasi_homo&amp;quot;, _majority, _minority];
            _state = &amp;quot;quasi_homo&amp;quot;;
        } else {
            hetero(i, it);
        }
    }

    - quasi_homo: method(i, it) {
        if (it == _majority) {
            yield [&amp;quot;quasi_homo&amp;quot;, _majority, _minority];
        } else {
            hetero(i, it);
        }
    }

    - hetero: method(i, it) {
        _state = &amp;quot;hetero&amp;quot;;
        yield [&amp;quot;hetero&amp;quot;, null];
    }
}

Classify([1,1,1,1,1].each).classify.p;    //=&amp;gt; [homo,1]
Classify([1,2,1,1,1].each).classify.p;    //=&amp;gt; [quasi_homo,1,2]
Classify([2,1,1,1,1].each).classify.p;    //=&amp;gt; [quasi_homo,1,2]
Classify([2,2,1,1,1].each).classify.p;    //=&amp;gt; [hetero,null]
Classify([2,4,1,1,1].each).classify.p;    //=&amp;gt; [hetero,null]
Classify([1,2,3,4,5].each).classify.p;    //=&amp;gt; [hetero,null]

Classify([2,1,1,1,3].each).each_classify {
  it.p;
}
//=&amp;gt; [homo,2]
//=&amp;gt; [?,2,1]
//=&amp;gt; [quasi_homo,1,2]
//=&amp;gt; [quasi_homo,1,2]
//=&amp;gt; [hetero,null]

Classify([1,1,3].cycle).classify(5).p;    //=&amp;gt; [quasi_homo,1,3]
Classify([1,1,3].cycle).classify(6).p;    //=&amp;gt; [hetero,null]
Classify([1,2,3].cycle).classify.p;       //=&amp;gt; [hetero,null]
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2700/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2700/</guid></item><item><title>miyamuko's comment on 与えられた文字列でピラミッド
</title><link>http://ja.doukaku.org/comment/2574/</link><description>



&lt;a href="http://ja.doukaku.org/52/"&gt;与えられた文字列でピラミッド&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/52/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/52/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;末尾の空白の数がサンプル出力と違いますが、題意になかったのでスルーしました。

chainは引数のイテレータを順番に実行するイテレータを返す関数です。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;pyramid: fun(str) {
    space: [&amp;quot; &amp;quot;].cycle;
    arr: str.split(&amp;quot;&amp;quot;).to_a;
    n: arr.length;
    n.times.map(|i| i + 1){
        chain(space.take(n - it ),
              arr.slice(n - it, n).zip(space).map(|a,b| a~b)).join(&amp;quot;&amp;quot;).p;
    }
}

pyramid(&amp;quot;hoge&amp;quot;);
pyramid(&amp;quot;abracadabra&amp;quot;);
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2574/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2574/</guid></item><item><title>miyamuko's comment on 隣り合う二項の差
</title><link>http://ja.doukaku.org/comment/2419/</link><description>



&lt;a href="http://ja.doukaku.org/49/"&gt;隣り合う二項の差&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/49/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/49/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  最初 diff は Array を引数に取り、その Array の Iterator と一個先に進めたIterator を zip して map していたんですが、無限列を diff したくなったので Array ではなく Iterator を引数に取るようにしました。

&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Iterator::each_pair: method fiber {
    prev: null;
    this { prev = it; break; }
    this {
        yield prev, it;
        prev = it;
    }
}

diff: fun(iter) {
    return iter.each_pair.map(|a,b| b - a);
}

diff([3, 1, 4, 1, 5, 9, 2, 6, 5].each).to_a.p;


// 無限列のテスト
random_generator: fiber {
    while (true) {
        yield math::ceil(math::random_range(1, 10));
    }
}
diff(random_generator).take(20).to_a.p;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2419/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2419/</guid></item><item><title>miyamuko's comment on アルファベットの繰り上がり
</title><link>http://ja.doukaku.org/comment/2234/</link><description>



&lt;a href="http://ja.doukaku.org/21/"&gt;アルファベットの繰り上がり&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/21/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/21/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;前の桁で生成した値の頭にA..Zを付加するという戦略です。

無限桁に対応。A-Zの26進数以外もいけます。

ただ、メモリの消費量が激しいです。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;ExcelNumber: class {
    + _chars: &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;;

    + generate: method fiber {
        before: [&amp;quot;&amp;quot;];
        while (true) {
            before = generate_and_yield(before);
        }
    }

    - generate_and_yield: method(before) {
        r: [];
        _chars.split(&amp;quot;&amp;quot;) {|c|
            before {|b|
                n: c ~ b;
                r.push_back(n);
                yield n;
            }
        }
        return r;
    }
}

excelnum: ExcelNumber();
excelnum.generate.take(100).to_a.p;

excelnum.chars = &amp;quot;abc&amp;quot;;
excelnum.generate.take(100).to_a.p;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2234/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2234/</guid></item><item><title>yagihiro's comment on 長方形の交差判定
</title><link>http://ja.doukaku.org/comment/2191/</link><description>



&lt;a href="http://ja.doukaku.org/23/"&gt;長方形の交差判定&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/23/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/23/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;javascriptの投稿(http://ja.doukaku.org/comment/1146/)がすっきりしててかっこよかったのでそのままもらいました。

svn rev154 (0.9.7.1)です。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Rectangle: class {
  + _top; + _right; + _bottom; + _left;

  initialize: method(top: 0, right: 0, bottom: 0, left: 0) {
    _top = top;
    _right = right;
    _bottom = bottom;
    _left = left;
  }

  is_overlapped: method(other) {
    return (math::min(_right, other.right) - math::max(_top, other.left) &amp;gt; 0 &amp;amp;&amp;amp;
            math::min(_bottom, other.bottom) - math::max(_left, other.top) &amp;gt; 0);
  }

  to_s: method() {
    return [_top, _right, _bottom, _left].to_s;
  }
}

r1: Rectangle(top: 10, right: 20, bottom: 20, left: 10);
[ // overlapped
  Rectangle(top: 10, right: 20, bottom: 20, left: 10), // 一致
  Rectangle(top: 11, right: 19, bottom: 19, left: 11), // 内
  Rectangle(top: 9, right: 21, bottom: 21, left: 9),   // 外
  Rectangle(top: 5, right: 15, bottom: 15, left: 5),   // 左上
  Rectangle(top: 5, right: 25, bottom: 15, left: 15),  // 右上
  Rectangle(top: 15, right: 25, bottom: 25, left: 15), // 右下
  Rectangle(top: 15, right: 15, bottom: 25, left: 5),  // 左下
  // ! overlapped
  Rectangle(top: 0, right: 10, bottom: 10, left: 0),   // 左上
  Rectangle(top: 0, right: 20, bottom: 10, left: 10),  // 上
  Rectangle(top: 0, right: 30, bottom: 10, left: 20),  // 右上
  Rectangle(top: 10, right: 30, bottom: 20, left: 20), // 右
  Rectangle(top: 20, right: 30, bottom: 30, left: 20), // 右下
  Rectangle(top: 20, right: 20, bottom: 30, left: 10), // 下
  Rectangle(top: 20, right: 10, bottom: 30, left: 0), // 左下
  Rectangle(top: 10, right: 10, bottom: 20, left: 0), // 左
].each {|r| r1.is_overlapped(r).p; }
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2191/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2191/</guid></item><item><title>yagihiro's comment on 実行時間の測定
</title><link>http://ja.doukaku.org/comment/2189/</link><description>



&lt;a href="http://ja.doukaku.org/22/"&gt;実行時間の測定&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/22/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/22/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;0.9.7 から追加された(と思われる) clock() 関数を使ってみました。

* profile 関数と func 関数が同じ引数を受け取れる。
* func 関数の戻り値を profile 関数の戻り値としている。

svn rev154 (0.9.7.1)です。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;profile: fun(...) {
  fmt: %f!profile: %d sec!;

  start: clock();
  result: func(...);
  fmt(clock() - start).p;

  return result;
}

func: fun(...) {
  for (i: 0; i &amp;lt; 1000000; i++) {
    // 重たい処理
  }
}

profile(&amp;quot;test&amp;quot;);
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2189/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2189/</guid></item><item><title>miyamuko's comment on メソッド名一覧の表示
</title><link>http://ja.doukaku.org/comment/2179/</link><description>



&lt;a href="http://ja.doukaku.org/32/"&gt;メソッド名一覧の表示&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/32/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/32/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;super クラスも検索するようにしてみました。

「bar: || "bar".p」というのは引数なしの lambda 関数を bar に束縛しているような感じです。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;String::start_with: method(sub) {
    return this.split(&amp;quot;&amp;quot;).take(sub.length).to_a.join(&amp;quot;&amp;quot;) == sub;
}

TargetTest: class {
    test_foo: || &amp;quot;test_foo&amp;quot;.p;
    test_bar: || &amp;quot;test_bar&amp;quot;.p;
    foo: || &amp;quot;foo&amp;quot;.p;
    bar: || &amp;quot;bar&amp;quot;.p;
}
TargetTest2: class(TargetTest) {
    test_foo: || &amp;quot;test_foo_sub&amp;quot;.p;
    test_baz: || &amp;quot;test_baz&amp;quot;.p;
}

TestRunner: class {
    suite: method(target, inherited_too: true) fiber {
        klasses: [target];
        if (inherited_too) {
            klasses ~= target.each_ancestor.to_a;
        }

        override: Map();
        klasses {|klass|
            klass.each_member {|name, x, meth|
                if (! override[name] &amp;amp;&amp;amp; name.start_with(&amp;quot;test_&amp;quot;)) {
                    yield meth;
                }
               override[name] = true;
            }
        }
    }

    run: method(target) {
        suite(target) {
            it();
        }
    }
}

runner: TestRunner();
&amp;quot;---&amp;quot;.p;
runner.run(TargetTest2);
&amp;quot;---&amp;quot;.p;
runner.run(TargetTest);
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2179/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2179/</guid></item><item><title>miyamuko's comment on Hello, world!その２
</title><link>http://ja.doukaku.org/comment/2177/</link><description>



&lt;a href="http://ja.doukaku.org/13/"&gt;Hello, world!その２&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/13/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/13/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;xtal 0.9.7 から識別子に日本語が使えるようになったのでそれで。
なでしこのが参考になりました。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;へ: &amp;quot;He&amp;quot;;
ろ: &amp;quot;l&amp;quot;;
お: &amp;quot;o&amp;quot;;
わ: &amp;quot;w&amp;quot;;
る: &amp;quot;r&amp;quot;;
ど: &amp;quot;d!&amp;quot;;
(へ ~ ろ ~ ろ ~ お ~ &amp;quot;, &amp;quot; ~ わ ~ お ~ る ~ ろ ~ ど).p;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2177/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2177/</guid></item><item><title>miyamuko's comment on 全ての組み合わせ
</title><link>http://ja.doukaku.org/comment/2167/</link><description>



&lt;a href="http://ja.doukaku.org/44/"&gt;全ての組み合わせ&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/44/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/44/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;fiber でジェネレータにしました。

「(...)」 というのは可変長引数をあらわすオブジェクトです。でも、コレ使うのなんかクラッシュする。。。

あと、配列の分配がきれいにかけないです。
&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;CrossProduct: class {
    - _list: [];

    initialize: method(...) {
        (...).each_ordered_arg {
            // ここのコメントを削除するとなぜかクラッシュする＾＾
            if (it is String) {
                _list.push_back(it.split(&amp;quot;&amp;quot;).to_a);
            } else {
                _list.push_back(it);
            }
        }
    }

    all: method fiber {
        (fun (acc, rest) {
            if (rest.empty()) {
                yield acc;
            } else {
                x, xs: rest[0], rest.slice(1, rest.length);
                x {
                    callee(acc ~ [it], xs);
                }
            }
        })([], _list);
    }
}

c: CrossProduct([0, 1], &amp;quot;ab&amp;quot;, [&amp;quot;Foo&amp;quot;, &amp;quot;Bar&amp;quot;]);
c.all {
    it.p;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2167/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2167/</guid></item><item><title>miyamuko's comment on 与えた条件を満たす候補
</title><link>http://ja.doukaku.org/comment/2161/</link><description>



&lt;a href="http://ja.doukaku.org/43/"&gt;与えた条件を満たす候補&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/43/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/43/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;not を何回も書けるようにしました。
and とか or みたいに１行メソッドがシンプルに書けるのがいいですね。

あと、xtal は callee があるので無名関数で再帰できるのもいいところ。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;// xtal 0.9.7.1 の inject はバグっているので自作。
Iterator::reduce: method(init, fn){
    result: init;
    this {
        result = fn(result, it);
    }
    return result;
}

Solver: class {

    - _expr;

    initialize: method(_expr) {}

    and: |a,b| a &amp;amp;&amp;amp; b;
    or:  |a,b| a || b;

    apply_not: method(values) {
        r: values.clone();
        i: 0;
        _expr.each {
            if (it == &amp;quot;not&amp;quot;) {
                r[i] = ! r[i];
            } else {
                i++;
            }
        }
        return r[0], r.slice(1, r.length);
    }

    eval: method(values) {
        first, rest: apply_not(values);
        expr: _expr.select(|e| e != &amp;quot;not&amp;quot;);
        return expr.zip(rest.each).reduce(first, fun(r, pair) {
            // this.(&amp;quot;and&amp;quot;) で and メソッドが取得できる
            return this.(pair[0])(r, pair[1]);
        });
    }
}

prodloop: method(n) fiber {
    (fun(n, xs) {
        if (n == 0) {
            yield xs;
        } else {
            [true, false] {
                callee(n - 1, xs ~ [it]);
            }
        }
    })(n, []);
}

solver: Solver([&amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;, &amp;quot;not&amp;quot;, &amp;quot;not&amp;quot;, &amp;quot;not&amp;quot;, &amp;quot;and&amp;quot;]);
prodloop(4).select(|v| solver.eval(v) ) {
    it.p;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2161/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2161/</guid></item><item><title>miyamuko's comment on 倍数になる13進数
</title><link>http://ja.doukaku.org/comment/2160/</link><description>



&lt;a href="http://ja.doukaku.org/14/"&gt;倍数になる13進数&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/14/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/14/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;無駄に無限リストにしてみました。
遅くて３個目が見つからない。。。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;// xtal 0.9.7.1 の inject はバグっているので自作。
Iterator::reduce: method(init, fn){
    result: init;
    this {
        result = fn(result, it);
    }
    return result;
}


Int::to_i13: method {
    return this.to_s.split(&amp;quot;&amp;quot;).reduce(0, |r,e| r * 13 + e.to_i);
}

resolver: fiber {
    for (i: 10; true; i++) {
        if (i.to_i13 % i == 0) {
            yield i;
        }
    }
}

resolver.take(1).to_a[0].p;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2160/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2160/</guid></item><item><title>miyamuko's comment on RFC 4180対応版 CSVレコードの分解
</title><link>http://ja.doukaku.org/comment/2159/</link><description>



&lt;a href="http://ja.doukaku.org/33/"&gt;RFC 4180対応版 CSVレコードの分解&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/33/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/33/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;汚いなぁ。。。
fiber 便利。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Iterator::with_peek: method fiber {
    prev, curr: null, null;
    noloop: true;
    this {|next|
        if (curr) {
            yield prev, curr, next;
        }
        prev, curr = curr, next;
        noloop = false;
    }
    if (!noloop) {
        yield prev, curr, null;
    }
}

CSVParser: class {
    - _iter;
    - _finish;

    initialize: method(string) {
        _iter = string.split(&amp;quot;&amp;quot;).each.with_peek;
        _finish = false;
    }

    flush: method(field) {
        r: field.join(&amp;quot;&amp;quot;);
        field.clear();
        return r;
    }

    line_parser: method fiber {
        in_quote: false;
        field: [];
        _iter {|prev,it,next|
            if (in_quote) {
                if (it == &amp;quot;\&amp;quot;&amp;quot;) {
                    if (prev == &amp;quot;\&amp;quot;&amp;quot;) {
                        // ignore
                    } else if (next == &amp;quot;\&amp;quot;&amp;quot;) {
                        field.push_back(it);
                    } else {
                        in_quote = false;
                    }
                } else {
                    field.push_back(it);
                }
            } else {
                if (field.empty() &amp;amp;&amp;amp; it == &amp;quot;\&amp;quot;&amp;quot;) {
                    in_quote = true;
                } else if (it == &amp;quot;\n&amp;quot;) {
                    yield flush(field);
                    break;
                } else if (it == &amp;quot;,&amp;quot;) {
                    yield flush(field);
                } else {
                    field.push_back(it);
                }
            }
        } nobreak {
            _finish = true;
        }
        if (!field.empty()) {
            yield flush(field);
        }
    }

    parse: method fiber {
        while (!_finish) {
            yield line_parser();
        }
    }
}


parser: CSVParser(
    [%!&amp;quot;aaa&amp;quot;,&amp;quot;b\nbb&amp;quot;,&amp;quot;ccc&amp;quot;,zzz,&amp;quot;y&amp;quot;&amp;quot;Y&amp;quot;&amp;quot;y&amp;quot;,xxx!,
     %!a,b,c,d!,
     %!a,b,c,!,
     %!a!,
     %!!,
     ].join(&amp;quot;\n&amp;quot;));

format: %f[%(line)d:%(col)d: %(cell)s];
parser.parse.with_index {|lineno,line|
    line.with_index {|colno,it|
        format(line: lineno, col: colno, cell: it).p;
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2159/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2159/</guid></item><item><title>miyamuko's comment on リストを逆順に表示
</title><link>http://ja.doukaku.org/comment/2158/</link><description>



&lt;a href="http://ja.doukaku.org/27/"&gt;リストを逆順に表示&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/27/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/27/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Iterator::reverse: method fiber {
    arr: this.to_a;
    while (!arr.empty()) {
        yield arr[arr.size - 1];
        arr.pop_back();
    }
}

[1, 2, 3, 4, 5].each.reverse.to_a.p;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2158/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2158/</guid></item><item><title>miyamuko's comment on /*コメント*/を取り除く
</title><link>http://ja.doukaku.org/comment/2157/</link><description>



&lt;a href="http://ja.doukaku.org/17/"&gt;/*コメント*/を取り除く&lt;/a&gt;
(&lt;a href="http://ja.doukaku.org/17/nested/"&gt;Nested&lt;/a&gt; 
 &lt;a href="http://ja.doukaku.org/17/flatten/"&gt;Flatten&lt;/a&gt;)


&lt;hr&gt;
  &lt;pre class='compact'&gt;ひたすら一文字づつ見てパースしました。正規表現ほしぃ。。。&lt;/pre&gt;
&lt;hr&gt;
  
    &lt;table&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Iterator::with_peek: method fiber {
    prev, curr: null, null;
    noloop: true;
    this {|next|
        if (curr) {
            yield prev, curr, next;
        }
        prev, curr = curr, next;
        noloop = false;
    }
    if (!noloop) {
        yield prev, curr, null;
    }
}

remover: fun(str) fiber {
    in_comment: false;
    str.split(&amp;quot;&amp;quot;).each.with_peek {|prev,it,next|
        if (in_comment) {
            if (prev == &amp;quot;*&amp;quot; &amp;amp;&amp;amp; it == &amp;quot;/&amp;quot;) {
                in_comment = false;
            }
        } else {
            if (it == &amp;quot;/&amp;quot; &amp;amp;&amp;amp; next == &amp;quot;*&amp;quot;) {
                in_comment = true;
            } else {
                yield it;
            }
        }
    }
}

remove_comment: fun(str) {
    return remover(str).to_a.join(&amp;quot;&amp;quot;);
}

assert remove_comment(&amp;quot;AAA&amp;quot;) == &amp;quot;AAA&amp;quot;;
assert remove_comment(&amp;quot;AAA/*BBB*/&amp;quot;) == &amp;quot;AAA&amp;quot;;
assert remove_comment(&amp;quot;AAA/*BBB&amp;quot;) == &amp;quot;AAA&amp;quot;;
assert remove_comment(&amp;quot;AAA/*BBB*/CCC&amp;quot;) == &amp;quot;AAACCC&amp;quot;;
assert remove_comment(&amp;quot;AAA/*BBB/*CCC*/DDD*/EEE&amp;quot;) == &amp;quot;AAADDD*/EEE&amp;quot;;
assert remove_comment(&amp;quot;AAA/a//*BB*B**/CCC&amp;quot;) == &amp;quot;AAA/a/CCC&amp;quot;;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
    &lt;div align = "right" style="margin-right: 1em;"&gt;
      [&lt;a href="http://ja.doukaku.org/lang/xtal/"&gt;
      xtal
      &lt;/a&gt;]
      [&lt;a href="http://ja.doukaku.org/comment/2157/download/"&gt;
      download code
      &lt;/a&gt;]
      &lt;/a&gt;]
    &lt;/div&gt;
    &lt;hr&gt;
  

</description><guid>http://ja.doukaku.org/comment/2157/</guid></item></channel></rss>