# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2062 # # 正の整数 i について,iの立方数の各桁をソートして結合した文字列は # 桁を並び替えることで生成できる数に共通のキーとなる. # i を 0 .. ∞ まで増やして,現れる共通のキーをカウントし, # 共通のキーが過去に5回現れた立方数は, # 立方数になるような桁の置換をちょうど5つもつ立方数のひとつである. # カウントと共に元となった立方数も記録しておき, # カウントが5になったときに共通のキーを持つ中で最小の立方数を表示する. # i = 1 # 共通のキーをキーにしたハッシュテーブル hash = {} loop do iii = (i ** 3).to_s # 共通のキー key = iii.chars.to_a.sort.join if (h = hash[key]) h[:count] += 1 h[:iii] << i ** 3 # 過去に5回現れていたら,最小の値を表示して終わる if (h[:count] == 5) puts h[:iii].min break end else hash[key] = {:count => 1, :iii => [i ** 3]} end i = i.next end