如何为 Luhn 对象创建条件循环以检查索引 [0] 是否不为 0

how to create conditional loop for Luhn object to check if index[0] is not 0

我正在使用来自 Github 的 Luhn 库。 Luhn class 有更多方法,但我只对 "generate" 和 "valid?" 方法感兴趣。

  m = Luhn.generate(9) # generates a random number like [123456789] or [098765432]
  Luhn.valid?(m)   # returns true or false based on Luhn checksum passing

但我不希望生成的数字以“0”开头。

那么我该如何放入我的 ruby 脚本:

  1. 丢弃以"0"开头的生成数字。
  2. 生成另一个数字并再次检查,直到 m[0] 不为零。
  3. 运行 valid?() on generated number:如果为假,则生成另一个非零数字,直到为真。
  4. return 来电号码的有效 9 位数字

这对你有用吗? (非常基本的递归)

require 'luhn'
def generate_non_zero_luhn(size=9)
  m = Luhn.generate(size)
  m[0] != "0" && Luhn.valid?(m) ? m : generate_non_zero_luhn(size)
end

示例输出

10.times.map { generate_non_zero_luhn }
#=> ["582428355", "353646136", "821379013", "818135220", "696652767", 
     "934766437", "885229401", "226319044", "682121645", "688197078"]

尽管我认为不需要进行有效性检查,因为 Luhn 正在生成号码,因此它将始终有效。例如

1_000_000.times.map { Luhn.valid?(Luhn.generate(9))}.any?{|val| !val}
#=> false

那么方法就可以变成

def generate_non_zero_luhn(size=9)
  m = Luhn.generate(size)
  m[0] != "0" ? m : generate_non_zero_luhn(size)
end