Ruby中字符串数组的布尔比较

时间:2009-11-20 04:17:47

标签: ruby

我在Ruby中有一个基本上代表方形布尔矩阵的数组。点表示零,而任何其他字符表示零。例如:

irb(main):044:0> g
=> [".b", "m."] # This grid has two '1' values and two '0' values.

我想在这个数组上使用另一个类似的数组执行指定的逻辑运算(比方说,OR)以获得第三个结果。例如,如果h["q.", "r."],那么类似于g.perform_or(h)的内容应该会产生一个新数组["qb", "r."]。 (选择r代表'm' || 'r'的结果是任意的,不相关;任何其他非'。'字符都可以在那里。)

我该怎么做?


编辑:我在我的例子中犯了一个错误。道歉!

2 个答案:

答案 0 :(得分:6)

对于OR:

g.zip(h).map {|gx,hx| (0...gx.size).map {|i| [gx[i..i],hx[i..i]].any? {|cell| cell != "."} ? "x" : "."}.join}

对于AND只是改变“任何?” “全部?”。

答案 1 :(得分:0)

伙计,这个人一直在我的磁盘上积聚灰尘 loong 时间:

class String
  def to_bool; return chars.map {|c| if c == '.' then false else c end } end
  def from_bool; return self end
end

class TrueClass;  def from_bool; return 't' end end
class FalseClass; def from_bool; return '.' end end

class Array
  def to_bool;   map(&:to_bool) end
  def from_bool; map {|row| row.map(&:from_bool).join} end

  def |(other)
    to_bool.zip(other.to_bool).inject([]) {|row, (l, r)|
      row << l.zip(r).inject([]) {|col, (l, r)|
        col << (l || r).from_bool
      }
    }
  end

  def &(other)
    to_bool.zip(other.to_bool).inject([]) {|row, (l, r)|
      row << l.zip(r).inject([]) {|col, (l, r)|
        col << (l && r).from_bool
      }
    }
  end
end

这是一个(相当不完整的)测试套件:

require 'test/unit'
class TestLogicMatrix < Test::Unit::TestCase
  def test_to_bool
    assert_equal [['a', false], [false, 'z']], ['a.', '.z'].to_bool
  end
  def test_from_bool
    assert_equal ['a.', 'tz'], [['a', false], [true, 'z']].from_bool
  end
  def test_that_OR_works
    assert_equal ['qb', 'm.'], (['.b', 'm.'] | ['q.', 'r.']).from_bool
  end
  def test_that_AND_works
    assert_equal ['..', 'r.'], (['.b', 'm.'] & ['q.', 'r.']).from_bool
  end
end