089 Roman numerals.sf 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 28 January 2017
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=89
  7. # Runtime: 0.382s
  8. # usage: sidef script.sf < p089_roman.txt
  9. func roman2arabic(roman) {
  10. var arabic = 0
  11. var last_digit = 1000
  12. static lookup = Hash(
  13. I => 1,
  14. V => 5,
  15. X => 10,
  16. L => 50,
  17. C => 100,
  18. D => 500,
  19. M => 1000,
  20. )
  21. for digit in (roman.chars.map { lookup{_} }) {
  22. if (last_digit < digit) {
  23. arabic -= 2*last_digit
  24. }
  25. arabic += (last_digit = digit)
  26. }
  27. return arabic
  28. }
  29. func arabic2roman(arabic) {
  30. static lookup = [
  31. [M => 1000],
  32. [CM => 900],
  33. [D => 500],
  34. [CD => 400],
  35. [C => 100],
  36. [XC => 90],
  37. [L => 50],
  38. [XL => 40],
  39. [X => 10],
  40. [IX => 9],
  41. [V => 5],
  42. [IV => 4],
  43. [I => 1],
  44. ]
  45. var roman = ''
  46. for pair in (lookup) {
  47. while (arabic >= pair[1]) {
  48. roman += pair[0]
  49. arabic -= pair[1]
  50. }
  51. }
  52. return roman
  53. }
  54. var saved = 0
  55. ARGF.each { |line|
  56. line.strip!
  57. saved += (line.len - arabic2roman(roman2arabic(line)).len)
  58. }
  59. say saved