如何验证字符串中的连续数字是否是连续的?

时间:2016-03-27 14:43:26

标签: ruby string validation passwords integer

我的任务是使用一个非常简单的密码验证方案,但对于我的生活,我似乎无法做到这一点。这是任务:

  

用户通过表单发送6个字符的数字密码。在   为了强制安全密码创建一个验证数字   不能连续上升或下降。

这就是我所拥有的:

password = '246879'
new_password = password.split('').map { |s| s.to_i }

new_password.each_with_index do |val, index|

  next_element = new_password[index + 1]
  prev_element = new_password[index - 1]

  if new_password[index] + 1 == next_element
    puts 'next bad'
    break
  elsif
    new_password[index] - 1 == prev_element
    puts 'prev bad'
    break
  end
end

密码应该在87上失败,因为7小于8。

2 个答案:

答案 0 :(得分:3)

我喜欢CodeGnome的答案,但我稍微简化了一下。

def valid_password?(password)
  password.chars.each_cons(2).none? do |a, b|
    (a.ord - b.ord).abs == 1
  end
end

p valid_password?('246879')
#=> false

p valid_password?('246809')
#=> true

这假定所有字符都是数字(即某些其他代码验证了这一点)。由于"0""9"按顺序排列为UTF-8(如ASCII格式),我们不需要将它们转换为数字,我们只需要比较它们的字符代码。它也使用Enumerable#none?,因为这类问题正是它的目的所在。

答案 1 :(得分:0)

使用Enumerable#each_cons比较字符或整数的滑动窗口。例如:

def valid_password? str_of_ints
  str_of_ints.chars.map(&:to_i).each_cons(2) do |i, j|
    return false if i.succ == j or i.pred == j
  end
  true
end

valid_password? '246879'
#=> false

valid_password? '246809'
#=> true