Github自动评分系统输出匹配却报错的Ruby程序问题求助
问题排查与解决方案
核心问题:二进制输出的分隔符不匹配
你的代码中二进制输出行存在关键错误:
puts "Binary: #{binary.reverse.join(" " " ")}"
Ruby会自动拼接相邻的字符串字面量," " " "等价于" "(两个空格),这导致二进制位之间用两个空格分隔,而系统预期的是单个空格(如你给出的预期输出1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1)。这是自动评分系统判定输出不匹配的直接原因。
次要优化点
- prime?方法返回值不规范
当前prime?方法在判断为质数时返回数字本身,虽然Ruby会将非零整数视为true,但方法名是prime?,语义上应该返回布尔值,建议修改为:
def prime?(number) return false if number < 2 (2..Integer.sqrt(number)).none? { |divisor| number % divisor == 0 } end
用none?方法更简洁,且明确返回布尔值,逻辑更清晰。
- 求和逻辑简化
当前求和代码可以用Ruby内置的sum方法简化:
sum = primes.sum
替代手动循环累加的写法,更简洁高效。
修正后的完整代码
# frozen_string_literal: true def set_number(index1, index2) Array(index1..index2) end def prime?(number) return false if number < 2 (2..Integer.sqrt(number)).none? { |divisor| number % divisor == 0 } end def decimal_to_binary(number) number = number.to_i return [0] if number == 0 binary = [] while number != 0 binary << (number % 2).to_s number = number / 2 end binary end index1, index2 = gets.chomp.split.map(&:to_i) array = set_number(index1, index2) puts "Range: #{index1}-#{index2}" primes = array.select { |x| prime?(x) } sum = primes.sum puts "Sum: #{sum}" binary = decimal_to_binary(sum) puts "Binary: #{binary.reverse.join(" ")}"
额外注意事项
如果修正后仍有问题,检查换行符差异:本地Windows环境默认换行符是\r\n,而Github Autograding运行在Linux环境,使用\n作为换行符。可以确保代码中没有手动添加多余的换行,依赖Rubyputs的默认行为即可。
内容的提问来源于stack exchange,提问作者ahailtotheKing
相关产品推荐
相关产品推荐

