В этой статье вы научитесь программировать на Kotlin с нуля.

Чтобы направлять процесс обучения, мы решим задачу программирования из Пришествия кода. Мы будем использовать первую задачу из Advent of Code 2015 года. Сначала прочитайте задачу, а затем продолжайте читать здесь.

Это может показаться вам очень сложным, если вы никогда раньше не программировали, но я верю, что это будет легко понять.

Первое, о чем вы должны помнить, это то, что вам придется постепенно приобретать навык игнорировать текст, который не добавляет никакой ценности к постановке задачи. Например, нас не волнует, что Санта надеялся на белое Рождество, и нас также не волнует, что он пытается доставить подарки в большом многоквартирном доме.

Давайте посмотрим, что действительно важно…

Он начинает с первого этажа (этаж 0), а затем следует инструкциям по одному персонажу за раз.

Эти инструкции представляют собой просто последовательность символов, заданную в нашей задаче, которую вы можете скачать со страницы. Вы видите, что это просто последовательность скобок. Это означает, что нам придется как-то научиться обрабатывать этот файл.

Другой важной частью постановки задачи является следующее:

Открывающая скобка (, означает, что он должен подняться на один этаж, а закрывающая скобка, ) означает, что он должен спуститься на один этаж.

Как мы можем представить это «подняться на один этаж» и «спуститься на один этаж»? И как мы узнаем, на каком этаже мы сейчас находимся?

Переменные

Концепция программирования, которую вы будете использовать снова и снова, — это концепция переменных. По сути, переменная — это просто помеченная коробка, в которой вы можете что-то хранить. В случае Kotlin тип вещей, которые вы кладете в этот ящик, также привязан к этому ящику. В этом случае поле будет называться, например, этаж, а его тип будет числом. В данном конкретном случае Kotlin представляет это число как тип Int. Поскольку в постановке задачи упоминается, что Санта начинает с нулевого этажа, в Котлине это будет определено так:

этаж var = 0

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

Условия

Если инструкция, которую мы читаем, является открывающей скобкой, мы поднимаемся вверх, если это закрывающая скобка, мы опускаемся. Это «если», которое я использовал в начале предложения, точно такое же, как вы будете использовать в Kotlin. Условие, которое мы хотим проверить, будет написано между скобками, а действие будет впереди. Например, вот так:

если (инструкция - это открывающая скобка) подняться на один этаж
если (инструкция - это закрывающая скобка) спуститься на этаж

К сожалению, мы не можем написать это так. Давайте сначала позаботимся об этом «инструкция…».

Сравнения

Чтобы сравнить, если что-то равно другому, мы используем оператор ==. Да, два знака равенства. На самом деле инструкция будет другой переменной, которую мы прочитаем из нашего ввода (мы узнаем, как это сделать позже), а открывающая скобка — это символ, который в Kotlin будет представлен как '(', открывающая скобка в одинарных кавычках .Одинарные кавычки используются, чтобы сообщить Kotlin, что мы имеем дело с одним символом.Наше условие if будет записано так:

if (instruction == '(') подняться на один этаж
if (instruction == ')') спуститься на один этаж

Арифметические выражения

В Kotlin мы можем делать арифметические выражения, которые мы должны использовать в этом случае, чтобы иметь возможность подниматься и спускаться по этажам.

Если мы находимся на третьем этаже и поднимемся на один этаж, мы окажемся на четвертом этаже. Что мы сделали? Просто увеличил значение пола на единицу, что можно сделать в Kotlin, написав floor + 1.

Проблема здесь в том, что мы на самом деле хотим, чтобы результатом этого выражения был новый пол, поэтому нам нужно обновить значение нашей переменной floor.

Задания

В Котлине присваивания выполняются со знаком равенства. Поначалу это может вас сбить с толку, потому что представляет не равенство, а присваивание. Помните, что равенство представлено двумя знаками равенства.

переменная = значение

Это означает, что поле с именем переменной теперь будет содержать значение справа. В нашем случае мы бы сделали этаж = этаж + 1. Это означает, что нужно получить текущее значение пола, добавить к нему единицу и сохранить его в том же месте, в основном переопределяя любое значение, которое было раньше. Поскольку это очень распространено, вы можете использовать более короткую версию: floor += 1. Или даже этаж++. Используйте то, что более понятно для вас на данный момент.

