2012年11月22日木曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 12章(新しいクラスのオブジェクト), 12.6(練習問題の続き)roman_to_integer 'mcmxcix'! を解いてみる。

その他参考書籍

roman_to_integer 'mcmxcix'!

コード(TextWrangler)

sample.rb

#!/usr/bin/env ruby1.9
# -*- coding: utf-8 -*-

def roman_to_integer roman
  number = 0
  r_i = {'i' => 1,
         'v' => 5,
         'x' => 10,
         'l' => 50,
         'c' => 100,
         'd' => 500,
         'm' => 1000}
  pre = 0
  a = roman.split("")
  while a.length > 0
    ch =a.pop.downcase
    return "有効なローマ数字になっていない!" unless r_i[ch]
    if r_i[ch] >= pre
      number += r_i[ch]
      pre = r_i[ch];
    else
      number -= r_i[ch]
    end
  end
  number
end

def roman_numeral number
  t = number / 1000
  number = number % 1000
  h = number / 100
  number = number % 100
  tens = number / 10  
  o = number % 10
  
  roman = 'M' * t
  if h == 9
    roman += 'CM'
  elsif h == 4
    roman += 'CD'
  else
    roman += 'D' * (h / 5)
    roman += 'C' * (h % 5)
  end
  if tens == 9
    roman += 'XC'
  elsif tens == 4
    roman += 'XL'
  else
    roman += 'L' * (tens / 5)
    roman += 'X' * (tens % 5)
  end
  if o == 9
    roman += 'IX'
  elsif o == 4
    roman += 'IV'
  else
    roman += 'V' * (o / 5)
    roman += 'I' * (o % 5)
  end
  roman
end

puts roman_to_integer 'abcde'
puts roman_to_integer 'mcmxcix'

(1..1000).each do |number|
  roman = roman_numeral number
  i = roman_to_integer roman
  break if number != i
  puts "#{i}: #{roman}"
end

入出力結果(Terminal)

$ ./sample.rb
有効なローマ数字になっていない!
1999
I: 1
II: 2
III: 3
IV: 4
V: 5
VI: 6
VII: 7
VIII: 8
IX: 9
X: 10
XI: 11
XII: 12
XIII: 13
XIV: 14
XV: 15
XVI: 16
XVII: 17
XVIII: 18
XIX: 19
XX: 20
XXI: 21
XXII: 22
XXIII: 23
XXIV: 24
XXV: 25
XXVI: 26
XXVII: 27
XXVIII: 28
XXIX: 29
XXX: 30
XXXI: 31
XXXII: 32
XXXIII: 33
XXXIV: 34
XXXV: 35
XXXVI: 36
XXXVII: 37
XXXVIII: 38
XXXIX: 39
XL: 40
XLI: 41
XLII: 42
XLIII: 43
XLIV: 44
XLV: 45
XLVI: 46
XLVII: 47
XLVIII: 48
XLIX: 49
L: 50
LI: 51
LII: 52
LIII: 53
LIV: 54
LV: 55
LVI: 56
LVII: 57
LVIII: 58
LIX: 59
LX: 60
LXI: 61
LXII: 62
LXIII: 63
LXIV: 64
LXV: 65
LXVI: 66
LXVII: 67
LXVIII: 68
LXIX: 69
LXX: 70
LXXI: 71
LXXII: 72
LXXIII: 73
LXXIV: 74
LXXV: 75
LXXVI: 76
LXXVII: 77
LXXVIII: 78
LXXIX: 79
LXXX: 80
LXXXI: 81
LXXXII: 82
LXXXIII: 83
LXXXIV: 84
LXXXV: 85
LXXXVI: 86
LXXXVII: 87
LXXXVIII: 88
LXXXIX: 89
XC: 90
XCI: 91
XCII: 92
XCIII: 93
XCIV: 94
XCV: 95
XCVI: 96
XCVII: 97
XCVIII: 98
XCIX: 99
C: 100
CI: 101
CII: 102
CIII: 103
CIV: 104
CV: 105
CVI: 106
CVII: 107
CVIII: 108
CIX: 109
CX: 110
CXI: 111
CXII: 112
CXIII: 113
CXIV: 114
CXV: 115
CXVI: 116
CXVII: 117
CXVIII: 118
CXIX: 119
CXX: 120
CXXI: 121
CXXII: 122
CXXIII: 123
CXXIV: 124
CXXV: 125
CXXVI: 126
CXXVII: 127
CXXVIII: 128
CXXIX: 129
CXXX: 130
CXXXI: 131
CXXXII: 132
CXXXIII: 133
CXXXIV: 134
CXXXV: 135
CXXXVI: 136
CXXXVII: 137
CXXXVIII: 138
CXXXIX: 139
CXL: 140
CXLI: 141
CXLII: 142
CXLIII: 143
CXLIV: 144
CXLV: 145
CXLVI: 146
CXLVII: 147
CXLVIII: 148
CXLIX: 149
CL: 150
CLI: 151
CLII: 152
CLIII: 153
CLIV: 154
CLV: 155
CLVI: 156
CLVII: 157
CLVIII: 158
CLIX: 159
CLX: 160
CLXI: 161
CLXII: 162
CLXIII: 163
CLXIV: 164
CLXV: 165
CLXVI: 166
CLXVII: 167
CLXVIII: 168
CLXIX: 169
CLXX: 170
CLXXI: 171
CLXXII: 172
CLXXIII: 173
CLXXIV: 174
CLXXV: 175
CLXXVI: 176
CLXXVII: 177
CLXXVIII: 178
CLXXIX: 179
CLXXX: 180
CLXXXI: 181
CLXXXII: 182
CLXXXIII: 183
CLXXXIV: 184
CLXXXV: 185
CLXXXVI: 186
CLXXXVII: 187
CLXXXVIII: 188
CLXXXIX: 189
CXC: 190
CXCI: 191
CXCII: 192
CXCIII: 193
CXCIV: 194
CXCV: 195
CXCVI: 196
CXCVII: 197
CXCVIII: 198
CXCIX: 199
CC: 200
CCI: 201
CCII: 202
CCIII: 203
CCIV: 204
CCV: 205
CCVI: 206
CCVII: 207
CCVIII: 208
CCIX: 209
CCX: 210
CCXI: 211
CCXII: 212
CCXIII: 213
CCXIV: 214
CCXV: 215
CCXVI: 216
CCXVII: 217
CCXVIII: 218
CCXIX: 219
CCXX: 220
CCXXI: 221
CCXXII: 222
CCXXIII: 223
CCXXIV: 224
CCXXV: 225
CCXXVI: 226
CCXXVII: 227
CCXXVIII: 228
CCXXIX: 229
CCXXX: 230
CCXXXI: 231
CCXXXII: 232
CCXXXIII: 233
CCXXXIV: 234
CCXXXV: 235
CCXXXVI: 236
CCXXXVII: 237
CCXXXVIII: 238
CCXXXIX: 239
CCXL: 240
CCXLI: 241
CCXLII: 242
CCXLIII: 243
CCXLIV: 244
CCXLV: 245
CCXLVI: 246
CCXLVII: 247
CCXLVIII: 248
CCXLIX: 249
CCL: 250
CCLI: 251
CCLII: 252
CCLIII: 253
CCLIV: 254
CCLV: 255
CCLVI: 256
CCLVII: 257
CCLVIII: 258
CCLIX: 259
CCLX: 260
CCLXI: 261
CCLXII: 262
CCLXIII: 263
CCLXIV: 264
CCLXV: 265
CCLXVI: 266
CCLXVII: 267
CCLXVIII: 268
CCLXIX: 269
CCLXX: 270
CCLXXI: 271
CCLXXII: 272
CCLXXIII: 273
CCLXXIV: 274
CCLXXV: 275
CCLXXVI: 276
CCLXXVII: 277
CCLXXVIII: 278
CCLXXIX: 279
CCLXXX: 280
CCLXXXI: 281
CCLXXXII: 282
CCLXXXIII: 283
CCLXXXIV: 284
CCLXXXV: 285
CCLXXXVI: 286
CCLXXXVII: 287
CCLXXXVIII: 288
CCLXXXIX: 289
CCXC: 290
CCXCI: 291
CCXCII: 292
CCXCIII: 293
CCXCIV: 294
CCXCV: 295
CCXCVI: 296
CCXCVII: 297
CCXCVIII: 298
CCXCIX: 299
CCC: 300
CCCI: 301
CCCII: 302
CCCIII: 303
CCCIV: 304
CCCV: 305
CCCVI: 306
CCCVII: 307
CCCVIII: 308
CCCIX: 309
CCCX: 310
CCCXI: 311
CCCXII: 312
CCCXIII: 313
CCCXIV: 314
CCCXV: 315
CCCXVI: 316
CCCXVII: 317
CCCXVIII: 318
CCCXIX: 319
CCCXX: 320
CCCXXI: 321
CCCXXII: 322
CCCXXIII: 323
CCCXXIV: 324
CCCXXV: 325
CCCXXVI: 326
CCCXXVII: 327
CCCXXVIII: 328
CCCXXIX: 329
CCCXXX: 330
CCCXXXI: 331
CCCXXXII: 332
CCCXXXIII: 333
CCCXXXIV: 334
CCCXXXV: 335
CCCXXXVI: 336
CCCXXXVII: 337
CCCXXXVIII: 338
CCCXXXIX: 339
CCCXL: 340
CCCXLI: 341
CCCXLII: 342
CCCXLIII: 343
CCCXLIV: 344
CCCXLV: 345
CCCXLVI: 346
CCCXLVII: 347
CCCXLVIII: 348
CCCXLIX: 349
CCCL: 350
CCCLI: 351
CCCLII: 352
CCCLIII: 353
CCCLIV: 354
CCCLV: 355
CCCLVI: 356
CCCLVII: 357
CCCLVIII: 358
CCCLIX: 359
CCCLX: 360
CCCLXI: 361
CCCLXII: 362
CCCLXIII: 363
CCCLXIV: 364
CCCLXV: 365
CCCLXVI: 366
CCCLXVII: 367
CCCLXVIII: 368
CCCLXIX: 369
CCCLXX: 370
CCCLXXI: 371
CCCLXXII: 372
CCCLXXIII: 373
CCCLXXIV: 374
CCCLXXV: 375
CCCLXXVI: 376
CCCLXXVII: 377
CCCLXXVIII: 378
CCCLXXIX: 379
CCCLXXX: 380
CCCLXXXI: 381
CCCLXXXII: 382
CCCLXXXIII: 383
CCCLXXXIV: 384
CCCLXXXV: 385
CCCLXXXVI: 386
CCCLXXXVII: 387
CCCLXXXVIII: 388
CCCLXXXIX: 389
CCCXC: 390
CCCXCI: 391
CCCXCII: 392
CCCXCIII: 393
CCCXCIV: 394
CCCXCV: 395
CCCXCVI: 396
CCCXCVII: 397
CCCXCVIII: 398
CCCXCIX: 399
CD: 400
CDI: 401
CDII: 402
CDIII: 403
CDIV: 404
CDV: 405
CDVI: 406
CDVII: 407
CDVIII: 408
CDIX: 409
CDX: 410
CDXI: 411
CDXII: 412
CDXIII: 413
CDXIV: 414
CDXV: 415
CDXVI: 416
CDXVII: 417
CDXVIII: 418
CDXIX: 419
CDXX: 420
CDXXI: 421
CDXXII: 422
CDXXIII: 423
CDXXIV: 424
CDXXV: 425
CDXXVI: 426
CDXXVII: 427
CDXXVIII: 428
CDXXIX: 429
CDXXX: 430
CDXXXI: 431
CDXXXII: 432
CDXXXIII: 433
CDXXXIV: 434
CDXXXV: 435
CDXXXVI: 436
CDXXXVII: 437
CDXXXVIII: 438
CDXXXIX: 439
CDXL: 440
CDXLI: 441
CDXLII: 442
CDXLIII: 443
CDXLIV: 444
CDXLV: 445
CDXLVI: 446
CDXLVII: 447
CDXLVIII: 448
CDXLIX: 449
CDL: 450
CDLI: 451
CDLII: 452
CDLIII: 453
CDLIV: 454
CDLV: 455
CDLVI: 456
CDLVII: 457
CDLVIII: 458
CDLIX: 459
CDLX: 460
CDLXI: 461
CDLXII: 462
CDLXIII: 463
CDLXIV: 464
CDLXV: 465
CDLXVI: 466
CDLXVII: 467
CDLXVIII: 468
CDLXIX: 469
CDLXX: 470
CDLXXI: 471
CDLXXII: 472
CDLXXIII: 473
CDLXXIV: 474
CDLXXV: 475
CDLXXVI: 476
CDLXXVII: 477
CDLXXVIII: 478
CDLXXIX: 479
CDLXXX: 480
CDLXXXI: 481
CDLXXXII: 482
CDLXXXIII: 483
CDLXXXIV: 484
CDLXXXV: 485
CDLXXXVI: 486
CDLXXXVII: 487
CDLXXXVIII: 488
CDLXXXIX: 489
CDXC: 490
CDXCI: 491
CDXCII: 492
CDXCIII: 493
CDXCIV: 494
CDXCV: 495
CDXCVI: 496
CDXCVII: 497
CDXCVIII: 498
CDXCIX: 499
D: 500
DI: 501
DII: 502
DIII: 503
DIV: 504
DV: 505
DVI: 506
DVII: 507
DVIII: 508
DIX: 509
DX: 510
DXI: 511
DXII: 512
DXIII: 513
DXIV: 514
DXV: 515
DXVI: 516
DXVII: 517
DXVIII: 518
DXIX: 519
DXX: 520
DXXI: 521
DXXII: 522
DXXIII: 523
DXXIV: 524
DXXV: 525
DXXVI: 526
DXXVII: 527
DXXVIII: 528
DXXIX: 529
DXXX: 530
DXXXI: 531
DXXXII: 532
DXXXIII: 533
DXXXIV: 534
DXXXV: 535
DXXXVI: 536
DXXXVII: 537
DXXXVIII: 538
DXXXIX: 539
DXL: 540
DXLI: 541
DXLII: 542
DXLIII: 543
DXLIV: 544
DXLV: 545
DXLVI: 546
DXLVII: 547
DXLVIII: 548
DXLIX: 549
DL: 550
DLI: 551
DLII: 552
DLIII: 553
DLIV: 554
DLV: 555
DLVI: 556
DLVII: 557
DLVIII: 558
DLIX: 559
DLX: 560
DLXI: 561
DLXII: 562
DLXIII: 563
DLXIV: 564
DLXV: 565
DLXVI: 566
DLXVII: 567
DLXVIII: 568
DLXIX: 569
DLXX: 570
DLXXI: 571
DLXXII: 572
DLXXIII: 573
DLXXIV: 574
DLXXV: 575
DLXXVI: 576
DLXXVII: 577
DLXXVIII: 578
DLXXIX: 579
DLXXX: 580
DLXXXI: 581
DLXXXII: 582
DLXXXIII: 583
DLXXXIV: 584
DLXXXV: 585
DLXXXVI: 586
DLXXXVII: 587
DLXXXVIII: 588
DLXXXIX: 589
DXC: 590
DXCI: 591
DXCII: 592
DXCIII: 593
DXCIV: 594
DXCV: 595
DXCVI: 596
DXCVII: 597
DXCVIII: 598
DXCIX: 599
DC: 600
DCI: 601
DCII: 602
DCIII: 603
DCIV: 604
DCV: 605
DCVI: 606
DCVII: 607
DCVIII: 608
DCIX: 609
DCX: 610
DCXI: 611
DCXII: 612
DCXIII: 613
DCXIV: 614
DCXV: 615
DCXVI: 616
DCXVII: 617
DCXVIII: 618
DCXIX: 619
DCXX: 620
DCXXI: 621
DCXXII: 622
DCXXIII: 623
DCXXIV: 624
DCXXV: 625
DCXXVI: 626
DCXXVII: 627
DCXXVIII: 628
DCXXIX: 629
DCXXX: 630
DCXXXI: 631
DCXXXII: 632
DCXXXIII: 633
DCXXXIV: 634
DCXXXV: 635
DCXXXVI: 636
DCXXXVII: 637
DCXXXVIII: 638
DCXXXIX: 639
DCXL: 640
DCXLI: 641
DCXLII: 642
DCXLIII: 643
DCXLIV: 644
DCXLV: 645
DCXLVI: 646
DCXLVII: 647
DCXLVIII: 648
DCXLIX: 649
DCL: 650
DCLI: 651
DCLII: 652
DCLIII: 653
DCLIV: 654
DCLV: 655
DCLVI: 656
DCLVII: 657
DCLVIII: 658
DCLIX: 659
DCLX: 660
DCLXI: 661
DCLXII: 662
DCLXIII: 663
DCLXIV: 664
DCLXV: 665
DCLXVI: 666
DCLXVII: 667
DCLXVIII: 668
DCLXIX: 669
DCLXX: 670
DCLXXI: 671
DCLXXII: 672
DCLXXIII: 673
DCLXXIV: 674
DCLXXV: 675
DCLXXVI: 676
DCLXXVII: 677
DCLXXVIII: 678
DCLXXIX: 679
DCLXXX: 680
DCLXXXI: 681
DCLXXXII: 682
DCLXXXIII: 683
DCLXXXIV: 684
DCLXXXV: 685
DCLXXXVI: 686
DCLXXXVII: 687
DCLXXXVIII: 688
DCLXXXIX: 689
DCXC: 690
DCXCI: 691
DCXCII: 692
DCXCIII: 693
DCXCIV: 694
DCXCV: 695
DCXCVI: 696
DCXCVII: 697
DCXCVIII: 698
DCXCIX: 699
DCC: 700
DCCI: 701
DCCII: 702
DCCIII: 703
DCCIV: 704
DCCV: 705
DCCVI: 706
DCCVII: 707
DCCVIII: 708
DCCIX: 709
DCCX: 710
DCCXI: 711
DCCXII: 712
DCCXIII: 713
DCCXIV: 714
DCCXV: 715
DCCXVI: 716
DCCXVII: 717
DCCXVIII: 718
DCCXIX: 719
DCCXX: 720
DCCXXI: 721
DCCXXII: 722
DCCXXIII: 723
DCCXXIV: 724
DCCXXV: 725
DCCXXVI: 726
DCCXXVII: 727
DCCXXVIII: 728
DCCXXIX: 729
DCCXXX: 730
DCCXXXI: 731
DCCXXXII: 732
DCCXXXIII: 733
DCCXXXIV: 734
DCCXXXV: 735
DCCXXXVI: 736
DCCXXXVII: 737
DCCXXXVIII: 738
DCCXXXIX: 739
DCCXL: 740
DCCXLI: 741
DCCXLII: 742
DCCXLIII: 743
DCCXLIV: 744
DCCXLV: 745
DCCXLVI: 746
DCCXLVII: 747
DCCXLVIII: 748
DCCXLIX: 749
DCCL: 750
DCCLI: 751
DCCLII: 752
DCCLIII: 753
DCCLIV: 754
DCCLV: 755
DCCLVI: 756
DCCLVII: 757
DCCLVIII: 758
DCCLIX: 759
DCCLX: 760
DCCLXI: 761
DCCLXII: 762
DCCLXIII: 763
DCCLXIV: 764
DCCLXV: 765
DCCLXVI: 766
DCCLXVII: 767
DCCLXVIII: 768
DCCLXIX: 769
DCCLXX: 770
DCCLXXI: 771
DCCLXXII: 772
DCCLXXIII: 773
DCCLXXIV: 774
DCCLXXV: 775
DCCLXXVI: 776
DCCLXXVII: 777
DCCLXXVIII: 778
DCCLXXIX: 779
DCCLXXX: 780
DCCLXXXI: 781
DCCLXXXII: 782
DCCLXXXIII: 783
DCCLXXXIV: 784
DCCLXXXV: 785
DCCLXXXVI: 786
DCCLXXXVII: 787
DCCLXXXVIII: 788
DCCLXXXIX: 789
DCCXC: 790
DCCXCI: 791
DCCXCII: 792
DCCXCIII: 793
DCCXCIV: 794
DCCXCV: 795
DCCXCVI: 796
DCCXCVII: 797
DCCXCVIII: 798
DCCXCIX: 799
DCCC: 800
DCCCI: 801
DCCCII: 802
DCCCIII: 803
DCCCIV: 804
DCCCV: 805
DCCCVI: 806
DCCCVII: 807
DCCCVIII: 808
DCCCIX: 809
DCCCX: 810
DCCCXI: 811
DCCCXII: 812
DCCCXIII: 813
DCCCXIV: 814
DCCCXV: 815
DCCCXVI: 816
DCCCXVII: 817
DCCCXVIII: 818
DCCCXIX: 819
DCCCXX: 820
DCCCXXI: 821
DCCCXXII: 822
DCCCXXIII: 823
DCCCXXIV: 824
DCCCXXV: 825
DCCCXXVI: 826
DCCCXXVII: 827
DCCCXXVIII: 828
DCCCXXIX: 829
DCCCXXX: 830
DCCCXXXI: 831
DCCCXXXII: 832
DCCCXXXIII: 833
DCCCXXXIV: 834
DCCCXXXV: 835
DCCCXXXVI: 836
DCCCXXXVII: 837
DCCCXXXVIII: 838
DCCCXXXIX: 839
DCCCXL: 840
DCCCXLI: 841
DCCCXLII: 842
DCCCXLIII: 843
DCCCXLIV: 844
DCCCXLV: 845
DCCCXLVI: 846
DCCCXLVII: 847
DCCCXLVIII: 848
DCCCXLIX: 849
DCCCL: 850
DCCCLI: 851
DCCCLII: 852
DCCCLIII: 853
DCCCLIV: 854
DCCCLV: 855
DCCCLVI: 856
DCCCLVII: 857
DCCCLVIII: 858
DCCCLIX: 859
DCCCLX: 860
DCCCLXI: 861
DCCCLXII: 862
DCCCLXIII: 863
DCCCLXIV: 864
DCCCLXV: 865
DCCCLXVI: 866
DCCCLXVII: 867
DCCCLXVIII: 868
DCCCLXIX: 869
DCCCLXX: 870
DCCCLXXI: 871
DCCCLXXII: 872
DCCCLXXIII: 873
DCCCLXXIV: 874
DCCCLXXV: 875
DCCCLXXVI: 876
DCCCLXXVII: 877
DCCCLXXVIII: 878
DCCCLXXIX: 879
DCCCLXXX: 880
DCCCLXXXI: 881
DCCCLXXXII: 882
DCCCLXXXIII: 883
DCCCLXXXIV: 884
DCCCLXXXV: 885
DCCCLXXXVI: 886
DCCCLXXXVII: 887
DCCCLXXXVIII: 888
DCCCLXXXIX: 889
DCCCXC: 890
DCCCXCI: 891
DCCCXCII: 892
DCCCXCIII: 893
DCCCXCIV: 894
DCCCXCV: 895
DCCCXCVI: 896
DCCCXCVII: 897
DCCCXCVIII: 898
DCCCXCIX: 899
CM: 900
CMI: 901
CMII: 902
CMIII: 903
CMIV: 904
CMV: 905
CMVI: 906
CMVII: 907
CMVIII: 908
CMIX: 909
CMX: 910
CMXI: 911
CMXII: 912
CMXIII: 913
CMXIV: 914
CMXV: 915
CMXVI: 916
CMXVII: 917
CMXVIII: 918
CMXIX: 919
CMXX: 920
CMXXI: 921
CMXXII: 922
CMXXIII: 923
CMXXIV: 924
CMXXV: 925
CMXXVI: 926
CMXXVII: 927
CMXXVIII: 928
CMXXIX: 929
CMXXX: 930
CMXXXI: 931
CMXXXII: 932
CMXXXIII: 933
CMXXXIV: 934
CMXXXV: 935
CMXXXVI: 936
CMXXXVII: 937
CMXXXVIII: 938
CMXXXIX: 939
CMXL: 940
CMXLI: 941
CMXLII: 942
CMXLIII: 943
CMXLIV: 944
CMXLV: 945
CMXLVI: 946
CMXLVII: 947
CMXLVIII: 948
CMXLIX: 949
CML: 950
CMLI: 951
CMLII: 952
CMLIII: 953
CMLIV: 954
CMLV: 955
CMLVI: 956
CMLVII: 957
CMLVIII: 958
CMLIX: 959
CMLX: 960
CMLXI: 961
CMLXII: 962
CMLXIII: 963
CMLXIV: 964
CMLXV: 965
CMLXVI: 966
CMLXVII: 967
CMLXVIII: 968
CMLXIX: 969
CMLXX: 970
CMLXXI: 971
CMLXXII: 972
CMLXXIII: 973
CMLXXIV: 974
CMLXXV: 975
CMLXXVI: 976
CMLXXVII: 977
CMLXXVIII: 978
CMLXXIX: 979
CMLXXX: 980
CMLXXXI: 981
CMLXXXII: 982
CMLXXXIII: 983
CMLXXXIV: 984
CMLXXXV: 985
CMLXXXVI: 986
CMLXXXVII: 987
CMLXXXVIII: 988
CMLXXXIX: 989
CMXC: 990
CMXCI: 991
CMXCII: 992
CMXCIII: 993
CMXCIV: 994
CMXCV: 995
CMXCVI: 996
CMXCVII: 997
CMXCVIII: 998
CMXCIX: 999
M: 1000
$

