fork download
  1. class Fixnum
  2. ROMAN_NUMBERS = {
  3. 1000 => "M",
  4. 900 => "CM",
  5. 500 => "D",
  6. 400 => "CD",
  7. 100 => "C",
  8. 90 => "XC",
  9. 50 => "L",
  10. 40 => "XL",
  11. 10 => "X",
  12. 9 => "IX",
  13. 5 => "V",
  14. 4 => "IV",
  15. 1 => "I",
  16. }
  17.  
  18. def romanize
  19. n = self
  20. roman = ""
  21. ROMAN_NUMBERS.each do |value, letter|
  22. roman << letter*(n / value)
  23. n = n % value
  24. end
  25. return roman
  26. end
  27. end
  28.  
  29. must_have = "MDCLXVI"
  30. pandigitals = []
  31. 0.upto(2000) do |x|
  32. romanized = x.romanize
  33. valid = true
  34. must_have.each_char do |char|
  35. valid = false if valid and not romanized.include? char
  36. end
  37. pandigitals.push(x) if valid
  38. end
  39.  
  40. pandigitals_one_letter = []
  41. pandigitals.each do |x|
  42. char_counts = Hash.new 0
  43. x.romanize.each_char do |char|
  44. char_counts[char] += 1
  45. end
  46.  
  47. valid = true
  48. char_counts.each do |char, num|
  49. valid = false if num != 1
  50. end
  51. pandigitals_one_letter.push(x) if valid
  52. end
  53.  
  54. puts pandigitals.to_s
  55. puts pandigitals_one_letter.to_s
  56.  
Success #stdin #stdout 0.02s 28680KB
stdin
Standard input is empty
stdout
[1444, 1446, 1447, 1448, 1464, 1466, 1467, 1468, 1474, 1476, 1477, 1478, 1484, 1486, 1487, 1488, 1644, 1646, 1647, 1648, 1664, 1666, 1667, 1668, 1674, 1676, 1677, 1678, 1684, 1686, 1687, 1688, 1744, 1746, 1747, 1748, 1764, 1766, 1767, 1768, 1774, 1776, 1777, 1778, 1784, 1786, 1787, 1788, 1844, 1846, 1847, 1848, 1864, 1866, 1867, 1868, 1874, 1876, 1877, 1878, 1884, 1886, 1887, 1888]
[1444, 1446, 1464, 1466, 1644, 1646, 1664, 1666]