简单的思路,但是代码比较长,逻辑循环比较简单

while(line=readline()){
    var arr = [0,0,0] , num = 0 , num_1 = 0 , YoN = 0
    var lines = line.split('  ')
    var a = lines[0]
    if(a.length>=8){            //密码长度小于八位,错误
        str = a.split('')
        for(var i=0 ; i<a.length ; i++)        //判断是否含有大于2的包含公共元素的子串重复
            for(var j=i+3 ; j<a.length-1 ; j++){        //因为大于2,所以至少三个重复字符串才会判错,所以嵌套for循环从i+3开始
                if(str[i] == str[j])           //三个重复,将YON的值赋为1,也就是错误
                    if(str[i+1] == str[j+1])
                        if(str[i+2] == str[j+2]){
                        YoN = 1                //赋为1之后立刻跳出两个循环
                        break
                        }
                if(YoN == 1)
                    break
            }

        if(YoN == 0){            //判断包含的字符种类
            for(var i=0 ; i<a.length ; i++)            //计算A~Z元素的个数,只要有一个,arr[0]为1,代表有大写字母
                if( str[i]>='A' && str[i]<='Z' ){
                    num++
                    arr[0] = 1
                }
            for(var i=0 ; i<a.length ; i++)            //计算a~z元素的个数,只要有一个,arr[1]为1,代表有小写字母
                if( str[i]>='a' && str[i]<='z' ){
                    num++
                    arr[1] = 1
                }
            for(var i=0 ; i<a.length ; i++)            //计算0~0元素的个数,只要有一个,arr[2]为1,代表有小写字母
                if( str[i]>=0 && str[i]<=9 ){
                    num++
                    arr[2] = 1
                }
            for( i=0 ; i<3 ; i++)        //计算大写字母小写字母以及数字的在密码中的总数,如果密码长度大于总数,说明还有其他符号
                if(arr[i] == 1)
                    num_1++
            if(num_1 == 3)
                console.log('OK')
            else if(num_1 == 2)
                if( a.length-num > 0 )
                    console.log('OK')
                else console.log('NG')
            else console.log('NG')
        }
        else console.log('NG')

    }
    else console.log('NG')
}