牛客--Ruby(三)

while str = gets
    str.chomp!
    data = str.split(";")
    x = 0
    y = 0
    for i in 0..data.size-1
        #判断首字母是否符合标准
        if ((data[i][0] == "A") || (data[i][0] == "S") || (data[i][0] == "D") || (data[i][0] == "W"))
            flag = true
            #判断每一位是否符合标准
            for j in 1..data[i].size-1
                flag = false if ((data[i][j].ord < "0".ord) || (data[i][j].ord > "9".ord))
            end
            next if !flag
            #分别进行处理
            if data[i][0] == "A"
                data[i].slice!(0)
                result = data[i].to_i
                x -= result
            elsif data[i][0] == "S"
                data[i].slice!(0)
                result = data[i].to_i
                y -= result
            elsif data[i][0] == "D"
                data[i].slice!(0)
                result = data[i].to_i
                x += result
            else
                data[i].slice!(0)
                result = data[i].to_i
                y += result
            end
        end
    end
    print x, ",", y, "\n"
end

a_number = 0
b_number = 0
c_number = 0
d_number = 0
e_number = 0
wrong_n = 0
personal = 0
while str = gets
    str.chomp!
    value = str.split("~")
    value[0] = value[0].split(".")
    value[1] = value[1].split(".")
    mask = ""
    #将子网掩码转换成二进制字符串形式
    for i in 0..3
        mask.concat((value[1][i].to_i).to_s(2))
    end
    flag = 0
    #设置标志位,标志前后位数是否发生变化,若变化超过2次,则直接跳出循环
    for j in 0..mask.size-2
        flag += 1 if mask[j] != mask[j+1]
        break if flag > 1
    end
    if flag != 1 || mask[0] == "0"
        wrong_n += 1
        next
    end
    check = 0
    #设置标志位,标志IP地址是否合法,若不合法则标志位置1并跳出循环
    for i in 0..3
        if value[0][i] == "" || value[0][i].to_i < 0 || value[0][i].to_i > 255
            wrong_n += 1
            check = 1
            break
        end
    end
    next if check == 1
    #判断私有IP地址(三类私有IP可分别划分进A、B、C类地址)。此处不方便使用if、else、elsif,因为else并不包含所有不满足条件的情况。
    if value[0][0].to_i == 172
        personal += 1 if value[0][1].to_i >= 16 && value[0][1].to_i <= 31
        b_number += 1
        next
    end
    if value[0][0].to_i == 192
        personal += 1 if value[0][1].to_i == 168
        c_number += 1
        next
    end
    if value[0][0].to_i == 10
        personal += 1
        a_number += 1
        next
    end
    #判断A、B、C、D、E类地址
    a_number += 1 if value[0][0].to_i >= 1 && value[0][0].to_i <= 126
    b_number += 1 if value[0][0].to_i >= 128 && value[0][0].to_i <= 191
    c_number += 1 if value[0][0].to_i >= 192 && value[0][0].to_i <= 223
    d_number += 1 if value[0][0].to_i >= 224 && value[0][0].to_i <= 239
    e_number += 1 if value[0][0].to_i >= 240 && value[0][0].to_i <= 255
end
print a_number, " ", b_number, " ", c_number, " ", d_number, " ", e_number, " ", wrong_n, " ", personal, " "

Ps:这道题我的答案在牛客上case通过率为60.00%,但是看完其他的C++答案,感觉逻辑没有问题,实在检查不出bug在哪里,希望能有大神解惑。

data = []
while paths = gets
    paths.chomp!
    data << paths
end
for i in 0..data.size-1
    data[i] = data[i].split(" ")
end
#使用散列使代码可读性更高,也可以是使用数组
result = {file: [], row: [], times: []}
for i in 0..data.size-1
    #分割取文件名
    memory = data[i][0].split("\\")
    #判断文件名长度,若大于16,则保留最后16位
    memory[memory.size-1].slice!(0, memory[memory.size-1].size-16) if memory[memory.size-1].size > 16
    #第一步i=0时
    if i == 0
        result[:file].push(memory[memory.size-1])
        result[:row].push(data[i][1])
        result[:times].push(1)
        next
    #第二步,判断是否有重复的文件名
    elsif result[:file].include?(memory[memory.size-1])
        #对散列中的每一个文件名都进行比较,判断是否文件名相同且行数相同
        for j in 0..result[:file].size-1
            if (result[:file][j] == memory[memory.size-1]) && (result[:row][j] == data[i][1])
                result[:times][j] += 1
                break
            elsif j == result[:file].size-1
                result[:file].push(memory[memory.size-1])
                result[:row].push(data[i][1])
                result[:times].push(1)
            else
                next
            end
        end
        next
    #第三步,不满足上述条件时直接加在最后
    else
        result[:file].push(memory[memory.size-1])
        result[:row].push(data[i][1])
        result[:times].push(1)
        next
    end
end
if result[:file].size > 8
    for k in result[:file].size-8..result[:file].size-1
        print result[:file][k], " ", result[:row][k], " ", result[:times][k], "\n"
    end
else
    for k in 0..result[:file].size-1
        print result[:file][k], " ", result[:row][k], " ", result[:times][k], "\n"
    end
end

 

while str = gets
    #创建一个4位全为0的数组作为标志位
    flag = Array.new(4, 0)
    data = []
    str.chomp!
    data[0] = 1 if str.size > 8
    #判断条件,注意break和next的使用
    for i in 0..str.size-1
        if str[i].ord >= 65 && str[i].ord <= 90
            flag[0] = 1
        elsif str[i].ord >= 97 && str[i].ord <= 122
            flag[1] = 1
        elsif str[i].ord >= 48 && str[i].ord <= 57
            flag[2] = 1
        else
            flag[3] = 1
        end
        if flag[0] + flag[1] + flag[2] + flag[3] >= 3
            data[1] = 1
            break
        end
    end
    data[2] = 0
    #对每一位做判断,这一步时间复杂度较高,但暂时没想到更好的
    for i in 0..str.size-3
        for j in 0..str.size-3
            data[2] += 1 if str[i] == str[j] && str[i+1] == str[j+1] && str[i+2] == str[j+2]
        end
    end
    if data[0] == 1 && data[1] == 1 && data[2] == str.size-2
        print "OK\n"
    else
        print "NG\n"
    end
end

 

while str= gets
    str.chomp!
    result = ""
    #根据条件对str中的每一位做变换再将变换后的位接在空字符串后
    for i in 0..str.size-1
        #注意应该先判断小写字母,因为若先判断大写字母会使大写字母变换为小写字母后再做一次变换导致错误。str.ord是将字符转换成ASCII码,.chr可以将ASCII码转换回字符。
        if str[i].ord >= 97 && str[i].ord <= 122
            str[i] = "2" if str[i].ord >= 97 && str[i].ord <= 99
            str[i] = "3" if str[i].ord >= 100 && str[i].ord <= 102
            str[i] = "4" if str[i].ord >= 103 && str[i].ord <= 105
            str[i] = "5" if str[i].ord >= 106 && str[i].ord <= 108
            str[i] = "6" if str[i].ord >= 109 && str[i].ord <= 111
            str[i] = "7" if str[i].ord >= 112 && str[i].ord <= 115
            str[i] = "8" if str[i].ord >= 116 && str[i].ord <= 118
            str[i] = "9" if str[i].ord >= 119 && str[i].ord <= 122
        end
        if str[i].ord >= 65 && str[i].ord <= 90
            if str[i].ord != 90
                str[i] = (str[i].ord+33).chr
            else
                str[i] = "a"
            end
        end
        result += str[i]
    end
    print result, "\n"
end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值