miyamuko #2700(2007/08/30 17:41 GMT) [ xtal ] Rating2/2=1.00
辞書などを使った回答はもうずいぶん出ているので違ったアプローチで書いたら、 ずいぶん長くなってしまいました。。 実装はひとつづつ要素を見ながら状態遷移していくものです。 each_classify で状態遷移を観察することができます。 無限列にも適用可能です。 もちろん本当に無限にある場合は「その他」以外では答えを出せないのですが、 無限列の最初の n 個の仲間はずれを判定できます。
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
Classify: class { - _iter; - _state: "homo"; - _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 == "hetero") { break; } } } - homo: method(i, it) { if (_majority && _majority != it) { _minority = it; if (i < 2) { _state = "quasi_homo0"; yield ["?", _majority, _minority]; } else { _state = "quasi_homo"; yield ["quasi_homo", _majority, _minority]; } } else { _majority = it; yield ["homo", it]; } } - quasi_homo0: method(i, it) { if (it == _majority || it == _minority) { if (it == _minority) { _majority, _minority = _minority, _majority; } yield ["quasi_homo", _majority, _minority]; _state = "quasi_homo"; } else { hetero(i, it); } } - quasi_homo: method(i, it) { if (it == _majority) { yield ["quasi_homo", _majority, _minority]; } else { hetero(i, it); } } - hetero: method(i, it) { _state = "hetero"; yield ["hetero", null]; } } Classify([1,1,1,1,1].each).classify.p; //=> [homo,1] Classify([1,2,1,1,1].each).classify.p; //=> [quasi_homo,1,2] Classify([2,1,1,1,1].each).classify.p; //=> [quasi_homo,1,2] Classify([2,2,1,1,1].each).classify.p; //=> [hetero,null] Classify([2,4,1,1,1].each).classify.p; //=> [hetero,null] Classify([1,2,3,4,5].each).classify.p; //=> [hetero,null] Classify([2,1,1,1,3].each).each_classify { it.p; } //=> [homo,2] //=> [?,2,1] //=> [quasi_homo,1,2] //=> [quasi_homo,1,2] //=> [hetero,null] Classify([1,1,3].cycle).classify(5).p; //=> [quasi_homo,1,3] Classify([1,1,3].cycle).classify(6).p; //=> [hetero,null] Classify([1,2,3].cycle).classify.p; //=> [hetero,null]
Rating2/2=1.00-0+
[ reply ]
miyamuko
#2700()
[
xtal
]
Rating2/2=1.00
Classify: class { - _iter; - _state: "homo"; - _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 == "hetero") { break; } } } - homo: method(i, it) { if (_majority && _majority != it) { _minority = it; if (i < 2) { _state = "quasi_homo0"; yield ["?", _majority, _minority]; } else { _state = "quasi_homo"; yield ["quasi_homo", _majority, _minority]; } } else { _majority = it; yield ["homo", it]; } } - quasi_homo0: method(i, it) { if (it == _majority || it == _minority) { if (it == _minority) { _majority, _minority = _minority, _majority; } yield ["quasi_homo", _majority, _minority]; _state = "quasi_homo"; } else { hetero(i, it); } } - quasi_homo: method(i, it) { if (it == _majority) { yield ["quasi_homo", _majority, _minority]; } else { hetero(i, it); } } - hetero: method(i, it) { _state = "hetero"; yield ["hetero", null]; } } Classify([1,1,1,1,1].each).classify.p; //=> [homo,1] Classify([1,2,1,1,1].each).classify.p; //=> [quasi_homo,1,2] Classify([2,1,1,1,1].each).classify.p; //=> [quasi_homo,1,2] Classify([2,2,1,1,1].each).classify.p; //=> [hetero,null] Classify([2,4,1,1,1].each).classify.p; //=> [hetero,null] Classify([1,2,3,4,5].each).classify.p; //=> [hetero,null] Classify([2,1,1,1,3].each).each_classify { it.p; } //=> [homo,2] //=> [?,2,1] //=> [quasi_homo,1,2] //=> [quasi_homo,1,2] //=> [hetero,null] Classify([1,1,3].cycle).classify(5).p; //=> [quasi_homo,1,3] Classify([1,1,3].cycle).classify(6).p; //=> [hetero,null] Classify([1,2,3].cycle).classify.p; //=> [hetero,null]Rating2/2=1.00-0+
[ reply ]