Перейти к содержанию

🗒 Задача

Создай программу, имитирующую авторизацию по коду из смс. Программа будет “высылать” код из четырех цифр (случайное число от 1000 до 9999).

Выведи его в консоль с текстом “Ваш код авторизации: N”. Далее программа запрашивает ввод кода, чтобы авторизоваться.

– Если код введён неверно – программа вышлет новый (отобразит в консоли) и снова будет запрашивать его ввод для попытки авторизации. – Если код введен верно – программа отображает приветствие и завершает работу.

❌ Ошибки

  • создают смс код в цикле по одному числу — рекомендовать оптимизированно делать (1000..9999).random()

  • вводят дополнительные переменные или условия для проверки пароля — проверять все с условии while

✏️ Комментарии

Все хорошо, но для большей элегантности предлагаю не инициализировать переменную внутри цикла. Чтобы каждый раз не выделялась память при пересоздании переменной.
Проверка дублируется. Мы уже написали в условии цикла, что код будет генерироваться и запрашиваться каждую итерацию. Поэтому welcome message можно просто написать за пределами цикла (после него).
Можно написать более оптимизированно (без лишнего импорта) - `(1000..9999).random()`
Тут что-то с форматированием. Цикл вложенный в функцию main(), поэтому отступ обязателен. Также чтобы было понягляднее, особенно в большой программе, лучше обосабливать внутренние циклы и условия пустыми строками сверху и снизу.
Почему бы не сделать один интервал с рандомным 4-значным числом?)
Тут стоило бы более корректное название переменной дать. Технически это не интервал, а конкретно сгенерированное рандомное число
Давай обосабливать цикл пустыми строками, чтобы код не выглядел таким монолитным. Это общепринятая практика согласно [конвенции Kotlin](https://kotlinlang.org/docs/coding-conventions.html)
Смущает повторение кода инициализации переменной. Предлагаю переделать через реализацию с помощью `do while`
Обрати внимание, когда ставишь символ переноса строки – пробел не нужен. Иначе новая строка начинается с пробела.
Использование оператора `!!` подразумевает, что ты уверен в том, что значение не может быть `null`. Однако, если это не так, то приложение "упадет" с ошибкой. Поэтому этот оператор считается опасным и не рекомендуется использовать. Только в крайних случаях. 

Это противоречит основной идее безопасности типов в Kotlin, поэтому лучше использовать альтернативные способы обработки нулабельных значений. Такие как оператор безопасного вызова `?.`, элвис-оператор `?:` или оператор `let`.

Но пока я рекомендую использовать более свежую функцию readln(), которая возвращает ненулябельный тип (все приводится к строке, даже null становится “null”).

🧾 Решение

fun main() {
    var code: Int
    var codeEnter: Int

    do {
        code = (1000..9999).random()
        println("Ваш код авторизации N: $code")
        println("Введите код")
        codeEnter = readln().toInt()
    } while (codeEnter != code)

    println("Добро пожаловать!")
}