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

(違いは、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

4

1 に答える 1

2

申し訳ありませんが、入力ファイルなどを保存せずにコピー アンド ペーストしてしまいました。私はあなたの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 に答える