June 30, 2023

#6 Путь разработчика Leo

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

План статей из цикла "Путь разработчика"

Сегодня мы создадим 2 программы. Первая программа будет определять сколько степеней двойки в данном числе. Вторая программа будет вычислять, является ли год високосным.

Первая программа

Для начала нам нужно открыть Aleo Studio и создать новый проект. Если вы еще не скачали Aleo Studio, то можете сделать это по ссылке: https://www.aleo.studio/.

Приступаем к написанию кода. Для начала пропишем вход и выход функции.

transition main(public n: field) -> u8 {

В функцию поступает переменная n типа field, а на выходе переменная типа u8, так как число типа field не может иметь больше 255 степеней двойники (до 253 бит).

Далее нам нужно создать 2 переменные. Первая переменная будет иметь такое же значение, как n и мы будем её делить на 2 каждый цикл. Назовем её remaining.

let remaining: field = n;

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

let two: u8 = 0u8;

Теперь нам нужно создать цикл for, который будет делить переменную, пока она четная и не нулевая. 253 повторения, так как число типа field не может быть больше, чем 253 битным.

for i:u8 in 0u8..252u8 {

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

function is_even_and_nonzero (n: field) -> bool {

        return n/2field < n;

    }

Теперь, использовав эту функцию, проведем операции над входным числом.

if is_even_and_nonzero(remaining){

                remaining = remaining/2field;

                two += 1u8;

            }

По итогу, мы имеем следующий код:

Давайте укажем следующие входные данные:

[main]public

n: field = 8field;

Таким образом, на выходе мы должны получить 3, так как 2 в 3 степени равно 8.

Всё работает корректно, давайте перейдем ко второй программе.

Вторая программа

Напомню, что данная программа определяет, является ли год високосным. Нам нужно создать следующую логику: год является високосным, если он кратен 4, но не кратен 100, или кратен 400. Приступаем к написанию коду.

Функция перехода на входе будет получать переменную типа u32 (год), а на выходе переменная типа boolean (true, если год високосный и false, если нет).

transition main(public a: u32) -> bool {

Теперь нам нужно создать 2 переменные, которые будут иметь значение true и false.

let t: bool = true;

let f: bool = false;

Составляем логическое выражение.

if a % 4u32 == 0u32  && a % 100u32 != 0u32 || a % 400u32 == 0u32 {

            return t;

        } else {

            return f;

        }

Таким образом, если остаток от деления на 4 равен 0, но не равен 0 при делении на 100 или остаток от деления на 400 равен 0, тогда год является висикосным, то есть мы возвращаем переменную со значением true. Если же условие не выполняется, то возвращаем false. Давайте запустим код с входными данными 2000.

[main]

public a: u32 =2000u32;

Как мы видим, год является високосным. Давайте оптимизируем наш код с помощью троичных выражений, они дешевле при вычислении и имеют следующую структуру.

return condition ? a : b

В нашем случае это выглядит так.

На этом всё! Надеюсь, данная серия статей была вам интересна.

Полезные материалы

Плейлист с этими статьями в видео формате: ссылка