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