Конечно, если мы можем увеличивать, мы можем и уменьшать. Я позволю вам самим догадаться, как это будет.

Вход и выход

Программирование — это обработка входных данных и создание выходных данных. В этом случае входные данные даются вместе с описанием проблемы, и вы можете загрузить предоставленный файл input.txt, но сначала мы проверим наш алгоритм более простым способом. Алгоритм — это просто последовательность шагов, которые мы будем выполнять для получения желаемого результата.

Наши входные данные представляют собой последовательность символов, в мире программирования это называется строка. С этого момента я буду использовать термин строка вместо последовательности символов.

Струны

Вместо чтения из файла, что является более сложной темой, которую мы рассмотрим в следующей статье, давайте просто воспользуемся переменной, которая будет содержать наш ввод. Строка — это просто последовательность символов в двойных кавычках, например "(())". У нас может быть переменная, содержащая эту строку, например:

var input = "(())"

Ценности

В данном конкретном случае наша переменная на самом деле должна быть переменной, потому что она не изменится. Когда вы знаете, что значение в поле не изменится, вы определяете это поле с помощью val вместо var. Правильный способ сделать это будет таким:

val input = "(())"

Конечно, использование var также будет работать, но вы должны с самого начала настроиться на то, чтобы иметь возможность идентифицировать вещи, которые изменятся или не изменятся. Это даст вам некоторые гарантии, которые помогут вам в будущем, когда вы узнаете больше о программировании.

Теперь, когда у нас есть строка, как нам ее пройти? Нам нужна концепция цикла.

Петли

Есть несколько способов зацикливания. Тот, который мы изучим, очень прост. Это позволяет нам выразить что-то вроде «для каждого символа в нашем вводе сделать что-то».

val input = "(())"
for (инструкция на входе) сделать что-нибудь

Что это будет делать, так это пройти через нашу входную строку и шаг за шагом поместить каждый символ в переменную instruction. «Сделать что-то» на самом деле будет нашим условием if, о котором мы упоминали ранее, потому что мы хотим идти вверх и вниз в зависимости от инструкции.

Это было бы так:

val input = "(())"
var floor = 0

for (инструкция на входе) {
if (instruction == '(') floor += 1
if (instruction == ')') floor -= 1
}

Обратите внимание на фигурные скобки, они используются для формирования блока, и все, что находится внутри этого блока, будет выполняться для каждого символа, который мы читаем из ввода.

Как все это выполнить и получить результат?

Функция main

В Kotlin каждая программа начинает свое выполнение в функции с именем main. Это только это:

fun main() {
инструкции здесь
}

fun – это, очевидно, сокращение от слова "функция". Открывающая и закрывающая круглые скобки после слова main означают, что эта функция не получает никаких входных данных, но сейчас вам не нужно об этом беспокоиться.

Отображение вывода

Теперь, когда вы знаете о функциях, есть еще одна очень полезная функция, которая называется print. Вы можете передать этой функции значение или переменную, и ее значение будет отображаться на экране. Например, print(floor). Обратите внимание на использование скобок. Обычно мы делаем разрыв строки после печати строки, поэтому мы должны использовать другую функцию, называемую println. ln — это сокращение от строки.

Полная программа

Наша полная программа будет выглядеть так:

Запуск этого кода отобразит на экране значение 3.

Вы можете попробовать его на сайте Kotlin kotlinlang.org в разделе Try Kotlin. Напишите туда свой код и нажмите Выполнить.

Не стесняйтесь экспериментировать с тем, что вы узнали. Вы можете скопировать и вставить строку из файла input.txt и запустить программу, и вы получите правильный ответ, который вы можете отправить для решения проблемы.

В следующей статье вы узнаете, как обрабатывать файл напрямую.

Если вы дошли до этого момента, большое спасибо. Это моя первая статья на Medium. Если вам понравился этот урок, не стесняйтесь поддержать меня на Patreon.