Объектно-ориентированный подход был бы рядом правил. Присвойте вес каждому правилу и выполните итерации через них. В psuedo-коде:
abstract class Rule {
float weight;
float calculateScore( string password );
}
Вычисление общего счета:
float getPasswordStrength( string password ) {
float totalWeight = 0.0f;
float totalScore = 0.0f;
foreach ( rule in rules ) {
totalWeight += weight;
totalScore += rule.calculateScore( password ) * rule.weight;
}
return (totalScore / totalWeight) / rules.count;
}
алгоритм правила в качестве примера, на основе количества существующих классов символов:
float calculateScore( string password ) {
float score = 0.0f;
// NUMBER_CLASS is a constant char array { '0', '1', '2', ... }
if ( password.contains( NUMBER_CLASS ) )
score += 1.0f;
if ( password.contains( UPPERCASE_CLASS ) )
score += 1.0f;
if ( password.contains( LOWERCASE_CLASS ) )
score += 1.0f;
// Sub rule as private method
if ( containsPunctuation( password ) )
score += 1.0f;
return score / 4.0f;
}
В пакете zoo
есть функция na.locf ()
:
R> library("zoo")
R> na.locf(c(1, 2, 3, 4))
[1] 1 2 3 4
R> na.locf(c(1, NA, NA, 2, 3, NA, 4))
[1] 1 1 1 2 3 3 4
na.locf
: Последний Продолжение наблюдения;
Универсальная функция для замены каждого «NA» самым последним не-NA перед ним.
См. Исходный код функции na.locf.default
, для нее не требуется для
-контур.
Я делаю минимальное копирование и вставку из библиотеки зоопарка (еще раз спасибо rcs за то, что указали мне на это), и это то, что мне действительно нужно:
fillInTheBlanks <- function(S) {
## NA in S are replaced with observed values
## accepts a vector possibly holding NA values and returns a vector
## where all observed values are carried forward and the first is
## also carried backward. cfr na.locf from zoo library.
L <- !is.na(S)
c(S[L][1], S[L])[cumsum(L)+1]
}