ちなみにJavaScriptの場合。

コード(TextWrangler)

function roman_to_integer(roman){
  var number = 0;
  var r_i = {'i' : 1,
         'v' : 5,
         'x' : 10,
         'l' : 50,
         'c' : 100,
         'd' : 500,
         'm' : 1000};
  var pre = 0;
  var a = roman.split("");
  while(a.length > 0){
    ch = a.pop().toLowerCase();
    if(! r_i[ch]){return "有効なローマ数字になっていません!";}
    if(r_i[ch] >= pre){
      number += r_i[ch];
      pre = r_i[ch];
    } else {
      number -= r_i[ch];
    }
  }
  return number;
}

var roman = $('#t0').val();
$('#pre0').text(roman_to_integer(roman));




pythonの場合。

sample.py

コード(TextWrangler)

#!/usr/bin/env python3.3
# -*- coding: utf-8 -*-

def roman_to_integer(roman):
    number = 0
    r_i = {'i':1,
           'v':5,
           'x':10,
           'l':50,
           'c':100,
           'd':500,
           'm':1000}
    
    pre = 0
    l = list(roman)
    l.reverse()
    for ch in l:
        ch = ch.lower()
        if not ch in r_i:
            return "有効なローマ数字になっていない!"
        if r_i[ch] >= pre:
            number += r_i[ch]
            pre = r_i[ch]
        else:
            number -= r_i[ch]
    
    return number

