fork download
  1. #lang racket
  2.  
  3. (require rackunit)
  4.  
  5. ;; 目的 : 整数をローマ数字に変換する。
  6.  
  7. ;; integer->roman : integer -> string
  8. (define (integer->roman n)
  9. (let ((roman-numeral-map '(("M" . 1000)
  10. ("CM" . 900)
  11. ("D" . 500)
  12. ("CD" . 400)
  13. ("C" . 100)
  14. ("XC" . 90)
  15. ("L" . 50)
  16. ("XL" . 40)
  17. ("X" . 10)
  18. ("IX" . 9)
  19. ("V" . 5)
  20. ("IV" . 4)
  21. ("I" . 1))))
  22. (car (foldl (lambda (y x)
  23. (let ((numeral (car y)) (integer (cdr y)))
  24. (let loop ((result (car x)) (n (cdr x)))
  25. (if (< n integer)
  26. `(,result . ,n)
  27. (loop (string-append result numeral) (- n integer))))))
  28. `("" . ,n) roman-numeral-map))))
  29.  
  30. ;; テスト
  31. (check-equal? (integer->roman 1) "I")
  32. (check-equal? (integer->roman 2) "II")
  33. (check-equal? (integer->roman 3) "III")
  34. (check-equal? (integer->roman 4) "IV")
  35. (check-equal? (integer->roman 5) "V")
  36. (check-equal? (integer->roman 6) "VI")
  37. (check-equal? (integer->roman 7) "VII")
  38. (check-equal? (integer->roman 8) "VIII")
  39. (check-equal? (integer->roman 9) "IX")
  40. (check-equal? (integer->roman 10) "X")
  41. (check-equal? (integer->roman 50) "L")
  42. (check-equal? (integer->roman 100) "C")
  43. (check-equal? (integer->roman 500) "D")
  44. (check-equal? (integer->roman 1000) "M")
  45. (check-equal? (integer->roman 31) "XXXI")
  46. (check-equal? (integer->roman 148) "CXLVIII")
  47. (check-equal? (integer->roman 294) "CCXCIV")
  48. (check-equal? (integer->roman 312) "CCCXII")
  49. (check-equal? (integer->roman 421) "CDXXI")
  50. (check-equal? (integer->roman 528) "DXXVIII")
  51. (check-equal? (integer->roman 621) "DCXXI")
  52. (check-equal? (integer->roman 782) "DCCLXXXII")
  53. (check-equal? (integer->roman 870) "DCCCLXX")
  54. (check-equal? (integer->roman 941) "CMXLI")
  55. (check-equal? (integer->roman 1043) "MXLIII")
  56. (check-equal? (integer->roman 1110) "MCX")
  57. (check-equal? (integer->roman 1226) "MCCXXVI")
  58. (check-equal? (integer->roman 1301) "MCCCI")
  59. (check-equal? (integer->roman 1485) "MCDLXXXV")
  60. (check-equal? (integer->roman 1509) "MDIX")
  61. (check-equal? (integer->roman 1607) "MDCVII")
  62. (check-equal? (integer->roman 1754) "MDCCLIV")
  63. (check-equal? (integer->roman 1832) "MDCCCXXXII")
  64. (check-equal? (integer->roman 1993) "MCMXCIII")
  65. (check-equal? (integer->roman 2074) "MMLXXIV")
  66. (check-equal? (integer->roman 2152) "MMCLII")
  67. (check-equal? (integer->roman 2212) "MMCCXII")
  68. (check-equal? (integer->roman 2343) "MMCCCXLIII")
  69. (check-equal? (integer->roman 2499) "MMCDXCIX")
  70. (check-equal? (integer->roman 2574) "MMDLXXIV")
  71. (check-equal? (integer->roman 2646) "MMDCXLVI")
  72. (check-equal? (integer->roman 2723) "MMDCCXXIII")
  73. (check-equal? (integer->roman 2892) "MMDCCCXCII")
  74. (check-equal? (integer->roman 2975) "MMCMLXXV")
  75. (check-equal? (integer->roman 3051) "MMMLI")
  76. (check-equal? (integer->roman 3185) "MMMCLXXXV")
  77. (check-equal? (integer->roman 3250) "MMMCCL")
  78. (check-equal? (integer->roman 3313) "MMMCCCXIII")
  79. (check-equal? (integer->roman 3408) "MMMCDVIII")
  80. (check-equal? (integer->roman 3501) "MMMDI")
  81. (check-equal? (integer->roman 3610) "MMMDCX")
  82. (check-equal? (integer->roman 3743) "MMMDCCXLIII")
  83. (check-equal? (integer->roman 3844) "MMMDCCCXLIV")
  84. (check-equal? (integer->roman 3888) "MMMDCCCLXXXVIII")
  85. (check-equal? (integer->roman 3940) "MMMCMXL")
  86. (check-equal? (integer->roman 3999) "MMMCMXCIX")
Success #stdin #stdout 0.69s 98292KB
stdin
Standard input is empty
stdout
Standard output is empty