1

如果我运行这个怎么办:

get_score = proc{ |word, position|
  val = 0
  word[1..-2].each_byte do |c|
    val = val + (c.ord - 64)
  end
  name_score = val*(position+1)
}

puts File.read("names.txt").split(',').sort.map.with_index(&get_score).inject(:+)

我得到答案:871193872

但是如果我运行这个:

get_score = proc{ |word, position|
  val = 0
  word.each_byte do |c|
    val = val + (c.ord - 64)
  end
  name_score = val*(position+1)
}

puts File.read("names.txt").gsub('"','').split(',').sort.map.with_index(&get_score).inject(:+)

我明白了:871190344

(不同的是,在第二个中我使用 gsub 删除引号,但在第一个中我保留它们直到我使用 word[1..-2] 仅遍历引号之间的字符)

在第三个版本中,它使用 scan(/\w+/) 来搜索空格,即使文件中没有空格,但这是给出正确答案的那个:

names = File.open('names.txt').read.scan(/\w+/).sort
puts names.map { |name|
        word_score = name.each_byte.map { |c| c - 64 }.reduce(:+)
        (names.index(name) + 1) * word_score
}.reduce(:+)

编辑:

这是示例数据:http ://projecteuler.net/project/names.txt

4

1 回答 1

2

恐怕您复制并粘贴了输入文件或类似的东西,而不是保存它。我试过你的两个代码,它们工作得很好:

$ ruby p22.rb
87119XX82
87119XX82

现在,如果你问我如何写它(你没有:-)),让我们保持抽象get_score,但稍微重构一下:

indexes = Hash[("A".."Z").map.with_index(1).to_a]
get_score = proc { |word, idx| indexes.values_at(*word.chars).reduce(:+) * idx }
sorted_names = File.read("names.txt").delete('"').split(',').sort
solution = sorted_names.map.with_index(1, &get_score).reduce(0, :+)
于 2013-07-07T22:17:56.973 回答