Created
October 14, 2021 21:53
-
-
Save andrew8088/8595de0744e5cc852ca3f028a5322aca to your computer and use it in GitHub Desktop.
Romain Numeral Addition
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const map = { | |
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", | |
}; | |
module.exports = map; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const assert = require("assert"); | |
const numbers = require("./number-map"); | |
function numeralAddition(addendA, addendB) { | |
// addendA should be bigger | |
if (addendB.length > addendA.length) { | |
[addendA, addendB] = [addendB, addendA]; | |
} | |
let result = addendA; | |
let pointer = ""; | |
while (pointer != addendB) { | |
result = increment(result); | |
pointer = increment(pointer); | |
} | |
return result; | |
} | |
function increment(num) { | |
let result = num + "I"; | |
// pattern 1: two units away: IXI => X, XCX => C | |
result = replaceCurrAndNext( | |
result, | |
(c, n) => new RegExp(`${c}${next(n)}${c}$`), | |
(_, n) => next(n) | |
); | |
// pattern 2: one unit away: IVI => V, XLX => L | |
result = replaceCurrAndNext( | |
result, | |
(c, n) => new RegExp(`${c}${n}${c}$`), | |
(_, n) => n | |
); | |
// pattern 3: four units: IIII => IV, XXXX => XL, CCCC => CD | |
result = result.replace( | |
/(I|X|C)(\1{3})/, | |
(_, captureGroup1) => captureGroup1 + next(captureGroup1) | |
); | |
// pattern 4: one unit away inverted, to two units away: VIV => IX, LXL => XC | |
result = replaceCurrAndNext( | |
result, | |
(c, n) => new RegExp(`${n}${c}${n}$`), | |
(c, n) => `${c}${next(n)}` | |
); | |
return result; | |
} | |
function next(unit) { | |
const units = "IVXLCDM".split(""); | |
const idx = units.indexOf(unit); | |
return idx > -1 && units[idx + 1] ? units[idx + 1] : null; | |
} | |
function replaceCurrAndNext(result, getRegex, getReplacement) { | |
let currUnit = "I"; | |
while (currUnit) { | |
const nextUnit = next(currUnit); | |
if (nextUnit) { | |
result = result.replace( | |
getRegex(currUnit, nextUnit), | |
getReplacement(currUnit, nextUnit) | |
); | |
} | |
currUnit = nextUnit; | |
} | |
return result; | |
} | |
// ===== TEST ===== | |
const done = {}; | |
const MAX = 1000; | |
for (let i = 1; i <= MAX; i++) { | |
const addendA = numbers[i]; | |
console.log(addendA); | |
for (let j = 1; j <= MAX; j++) { | |
if (i + j > MAX) continue; // no answer available in map | |
const addendB = numbers[j]; | |
if (done[[addendA, addendB].join("+")]) continue; // previously tested | |
done[[addendA, addendB].join("+")] = true; | |
done[[addendB, addendA].join("+")] = true; | |
const expected = numbers[i + j]; | |
const result = numeralAddition(addendA, addendB); | |
assert.equal(result, expected, `${addendA} + ${addendB} should equal ${expected}`); | |
} | |
} | |
console.log("done!"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment