Условие задачи
Сторонники языков Java и C++ часто спорят о том, какой язык лучше для решения олимпиадных задач. Одни говорят, что в Java есть масса полезных библиотек для работы со строками, хорошо реализованы механизмы чтения и вывода данных, а так же радует встроенные возможности для реализации длинной арифметики. С другой стороны, С++ является классическим языком, скорость выполнения программ благодаря существующим компиляторам (например, Intel Compiler 10.0) гораздо выше, чем у Java.
Но сейчас нас интересует лишь небольшие отличия, а именно соглашения, которыми пользуются программисты при описании имен переменных в Java и C++. Известно, что для понимания значений переменных часто используют английские слова или даже целые предложения, описывающие суть переменных, содержащих те или иные значения. Приведем ниже правила описания переменных, которыми руководствуются программисты, реализующие программы на Java и C++.
В языке Java принято первое слово, входящее в название переменной записывать с маленькой латинской буквы, следующее слово идет с большой буквы (только первая буква слова большая), слова не имеют разделителей и состоят только из латинских букв. Например, правильные записи переменных в Java могут выглядеть следующим образом: javaIdentifier, longAndMnemonicIdentifier, name, nEERC.
В языке C++ для описания переменных используются только маленькие латинские символы и символ «_», который отделяет непустые слова друг от друга. Примеры: java_identifier, long_and_mnemonic_identifier, name, n_e_e_r_c.
Вам требуется написать программу, которая преобразует переменную, записанную на одном языке в формат другого языка.
Входные данные
Во входном потоке задано наименование переменной длиной не более 100 символов.
Выходные данные
В выходной поток требуется вывести аналог имени переменной в другом языке. Т.е. если переменная представлена в формате Java, то следует перевести в формат C++ и наоборот. В том случае, когда имя переменной не соответствует ни одному из вышеописанных языков, следует вывести «Error!».
Задача взята с сайта e-olymp.
Тесты:
Ввод | Вывод |
java_word | javaWord |
cppWorD | cpp_wor_d |
simpleword | simpleword |
two__underscores | Error |
underscore_in_the_end_ | Error |
UppercaseInTheBeginning | Error |
mixed_Style | Error |
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
class Main { static function main() { var varName = getNextString(); var language:Language = parseLanguage(varName); var result = ""; switch (language) { case Language.Java: result = toCPP(varName); case Language.CPP: result = toJava(varName); case Language.Universal: result = varName; case Language.Error: result = "Error"; } var output = Sys.stdout(); output.writeString(result + "\n"); } static function getNextString() { var string = Sys.stdin().readLine(); return string; } static function parseLanguage(varName:String) { var language:Language = Language.Universal; var hasUnderscore = varName.indexOf("_") != -1; var hasUpper = hasUpperCase(varName); if (hasUnderscore && !hasUpper) { language = validateCPPVar(varName) ? Language.CPP : Language.Error; } else if (!hasUnderscore && hasUpper) { language = validateJavaVar(varName) ? Language.Java : Language.Error; } else if (!hasUnderscore && !hasUpper) { language = Language.Universal; } else { language = Language.Error; } return language; } static function hasUpperCase(string:String) { var underscore = "_"; var has = false; for (i in 0...string.length) { var ch = string.charAt(i); if (ch != underscore && ch == ch.toUpperCase()) { has = true; break; } } return has; } static function validateCPPVar(varName:String) { var underscore = "_"; var isValid = varName.charAt(0) != underscore && varName.charAt(varName.length - 1) != underscore; if (isValid) { var underscoreFlag = false; for (i in 0...varName.length) { var currentChar = varName.charAt(i); if (currentChar == underscore) { if (underscoreFlag) { isValid = false; break; } underscoreFlag = true; } else { underscoreFlag = false; } } } return isValid; } static function validateJavaVar(varName:String) { var firstChar = varName.charAt(0); return firstChar != firstChar.toUpperCase(); } static function toCPP(javaVar:String) { var cppVar = ""; for (i in 0...javaVar.length) { var currentChar = javaVar.charAt(i); if (currentChar != currentChar.toUpperCase()) { cppVar += currentChar; } else { cppVar += "_" + currentChar.toLowerCase(); } } return cppVar; } static function toJava(cppVar:String) { var underscore = "_"; var javaVar = ""; var underscoreFlag = false; for (i in 0...cppVar.length) { var currentChar = cppVar.charAt(i); if (currentChar != underscore) { var c = underscoreFlag ? currentChar.toUpperCase() : currentChar; javaVar += c; underscoreFlag = false; } else { underscoreFlag = true; } } return javaVar; } } enum Language { Java; CPP; Universal; Error; } |
Ход решения:
Со входного потока считывается название переменной, которая помещается в переменную $varName$. Затем вызывается вспомогательная функция $parseLanguage$, которая возвращает одно из значений enum: относится ли переменная к языку С++, Java, универсальная ли она или же, если ничего из вышеперечисленного не подошло, возвращает ошибку. Далее, проанализировав значение, которое нам вернула функция, решается, что делать с переменной: либо конвертировать её в переменную C++, либо в переменную Java, либо оставить её, как есть (универсальная переменная). В ином случае это ошибка, что тоже выводится. Функции $toCPP$ и $toJava$ также являются вспомогательными, которые «переводят» переменную из одного языка в другой.
- e-olymp 1108. Червячные дыры - 06.06.2017
- e-olymp 1077. Java против C++ - 02.05.2017
- A711a - 02.05.2017
Зачтено. Только сделайте, пожалуйста, ссылку для выполнения кода.
А картинка не понравилась?
Картинка понравилась, но я использую другой алгоритм, поэтому она мне не подошла. Ссылку оставил