これを実行するとどうなりますか:
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
(違いは、2 番目の例では gsub を使用して引用符を削除したことですが、最初の例では word[1..-2] を使用して引用符の間の文字のみを反復処理するまでそれらを保持していたことです)
そして、この 3 番目のバージョンでは、ファイルに空白がなくても空白を検索する 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