Ruby检查一个数组字符串与另一个数组字符串的相似性

时间:2016-09-07 05:08:34

标签: arrays ruby string numbers comparison

目标是检查它是否是一次性的。例如,如果中奖彩票是1234 我的机票是1233 ,或 2234 ,或 1334 这应该是真的,因为票是一次性的。非正则表达式请参与,因为这是初学者。

如果确切,则失败。如果关闭多个号码,则失败。这是我到目前为止所做的。

这是我的功能:

require "minitest/autorun"
require_relative "offbyone.rb"

class TestLottoFunction < Minitest::Test

def test_a_matching_ticket_returns_false
        my_ticket = "1234"
        winning_tickets = "1234"
        assert_equal(false, off(my_ticket, winning_tickets))
    end

def test_a_one_off_ticket
    my_ticket = "1234"
    winning_tickets = "1235"
    assert_equal(true, off(my_ticket, winning_tickets)) 
end

end

我试图以更复杂的方式拼出我的目标,看看是否有效,但事实并非如此。我得到了相同的错误消息,告诉我它是第9行和第15行,告诉我该函数预期为true或false,并且它正在接收nil。这是我的代码。

def off(my_ticket, winning_tickets)
    i = 0
    c = 0

4.times do

    if winning_tickets[0][i] == my_ticket[0][i]
        c+=1
    end

    i+=1

    end
if c==3
    true
end
end

我刚刚改变了

 if winning_tickets[i] == my_tickets [i]

包括

winning_tickets[0][i] == my_tickets [0][i] 

它消除了一个错误,但创建了一个新错误。

如果我不包含[0] [i],我会收到一条错误消息,说我在assert_equal行上有2个错误,两个都说他们正在接收 nil 而不是对或错。

如果我将[0] [i]添加到两行,我得到1错误,说我的错误在匹配的票证中,说它期望是真的并且收到错误。

对此有何帮助?

我真的很好奇为什么我收到零。数组中的哪个位置我错了以获得nil。请指出我的错误。

2 个答案:

答案 0 :(得分:1)

我知道我们会收到两个非负数,nm,并希望确定nm是否具有相同的位数,以及在两个数字的对应数字对中,究竟一对数字是否恰好相差一个而所有其他对是相等的。例如,124134是“一次性”,但12412以及124135不是。

您可以执行以下操作。

def one_off?(n,m)
  nstr, mstr = n.to_s, m.to_s
  return false unless nstr+mstr =~ /\A\d+\z/ && nstr.size == mstr.size
  nstr.each_char.zip(mstr.chars).reduce(0) { |tot, (ns, ms)|
    tot + (ns.to_i - ms.to_i).abs } == 1
end

one_off?(1234, 1233) #=> true 
one_off?(124, 134)   #=> true 
one_off?(124, 124)   #=> false 
one_off?(124, 135)   #=> false 
one_off?(124, 1245)  #=> false 
one_off?(124, -12)   #=> false 

请参阅Enumerable#zipEnumerable#reduce(又名inject)。

答案 1 :(得分:1)

使用整数比较

你的灯具数据和你所说的“一个人”的定义有些含糊不清。假设你的意思是一个整数,它可以是目标整数的+1或-1,那么你可能想要比较整数而不是索引到一个字符串。例如:

def off_by_one? winner, mine
  winner.succ == mine or winner.pred == mine ? true : false
end

off_by_one? 1234, 1234
#=> false

off_by_one? 1234, 1233
#=> true

off_by_one? 1234, 1235 
#=> true

off_by_one? 1234, 1254
#=> false

即使在整数长度不匹配的边界条件下也是如此。例如:

off_by_one? 1000, 999
#=> true

当然,如果您的业务规则更复杂,那么您可能需要一个不同的解决方案。