[英]Ruby Checking one array string against another array string for similarities
目标是检查它是否为一次性。 例如,如果中奖票证是1234 ,而我的票证是 1233,2234或1334 ,则该票证应为true,因为该票证是一次性的。 不涉及正则表达式,因为这是针对初学者的。
如果正确,则失败。 如果超过一个数字,则失败。 到目前为止,这就是我所拥有的。
这是我的功能:
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而不是true或false。
如果我在两行中都添加[0] [i],则会得到1个错误,表示我的错误在匹配的票证中,并表示它期望为true并接收到false。
有什么帮助吗?
我实际上对为什么我收到零感到好奇。 我在数组中的什么地方出错会得到nil。 请指出我的错误。
我了解我们得到了两个非负数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的整数,那么您可能需要比较Integers而不是索引到String中。 例如:
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
当然,如果您的业务规则更加复杂,那么您可能需要其他解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.