package main

import (
	"bytes"
	"math"
)

var mRoman = map[float64]rune{
	1:    'I',
	5:    'V',
	10:   'X',
	50:   'L',
	100:  'C',
	500:  'D',
	1000: 'M',
}

func digitToRoman(pos, digit int) []rune {
	res := make([]rune, 0)
	base := math.Pow10(pos)
	switch digit {
	case 0:
	case 1:
		fallthrough
	case 2:
		fallthrough
	case 3:
		for i := 0; i < digit; i++ {
			res = append(res, mRoman[base])
		}
	case 4:
		res = append(res, mRoman[base], mRoman[base*5])
	case 5:
		fallthrough
	case 6:
		fallthrough
	case 7:
		fallthrough
	case 8:
		res = append(res, mRoman[base*5])
		for i := 5; i < digit; i++ {
			res = append(res, mRoman[base])
		}
	case 9:
		res = append(res, mRoman[base], mRoman[base*10])
	default:
	}
	return res
}

func intToRomanOld(num int) string {
	res := make([]rune, 0)
	for i := 0; num != 0; i, num = i+1, num/10 {
		roman := digitToRoman(i, num%10)
		res = append(roman, res...)
	}
	return string(res)
}

var roman = [4][10]string{
	{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
	{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
	{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
	{"", "M", "MM", "MMM"},
}

func intToRoman(num int) string {
	var res bytes.Buffer
	res.WriteString(roman[3][num/1000])
	res.WriteString(roman[2][num%1000/100])
	res.WriteString(roman[1][num%100/10])
	res.WriteString(roman[0][num%10])
	return res.String()
}

/* func main() {
	fmt.Println(intToRoman(1998))
} */