package main
import (
"bufio"
"errors"
"fmt"
"os"
"strconv"
"strings"
)
func getInput() string {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
inputExpression := scanner.Text()
return inputExpression
}
// validateAndParseInput проверяет формат строки и возвращает операнды и оператор
func validateAndParseInput(input string) (string, string, string, error) {
parts := strings.Fields(input)
// Проверяем, что строка состоит из трех частей: операнд, оператор, операнд
if len(parts) != 3 {
return "", "", "", errors.New("Строка состоит не из трех частей: операнд, оператор, операнд")
}
// Проверяем оператор
if parts[1] == "+" || parts[1] == "-" || parts[1] == "*" || parts[1] == "/" {
return parts[0], parts[1], parts[2], nil
} else {
return "", "", "", errors.New("Оператор не соотвествует ни одному значению из : '+', '-', '*', '/'")
}
}
// validateOperands проверяет операнды и возвращает их числовые значения и тип
func validateOperands(a, b string) (int, int, bool, error) {
// Пробуем преобразовать оба операнда в арабские числа
leftOperandArabic, leftErr := strconv.Atoi(a)
rightOperandArabic, rightErr := strconv.Atoi(b)
// Если оба операнда успешно преобразованы, они арабские
if leftErr == nil && rightErr == nil {
return leftOperandArabic, rightOperandArabic, false, nil
}
// Проверяем что оба операнда одной системы счисления
checkingRoman := 0
romeNumber := []string{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"}
for i := 0; i < len(romeNumber); i++ {
if romeNumber[i] == a {
checkingRoman += 1
break
}
}
for i := 0; i < len(romeNumber); i++ {
if romeNumber[i] == b {
checkingRoman += 1
break
}
}
if checkingRoman != 2 {
return 0, 0, false, errors.New("Операнды в разных системах счисления")
}
// Преобразуем римские числа в арабские, возвращаем флаг римских чисел
romanMap := map[string]int{
"I": 1,
"II": 2,
"III": 3,
"IV": 4,
"V": 5,
"VI": 6,
"VII": 7,
"VIII": 8,
"IX": 9,
"X": 10,
}
for key, result := range romanMap {
if a == key {
leftOperandArabic = result
}
if b == key {
rightOperandArabic = result
}
}
return leftOperandArabic, rightOperandArabic, true, nil
}
func ArabicToRoman(a int) (string, error) {
// реализация преобразования арабских чисел в римские
arabicSlice := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
romanSlice := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
var romanResult string
if a <= 0 {
return "", errors.New("Результат меньше или равен 0")
}
for index, number := range arabicSlice {
for number <= a {
romanResult = romanResult + romanSlice[index]
a -= number
}
}
return romanResult, nil
}
func calculate(a int, operator string, b int) (int, error) {
if operator == "+" {
return a + b, nil
} else if operator == "-" {
return a - b, nil
} else if operator == "*" {
return a * b, nil
} else if operator == "/" {
if b == 0 {
return 0, errors.New("На 0 делить нельзя")
}
return a / b, nil
}
return 0, nil
}
func main() {
// Ввод данных от пользователя из os.Stdin
input := getInput()
// Валидация и парсинг входных данных
left, operator, right, err := validateAndParseInput(input)
if err != nil {
panic(err)
}
// // Валидация и парсинг операндов
a, b, isRoman, err := validateOperands(left, right)
if err != nil {
panic(err)
}
// Выполнение операции
result, err := calculate(a, operator, b)
if err != nil {
panic(err)
}
// Вывод результата согласно введенным данным
if isRoman == true {
resultRoman, err := ArabicToRoman(result)
if err != nil {
panic(err)
}
fmt.Println(resultRoman)
} else {
fmt.Println(result)
}
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImJ1ZmlvIgoJImVycm9ycyIKCSJmbXQiCgkib3MiCgkic3RyY29udiIKCSJzdHJpbmdzIgopCgpmdW5jIGdldElucHV0KCkgc3RyaW5nIHsKCglzY2FubmVyIDo9IGJ1ZmlvLk5ld1NjYW5uZXIob3MuU3RkaW4pCglzY2FubmVyLlNjYW4oKQoJaW5wdXRFeHByZXNzaW9uIDo9IHNjYW5uZXIuVGV4dCgpCglyZXR1cm4gaW5wdXRFeHByZXNzaW9uCgp9CgovLyB2YWxpZGF0ZUFuZFBhcnNlSW5wdXQg0L/RgNC+0LLQtdGA0Y/QtdGCINGE0L7RgNC80LDRgiDRgdGC0YDQvtC60Lgg0Lgg0LLQvtC30LLRgNCw0YnQsNC10YIg0L7Qv9C10YDQsNC90LTRiyDQuCDQvtC/0LXRgNCw0YLQvtGACmZ1bmMgdmFsaWRhdGVBbmRQYXJzZUlucHV0KGlucHV0IHN0cmluZykgKHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIGVycm9yKSB7CglwYXJ0cyA6PSBzdHJpbmdzLkZpZWxkcyhpbnB1dCkKCgkvLyDQn9GA0L7QstC10YDRj9C10LwsINGH0YLQviDRgdGC0YDQvtC60LAg0YHQvtGB0YLQvtC40YIg0LjQtyDRgtGA0LXRhSDRh9Cw0YHRgtC10Lk6INC+0L/QtdGA0LDQvdC0LCDQvtC/0LXRgNCw0YLQvtGALCDQvtC/0LXRgNCw0L3QtAoJaWYgbGVuKHBhcnRzKSAhPSAzIHsKCQlyZXR1cm4gIiIsICIiLCAiIiwgZXJyb3JzLk5ldygi0KHRgtGA0L7QutCwINGB0L7RgdGC0L7QuNGCINC90LUg0LjQtyDRgtGA0LXRhSDRh9Cw0YHRgtC10Lk6INC+0L/QtdGA0LDQvdC0LCDQvtC/0LXRgNCw0YLQvtGALCDQvtC/0LXRgNCw0L3QtCIpCgl9CgoJLy8g0J/RgNC+0LLQtdGA0Y/QtdC8INC+0L/QtdGA0LDRgtC+0YAKCWlmIHBhcnRzWzFdID09ICIrIiB8fCBwYXJ0c1sxXSA9PSAiLSIgfHwgcGFydHNbMV0gPT0gIioiIHx8IHBhcnRzWzFdID09ICIvIiB7CgkJcmV0dXJuIHBhcnRzWzBdLCBwYXJ0c1sxXSwgcGFydHNbMl0sIG5pbAoJfSBlbHNlIHsKCQlyZXR1cm4gIiIsICIiLCAiIiwgZXJyb3JzLk5ldygi0J7Qv9C10YDQsNGC0L7RgCDQvdC1INGB0L7QvtGC0LLQtdGB0YLQstGD0LXRgiDQvdC4INC+0LTQvdC+0LzRgyDQt9C90LDRh9C10L3QuNGOINC40LcgOiAnKycsICctJywgJyonLCAnLyciKQoJfQoKfQoKLy8gdmFsaWRhdGVPcGVyYW5kcyDQv9GA0L7QstC10YDRj9C10YIg0L7Qv9C10YDQsNC90LTRiyDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQuNGFINGH0LjRgdC70L7QstGL0LUg0LfQvdCw0YfQtdC90LjRjyDQuCDRgtC40L8KZnVuYyB2YWxpZGF0ZU9wZXJhbmRzKGEsIGIgc3RyaW5nKSAoaW50LCBpbnQsIGJvb2wsIGVycm9yKSB7CgkvLyDQn9GA0L7QsdGD0LXQvCDQv9GA0LXQvtCx0YDQsNC30L7QstCw0YLRjCDQvtCx0LAg0L7Qv9C10YDQsNC90LTQsCDQsiDQsNGA0LDQsdGB0LrQuNC1INGH0LjRgdC70LAKCWxlZnRPcGVyYW5kQXJhYmljLCBsZWZ0RXJyIDo9IHN0cmNvbnYuQXRvaShhKQoJcmlnaHRPcGVyYW5kQXJhYmljLCByaWdodEVyciA6PSBzdHJjb252LkF0b2koYikKCgkvLyDQldGB0LvQuCDQvtCx0LAg0L7Qv9C10YDQsNC90LTQsCDRg9GB0L/QtdGI0L3QviDQv9GA0LXQvtCx0YDQsNC30L7QstCw0L3Riywg0L7QvdC4INCw0YDQsNCx0YHQutC40LUKCWlmIGxlZnRFcnIgPT0gbmlsICYmIHJpZ2h0RXJyID09IG5pbCB7CgkJcmV0dXJuIGxlZnRPcGVyYW5kQXJhYmljLCByaWdodE9wZXJhbmRBcmFiaWMsIGZhbHNlLCBuaWwKCX0KCgkvLyDQn9GA0L7QstC10YDRj9C10Lwg0YfRgtC+INC+0LHQsCDQvtC/0LXRgNCw0L3QtNCwINC+0LTQvdC+0Lkg0YHQuNGB0YLQtdC80Ysg0YHRh9C40YHQu9C10L3QuNGPCgljaGVja2luZ1JvbWFuIDo9IDAKCXJvbWVOdW1iZXIgOj0gW11zdHJpbmd7IkkiLCAiSUkiLCAiSUlJIiwgIklWIiwgIlYiLCAiVkkiLCAiVklJIiwgIlZJSUkiLCAiSVgiLCAiWCJ9Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHJvbWVOdW1iZXIpOyBpKysgewoJCWlmIHJvbWVOdW1iZXJbaV0gPT0gYSB7CgkJCWNoZWNraW5nUm9tYW4gKz0gMQoJCQlicmVhawoJCX0KCX0KCWZvciBpIDo9IDA7IGkgPCBsZW4ocm9tZU51bWJlcik7IGkrKyB7CgkJaWYgcm9tZU51bWJlcltpXSA9PSBiIHsKCQkJY2hlY2tpbmdSb21hbiArPSAxCgkJCWJyZWFrCgkJfQoJfQoJaWYgY2hlY2tpbmdSb21hbiAhPSAyIHsKCQlyZXR1cm4gMCwgMCwgZmFsc2UsIGVycm9ycy5OZXcoItCe0L/QtdGA0LDQvdC00Ysg0LIg0YDQsNC30L3Ri9GFINGB0LjRgdGC0LXQvNCw0YUg0YHRh9C40YHQu9C10L3QuNGPIikKCX0KCgkvLyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INGA0LjQvNGB0LrQuNC1INGH0LjRgdC70LAg0LIg0LDRgNCw0LHRgdC60LjQtSwg0LLQvtC30LLRgNCw0YnQsNC10Lwg0YTQu9Cw0LMg0YDQuNC80YHQutC40YUg0YfQuNGB0LXQuwoJcm9tYW5NYXAgOj0gbWFwW3N0cmluZ11pbnR7CgkJIkkiOiAgICAxLAoJCSJJSSI6ICAgMiwKCQkiSUlJIjogIDMsCgkJIklWIjogICA0LAoJCSJWIjogICAgNSwKCQkiVkkiOiAgIDYsCgkJIlZJSSI6ICA3LAoJCSJWSUlJIjogOCwKCQkiSVgiOiAgIDksCgkJIlgiOiAgICAxMCwKCX0KCWZvciBrZXksIHJlc3VsdCA6PSByYW5nZSByb21hbk1hcCB7CgkJaWYgYSA9PSBrZXkgewoJCQlsZWZ0T3BlcmFuZEFyYWJpYyA9IHJlc3VsdAoJCX0KCQlpZiBiID09IGtleSB7CgkJCXJpZ2h0T3BlcmFuZEFyYWJpYyA9IHJlc3VsdAoJCX0KCX0KCXJldHVybiBsZWZ0T3BlcmFuZEFyYWJpYywgcmlnaHRPcGVyYW5kQXJhYmljLCB0cnVlLCBuaWwKfQoKZnVuYyBBcmFiaWNUb1JvbWFuKGEgaW50KSAoc3RyaW5nLCBlcnJvcikgewoJLy8g0YDQtdCw0LvQuNC30LDRhtC40Y8g0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjRjyDQsNGA0LDQsdGB0LrQuNGFINGH0LjRgdC10Lsg0LIg0YDQuNC80YHQutC40LUKCWFyYWJpY1NsaWNlIDo9IFtdaW50ezEwMDAsIDkwMCwgNTAwLCA0MDAsIDEwMCwgOTAsIDUwLCA0MCwgMTAsIDksIDUsIDQsIDF9Cglyb21hblNsaWNlIDo9IFtdc3RyaW5neyJNIiwgIkNNIiwgIkQiLCAiQ0QiLCAiQyIsICJYQyIsICJMIiwgIlhMIiwgIlgiLCAiSVgiLCAiViIsICJJViIsICJJIn0KCgl2YXIgcm9tYW5SZXN1bHQgc3RyaW5nCglpZiBhIDw9IDAgewoJCXJldHVybiAiIiwgZXJyb3JzLk5ldygi0KDQtdC30YPQu9GM0YLQsNGCINC80LXQvdGM0YjQtSDQuNC70Lgg0YDQsNCy0LXQvSAwIikKCX0KCWZvciBpbmRleCwgbnVtYmVyIDo9IHJhbmdlIGFyYWJpY1NsaWNlIHsKCQlmb3IgbnVtYmVyIDw9IGEgewoJCQlyb21hblJlc3VsdCA9IHJvbWFuUmVzdWx0ICsgcm9tYW5TbGljZVtpbmRleF0KCQkJYSAtPSBudW1iZXIKCQl9Cgl9CglyZXR1cm4gcm9tYW5SZXN1bHQsIG5pbAp9CgpmdW5jIGNhbGN1bGF0ZShhIGludCwgb3BlcmF0b3Igc3RyaW5nLCBiIGludCkgKGludCwgZXJyb3IpIHsKCWlmIG9wZXJhdG9yID09ICIrIiB7CgkJcmV0dXJuIGEgKyBiLCBuaWwKCX0gZWxzZSBpZiBvcGVyYXRvciA9PSAiLSIgewoJCXJldHVybiBhIC0gYiwgbmlsCgl9IGVsc2UgaWYgb3BlcmF0b3IgPT0gIioiIHsKCQlyZXR1cm4gYSAqIGIsIG5pbAoJfSBlbHNlIGlmIG9wZXJhdG9yID09ICIvIiB7CgkJaWYgYiA9PSAwIHsKCQkJcmV0dXJuIDAsIGVycm9ycy5OZXcoItCd0LAgMCDQtNC10LvQuNGC0Ywg0L3QtdC70YzQt9GPIikKCQl9CgkJcmV0dXJuIGEgLyBiLCBuaWwKCX0KCXJldHVybiAwLCBuaWwKfQoKZnVuYyBtYWluKCkgewoJLy8g0JLQstC+0LQg0LTQsNC90L3Ri9GFINC+0YIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPINC40Lcgb3MuU3RkaW4KCWlucHV0IDo9IGdldElucHV0KCkKCgkvLyDQktCw0LvQuNC00LDRhtC40Y8g0Lgg0L/QsNGA0YHQuNC90LMg0LLRhdC+0LTQvdGL0YUg0LTQsNC90L3Ri9GFCglsZWZ0LCBvcGVyYXRvciwgcmlnaHQsIGVyciA6PSB2YWxpZGF0ZUFuZFBhcnNlSW5wdXQoaW5wdXQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJLy8gLy8g0JLQsNC70LjQtNCw0YbQuNGPINC4INC/0LDRgNGB0LjQvdCzINC+0L/QtdGA0LDQvdC00L7QsgoJYSwgYiwgaXNSb21hbiwgZXJyIDo9IHZhbGlkYXRlT3BlcmFuZHMobGVmdCwgcmlnaHQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJLy8g0JLRi9C/0L7Qu9C90LXQvdC40LUg0L7Qv9C10YDQsNGG0LjQuAoJcmVzdWx0LCBlcnIgOj0gY2FsY3VsYXRlKGEsIG9wZXJhdG9yLCBiKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCS8vINCS0YvQstC+0LQg0YDQtdC30YPQu9GM0YLQsNGC0LAg0YHQvtCz0LvQsNGB0L3QviDQstCy0LXQtNC10L3QvdGL0Lwg0LTQsNC90L3Ri9C8CglpZiBpc1JvbWFuID09IHRydWUgewoJCXJlc3VsdFJvbWFuLCBlcnIgOj0gQXJhYmljVG9Sb21hbihyZXN1bHQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXBhbmljKGVycikKCQl9CgkJZm10LlByaW50bG4ocmVzdWx0Um9tYW4pCgl9IGVsc2UgewoJCWZtdC5QcmludGxuKHJlc3VsdCkKCX0KfQo=