题解 | #密码强度等级#
密码强度等级
http://www.nowcoder.com/practice/52d382c2a7164767bca2064c1c9d5361
package main
import "fmt"
func main() {
for {
var a string
if _, err := fmt.Scan(&a); err != nil {
break
}
solution(a)
}
}
func solution(s string) {
r := []rune(s)
total := 0
c := count(r)
total = judgeLen(c) + judgeNum(c) + judgeAlph(c) + judgeSymbol(c) + award(c)
grade(total)
}
// 评分
func grade(n int) {
switch {
case n >= 90:
fmt.Println("VERY_SECURE")
case n >= 80:
fmt.Println("SECURE")
case n >= 70:
fmt.Println("VERY_STRONG")
case n >= 60:
fmt.Println("STRONG")
case n >= 50:
fmt.Println("AVERAGE")
case n >= 25:
fmt.Println("WEAK")
default:
fmt.Println("VERY_WEAK")
}
}
type Counter struct {
length, num, lower, upper, symbol int
}
// 一次遍历统计所有次数
func count(r []rune) *Counter {
var c Counter
c.length = len(r)
for _, v := range r {
switch {
case v >= 'a' && v <= 'z':
c.lower++
case v >= 'A' && v <= 'Z':
c.upper++
case v >= '0' && v <= '9':
c.num++
default:
c.symbol++
}
}
return &c
}
// 长度评分
func judgeLen(c *Counter) int {
l := c.length
switch {
case l <= 4:
return 5
case l <= 7:
return 10
default:
return 25
}
}
// 数字评分
func judgeNum(c *Counter) int {
n := c.num
switch {
case n == 0:
return 0
case n == 1:
return 10
default:
return 20
}
}
// 字母评分
func judgeAlph(c *Counter) int {
l, u := c.lower, c.upper
switch {
case l+u == 0:
return 0
case l == 0 || u == 0:
return 10
default:
return 20
}
}
// 符号评分
func judgeSymbol(c *Counter) int {
s := c.symbol
switch {
case s == 0:
return 0
case s == 1:
return 10
default:
return 25
}
}
// 奖励
func award(c *Counter) int {
l, u, n, s := c.lower, c.upper, c.num, c.symbol
switch {
case l > 0 && u > 0 && n > 0 && s > 0:
return 5
case l+u > 0 && n > 0 && s > 0:
return 3
case l+u > 0 && n > 0:
return 2
default:
return 0
}
}


vivo公司福利 363人发布