def roman_numeral(number):
  t = number // 1000
  number %= 1000
  h = number // 100
  number %= 100
  tens = number // 10
  o = number % 10

  roman = 'M' * t

  if h == 9:
    roman += 'CM'
  elif h == 4:
    roman += 'CD'
  else:
    roman += 'D' * (h // 5)
    roman += 'C' * (h % 5)

  if tens == 9:
    roman += 'XC'
  elif tens == 4:
    roman += 'XL'
  else:
    roman += 'L' * (tens // 5)
    roman += 'X' * (tens % 5)
  
  if o == 9:
    roman += 'IX'
  elif o == 4:
    roman += 'IV'
  else:
    roman += 'V' * (o // 5)
    roman += 'I' * (o % 5)
  
  return roman

print(roman_to_integer('abcde'))
print(roman_to_integer('mcmxcix'))

for number in range(1,1001):
    roman = roman_numeral(number)
    i = roman_to_integer(roman)
    if number != i: break
    print("{0}: {1}".format(number, roman))

入出力結果(Terminal)

$ ./sample.py
有効なローマ数字になっていない!
1999
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
10: X
11: XI
12: XII
13: XIII
14: XIV
15: XV
16: XVI
17: XVII
18: XVIII
19: XIX
20: XX
21: XXI
22: XXII
23: XXIII
24: XXIV
25: XXV
26: XXVI
27: XXVII
28: XXVIII
29: XXIX
30: XXX
31: XXXI
32: XXXII
33: XXXIII
34: XXXIV
35: XXXV
36: XXXVI
37: XXXVII
38: XXXVIII
39: XXXIX
40: XL
41: XLI
42: XLII
43: XLIII
44: XLIV
45: XLV
46: XLVI
47: XLVII
48: XLVIII
49: XLIX
50: L
51: LI
52: LII
53: LIII
54: LIV
55: LV
56: LVI
57: LVII
58: LVIII
59: LIX
60: LX
61: LXI
62: LXII
63: LXIII
64: LXIV
65: LXV
66: LXVI
67: LXVII
68: LXVIII
69: LXIX
70: LXX
71: LXXI
72: LXXII
73: LXXIII
74: LXXIV
75: LXXV
76: LXXVI
77: LXXVII
78: LXXVIII
79: LXXIX
80: LXXX
81: LXXXI
82: LXXXII
83: LXXXIII
84: LXXXIV
85: LXXXV
86: LXXXVI
87: LXXXVII
88: LXXXVIII
89: LXXXIX
90: XC
91: XCI
92: XCII
93: XCIII
94: XCIV
95: XCV
96: XCVI
97: XCVII
98: XCVIII
99: XCIX
100: C
101: CI
102: CII
103: CIII
104: CIV
105: CV
106: CVI
107: CVII
108: CVIII
109: CIX
110: CX
111: CXI
112: CXII
113: CXIII
114: CXIV
115: CXV
116: CXVI
117: CXVII
118: CXVIII
119: CXIX
120: CXX
121: CXXI
122: CXXII
123: CXXIII
124: CXXIV
125: CXXV
126: CXXVI
127: CXXVII
128: CXXVIII
129: CXXIX
130: CXXX
131: CXXXI
132: CXXXII
133: CXXXIII
134: CXXXIV
135: CXXXV
136: CXXXVI
137: CXXXVII
138: CXXXVIII
139: CXXXIX
140: CXL
141: CXLI
142: CXLII
143: CXLIII
144: CXLIV
145: CXLV
146: CXLVI
147: CXLVII
148: CXLVIII
149: CXLIX
150: CL
151: CLI
152: CLII
153: CLIII
154: CLIV
155: CLV
156: CLVI
157: CLVII
158: CLVIII
159: CLIX
160: CLX
161: CLXI
162: CLXII
163: CLXIII
164: CLXIV
165: CLXV
166: CLXVI
167: CLXVII
168: CLXVIII
169: CLXIX
170: CLXX
171: CLXXI
172: CLXXII
173: CLXXIII
174: CLXXIV
175: CLXXV
176: CLXXVI
177: CLXXVII
178: CLXXVIII
179: CLXXIX
180: CLXXX
181: CLXXXI
182: CLXXXII
183: CLXXXIII
184: CLXXXIV
185: CLXXXV
186: CLXXXVI
187: CLXXXVII
188: CLXXXVIII
189: CLXXXIX
190: CXC
191: CXCI
192: CXCII
193: CXCIII
194: CXCIV
195: CXCV
196: CXCVI
197: CXCVII
198: CXCVIII
199: CXCIX
200: CC
201: CCI
202: CCII
203: CCIII
204: CCIV
205: CCV
206: CCVI
207: CCVII
208: CCVIII
209: CCIX
210: CCX
211: CCXI
212: CCXII
213: CCXIII
214: CCXIV
215: CCXV
216: CCXVI
217: CCXVII
218: CCXVIII
219: CCXIX
220: CCXX
221: CCXXI
222: CCXXII
223: CCXXIII
224: CCXXIV
225: CCXXV
226: CCXXVI
227: CCXXVII
228: CCXXVIII
229: CCXXIX
230: CCXXX
231: CCXXXI
232: CCXXXII
233: CCXXXIII
234: CCXXXIV
235: CCXXXV
236: CCXXXVI
237: CCXXXVII
238: CCXXXVIII
239: CCXXXIX
240: CCXL
241: CCXLI
242: CCXLII
243: CCXLIII
244: CCXLIV
245: CCXLV
246: CCXLVI
247: CCXLVII
248: CCXLVIII
249: CCXLIX
250: CCL
251: CCLI
252: CCLII
253: CCLIII
254: CCLIV
255: CCLV
256: CCLVI
257: CCLVII
258: CCLVIII
259: CCLIX
260: CCLX
261: CCLXI
262: CCLXII
263: CCLXIII
264: CCLXIV
265: CCLXV
266: CCLXVI
267: CCLXVII
268: CCLXVIII
269: CCLXIX
270: CCLXX
271: CCLXXI
272: CCLXXII
273: CCLXXIII
274: CCLXXIV
275: CCLXXV
276: CCLXXVI
277: CCLXXVII
278: CCLXXVIII
279: CCLXXIX
280: CCLXXX
281: CCLXXXI
282: CCLXXXII
283: CCLXXXIII
284: CCLXXXIV
285: CCLXXXV
286: CCLXXXVI
287: CCLXXXVII
288: CCLXXXVIII
289: CCLXXXIX
290: CCXC
291: CCXCI
292: CCXCII
293: CCXCIII
294: CCXCIV
295: CCXCV
296: CCXCVI
297: CCXCVII
298: CCXCVIII
299: CCXCIX
300: CCC
301: CCCI
302: CCCII
303: CCCIII
304: CCCIV
305: CCCV
306: CCCVI
307: CCCVII
308: CCCVIII
309: CCCIX
310: CCCX
311: CCCXI
312: CCCXII
313: CCCXIII
314: CCCXIV
315: CCCXV
316: CCCXVI
317: CCCXVII
318: CCCXVIII
319: CCCXIX
320: CCCXX
321: CCCXXI
322: CCCXXII
323: CCCXXIII
324: CCCXXIV
325: CCCXXV
326: CCCXXVI
327: CCCXXVII
328: CCCXXVIII
329: CCCXXIX
330: CCCXXX
331: CCCXXXI
332: CCCXXXII
333: CCCXXXIII
334: CCCXXXIV
335: CCCXXXV
336: CCCXXXVI
337: CCCXXXVII
338: CCCXXXVIII
339: CCCXXXIX
340: CCCXL
341: CCCXLI
342: CCCXLII
343: CCCXLIII
344: CCCXLIV
345: CCCXLV
346: CCCXLVI
347: CCCXLVII
348: CCCXLVIII
349: CCCXLIX
350: CCCL
351: CCCLI
352: CCCLII
353: CCCLIII
354: CCCLIV
355: CCCLV
356: CCCLVI
357: CCCLVII
358: CCCLVIII
359: CCCLIX
360: CCCLX
361: CCCLXI
362: CCCLXII
363: CCCLXIII
364: CCCLXIV
365: CCCLXV
366: CCCLXVI
367: CCCLXVII
368: CCCLXVIII
369: CCCLXIX
370: CCCLXX
371: CCCLXXI
372: CCCLXXII
373: CCCLXXIII
374: CCCLXXIV
375: CCCLXXV
376: CCCLXXVI
377: CCCLXXVII
378: CCCLXXVIII
379: CCCLXXIX
380: CCCLXXX
381: CCCLXXXI
382: CCCLXXXII
383: CCCLXXXIII
384: CCCLXXXIV
385: CCCLXXXV
386: CCCLXXXVI
387: CCCLXXXVII
388: CCCLXXXVIII
389: CCCLXXXIX
390: CCCXC
391: CCCXCI
392: CCCXCII
393: CCCXCIII
394: CCCXCIV
395: CCCXCV
396: CCCXCVI
397: CCCXCVII
398: CCCXCVIII
399: CCCXCIX
400: CD
401: CDI
402: CDII
403: CDIII
404: CDIV
405: CDV
406: CDVI
407: CDVII
408: CDVIII
409: CDIX
410: CDX
411: CDXI
412: CDXII
413: CDXIII
414: CDXIV
415: CDXV
416: CDXVI
417: CDXVII
418: CDXVIII
419: CDXIX
420: CDXX
421: CDXXI
422: CDXXII
423: CDXXIII
424: CDXXIV
425: CDXXV
426: CDXXVI
427: CDXXVII
428: CDXXVIII
429: CDXXIX
430: CDXXX
431: CDXXXI
432: CDXXXII
433: CDXXXIII
434: CDXXXIV
435: CDXXXV
436: CDXXXVI
437: CDXXXVII
438: CDXXXVIII
439: CDXXXIX
440: CDXL
441: CDXLI
442: CDXLII
443: CDXLIII
444: CDXLIV
445: CDXLV
446: CDXLVI
447: CDXLVII
448: CDXLVIII
449: CDXLIX
450: CDL
451: CDLI
452: CDLII
453: CDLIII
454: CDLIV
455: CDLV
456: CDLVI
457: CDLVII
458: CDLVIII
459: CDLIX
460: CDLX
461: CDLXI
462: CDLXII
463: CDLXIII
464: CDLXIV
465: CDLXV
466: CDLXVI
467: CDLXVII
468: CDLXVIII
469: CDLXIX
470: CDLXX
471: CDLXXI
472: CDLXXII
473: CDLXXIII
474: CDLXXIV
475: CDLXXV
476: CDLXXVI
477: CDLXXVII
478: CDLXXVIII
479: CDLXXIX
480: CDLXXX
481: CDLXXXI
482: CDLXXXII
483: CDLXXXIII
484: CDLXXXIV
485: CDLXXXV
486: CDLXXXVI
487: CDLXXXVII
488: CDLXXXVIII
489: CDLXXXIX
490: CDXC
491: CDXCI
492: CDXCII
493: CDXCIII
494: CDXCIV
495: CDXCV
496: CDXCVI
497: CDXCVII
498: CDXCVIII
499: CDXCIX
500: D
501: DI
502: DII
503: DIII
504: DIV
505: DV
506: DVI
507: DVII
508: DVIII
509: DIX
510: DX
511: DXI
512: DXII
513: DXIII
514: DXIV
515: DXV
516: DXVI
517: DXVII
518: DXVIII
519: DXIX
520: DXX
521: DXXI
522: DXXII
523: DXXIII
524: DXXIV
525: DXXV
526: DXXVI
527: DXXVII
528: DXXVIII
529: DXXIX
530: DXXX
531: DXXXI
532: DXXXII
533: DXXXIII
534: DXXXIV
535: DXXXV
536: DXXXVI
537: DXXXVII
538: DXXXVIII
539: DXXXIX
540: DXL
541: DXLI
542: DXLII
543: DXLIII
544: DXLIV
545: DXLV
546: DXLVI
547: DXLVII
548: DXLVIII
549: DXLIX
550: DL
551: DLI
552: DLII
553: DLIII
554: DLIV
555: DLV
556: DLVI
557: DLVII
558: DLVIII
559: DLIX
560: DLX
561: DLXI
562: DLXII
563: DLXIII
564: DLXIV
565: DLXV
566: DLXVI
567: DLXVII
568: DLXVIII
569: DLXIX
570: DLXX
571: DLXXI
572: DLXXII
573: DLXXIII
574: DLXXIV
575: DLXXV
576: DLXXVI
577: DLXXVII
578: DLXXVIII
579: DLXXIX
580: DLXXX
581: DLXXXI
582: DLXXXII
583: DLXXXIII
584: DLXXXIV
585: DLXXXV
586: DLXXXVI
587: DLXXXVII
588: DLXXXVIII
589: DLXXXIX
590: DXC
591: DXCI
592: DXCII
593: DXCIII
594: DXCIV
595: DXCV
596: DXCVI
597: DXCVII
598: DXCVIII
599: DXCIX
600: DC
601: DCI
602: DCII
603: DCIII
604: DCIV
605: DCV
606: DCVI
607: DCVII
608: DCVIII
609: DCIX
610: DCX
611: DCXI
612: DCXII
613: DCXIII
614: DCXIV
615: DCXV
616: DCXVI
617: DCXVII
618: DCXVIII
619: DCXIX
620: DCXX
621: DCXXI
622: DCXXII
623: DCXXIII
624: DCXXIV
625: DCXXV
626: DCXXVI
627: DCXXVII
628: DCXXVIII
629: DCXXIX
630: DCXXX
631: DCXXXI
632: DCXXXII
633: DCXXXIII
634: DCXXXIV
635: DCXXXV
636: DCXXXVI
637: DCXXXVII
638: DCXXXVIII
639: DCXXXIX
640: DCXL
641: DCXLI
642: DCXLII
643: DCXLIII
644: DCXLIV
645: DCXLV
646: DCXLVI
647: DCXLVII
648: DCXLVIII
649: DCXLIX
650: DCL
651: DCLI
652: DCLII
653: DCLIII
654: DCLIV
655: DCLV
656: DCLVI
657: DCLVII
658: DCLVIII
659: DCLIX
660: DCLX
661: DCLXI
662: DCLXII
663: DCLXIII
664: DCLXIV
665: DCLXV
666: DCLXVI
667: DCLXVII
668: DCLXVIII
669: DCLXIX
670: DCLXX
671: DCLXXI
672: DCLXXII
673: DCLXXIII
674: DCLXXIV
675: DCLXXV
676: DCLXXVI
677: DCLXXVII
678: DCLXXVIII
679: DCLXXIX
680: DCLXXX
681: DCLXXXI
682: DCLXXXII
683: DCLXXXIII
684: DCLXXXIV
685: DCLXXXV
686: DCLXXXVI
687: DCLXXXVII
688: DCLXXXVIII
689: DCLXXXIX
690: DCXC
691: DCXCI
692: DCXCII
693: DCXCIII
694: DCXCIV
695: DCXCV
696: DCXCVI
697: DCXCVII
698: DCXCVIII
699: DCXCIX
700: DCC
701: DCCI
702: DCCII
703: DCCIII
704: DCCIV
705: DCCV
706: DCCVI
707: DCCVII
708: DCCVIII
709: DCCIX
710: DCCX
711: DCCXI
712: DCCXII
713: DCCXIII
714: DCCXIV
715: DCCXV
716: DCCXVI
717: DCCXVII
718: DCCXVIII
719: DCCXIX
720: DCCXX
721: DCCXXI
722: DCCXXII
723: DCCXXIII
724: DCCXXIV
725: DCCXXV
726: DCCXXVI
727: DCCXXVII
728: DCCXXVIII
729: DCCXXIX
730: DCCXXX
731: DCCXXXI
732: DCCXXXII
733: DCCXXXIII
734: DCCXXXIV
735: DCCXXXV
736: DCCXXXVI
737: DCCXXXVII
738: DCCXXXVIII
739: DCCXXXIX
740: DCCXL
741: DCCXLI
742: DCCXLII
743: DCCXLIII
744: DCCXLIV
745: DCCXLV
746: DCCXLVI
747: DCCXLVII
748: DCCXLVIII
749: DCCXLIX
750: DCCL
751: DCCLI
752: DCCLII
753: DCCLIII
754: DCCLIV
755: DCCLV
756: DCCLVI
757: DCCLVII
758: DCCLVIII
759: DCCLIX
760: DCCLX
761: DCCLXI
762: DCCLXII
763: DCCLXIII
764: DCCLXIV
765: DCCLXV
766: DCCLXVI
767: DCCLXVII
768: DCCLXVIII
769: DCCLXIX
770: DCCLXX
771: DCCLXXI
772: DCCLXXII
773: DCCLXXIII
774: DCCLXXIV
775: DCCLXXV
776: DCCLXXVI
777: DCCLXXVII
778: DCCLXXVIII
779: DCCLXXIX
780: DCCLXXX
781: DCCLXXXI
782: DCCLXXXII
783: DCCLXXXIII
784: DCCLXXXIV
785: DCCLXXXV
786: DCCLXXXVI
787: DCCLXXXVII
788: DCCLXXXVIII
789: DCCLXXXIX
790: DCCXC
791: DCCXCI
792: DCCXCII
793: DCCXCIII
794: DCCXCIV
795: DCCXCV
796: DCCXCVI
797: DCCXCVII
798: DCCXCVIII
799: DCCXCIX
800: DCCC
801: DCCCI
802: DCCCII
803: DCCCIII
804: DCCCIV
805: DCCCV
806: DCCCVI
807: DCCCVII
808: DCCCVIII
809: DCCCIX
810: DCCCX
811: DCCCXI
812: DCCCXII
813: DCCCXIII
814: DCCCXIV
815: DCCCXV
816: DCCCXVI
817: DCCCXVII
818: DCCCXVIII
819: DCCCXIX
820: DCCCXX
821: DCCCXXI
822: DCCCXXII
823: DCCCXXIII
824: DCCCXXIV
825: DCCCXXV
826: DCCCXXVI
827: DCCCXXVII
828: DCCCXXVIII
829: DCCCXXIX
830: DCCCXXX
831: DCCCXXXI
832: DCCCXXXII
833: DCCCXXXIII
834: DCCCXXXIV
835: DCCCXXXV
836: DCCCXXXVI
837: DCCCXXXVII
838: DCCCXXXVIII
839: DCCCXXXIX
840: DCCCXL
841: DCCCXLI
842: DCCCXLII
843: DCCCXLIII
844: DCCCXLIV
845: DCCCXLV
846: DCCCXLVI
847: DCCCXLVII
848: DCCCXLVIII
849: DCCCXLIX
850: DCCCL
851: DCCCLI
852: DCCCLII
853: DCCCLIII
854: DCCCLIV
855: DCCCLV
856: DCCCLVI
857: DCCCLVII
858: DCCCLVIII
859: DCCCLIX
860: DCCCLX
861: DCCCLXI
862: DCCCLXII
863: DCCCLXIII
864: DCCCLXIV
865: DCCCLXV
866: DCCCLXVI
867: DCCCLXVII
868: DCCCLXVIII
869: DCCCLXIX
870: DCCCLXX
871: DCCCLXXI
872: DCCCLXXII
873: DCCCLXXIII
874: DCCCLXXIV
875: DCCCLXXV
876: DCCCLXXVI
877: DCCCLXXVII
878: DCCCLXXVIII
879: DCCCLXXIX
880: DCCCLXXX
881: DCCCLXXXI
882: DCCCLXXXII
883: DCCCLXXXIII
884: DCCCLXXXIV
885: DCCCLXXXV
886: DCCCLXXXVI
887: DCCCLXXXVII
888: DCCCLXXXVIII
889: DCCCLXXXIX
890: DCCCXC
891: DCCCXCI
892: DCCCXCII
893: DCCCXCIII
894: DCCCXCIV
895: DCCCXCV
896: DCCCXCVI
897: DCCCXCVII
898: DCCCXCVIII
899: DCCCXCIX
900: CM
901: CMI
902: CMII
903: CMIII
904: CMIV
905: CMV
906: CMVI
907: CMVII
908: CMVIII
909: CMIX
910: CMX
911: CMXI
912: CMXII
913: CMXIII
914: CMXIV
915: CMXV
916: CMXVI
917: CMXVII
918: CMXVIII
919: CMXIX
920: CMXX
921: CMXXI
922: CMXXII
923: CMXXIII
924: CMXXIV
925: CMXXV
926: CMXXVI
927: CMXXVII
928: CMXXVIII
929: CMXXIX
930: CMXXX
931: CMXXXI
932: CMXXXII
933: CMXXXIII
934: CMXXXIV
935: CMXXXV
936: CMXXXVI
937: CMXXXVII
938: CMXXXVIII
939: CMXXXIX
940: CMXL
941: CMXLI
942: CMXLII
943: CMXLIII
944: CMXLIV
945: CMXLV
946: CMXLVI
947: CMXLVII
948: CMXLVIII
949: CMXLIX
950: CML
951: CMLI
952: CMLII
953: CMLIII
954: CMLIV
955: CMLV
956: CMLVI
957: CMLVII
958: CMLVIII
959: CMLIX
960: CMLX
961: CMLXI
962: CMLXII
963: CMLXIII
964: CMLXIV
965: CMLXV
966: CMLXVI
967: CMLXVII
968: CMLXVIII
969: CMLXIX
970: CMLXX
971: CMLXXI
972: CMLXXII
973: CMLXXIII
974: CMLXXIV
975: CMLXXV
976: CMLXXVI
977: CMLXXVII
978: CMLXXVIII
979: CMLXXIX
980: CMLXXX
981: CMLXXXI
982: CMLXXXII
983: CMLXXXIII
984: CMLXXXIV
985: CMLXXXV
986: CMLXXXVI
987: CMLXXXVII
988: CMLXXXVIII
989: CMLXXXIX
990: CMXC
991: CMXCI
992: CMXCII
993: CMXCIII
994: CMXCIV
995: CMXCV
996: CMXCVI
997: CMXCVII
998: CMXCVIII
999: CMXCIX
1000: M
$

0 コメント:

コメントを投稿