Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # проверка сложности пароля нейронной сетью
- class String
- def to_vector #вспомогательный метод, переводит строку в массив бит
- self.split('').collect {|c| sprintf("%8b", c[0]).split('').collect {|b| b.to_i} }.flatten
- end
- end
- class Password #тестовый генератор 8символьных паролей
- def self.good # хороший пароль - содержит маленькие и большие буквы, а также цифры
- (1..8).to_a.collect { (('0'..'9').to_a+('A'..'Z').to_a+('a'..'z').to_a)[rand(26+26+10)] }.join
- end
- def self.bad #плохой пароль, либо только цифры, либо только буквы
- if rand(2) > 0
- (1..8).to_a.collect { ('a'..'z').to_a[rand(26)] }.join
- else
- (1..8).to_a.collect { ('0'..'9').to_a[rand(10)] }.join
- end
- end
- end
- class Perceptron # простой перцептрон из одного нейрона
- def initialize
- @w = (1..64).to_a.collect { rand(10) } # случайные веса
- @v = 10 # порог
- 1000.times do # учим, тысячей хороших и тысячей плохих
- teach Password.good, 1
- teach Password.bad, -1
- end
- end
- def test password # проверка на "хорошесть"
- s = 0;
- p = password.to_vector
- 64.times do |i| # сумма произведений весов на входные данные(биты пароля) > порогового значение - пароль хороший, иначе плохой
- s += p[i]*@w[i]
- end
- return 1 if s >= @v
- -1
- end
- def teach password, result # обучение, пароль и результат к немму(1 или -1)
- p = password.to_vector
- 64.times do |i| # если не сошелся результат, то подгоняем веса
- @w[i] += p[i]*result;
- end unless (test(password) == result)
- end
- end
- p = Perceptron.new # учимся прямо при инициализации
- puts p.test(Password.good) # тест - хороший и плохой
- puts p.test(Password.bad)
- res = []
- res[1] = "good"
- res[2] = "bad"
- # можно проверять свои пароли
- s = ""
- puts res[p.test(s)] while (s = gets.chomp) != "quit"
Add Comment
Please, Sign In to add comment