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

🗒 Задача

Продолжаем работать над приложением “Шахматы”. Напиши программу для сервера, которая примет строку, отправленную игроком (считаем эти данные уже известными и объявляем строку с данными: “D2-D4;0”.

Необходимо будет сделать обратное. Распарсить строку – разбить ее на 3 составляющих: откуда, куда и номер хода, присвоить соответствующим переменным и распечатать по отдельности.

❌ Ошибки

  • обращаются по индексу. рабочее решение, но есть ощущение, что индексы менее стабильны — предлагать попробовать split()

  • используют split() с одним параметром разделителя — можно отправить оба через запятую

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

Мы пользуемся сплит и обрати внимание на его сигнатуру. метод имеет ключевое слово vararg - то есть он может принимать произвольное количество параметров. то есть в данном случае разделителей. Подробнее тут [https://metanit.com/kotlin/tutorial/3.2.php](https://metanit.com/kotlin/tutorial/3.2.php)
Попробуй сохранить в переменную результат выполнения move.split("-", ";"), затем принудительно вывести ее тип. Это будет список (можно подробнее изучить сигнатуру метода и увидеть возвращаемое значение).

Далее надо из списка по определенным индексам элементов доставать значения и присваивать переменным from итд.

Если что задача 5 - повышенной сложности, поэтому не по уровню урока. Ничего страшного, если решишь вернуться к ней потом).
После инициализации они никак не перезаписываются. Поэтому надо стараться по умолчанию всегда сразу писать val. Кроме того IDEA подсвечивает это сообщение варнингом.
Неплохо, рабочее решение! Но попробуем более оптимальное решение)
Предлагаю применить функцию split(), обрати внимание какие параметры она умеет принимать.
Верное направление! Однако, сплит умеет принимать несколько параметров. Можно существенно сократить код
да! а можно еще короче. функция split() умеет принимать несколько параметров через запятую)
Решение с java.util.regex.Matcher корректное, но менее универсальное чем Regex котлина. https://www.baeldung.com/kotlin/regular-expressions
Давай переделаем, тогда твой код может быть переиспользован, к примеру, для iOS / Web и так далее
По решению немного не нравится повторяющийся код. Не соблюдаем принцип `[DRY](https://ru.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself)`. Если изменятся разделители, то придется менять код аш в трех местах.
В связи с этим лучше один раз проинициализировать переменную со списком, а ниже уже доставать из нее по индексам соответствующие значения.
Рабочее решение, но есть ощущение, что индексы менее стабильны. Давай попробуем более оптимальное решение) с соблюдением принципа [DRY](https://ru.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself).

Предлагаю применить функцию split(), обрати внимание какие параметры она умеет принимать.

🧾 Решение

fun main() {
    val inputData = "D2-D4;0"

    val splitData = inputData.split("-", ";")
    val from = splitData[0]
    val where = splitData[1]
    val numberTurn = splitData[2]

    println(from)
    println(where)
    println(numberTurn)
}
// продвинутый c Regex
fun main() {
   val moveChess = "D2-D4;0"
   val startPoint: String
   val endPoint: String
   val number: String

   val list = moveChess.split("[-;]".toRegex())

   startPoint = list[0]
   endPoint = list[1]
   number = list[2]

   println("Start point: $startPoint")
   println("End point: $endPoint")
   println("move number: $number")
}
fun main() {
    val moveFromPlayer = "D2-D4;0"

    val (start, end, moveNumber) = moveFromPlayer.split("-", ";")

    println(start)
    println(end)
    println(moveNumber)
}