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

🗒 Задача

Для алгоритма улучшенного приложения-лотереи нужно угадать три числа от 0 до 42. Пользователь вводит числа через консоль.

Требования к программе:

  • Загаданные числа должны рандомно генерироваться при каждом запуске программы и храниться в списке.
  • Поочередно введенные пользователем числа должны также храниться в списке.
  • Для определения совпадений используй метод intersect() и сохрани размер полученной коллекции в отдельную переменную.

В зависимости от количества угаданных чисел программа выводит результат:

  • При трех совпадениях сообщается, что пользователь угадал все числа и выиграл джекпот.
  • При двух совпадениях информируется о том, что пользователь угадал два числа и получает крупный приз.
  • Если угадано одно число, пользователю выплачивается утешительный приз.
  • Если нет совпадений, программа сообщает, что пользователь не угадал ни одного числа.
  • В конце игры вне зависимости от результата программа выводит выигрышные числа.

❌ Ошибки

  • используют Java Random или Math Random — плохо, потому, что не кроссплатформа

  • нет проверки чисел, введенные в обратном порядке

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

Отлично, давай еще применим `when` для множественного ветвления – будет выглядеть более аккуратно и соблюдем принцип [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)
Визуально монолитный код получается. Давай разделять блок с переменными пустыми строками от всего остального кода
Тут бы и выше использовал [строковые шаблоны](https://kotlinlang.org/docs/strings.html#string-templates), для лучшей читаемости
В целом преобразование в Byte можно не делать, обычно это называют "Экономия на спичках", тут у тебя нет больших массивов данных
Эта строка трижды повторена в коде. Знак того, что что-то работает не так) нужно доработать код. Не соблюдается принцип [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)
Да, в целом валидный вариант и даже более оптимальный, чем java.util.Random. Но если планируешь писать мультиплатформенный код (который и в браузере, и в jvm и для iOS будет работать) лучше использовать встроенный в Котлин Random
Комментированный код лучше не оставлять в продакшене, если это не 
Рекомендую пользоваться котлиновской экстеншен функцией для получения рандомного числа. Она поаккуратнее и избавимся от лишнего импорта
Другой вопрос в том, что while не совсем оптимально, так как есть риск по разным причинам, что цикл не остановится на 2х итерациях. Лучше использовать нечто более гарантирующее ограниченное количество итераций. Например, repeat()
А зачем делать деструктуринг (я про перечисление переменных), а потом формировать из них список? Можно же применить маппинг к результату split()

🧾 Решение

import kotlin.random.Random

fun main() {
    val winningNumbers = List(3) {Random.nextInt(1,42);
        Random.nextInt(1,42);
        Random.nextInt(1,42)}

    println("Введите по очереди три числа")

    val mutableList = mutableListOf(readln().toInt(), readln().toInt(), readln().toInt())
    val intersectedList = winningNumbers.intersect(mutableList).size

    when(intersectedList) {
        3 -> println("Вы выиграли джекпот! Угадали 3 числа")
        2 -> println("Вы выиграли второй приз! Угадали 2 числа")
        1 -> println("Вы выиграли утешительнй приз! Угадали 1 число")
        else -> println("Вы не угадали ни одно число!")
    }
    println("Выигрышные числа: $winningNumbers")
    }
  import kotlin.random.Random

  fun main() {
      val winningNumbers = List(3) { Random.nextInt(0, 43) }
      val userNumbers = mutableListOf<Int>()

      repeat(3) {
          print("Введите число ${it + 1} от 0 до 42: ")
          val userNumber = readln().toIntOrNull()

          if (userNumber != null && userNumber in 0..42) {
              userNumbers.add(userNumber)
          } else {
              println("Некорректный ввод. Попробуйте снова.")
              return
          }
      }

      val matchedNumbers = winningNumbers.intersect(userNumbers)

      when (matchedNumbers.size) {
          3 -> println("Поздравляем! Вы угадали все числа и выиграли джекпот!")
          2 -> println("Поздравляем! Вы угадали два числа и получаете крупный приз!")
          1 -> println("Вы угадали одно число и получаете утешительный приз.")
          else -> println("К сожалению, вы не угадали ни одного числа.")
      }

      println("Выигрышные числа: $winningNumbers")
  }