我的任务是使用一个非常简单的密码验证方案,但对于我的生活,我似乎无法做到这一点。这是任务:
用户通过表单发送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。
答案 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