December 12, 2023

Функция, которая определяет 3 числа, которые идут подряд на Leo

Всем привет! Продолжаем с вами изучать язык программирования Leo. Для тех кто здесь впервые напоминаю, что Leo - это язык программирования, основанный на rust для создания приложений на технологии доказательств с нулевым знанием (ZKP). В своих статьях я вместе с вами изучаю этот язык программирования и делюсь своим опытом.

Задача имеет следующее содержание:

Напишите логическую функцию, которая возвращает истину, если в целом 5ти-значном числе есть 3 цифры, которые идут подряд. В противном случае функция возвращает ложь.

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

P.S. Если вам удобнее изучать информацию в видео-формате, то вот ссылка на мой ролик по созданию данной функции.

Открываем Aleo Studio или просто создаём проект в Git Bash через командную строку. В этот раз я буду показывать на примере Aleo Studio (как работать с Git Bash я не раз показывал в своих статьях, можете изучить). Создаем программу, нажимая New leo project. Я назову его podryad.

Нажимаем кнопку create и ждем когда приложение откроется. Если что-то не работает (а это почти каждый раз, так как aleo studio ещё дорабатывается), то можете перезайти в программу.

Создалась программа по умолчанию, которая является helloworld на языке Leo. Давайте её видоизменять.

Для начала поменяем вход и выход функции. Поступает одна переменная типа u32, назовём её a, а на выходе переменная типа bool (boolean имеет значение true или false). Подробнее про типы переменных и вход и выход функции вы можете узнать в бесплатном курсе по leo на моём канале.

Таким образом функция имеет следующий вид:

transition main(a: u32) -> bool {

Теперь нам нужно создать переменную, которую мы и будем возвращать по результатам работы функции. Она будет иметь типо boolean и иметь значение false.

let result: bool = false;

Следующим шагом мы должны сохранить все цифры числа в отдельные переменные. Алгоритм, как это происходит я описал выше. Напомню, что мы находим последнюю цифра числа с помощью поиска остатка от деления на 10 и потом делим наше число на 10 чтобы перейти на порядок больше. Да, таким образом мы получаем сначала единицы и идём к тысячам (то есть справа на лево,а не слева направо), но для нас это роли не играет, так как нам нужно определить лишь факт, что 3 цифры подряд одинаковые.

let n_1: u32 = a.rem(10u32);
a = a/10u32;
let n_2: u32 = a.rem(10u32);
a = a/10u32;
let n_3: u32 = a.rem(10u32);
a = a/10u32;
let n_4: u32 = a.rem(10u32);
a = a/10u32;
let n_5: u32 = a.rem(10u32);

Теперь остаётся лишь написать условное выражение, которое будет сравнивать по 3 числа. Для этого используем условный оператор if.

 if n_1 == n_2 && n_2 == n_3  n_2 == n_3 && n_3 == n_4  n_3 == n_4 && n_4 == n_5 {

С помощью && мы обозначаем "и", а с помощью || - "или". Если это условие верно, то мы даем переменной result значение true.

result = true;

Остается вернуть данную переменную.

return result;

Общий код выглядит так:

program podryad.aleo {
    transition main(a: u32) -> bool {
        let result: bool = false;
        let n_1: u32 = a.rem(10u32);
        a = a/10u32;
        let n_2: u32 = a.rem(10u32);
        a = a/10u32;
        let n_3: u32 = a.rem(10u32);
        a = a/10u32;
        let n_4: u32 = a.rem(10u32);
        a = a/10u32;
        let n_5: u32 = a.rem(10u32);
        if n_1 == n_2 && n_2 == n_3  n_2 == n_3 && n_3 == n_4  n_3 == n_4 && n_4 == n_5 {
        result = true;
        }
        return result;
    }
}

Теперь указываем входные данные.

В данном случае мы должны получить true, так как идёт 3 единицы подряд.

Всё верно. Теперь давайте попробуем другие данные.

И всё правильно, мы получаем false.

На этом всё! Надеюсь, данная статья была вам полезна. Можете задавать вопросы в комментариях.