プロジェクト・オイラーの Problem 68, 69

Problem 68

def sum(i); @b[i].inject(:+); end

max = 0
@b = Array.new(5)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1].permutation(10) do |a|
  next unless a[0] == 10 or a[1] == 10 or a[2] == 10 or a[3] == 10 or a[4] == 10
  @b[0] = [a[0], a[5], a[6]]
  @b[1] = [a[1], a[6], a[7]]
  @b[2] = [a[2], a[7], a[8]]
  @b[3] = [a[3], a[8], a[9]]
  @b[4] = [a[4], a[9], a[5]]
  next unless sum(0) == sum(1) and sum(0) == sum(2) and
      sum(0) == sum(3) and sum(0) == sum(4)
  i = a[0..4].index(a[0..4].min)
  @b.rotate!(i)
  b = @b.map {|x| x.map {|y| y.to_s}}.flatten
  num = b.inject("") {|r, i| r + i}.to_i
  max = num if max < num
end
puts max



Problem 69。野良Gem 'Utilsc' についてはここを参照。

require 'bundler/setup'
require 'utilsc'

max = [0, 0]
6.step(1_000_000, 6) do |n|
  a = n / n.totient.to_f
  p max = [a, n] if max[0] < a
end
puts max[1]

それにしてもどうしようもないコードで、終わるまでに 4時間45分もかかった…。