目标是检查它是否是一次性的。例如,如果中奖彩票是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。请指出我的错误。
答案 0 :(得分:1)
我知道我们会收到两个非负数,n
和m
,并希望确定n
和m
是否具有相同的位数,以及在两个数字的对应数字对中,究竟一对数字是否恰好相差一个而所有其他对是相等的。例如,124
和134
是“一次性”,但124
和12
以及124
和135
不是。
您可以执行以下操作。
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#zip和Enumerable#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
当然,如果您的业务规则更复杂,那么您可能需要一个不同的解决方案。