繁体   English   中英

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

[英]Ruby Checking one array string against another array string for similarities

目标是检查它是否为一次性。 例如,如果中奖票证是1234 ,而我的票证是 1233,22341334 ,则该票证应为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。 请指出我的错误。

我了解我们得到了两个非负数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的整数,那么您可能需要比较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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM