From 67876667dff462d32726ac7d9635042c6db7b8e7 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 5 Jun 2026 16:23:29 +0500 Subject: [PATCH 01/29] =?UTF-8?q?feat(10-basics):=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20Python?= =?UTF-8?q?=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 10-hello-world: теория до паритета с Python (значение символов, где практиковаться, диаграмма интерпретатора), сохранён блок echo vs print_r, добавлена иллюстрация hello-world.png - 30-comments: структура из Python (примеры, диаграмма, служебные комментарии BEGIN/END), сохранён PHP-блок о многострочных комментариях - 40-instructions: разделы «Порядок имеет значение», «Альтернативная форма записи», «Зачем это нужно» (isPrime на PHP) - 45-testing: актуализированная структура из Python, PHPUnit-вывод ошибки - 50-syntax-errors: разделы о Parse error, «Почему ошибки простые», «Что делать»; задание выровнено с Python (вывод + намеренная поломка), как в JS - data.yml: tips перенесены и адаптированы под PHP (w3schools, php.net, сообщество Telegram) Локали en/es не тронуты — обновятся фазой перевода. Co-Authored-By: Claude Opus 4.8 (1M context) --- modules/10-basics/10-hello-world/ru/README.md | 77 +++++++++++---- .../10-hello-world/ru/assets/hello-world.png | Bin 0 -> 33900 bytes modules/10-basics/10-hello-world/ru/data.yml | 2 +- modules/10-basics/30-comments/ru/README.md | 89 ++++++++++++++---- modules/10-basics/30-comments/ru/data.yml | 5 +- .../10-basics/40-instructions/ru/README.md | 76 ++++++++++++--- modules/10-basics/45-testing/ru/README.md | 46 +++++---- modules/10-basics/45-testing/ru/data.yml | 2 + .../50-syntax-errors/SolutionTest.php | 2 +- modules/10-basics/50-syntax-errors/index.php | 2 +- .../10-basics/50-syntax-errors/ru/EXERCISE.md | 12 ++- .../10-basics/50-syntax-errors/ru/README.md | 46 ++++++++- .../10-basics/50-syntax-errors/ru/data.yml | 5 +- 13 files changed, 287 insertions(+), 77 deletions(-) create mode 100644 modules/10-basics/10-hello-world/ru/assets/hello-world.png diff --git a/modules/10-basics/10-hello-world/ru/README.md b/modules/10-basics/10-hello-world/ru/README.md index f303ed9c..8974c7e1 100644 --- a/modules/10-basics/10-hello-world/ru/README.md +++ b/modules/10-basics/10-hello-world/ru/README.md @@ -1,42 +1,85 @@ -В этом уроке мы сразу напишем первую программу. Мы узнаем, какие команды понадобятся для этого и какие теги нужно использовать, чтобы программа, которая выполняет код, восприняла его. Также узнаем, зачем в коде нужны комментарии. +Изучение нового языка программирования традиционно начинается с программы 'Hello, World!'. Это простая программа, которая выводит приветствие на экран и знакомит с синтаксисом и структурой нового языка. -## Как написать простую программу +```text +Hello, World! +``` + +![Hello World](./assets/hello-world.png) -Чтобы написать программу и вывести результат на экран, используют два способа: +Этой традиции уже больше сорока лет, и мы тоже начнем с нее. В первом уроке мы напишем программу `Hello, World!`. На PHP эта программа выглядит так: -* Через команду `echo` -* Через команду `print_r()` +```php + Hello, World! +print_r('Хекслет - школа программирования'); ``` +Команда остается той же, меняется только содержимое скобок. Чтобы программа понимала, что это именно текст, он заключается в кавычки. Можно использовать одинарные `'...'` или двойные `"..."`, но открывающая и закрывающая кавычки должны совпадать. -Вывод на экран выполняется с помощью специальной команды `echo`. После нее в одиночных кавычках указывается строка для вывода. В конце обязательно ставим точку с запятой. +```php + РЕЗУЛЬТАТ`. +В PHP принято использовать одинарные кавычки для строк. Если внутри строки есть апостроф, одинарные кавычки сломают синтаксис, поэтому в таких случаях используют двойные. -### Пишем программу через `print_r()` +```php + Hello, World! ``` +Для удобства мы будем показывать результат запуска строк кода так: `// => РЕЗУЛЬТАТ`. + +В простых ситуациях между `echo` и `print_r()` нет разницы — можно использовать любую команду. А там, где на экран нужно выводить не просто числа или строки, а, например, массивы, `echo` не сможет этого сделать, а `print_r()` все выведет. -В этом случае строка указывается в скобках сразу после имени функции. В конце также нужно ставить `;`. +## Значение символов + +Код состоит из команд, и каждая из них должна быть написана в определенной форме. Помимо букв, в коде важны кавычки `'` и `"`, скобки `()` и знаки препинания. Пропущенный или перепутанный знак приведет к тому, что программа не запустится. Попробуйте определить, какая ошибка допущена в каждой из строк? + +```php +7fnRA`&~&7x9%tgmLJak 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 [Немного о 'Hello, - World!'](https://ru.hexlet.io/blog/posts/moy-chelovek-menya-ponimaet-istoriya-frazy-hello-world-i-ee-analogov) + World!'](https://ru.hexlet.io/blog/posts/moy-chelovek-menya-ponimaet-istoriya-frazy-hello-world-i-ee-analogov?utm_source=code-basics&utm_medium=referral&utm_campaign=blog&utm_content=lesson) diff --git a/modules/10-basics/30-comments/ru/README.md b/modules/10-basics/30-comments/ru/README.md index 464c8dfe..1805f638 100644 --- a/modules/10-basics/30-comments/ru/README.md +++ b/modules/10-basics/30-comments/ru/README.md @@ -1,28 +1,77 @@ -## Зачем нужны комментарии +Кроме самого кода, в исходных файлах часто можно встретить комментарии. Это строки, которые интерпретатор не обрабатывает. Программисты пишут их, чтобы пояснить, как работает код, отметить ошибки или напомнить, что нужно доделать. -Кроме кода в файлах с исходным кодом могут находиться комментарии. Этот текст не является частью программы. Он нужен программистам для пометок. С их помощью добавляют пояснения, например, как работает код, какие ошибки нужно поправить или не забыть что-то позже добавить. +```php + +// END +``` + +Увидев *BEGIN* и *END*, пишите свой код между ними, остальное оставляйте без изменений. diff --git a/modules/10-basics/30-comments/ru/data.yml b/modules/10-basics/30-comments/ru/data.yml index 64f00d08..7d4f6a51 100644 --- a/modules/10-basics/30-comments/ru/data.yml +++ b/modules/10-basics/30-comments/ru/data.yml @@ -1,6 +1,9 @@ --- name: Комментарии -tips: [] +tips: + - > + [Подробнее о + комментариях](https://www.w3schools.com/php/php_comments.asp) definitions: - name: Комментарий description: > diff --git a/modules/10-basics/40-instructions/ru/README.md b/modules/10-basics/40-instructions/ru/README.md index 9a4641be..a0918559 100644 --- a/modules/10-basics/40-instructions/ru/README.md +++ b/modules/10-basics/40-instructions/ru/README.md @@ -1,28 +1,82 @@ -## Что такое инструкция +Команду `print_r('Hexlet')` мы можем назвать инструкцией, она говорит интерпретатору PHP что нужно делать. Таких инструкций может быть сколько угодно. Каждая из них выполняется после того, как закончилась предыдущая и так мы из простых элементов получаем сколь угодно большую и сложную программу. -**Инструкция** — это команда, которую исполняет интерпретатор PHP. Она написана на языке программирования. Ее можно сравнить с инструкцией или рецептом по приготовлению блюда: +```text +Инструкция 1: print_r('Hello') → выполнена + ↓ +Инструкция 2: print_r('World') → выполнена + ↓ +Инструкция 3: print_r('!') → выполнена +``` + +Код на PHP — это набор инструкций, которые отделяются друг от друга символом `;`. Вот пример кода с двумя инструкциями. Эти строки говорят компьютеру вывести фразы на экран. + +```php + Mother of Dragons. Dracarys! +print_r('Mother of Dragons. '); ``` -При запуске этого кода на экран последовательно выводятся два предложения: `Mother of Dragons. Dracarys!`. +на экране они тоже поменяются: -Инструкции можно написать последовательно друг за другом без переноса на новую строчку: +```text +Dracarys!Mother of Dragons. +``` + +## Альтернативная форма записи + +Обычно инструкции пишут на отдельных строках, но раз инструкции в PHP отделяются символом `;`, то перенос строки не обязателен. Несколько инструкций можно записать в одну строку: ```php Mother of Dragons. Dracarys! +print_r('Mother of Dragons. '); print_r('Dracarys!'); ``` -Результат на экране будет таким же. Но такой код неудобно читать, поэтому инструкции располагают друг под другом. +Обе версии работают одинаково, но второй вариант читать сложнее. Поэтому инструкции почти всегда пишут по одной на строку. + +## Зачем это нужно + +Сейчас мы пишем очень простые программы, но со временем они начнут усложняться и один из самых важных навыков, который поможет их понимать, это способность разбивать (в голове) программу на независимые инструкции. Только так можно разобраться в том, что в коде происходит. Ниже пример для привлечения внимания, понимать его пока не надо: + +```php +expectOutputString($expected); require 'index.php'; } diff --git a/modules/10-basics/50-syntax-errors/index.php b/modules/10-basics/50-syntax-errors/index.php index 46242713..8bc15518 100644 --- a/modules/10-basics/50-syntax-errors/index.php +++ b/modules/10-basics/50-syntax-errors/index.php @@ -1,3 +1,3 @@ + [Виды ошибок в + PHP](https://www.php.net/manual/ru/language.errors.basics.php) definitions: - name: Синтаксическая ошибка description: нарушение грамматических правил языка программирования. From e1258b231ad68f14b8ac90974f6486012c12e725 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 5 Jun 2026 17:14:08 +0500 Subject: [PATCH 02/29] =?UTF-8?q?feat(20-arithmetics):=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20?= =?UTF-8?q?Python=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Теория RU всех уроков доведена до паритета с Python (101–153%) - Задания выровнены с Python: батарейки, подлодка, забор/пирожные, магазин, пицца (код и тесты адаптированы под PHP) - Новый урок 43-float: числа с плавающей точкой, демонстрация погрешности через print_r(0.1 + 0.2 - 0.3) без var_dump - 45-linting: README актуализирован на PHP CS Fixer (PSR-1/PSR-12) - definitions/tips перенесены из Python во все data.yml Co-Authored-By: Claude Opus 4.8 (1M context) --- .../20-arithmetics/20-basic/ru/EXERCISE.md | 2 +- modules/20-arithmetics/20-basic/ru/README.md | 153 ++++++++++++++++-- .../20-basic/ru/assets/arithmetics.png | Bin 0 -> 31638 bytes modules/20-arithmetics/20-basic/ru/data.yml | 7 + .../25-operator/SolutionTest.php | 2 +- modules/20-arithmetics/25-operator/index.php | 1 + .../20-arithmetics/25-operator/ru/EXERCISE.md | 9 +- .../20-arithmetics/25-operator/ru/README.md | 65 ++++++-- .../20-arithmetics/25-operator/ru/data.yml | 9 ++ .../27-commutativity/SolutionTest.php | 2 +- .../20-arithmetics/27-commutativity/index.php | 4 +- .../27-commutativity/ru/EXERCISE.md | 5 +- .../27-commutativity/ru/README.md | 64 +++++++- .../27-commutativity/ru/data.yml | 5 +- .../30-composition/SolutionTest.php | 2 +- .../20-arithmetics/30-composition/index.php | 2 +- .../30-composition/ru/EXERCISE.md | 6 +- .../30-composition/ru/README.md | 85 +++++++++- .../20-arithmetics/30-composition/ru/data.yml | 4 + .../40-priority/SolutionTest.php | 2 +- modules/20-arithmetics/40-priority/index.php | 2 +- .../20-arithmetics/40-priority/ru/EXERCISE.md | 9 +- .../20-arithmetics/40-priority/ru/README.md | 69 ++++++-- .../20-arithmetics/40-priority/ru/data.yml | 5 + modules/20-arithmetics/43-float/Makefile | 2 + .../20-arithmetics/43-float/SolutionTest.php | 17 ++ .../43-float/description.es.yml | 73 +++++++++ .../20-arithmetics/43-float/en/EXERCISE.md | 3 + modules/20-arithmetics/43-float/en/README.md | 54 +++++++ modules/20-arithmetics/43-float/en/data.yml | 10 ++ .../20-arithmetics/43-float/es/EXERCISE.md | 3 + modules/20-arithmetics/43-float/es/README.md | 54 +++++++ modules/20-arithmetics/43-float/es/data.yml | 10 ++ modules/20-arithmetics/43-float/index.php | 5 + .../20-arithmetics/43-float/ru/EXERCISE.md | 3 + modules/20-arithmetics/43-float/ru/README.md | 63 ++++++++ modules/20-arithmetics/43-float/ru/data.yml | 10 ++ .../20-arithmetics/45-linting/ru/README.md | 56 ++++++- modules/20-arithmetics/45-linting/ru/data.yml | 6 +- 39 files changed, 815 insertions(+), 68 deletions(-) create mode 100644 modules/20-arithmetics/20-basic/ru/assets/arithmetics.png create mode 100644 modules/20-arithmetics/43-float/Makefile create mode 100644 modules/20-arithmetics/43-float/SolutionTest.php create mode 100644 modules/20-arithmetics/43-float/description.es.yml create mode 100644 modules/20-arithmetics/43-float/en/EXERCISE.md create mode 100644 modules/20-arithmetics/43-float/en/README.md create mode 100644 modules/20-arithmetics/43-float/en/data.yml create mode 100644 modules/20-arithmetics/43-float/es/EXERCISE.md create mode 100644 modules/20-arithmetics/43-float/es/README.md create mode 100644 modules/20-arithmetics/43-float/es/data.yml create mode 100644 modules/20-arithmetics/43-float/index.php create mode 100644 modules/20-arithmetics/43-float/ru/EXERCISE.md create mode 100644 modules/20-arithmetics/43-float/ru/README.md create mode 100644 modules/20-arithmetics/43-float/ru/data.yml diff --git a/modules/20-arithmetics/20-basic/ru/EXERCISE.md b/modules/20-arithmetics/20-basic/ru/EXERCISE.md index 5dfef630..a8f46734 100644 --- a/modules/20-arithmetics/20-basic/ru/EXERCISE.md +++ b/modules/20-arithmetics/20-basic/ru/EXERCISE.md @@ -1 +1 @@ -Выведите на экран результат деления числа `81` на `9`. +Вы зашли в оптовый магазин и увидели упаковку из 9 батареек за 81 рубль. В обычном магазине одна батарейка стоит 12 рублей. Рассчитайте и выведите цену одной батарейки в оптовой упаковке, чтобы понять, где выгоднее покупать. diff --git a/modules/20-arithmetics/20-basic/ru/README.md b/modules/20-arithmetics/20-basic/ru/README.md index 046cd027..c21594f5 100644 --- a/modules/20-arithmetics/20-basic/ru/README.md +++ b/modules/20-arithmetics/20-basic/ru/README.md @@ -1,8 +1,12 @@ -На базовом уровне компьютеры оперируют только числами. Для сложения двух чисел в математике мы пишем, например, `3 + 4`. В программировании — то же самое. В этом уроке разберем, как проводить арифметические операции в коде. +На базовом уровне компьютеры работают только с числами. Даже если вы пишете сложное приложение на современном языке программирования, внутри него всегда происходят многочисленные вычисления: сложение, вычитание, деление и т.д. -## Арифметика в программировании +![Счетные палочки](./assets/arithmetics.png) -Рассмотрим пример программы, которая складывает два числа: +К счастью, чтобы начать программировать, достаточно знать обычную школьную арифметику. С нее мы и начнем. + +## Сложение в PHP + +В математике для сложения мы пишем 3 + 4. В PHP все точно так же: ```php 4 +print_r(3 ** 2); // => 9 +``` + +## Числа с плавающей точкой -Нам нужно попросить интерпретатор сложить `3 + 4` и дать команду сделать что-то с результатом. Например, вывести его на экран: +Помимо целых чисел в PHP есть числа с плавающей точкой, которые используются для работы с дробями. Такие числа записываются через точку: ```php 7 +print_r(3.5 + 1.2); // => 4.7 +print_r(10 / 4); // => 2.5 ``` -Кроме сложения доступны следующие операции: +Иногда мы используем их сами, когда нужно работать именно с дробными значениями, например при подсчете среднего или при работе с деньгами и измерениями. Но числа с плавающей точкой могут появляться и сами, например, в результате операции деления `/`: -* `*` — умножение -* `/` — деление -* `-` — вычитание -* `%` — [остаток от деления](https://ru.wikipedia.org/wiki/Деление_с_остатком) -* `**` — возведение в степень +```php + 4 +print_r(7 / 2); // => 3.5 +``` + +Если результат деления получился целым, PHP оставляет его целым числом, а дробный результат автоматически становится числом с плавающей точкой. + +Причина выделения этого в отдельный тип: компьютеру нужно хранить целые значения и дробные значения по-разному. Для целых он выделяет одни структуры в памяти, для дробных выделяет другие. Поэтому в PHP, как и в других языках программирования, существует два разных вида чисел: int (целые) и float (с плавающей точкой). + +На базовом уровне достаточно помнить: целые числа нужны, когда нет дробей, а числа с плавающей точкой нужны, когда дроби есть. Подробнее мы разберемся с ними дальше по курсу. + +## Что такое остаток от деления (`%`) + +Эта операция называется **взятие остатка от деления**. Она показывает, **что «остается»**, когда одно число делится на другое *не полностью*. Пример: + +```php + 1 +``` + +Почему результат равен 1? + +- 7 делится на 3 дважды: 3 * 2 = 6 +- До 7 остается 1, и это является остатком. + +Другие примеры: + +```php + 2 (10 делится на 4 дважды: 4 * 2 = 8, остаток 2) +print_r(15 % 5); // => 0 (делится без остатка) +``` + +Операция % часто используется в программировании, например: + +- чтобы проверить, делится ли число нацело (если остаток 0) +- чтобы выполнять циклические действия, например, поведение по четным/нечетным индексам + +Мы еще неоднократно встретим % в задачах и разберем его применение на практике. + +## Оформление арифметических выражений + +С точки зрения PHP между `3+4` и `3 + 4` нет разницы. Интерпретатор поймет оба варианта одинаково и в обоих случаях выполнит сложение. Разница только в оформлении кода. В программировании принято ставить пробелы вокруг арифметических операторов, потому что так выражения проще читать: + +```php +2VCasa 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 literal 0 HcmV?d00001 diff --git a/modules/20-arithmetics/20-basic/ru/data.yml b/modules/20-arithmetics/20-basic/ru/data.yml index 0333794a..73cd539e 100644 --- a/modules/20-arithmetics/20-basic/ru/data.yml +++ b/modules/20-arithmetics/20-basic/ru/data.yml @@ -9,6 +9,13 @@ tips: Деление на ноль приводит к ошибке `Division by zero`. Чтобы его не допустить, нужно знать про условные конструкции (о них вы узнаете в следующих уроках). + - | + [Деление с остатком](https://ru.wikipedia.org/wiki/Деление_с_остатком) - > Если в редакторе есть запись `// BEGIN` и `// END`, то код нужно писать между этими строчками. +definitions: + - name: Инструкция + description: > + наименьшая автономная часть языка программирования; команда или набор + команд. Программа обычно представляет собой последовательность инструкций. diff --git a/modules/20-arithmetics/25-operator/SolutionTest.php b/modules/20-arithmetics/25-operator/SolutionTest.php index 38121b48..ae610922 100644 --- a/modules/20-arithmetics/25-operator/SolutionTest.php +++ b/modules/20-arithmetics/25-operator/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = '87'; + $expected = '8729'; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/20-arithmetics/25-operator/index.php b/modules/20-arithmetics/25-operator/index.php index 790c3ea2..d3acae0e 100644 --- a/modules/20-arithmetics/25-operator/index.php +++ b/modules/20-arithmetics/25-operator/index.php @@ -2,4 +2,5 @@ // BEGIN print_r(6 - -81); +print_r((6 - -81) / 3); // END diff --git a/modules/20-arithmetics/25-operator/ru/EXERCISE.md b/modules/20-arithmetics/25-operator/ru/EXERCISE.md index 003cfc9c..ca7ca8a9 100644 --- a/modules/20-arithmetics/25-operator/ru/EXERCISE.md +++ b/modules/20-arithmetics/25-operator/ru/EXERCISE.md @@ -1 +1,8 @@ -Напишите программу, которая посчитает разность между числами `6` и `-81` и выведет ответ на экран. +Подводная лодка находится на глубине -81 м. Палуба спасательного корабля расположена на высоте +6 м над уровнем воды. + +Рассчитайте и выведите на экран: + +1. Полное расстояние всплытия в метрах. +2. Время подъема в минутах — лодка поднимается со скоростью 3 м/мин. + +Обратите внимание, что результаты выведутся «слепленными» в одну строчку без пробела. Мы научимся решать эту проблему в будущих уроках. diff --git a/modules/20-arithmetics/25-operator/ru/README.md b/modules/20-arithmetics/25-operator/ru/README.md index b7b41c59..dfc9d30b 100644 --- a/modules/20-arithmetics/25-operator/ru/README.md +++ b/modules/20-arithmetics/25-operator/ru/README.md @@ -1,8 +1,9 @@ -Знак операции, например, `+`, называют **оператором**. Операторы обычно представлены одним или несколькими символами, реже — словом. Обычно они соответствуют математическим операциям. +В математике и программировании мы часто используем знаки операций, такие как `+`, `-`, `*` и другие. В программировании такие знаки называются операторами. -Операторы выполняют операции над определенными значениями, которые называются **операндами**. +- Оператор представляет собой символ или слово, которое обозначает действие. +- Операнды являются значениями, к которым применяется оператор. -Рассмотрим пример: +Пример: ```php -3 ``` -Выше пример применения унарной операции к числу `3`. Оператор `-` перед тройкой говорит интерпретатору взять число `3` и найти противоположное, то есть `-3`. Это может сбить с толку, потому что `-3` — это одновременно и число, и оператор с операндом. Но у языков программирования такая структура: +В этом случае `-` является унарным оператором, а `3` является операндом. Интерпретатор получает команду: «возьми число 3 и измени его знак». + +Оператор `-` может использоваться по-разному. Когда он стоит **между двумя числами**, это операция вычитания: + +```php + 3 +print_r(10 - 7); // => 3 +``` + +Здесь `-` берет первое число и вычитает из него второе. + +Эта разница особенно заметна при работе с отрицательными числами. Например: ```php 1 +// минус на минус дает плюс +print_r(5 - -2); // => 7 ``` +Сначала мы видим операцию вычитания: `5 - (...)`. Но справа стоит унарный минус `-2`, который превращает `2` в отрицательное число. В итоге получается: `5 - (-2) = 7`. + +Таким образом, значение `-` зависит от контекста: если рядом стоит другое число, это вычитание, иначе это смена знака числа. + То же самое касается и плюса: ```php 3 +print_r(+3); // => 3 print_r(1 + +3); // => 4 ``` + +Главное, что здесь нужно помнить: поведение и даже сама запись здесь полностью соответствует тому, как мы делали это в школе. + +## Ошибки при вычислениях и парсинге + +Если воспринимать `-3` как единое число, можно не заметить, что `-` является отдельным оператором со своим приоритетом. Например: + +```php +- + Всегда отбивайте арифметические операторы пробелами от своих операндов – это + хороший стиль программирования. - | [Операторы в PHP](https://www.php.net/manual/ru/language.operators.php) definitions: - name: Арифметическая операция description: сложение, вычитание, умножение и деление. + - name: Оператор + description: >- + специальный символ, создающий операцию. Например, `+` создает операцию + сложения. + - name: Операнд + description: 'объект, который участвует в операции. `3 * 6`: здесь 3 и 6 — операнды.' - name: Унарная операция description: >- операция с одним операндом. Например, `-3` — унарная операция для diff --git a/modules/20-arithmetics/27-commutativity/SolutionTest.php b/modules/20-arithmetics/27-commutativity/SolutionTest.php index 82d6026c..2479e46a 100644 --- a/modules/20-arithmetics/27-commutativity/SolutionTest.php +++ b/modules/20-arithmetics/27-commutativity/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = '2432'; + $expected = '2563'; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/20-arithmetics/27-commutativity/index.php b/modules/20-arithmetics/27-commutativity/index.php index e38d8b77..d516da70 100644 --- a/modules/20-arithmetics/27-commutativity/index.php +++ b/modules/20-arithmetics/27-commutativity/index.php @@ -1,6 +1,6 @@ 5 +print_r(2 + 3); // => 5 +``` + +Одинаковый результат подтверждает, что операция коммутативна. + +```text +2 + 3 = 5 3 + 2 = 5 +└──────────┬─────────┘ + одинаковый результат + +2 - 3 = -1 3 - 2 = 1 +└──────────┬─────────┘ + разный результат +``` + +## Некоммутативные операции + +Но не все операции обладают таким свойством. Например, вычитание является некоммутативной операцией: + +```php + -1 +print_r(3 - 2); // => 1 +``` + +Перестановка операндов дает другой результат. + +## В программировании все то же самое + +Коммутативность в программировании работает точно так же, как в арифметике. PHP строго следует математическим правилам. + +Другие некоммутативные операции: + +- Деление: _8 / 2 ≠ 2 / 8_ +- Возведение в степень: _2 **3 ≠ 3** 2_ + +Примеры в коде: + +```php + + [Подробнее про + коммутативность](https://ru.wikipedia.org/wiki/Коммутативность) definitions: - name: Коммутативность description: > diff --git a/modules/20-arithmetics/30-composition/SolutionTest.php b/modules/20-arithmetics/30-composition/SolutionTest.php index c713a965..14c9a37f 100644 --- a/modules/20-arithmetics/30-composition/SolutionTest.php +++ b/modules/20-arithmetics/30-composition/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = '10.5'; + $expected = '660'; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/20-arithmetics/30-composition/index.php b/modules/20-arithmetics/30-composition/index.php index 49c5a8d6..9ce7c99c 100644 --- a/modules/20-arithmetics/30-composition/index.php +++ b/modules/20-arithmetics/30-composition/index.php @@ -1,5 +1,5 @@ 4 +``` + +Сначала выполняется умножение: `10 - 6 = 4`. + +Если же в выражении есть отрицательные числа, унарный минус применяется уже после возведения в степень: + +```php + -4, два в степени два, затем применяется минус +print_r(-2 * 5); // => -10, минус два умноженное на пять +print_r(4 + -2); // => 2 +print_r(6 - -2); // => 8 +``` + +Во всех примерах, кроме первого, сначала вычисляется унарный минус (`-2`), и затем проводятся остальные операции. + +Рассмотрим подробнее последний пример: ```php 400 +print_r(6 - -2); // => 8 ``` -Операции можно соединять друг с другом. Это дает возможность вычислять более сложные составные выражения. Такое свойство операций называется **композицией**. +Сначала вычисляется унарный минус (`-2`), и затем операция превращается в `6 - (-2)`, что дает `8`. Это то же самое, что: -Композиция арифметических операций в программировании аналогична композиции из школьной программы. Она распространяется на все операции, а не только на арифметические. +```php + 8 +``` -Чтобы представить, как происходят вычисления внутри интерпретатора, разберем пример: `2 * 4 * 5 * 10`. +## Что нужно запомнить -1. Сначала вычисляется `2 * 4` и получается выражение `8 * 5 * 10` -2. Затем `8 * 5`. В итоге имеем `40 * 10` -3. В конце происходит последнее умножение, и получается результат `400` +- Выражения могут состоять из нескольких операций. +- PHP вычисляет их поэтапно: слева направо, соблюдая приоритет операций. +- Скобки можно использовать, чтобы явно указать порядок вычислений. diff --git a/modules/20-arithmetics/30-composition/ru/data.yml b/modules/20-arithmetics/30-composition/ru/data.yml index bcab44d9..72350aa7 100644 --- a/modules/20-arithmetics/30-composition/ru/data.yml +++ b/modules/20-arithmetics/30-composition/ru/data.yml @@ -1,3 +1,7 @@ --- name: Композиция операций tips: [] +definitions: + - name: Композиция + description: | + метод объединения нескольких простых операций в одну сложную. diff --git a/modules/20-arithmetics/40-priority/SolutionTest.php b/modules/20-arithmetics/40-priority/SolutionTest.php index 6c9c8994..f4d59c49 100644 --- a/modules/20-arithmetics/40-priority/SolutionTest.php +++ b/modules/20-arithmetics/40-priority/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = '49'; + $expected = '160'; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/20-arithmetics/40-priority/index.php b/modules/20-arithmetics/40-priority/index.php index 3ba8600b..2a2ae3b5 100644 --- a/modules/20-arithmetics/40-priority/index.php +++ b/modules/20-arithmetics/40-priority/index.php @@ -1,5 +1,5 @@ 6 ``` -Интерпретатор производит арифметические вычисления в правильном порядке: сначала деление и умножение, потом сложение и вычитание, а приоритет возведения в степень выше всех остальных арифметических операций: `2 ** 3 * 2` вычислится в `16`. +Результат равен 6, а не 8. Это объясняется понятием приоритета операций в математике и программировании. Он определяет порядок, в котором выполняются действия: + +- Умножение и деление выполняются раньше сложения и вычитания. +- Возведение в степень (**) имеет еще более высокий приоритет. + +```text +Приоритет операций (от высокого к низкому): + + ** возведение в степень + ↓ + * / % умножение, деление, остаток + ↓ + + - сложение, вычитание +``` + +Например: + +```php + 16, потому что сначала 2 ** 3 = 8, затем 8 * 2 = 16 +``` + +Если рядом идут операции с одинаковым приоритетом, они выполняются слева направо: + +```php + 12, потому что сначала 8 / 2 = 4, затем 4 * 3 = 12 +``` + +## Управление порядком действий + +Иногда нужно изменить порядок вычислений. Для этого используются круглые скобки. Они позволяют задать, какие действия нужно выполнить в первую очередь: + +```php + 8 +``` -Иногда вычисления должны происходить в другом порядке. В этом случае приоритет задают круглыми скобками, например: `(2 + 2) * 2`. Скобки можно ставить вокруг любой операции. Они могут вкладываться друг в друга сколько угодно раз. Вот пара примеров: +Скобки можно ставить вокруг любой части выражения и вкладывать их друг в друга: ```php 9 +print_r(3 ** (4 - 2)); // => 9 print_r(7 * 3 + (4 / 2) - (8 + (2 - 1))); // => 14 ``` -В этом случае главное закрывать скобки в правильном порядке. Это часто становится причиной ошибок не только у новичков, но и у опытных программистов. Для удобства можно сразу ставить открывающую и закрывающую скобки, а потом писать внутреннюю часть. +Главное правило: всегда закрывайте скобки. Непарные скобки вызывают ошибки: и новички, и опытные программисты иногда забывают про закрывающую скобку. -Сейчас большинство редакторов кода делают это автоматически. Например, мы ставим открывающую скобку, а он автоматически ставит закрывающую. Это касается и других парных символов, например, кавычек. О них — в будущих уроках. +> Пишите скобки сразу парой. Например, вводите () и потом заполняйте внутреннюю часть. Большинство редакторов кода (в том числе наш) автоматически добавляют закрывающую скобку, как только вы пишете открывающую. Это касается и других парных символов, например, кавычек. + +## Повышаем читаемость + +Иногда выражение работает правильно, но выглядит запутанно. В таких случаях скобки можно добавить просто для наглядности: они не изменят результат, но улучшат восприятие. + +```php + 10.5 + +// Стало +print_r(((8 / 2) + 5) - (-3 / 2)); // => 10.5 +``` -Иногда выражение сложно воспринимать визуально. Тогда можно расставить скобки, не повлияв на приоритет. Код пишется для людей, а машины будут только исполнять его. Для машин код — или корректный, или не корректный. Для них нет «более» понятного или «менее» понятного кода. Явная расстановка приоритетов упрощает чтение кода другими разработчиками. +Программы пишут люди, и читают их тоже люди. Компьютеру все равно, насколько понятно написан код: достаточно, чтобы он был синтаксически правильным. Для человека понятный и аккуратный код является залогом удобства, особенно при работе в команде или разборе ошибок. diff --git a/modules/20-arithmetics/40-priority/ru/data.yml b/modules/20-arithmetics/40-priority/ru/data.yml index 84df3bea..f716ee70 100644 --- a/modules/20-arithmetics/40-priority/ru/data.yml +++ b/modules/20-arithmetics/40-priority/ru/data.yml @@ -4,3 +4,8 @@ tips: - > [Приоритет операторов](https://www.php.net/manual/ru/language.operators.precedence.php) +definitions: + - name: Выражение + description: > + последовательность действий над данными, приводящая к каком-то результату, + который можно использовать. diff --git a/modules/20-arithmetics/43-float/Makefile b/modules/20-arithmetics/43-float/Makefile new file mode 100644 index 00000000..d0d0a48c --- /dev/null +++ b/modules/20-arithmetics/43-float/Makefile @@ -0,0 +1,2 @@ +test: + @ test.sh diff --git a/modules/20-arithmetics/43-float/SolutionTest.php b/modules/20-arithmetics/43-float/SolutionTest.php new file mode 100644 index 00000000..76a93d5d --- /dev/null +++ b/modules/20-arithmetics/43-float/SolutionTest.php @@ -0,0 +1,17 @@ +expectOutputString($expected); + require 'index.php'; + } +} diff --git a/modules/20-arithmetics/43-float/description.es.yml b/modules/20-arithmetics/43-float/description.es.yml new file mode 100644 index 00000000..cc64fd90 --- /dev/null +++ b/modules/20-arithmetics/43-float/description.es.yml @@ -0,0 +1,73 @@ +--- + +name: Números de punto flotante +theory: | + En matemáticas hay diferentes tipos de números. Por ejemplo: + + - Naturales: números enteros positivos: 1, 2, 3, etc. + - Racionales: números fraccionarios que se pueden representar como una división, por ejemplo: 0.5, 1.75, 3.14. + + Desde el punto de vista de las matemáticas, todo es simple. Pero desde el punto de vista de la computadora, entre estos tipos de números hay un verdadero abismo. Intenta resolver mentalmente: ¿cuánto es `0.2` + `0.1`? Obviamente, `0.3`. PHP mostrará lo mismo al imprimir: + + ```php + 0.3 + ``` + + Todo parece estar bien. Pero hagamos una comprobación: restemos 0.3 de esta suma. Matemáticamente, el resultado debería ser exactamente cero. Esto es lo que dice PHP: + + ```php + 5.5511151231258E-17 + ``` + + En lugar de cero obtenemos una pequeña «cola»: un número en notación exponencial, aproximadamente igual a 0.000000000000000055. La cuestión es que internamente PHP no almacena exactamente 0.3, sino una aproximación de 0.30000000000000004. Al imprimir, el número se redondea a 14 dígitos significativos, por lo que el error no es visible. Pero no desaparece de los cálculos. + + ## ¿Por qué sucede esto? + + Este comportamiento es típico de Python, JavaScript y la mayoría de los demás lenguajes de programación. + + La razón está en el funcionamiento de la computadora. Una computadora trabaja con memoria limitada, mientras que los números racionales son infinitamente precisos. Entre 0.1 y 0.2 se pueden colocar infinitos números. Pero la computadora no puede almacenar el infinito. Aproxima el número, tratando de ajustarlo a la cantidad de bits disponible. + + Estos valores aproximados se llaman números de punto flotante (floating point numbers). Su almacenamiento y los cálculos con ellos siguen reglas estrictas descritas en un estándar especial, IEEE 754, en el que se basan la mayoría de los lenguajes de programación. + + ## Cuándo aparecen estos números + + Los números de punto flotante aparecen en los programas con más frecuencia de lo que parece. Estos son los casos principales: + + - Cuando escribes explícitamente un número fraccionario, por ejemplo 0.1, 2.5, 3.14. + - Cuando realizas una división con resultado fraccionario: + + ```php + 0.5 + print_r(2 / 3); // => 0.66666666666667 + ``` + + Incluso si el resultado parece «bonito», internamente sigue representado como un valor aproximado. Algunas fracciones, como 1 / 3, no pueden representarse exactamente en el sistema binario, por lo que su precisión siempre es limitada. + + ## Dónde es crítico y cómo se trabaja con esto + + Normalmente, un pequeño error no molesta. Pero en cálculos financieros, tareas científicas y de ingeniería, así como en la comparación exacta de resultados, puede convertirse en un problema. En los programas reales, el dinero a menudo se almacena en unidades mínimas, por ejemplo en centavos, es decir, se usan números enteros en lugar de fraccionarios. En otros casos, el resultado se redondea a la cantidad necesaria de dígitos, los números se comparan con un margen de error aceptable o se usan tipos de datos y bibliotecas especiales para cálculos exactos. + + ## Qué hay que recordar + + Las operaciones con números de punto flotante no siempre son exactas, y esto es normal. PHP redondea los números al imprimir, por lo que el error no siempre es visible en la pantalla, pero está presente en los cálculos. La precisión se puede controlar, por ejemplo, mediante el redondeo o la comparación de números con un margen de error dado. Al trabajar con dinero, mediciones precisas o cálculos científicos, es mejor usar tipos de datos especiales que proporcionen control sobre la precisión. + +instructions: | + Estás pagando dos productos en una tienda en línea: el primero cuesta 0.1 rublos, el segundo — 0.2 rublos. El programa de caja debe verificar la precisión de los cálculos: restar los 0.3 rublos esperados del total. + + Calcula e imprime esta diferencia. Esperas ver cero, pero PHP mostrará algo interesante. + +tips: + - > + [Lo que todo informático debe saber sobre la aritmética de punto + flotante](https://www.validlab.com/goldberg/paper.pdf) + +definitions: + - name: Número racional + description: | + un número que se puede representar como una fracción común. diff --git a/modules/20-arithmetics/43-float/en/EXERCISE.md b/modules/20-arithmetics/43-float/en/EXERCISE.md new file mode 100644 index 00000000..d40ef1f6 --- /dev/null +++ b/modules/20-arithmetics/43-float/en/EXERCISE.md @@ -0,0 +1,3 @@ +You are paying for two items in an online store: the first one costs 0.1 rubles, the second one costs 0.2 rubles. The checkout program must verify the accuracy of the calculations: subtract the expected 0.3 rubles from the total. + +Calculate and print this difference. You expect to see zero — but PHP will show something interesting. diff --git a/modules/20-arithmetics/43-float/en/README.md b/modules/20-arithmetics/43-float/en/README.md new file mode 100644 index 00000000..b0292b4f --- /dev/null +++ b/modules/20-arithmetics/43-float/en/README.md @@ -0,0 +1,54 @@ +In mathematics there are different types of numbers. For example: + +- Natural numbers: positive integers: 1, 2, 3, and so on. +- Rational numbers: fractional numbers that can be represented as a division, for example: 0.5, 1.75, 3.14. + +From the point of view of mathematics, everything is simple. But from the computer's point of view, there is a real chasm between these types of numbers. Try to solve mentally: what is `0.2` + `0.1`? Obviously, `0.3`. PHP will show the same when printing: + +```php + 0.3 +``` + +Everything seems fine. But let's check: subtract 0.3 from this sum. Mathematically, the result should be exactly zero. Here is what PHP says: + +```php + 5.5511151231258E-17 +``` + +Instead of zero, we get a tiny "tail" — a number in exponential notation, approximately equal to 0.000000000000000055. The thing is that internally PHP stores not exactly 0.3, but an approximation of 0.30000000000000004. When printing, the number is rounded to 14 significant digits, so the error is not visible. But it does not disappear from the calculations themselves. + +## Why does this happen? + +This behavior is typical for Python, JavaScript, and most other programming languages. + +The reason lies in how computers work. A computer operates with limited memory, while rational numbers are infinitely precise. Infinitely many other numbers can fit between 0.1 and 0.2. But a computer cannot store infinity. It approximates the number, trying to fit it into the available number of bits. + +Such approximate values are called floating point numbers. Their storage and calculations follow strict rules described in a special standard, IEEE 754, which most programming languages rely on. + +## When such numbers appear + +Floating point numbers appear in programs more often than it may seem. Here are the main cases: + +- When you explicitly write a fractional number, for example 0.1, 2.5, 3.14. +- When you perform division with a fractional result: + +```php + 0.5 +print_r(2 / 3); // => 0.66666666666667 +``` + +Even if the result looks "nice", internally it is still represented as an approximate value. Some fractions, such as 1 / 3, cannot be exactly represented in the binary system at all, so their precision is always limited. + +## Where it is critical and how to deal with it + +Usually a small error does not interfere. But in financial calculations, scientific and engineering tasks, as well as in exact comparison of results, it can become a problem. In real programs, money is often stored in minimal units, such as cents, that is, integers are used instead of fractions. In other cases, the result is rounded to the required number of digits, numbers are compared with an acceptable error margin, or special data types and libraries for exact calculations are used. + +## What to remember + +Operations with floating point numbers are not always exact, and this is normal. PHP rounds numbers when printing, so the error is not always visible on the screen — but it is present in the calculations. Precision can be controlled, for example, by rounding or comparing numbers with a given error margin. When working with money, precise measurements, or scientific calculations, it is better to use special data types that provide control over precision. diff --git a/modules/20-arithmetics/43-float/en/data.yml b/modules/20-arithmetics/43-float/en/data.yml new file mode 100644 index 00000000..397451b0 --- /dev/null +++ b/modules/20-arithmetics/43-float/en/data.yml @@ -0,0 +1,10 @@ +--- +name: Floating point numbers +tips: + - > + [What every computer scientist should know about floating-point + arithmetic](https://www.validlab.com/goldberg/paper.pdf) +definitions: + - name: Rational number + description: | + a number that can be represented as a common fraction. diff --git a/modules/20-arithmetics/43-float/es/EXERCISE.md b/modules/20-arithmetics/43-float/es/EXERCISE.md new file mode 100644 index 00000000..a73e3298 --- /dev/null +++ b/modules/20-arithmetics/43-float/es/EXERCISE.md @@ -0,0 +1,3 @@ +Estás pagando dos productos en una tienda en línea: el primero cuesta 0.1 rublos, el segundo — 0.2 rublos. El programa de caja debe verificar la precisión de los cálculos: restar los 0.3 rublos esperados del total. + +Calcula e imprime esta diferencia. Esperas ver cero, pero PHP mostrará algo interesante. diff --git a/modules/20-arithmetics/43-float/es/README.md b/modules/20-arithmetics/43-float/es/README.md new file mode 100644 index 00000000..987069ea --- /dev/null +++ b/modules/20-arithmetics/43-float/es/README.md @@ -0,0 +1,54 @@ +En matemáticas hay diferentes tipos de números. Por ejemplo: + +- Naturales: números enteros positivos: 1, 2, 3, etc. +- Racionales: números fraccionarios que se pueden representar como una división, por ejemplo: 0.5, 1.75, 3.14. + +Desde el punto de vista de las matemáticas, todo es simple. Pero desde el punto de vista de la computadora, entre estos tipos de números hay un verdadero abismo. Intenta resolver mentalmente: ¿cuánto es `0.2` + `0.1`? Obviamente, `0.3`. PHP mostrará lo mismo al imprimir: + +```php + 0.3 +``` + +Todo parece estar bien. Pero hagamos una comprobación: restemos 0.3 de esta suma. Matemáticamente, el resultado debería ser exactamente cero. Esto es lo que dice PHP: + +```php + 5.5511151231258E-17 +``` + +En lugar de cero obtenemos una pequeña «cola»: un número en notación exponencial, aproximadamente igual a 0.000000000000000055. La cuestión es que internamente PHP no almacena exactamente 0.3, sino una aproximación de 0.30000000000000004. Al imprimir, el número se redondea a 14 dígitos significativos, por lo que el error no es visible. Pero no desaparece de los cálculos. + +## ¿Por qué sucede esto? + +Este comportamiento es típico de Python, JavaScript y la mayoría de los demás lenguajes de programación. + +La razón está en el funcionamiento de la computadora. Una computadora trabaja con memoria limitada, mientras que los números racionales son infinitamente precisos. Entre 0.1 y 0.2 se pueden colocar infinitos números. Pero la computadora no puede almacenar el infinito. Aproxima el número, tratando de ajustarlo a la cantidad de bits disponible. + +Estos valores aproximados se llaman números de punto flotante (floating point numbers). Su almacenamiento y los cálculos con ellos siguen reglas estrictas descritas en un estándar especial, IEEE 754, en el que se basan la mayoría de los lenguajes de programación. + +## Cuándo aparecen estos números + +Los números de punto flotante aparecen en los programas con más frecuencia de lo que parece. Estos son los casos principales: + +- Cuando escribes explícitamente un número fraccionario, por ejemplo 0.1, 2.5, 3.14. +- Cuando realizas una división con resultado fraccionario: + +```php + 0.5 +print_r(2 / 3); // => 0.66666666666667 +``` + +Incluso si el resultado parece «bonito», internamente sigue representado como un valor aproximado. Algunas fracciones, como 1 / 3, no pueden representarse exactamente en el sistema binario, por lo que su precisión siempre es limitada. + +## Dónde es crítico y cómo se trabaja con esto + +Normalmente, un pequeño error no molesta. Pero en cálculos financieros, tareas científicas y de ingeniería, así como en la comparación exacta de resultados, puede convertirse en un problema. En los programas reales, el dinero a menudo se almacena en unidades mínimas, por ejemplo en centavos, es decir, se usan números enteros en lugar de fraccionarios. En otros casos, el resultado se redondea a la cantidad necesaria de dígitos, los números se comparan con un margen de error aceptable o se usan tipos de datos y bibliotecas especiales para cálculos exactos. + +## Qué hay que recordar + +Las operaciones con números de punto flotante no siempre son exactas, y esto es normal. PHP redondea los números al imprimir, por lo que el error no siempre es visible en la pantalla, pero está presente en los cálculos. La precisión se puede controlar, por ejemplo, mediante el redondeo o la comparación de números con un margen de error dado. Al trabajar con dinero, mediciones precisas o cálculos científicos, es mejor usar tipos de datos especiales que proporcionen control sobre la precisión. diff --git a/modules/20-arithmetics/43-float/es/data.yml b/modules/20-arithmetics/43-float/es/data.yml new file mode 100644 index 00000000..a54d5e6e --- /dev/null +++ b/modules/20-arithmetics/43-float/es/data.yml @@ -0,0 +1,10 @@ +--- +name: Números de punto flotante +tips: + - > + [Lo que todo informático debe saber sobre la aritmética de punto + flotante](https://www.validlab.com/goldberg/paper.pdf) +definitions: + - name: Número racional + description: | + un número que se puede representar como una fracción común. diff --git a/modules/20-arithmetics/43-float/index.php b/modules/20-arithmetics/43-float/index.php new file mode 100644 index 00000000..9dcfa518 --- /dev/null +++ b/modules/20-arithmetics/43-float/index.php @@ -0,0 +1,5 @@ + 0.3 +``` + +Кажется, все в порядке. Но проведем проверку: вычтем из этой суммы 0.3. Математически должен получиться ровно ноль. А вот что скажет PHP: + +```php + 5.5511151231258E-17 +``` + +Вместо нуля мы получаем крошечный «хвостик» — число в экспоненциальной записи, равное примерно 0.000000000000000055. Дело в том, что внутри PHP хранит не ровно 0.3, а приближение 0.30000000000000004. При выводе число округляется до 14 значащих цифр, поэтому погрешность не видна. Но в самих вычислениях она никуда не девается. + +```text +Ожидание: 0.1 + 0.2 → 0.3 +Реальность: 0.1 + 0.2 → 0.30000000000000004 + └── погрешность хранения +Проверка: 0.1 + 0.2 - 0.3 → 5.5511151231258E-17 (а не 0) +``` + +## Почему так происходит? + +Такое поведение характерно для Python, JavaScript и большинства других языков программирования. + +Причина в устройстве компьютера. Компьютер работает с ограниченной памятью, тогда как рациональные числа бесконечно точны. Между 0.1 и 0.2 можно поместить бесконечно много других чисел. Но компьютер не может хранить бесконечность. Он приближает число, стараясь уместить его в доступное количество бит. + +Такие приближенные значения называются числами с плавающей точкой (floating point numbers). Хранение и вычисления с ними подчиняются строгим правилам, описанным в специальном стандарте IEEE 754, на который ориентируются большинство языков программирования. + +## Когда появляются такие числа + +Числа с плавающей точкой появляются в программах чаще, чем может показаться. Вот основные случаи: + +- Когда вы явно пишете дробное число, например 0.1, 2.5, 3.14. +- Когда выполняете деление с дробным результатом: + +```php + 0.5 +print_r(2 / 3); // => 0.66666666666667 +``` + +Даже если результат кажется «красивым», внутри он все равно представлен в виде приближенного значения. Некоторые дроби, такие как 1 / 3, вообще не могут быть точно представлены в двоичной системе, поэтому их точность всегда ограничена. + +## Где это критично и как с этим работают + +Обычно небольшая погрешность не мешает. Но в финансовых расчетах, научных и инженерных задачах, а также при точном сравнении результатов она может стать проблемой. Например, ошибка в доли копейки способна дать неправильную итоговую сумму, а длинная цепочка вычислений может постепенно накапливать неточность. + +В реальных программах с этим работают по-разному. Деньги часто хранят в минимальных единицах, например в копейках, то есть используют целые числа вместо дробных. В других случаях результат округляют до нужного количества знаков, сравнивают числа с допустимой погрешностью или используют специальные типы данных и библиотеки для точных вычислений. + +## Что нужно запомнить + +Операции с числами с плавающей точкой не всегда точны, и это нормально. Такое поведение характерно для большинства языков программирования и объясняется устройством компьютерной памяти. PHP при выводе округляет числа, поэтому погрешность не всегда видна на экране — но в вычислениях она присутствует. Точность можно контролировать, например с помощью округления или сравнения чисел с заданной погрешностью. А при работе с деньгами, точными измерениями или научными расчетами лучше использовать специальные типы данных, которые обеспечивают контроль над точностью. diff --git a/modules/20-arithmetics/43-float/ru/data.yml b/modules/20-arithmetics/43-float/ru/data.yml new file mode 100644 index 00000000..5886c55a --- /dev/null +++ b/modules/20-arithmetics/43-float/ru/data.yml @@ -0,0 +1,10 @@ +--- +name: Числа с плавающей точкой +tips: + - > + [Что нужно знать про арифметику с плавающей + запятой](https://habr.com/ru/articles/112953/) +definitions: + - name: Рациональное число + description: | + число, которое можно представить в виде обыкновенной дроби. diff --git a/modules/20-arithmetics/45-linting/ru/README.md b/modules/20-arithmetics/45-linting/ru/README.md index 6b52622b..acb541ab 100644 --- a/modules/20-arithmetics/45-linting/ru/README.md +++ b/modules/20-arithmetics/45-linting/ru/README.md @@ -1,8 +1,8 @@ -В этом уроке мы узнаем, что такое стандарты по написанию кода. Они облегчают разработку и делают код более понятным. Мы подробнее разберем две основные рекомендации по PHP, которые содержат правила по написанию кода. +Когда разные разработчики пишут код в разном стиле, код становится трудночитаемым: где-то пробел лишний, где-то отступы разные. Чтобы избежать разногласий, программисты договорились соблюдать единый стиль кодирования. Этот свод правил описывает, как должен выглядеть код: расстановку пробелов, оформление функций и названия переменных. -## Стандарты по написанию кода в PHP +Единый стиль означает код, одинаково понятный всем членам команды, независимо от того, кто его написал. Это экономит время, снижает количество ошибок и упрощает совместную работу. -Код нужно оформлять так, чтобы он был понятным и простым в поддержке. Для этого существуют специальные наборы правил — **стандарты**. Они описывают различные аспекты написания кода. +## Стандарты кодирования В PHP самыми распространенными являются стандарты **PSR** — PHP Standards Recommendations или стандартные рекомендации PHP от [PHP-FIG](https://www.php-fig.org/psr/). Это набор правил, которые облегчают разработку и решают определенную проблему. @@ -12,11 +12,49 @@ * PSR-1. [Basic Coding Standard](https://www.php-fig.org/psr/psr-1/) — базовый стандарт написания кода. Это набор правил, которые определяют, как следует оформлять программный код: как писать теги PHP, по каким правилам именовать классы, методы и константы классов. Он также затрагивает вопросы кодировки, автозагрузки, пространства имен и разделения ответственности между файлами * PSR-12. [Extended Coding Style](https://www.php-fig.org/psr/psr-12/) — расширенный стандарт стиля кодирования, заменяет и дополняет устаревший PSR-2. Этот стандарт требует выполнения правил PSR-1. Также он добавляет множество новых требований: к отступам, файлам, строкам, ключевым словам, классам, управляющим конструкциям, области видимости и другим элементам -## Линтеры в PHP +Эти стандарты знают и используют все PHP-разработчики. Новичкам полезно время от времени заглядывать в них и вырабатывать правильные привычки с самого начала. Однако запоминать все сразу нет необходимости. -В любом языке программирования существуют специальные инструменты — **линтеры**. Они проверяют код на соответствие стандартам. Повсеместно используемым линтером в PHP является [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer). +## Линтеры: автоматическая проверка кода -Допустим, у нас есть файл с таким PHP-кодом: +Запоминать все правила вручную не нужно. Существуют специальные программы, которые делают это за вас. Они называются линтеры. + +Линтер представляет собой инструмент, который анализирует ваш код и сообщает о нарушениях стандартов. Он помогает: + +- Избавиться от лишних пробелов +- Соблюдать отступы +- Писать читаемые и красивые выражения + +В мире PHP широко используются два инструмента: [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer), который проверяет код на соответствие стандартам, и [PHP CS Fixer](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer), который умеет не только находить нарушения, но и исправлять их автоматически. В этом курсе используется PHP CS Fixer. + +Рассмотрим пример: + +```php + 10.5 ``` -Этот вариант уже не нарушает правил, и линтер будет «молчать». +Этот вариант уже не нарушает правил, и линтер будет «молчать». Когда вы только начинаете, такие мелочи могут казаться неважными. Но со временем становится понятно, что именно они формируют единый читаемый стиль. + +## Использование линтера в своих проектах + +Когда вы начнете писать собственные проекты за пределами учебной платформы, линтер будет незаменимым помощником. Его можно настроить в любом редакторе кода, запустить в терминале или подключить к сборке проекта. Линтер показывает ошибки, а PHP CS Fixer умеет и исправлять их автоматически. diff --git a/modules/20-arithmetics/45-linting/ru/data.yml b/modules/20-arithmetics/45-linting/ru/data.yml index 2dd0d71d..9725e2e8 100644 --- a/modules/20-arithmetics/45-linting/ru/data.yml +++ b/modules/20-arithmetics/45-linting/ru/data.yml @@ -1,3 +1,7 @@ --- name: Линтер -tips: [] +tips: + - | + [PSR-12](https://www.php-fig.org/psr/psr-12/) + - | + [PHP CS Fixer](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer) From 4070331d62fd9ecf650dc5e225ff8108451e5eae Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 5 Jun 2026 17:42:02 +0500 Subject: [PATCH 03/29] =?UTF-8?q?feat(30-variables):=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20Python?= =?UTF-8?q?=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 10-definition, 12-change, 13-variables-naming, 15, 18, 19, 23: теория RU доведена до паритета с exercises-python, примеры адаптированы под PHP 8.4 - rename: 15-expressions -> 15-variables-expressions, 18-concatenation -> 18-variable-concatenation (выравнивание slug по Python) - delete: 14-errors (тема влита в 10-definition, прецедент JS) - задания выровнены под сюжеты Python: 10 (url), 12 (deliveryStatus), 18 (письмо магазина), 19 (стоимость заказа), 20 (склад), 23 (MAX_LOGIN_ATTEMPTS); 13 и 15 сохранены (эквивалентны) - data.yml: definitions/tips перенесены из Python Co-Authored-By: Claude Opus 4.8 (1M context) --- .../10-definition/SolutionTest.php | 2 +- modules/30-variables/10-definition/index.php | 6 +- .../30-variables/10-definition/ru/EXERCISE.md | 4 +- .../30-variables/10-definition/ru/README.md | 115 ++++++++++++++++-- .../30-variables/10-definition/ru/data.yml | 5 +- .../30-variables/12-change/SolutionTest.php | 2 +- modules/30-variables/12-change/index.php | 6 +- modules/30-variables/12-change/ru/EXERCISE.md | 14 ++- modules/30-variables/12-change/ru/README.md | 42 ++++++- modules/30-variables/12-change/ru/data.yml | 5 +- .../13-variables-naming/ru/README.md | 40 +++++- .../13-variables-naming/ru/data.yml | 10 +- .../30-variables/14-errors/SolutionTest.php | 17 --- .../30-variables/14-errors/description.es.yml | 30 ----- modules/30-variables/14-errors/en/EXERCISE.md | 8 -- modules/30-variables/14-errors/en/README.md | 13 -- modules/30-variables/14-errors/en/data.yml | 2 - modules/30-variables/14-errors/es/EXERCISE.md | 7 -- modules/30-variables/14-errors/es/README.md | 13 -- modules/30-variables/14-errors/es/data.yml | 4 - modules/30-variables/14-errors/index.php | 11 -- modules/30-variables/14-errors/ru/EXERCISE.md | 7 -- modules/30-variables/14-errors/ru/README.md | 13 -- modules/30-variables/14-errors/ru/data.yml | 4 - .../30-variables/15-expressions/ru/README.md | 69 ----------- .../30-variables/15-expressions/ru/data.yml | 5 - .../Makefile | 0 .../SolutionTest.php | 0 .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../index.php | 0 .../ru/EXERCISE.md | 0 .../15-variables-expressions/ru/README.md | 82 +++++++++++++ .../15-variables-expressions/ru/data.yml | 12 ++ .../30-variables/18-concatenation/Makefile | 2 - .../30-variables/18-concatenation/index.php | 12 -- .../18-concatenation/ru/EXERCISE.md | 18 --- .../18-concatenation/ru/README.md | 32 ----- .../Makefile | 0 .../SolutionTest.php | 6 +- .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../18-variable-concatenation/index.php | 11 ++ .../18-variable-concatenation/ru/EXERCISE.md | 15 +++ .../18-variable-concatenation/ru/README.md | 81 ++++++++++++ .../ru/data.yml | 7 +- .../19-naming-style/SolutionTest.php | 2 +- .../30-variables/19-naming-style/index.php | 6 +- .../19-naming-style/ru/EXERCISE.md | 7 +- .../30-variables/19-naming-style/ru/README.md | 50 ++++++-- .../30-variables/19-naming-style/ru/data.yml | 4 +- .../20-magic-numbers/SolutionTest.php | 2 +- .../30-variables/20-magic-numbers/index.php | 10 +- .../20-magic-numbers/ru/EXERCISE.md | 22 ++-- .../30-variables/20-magic-numbers/ru/data.yml | 5 +- .../23-constants/SolutionTest.php | 2 +- modules/30-variables/23-constants/index.php | 2 +- .../30-variables/23-constants/ru/EXERCISE.md | 2 +- .../30-variables/23-constants/ru/README.md | 55 ++++++--- 69 files changed, 535 insertions(+), 366 deletions(-) delete mode 100644 modules/30-variables/14-errors/SolutionTest.php delete mode 100644 modules/30-variables/14-errors/description.es.yml delete mode 100644 modules/30-variables/14-errors/en/EXERCISE.md delete mode 100644 modules/30-variables/14-errors/en/README.md delete mode 100644 modules/30-variables/14-errors/en/data.yml delete mode 100644 modules/30-variables/14-errors/es/EXERCISE.md delete mode 100644 modules/30-variables/14-errors/es/README.md delete mode 100644 modules/30-variables/14-errors/es/data.yml delete mode 100644 modules/30-variables/14-errors/index.php delete mode 100644 modules/30-variables/14-errors/ru/EXERCISE.md delete mode 100644 modules/30-variables/14-errors/ru/README.md delete mode 100644 modules/30-variables/14-errors/ru/data.yml delete mode 100644 modules/30-variables/15-expressions/ru/README.md delete mode 100644 modules/30-variables/15-expressions/ru/data.yml rename modules/30-variables/{14-errors => 15-variables-expressions}/Makefile (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/SolutionTest.php (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/description.es.yml (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/en/EXERCISE.md (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/en/README.md (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/en/data.yml (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/es/EXERCISE.md (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/es/README.md (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/es/data.yml (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/index.php (100%) rename modules/30-variables/{15-expressions => 15-variables-expressions}/ru/EXERCISE.md (100%) create mode 100644 modules/30-variables/15-variables-expressions/ru/README.md create mode 100644 modules/30-variables/15-variables-expressions/ru/data.yml delete mode 100644 modules/30-variables/18-concatenation/Makefile delete mode 100644 modules/30-variables/18-concatenation/index.php delete mode 100644 modules/30-variables/18-concatenation/ru/EXERCISE.md delete mode 100644 modules/30-variables/18-concatenation/ru/README.md rename modules/30-variables/{15-expressions => 18-variable-concatenation}/Makefile (100%) rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/SolutionTest.php (67%) rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/description.es.yml (100%) rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/en/EXERCISE.md (100%) rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/en/README.md (100%) rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/en/data.yml (100%) rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/es/EXERCISE.md (100%) rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/es/README.md (100%) rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/es/data.yml (100%) create mode 100644 modules/30-variables/18-variable-concatenation/index.php create mode 100644 modules/30-variables/18-variable-concatenation/ru/EXERCISE.md create mode 100644 modules/30-variables/18-variable-concatenation/ru/README.md rename modules/30-variables/{18-concatenation => 18-variable-concatenation}/ru/data.yml (52%) diff --git a/modules/30-variables/10-definition/SolutionTest.php b/modules/30-variables/10-definition/SolutionTest.php index be4ef46d..d1d569e0 100644 --- a/modules/30-variables/10-definition/SolutionTest.php +++ b/modules/30-variables/10-definition/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = 'What Is Dead May Never Die!'; + $expected = "https://hexlet.io\nhttps://hexlet.io"; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/30-variables/10-definition/index.php b/modules/30-variables/10-definition/index.php index ff5bbc77..2cb5df49 100644 --- a/modules/30-variables/10-definition/index.php +++ b/modules/30-variables/10-definition/index.php @@ -1,6 +1,8 @@ Father! -// => Father! ``` -В строчке `$greeting = 'Father!'` значение `'Father!'` присваивается переменной с именем `$greeting`. В PHP имена переменных начинаются со знака *$*. В итоге переменная указывает на данные, которые были в нее записаны. +Результат: + +```text +Father! +Father! +``` + +**Переменная** представляет собой имя, за которым хранится значение. В нашем примере мы создали переменную с именем `$greeting` и записали в нее строку `'Father!'`. + +```text +$greeting = 'Father!'; + +Переменная Значение +┌───────────┐ ┌──────────┐ +│ $greeting │ ──→│ 'Father!'│ +└───────────┘ └──────────┘ +``` + +Строчка `$greeting = 'Father!'` читается так: "возьми значение `'Father!'` и присвой его переменной с именем `$greeting`". Знак `=` здесь является оператором присваивания, а не обозначением равенства как в математике. Он кладет значение в переменную. -Когда переменная создана, можно начать ее использовать. +Когда мы пишем `print_r($greeting)`, интерпретатор подставляет вместо имени `$greeting` то значение, которое в ней хранится. В результате на экран выводится строка `'Father!'`. -## Использование переменной +```text +print_r($greeting) + | + v +print_r('Father!') +``` + +## Имена переменных + +Имена переменных придумывает сам программист. В PHP имя переменной всегда начинается со знака `$`, а дальше можно использовать: + +- Латинские буквы (a-z, A-Z), +- цифры (но не в начале), +- нижнее подчеркивание _. + +Примеры допустимых имен: `$greeting`, `$name1`, `$helloWorld`. PHP различает строчные и заглавные буквы. Переменные `$greeting`, `$Greeting` и `$GREETING` являются тремя разными переменными. + +## Переменные и литералы + +В коде важно различать, где мы используем переменную, а где записываем значение напрямую. Это особенно заметно на примере с `print_r()`: + +```php + Mother! +print_r('greeting'); // => greeting +``` + +В первом случае используется **переменная** `$greeting`, и программа подставляет ее значение. Во втором случае `'greeting'` заключено в кавычки, поэтому это **строковый литерал**, то есть готовое значение, написанное прямо в коде. Здесь различить их помогает знак `$`, но с точки зрения интерпретатора это в любом случае абсолютно разные вещи. + +Литералы представляют собой данные, записанные явно (например, `'Hello'`, `42`, `3.14`). Идентификаторы являются именами переменных и функций (например, `$greeting`, `print_r`), которые указывают на уже существующие значения или команды. + +## Порядок использования + +Переменную нужно сначала создать (присвоить ей значение), а уже потом использовать. Если попытаться обратиться к переменной до ее создания, программа выдаст предупреждение, а вместо значения подставит "пустоту" — `null`: + +```php + Alice +``` + +## Несколько переменных в программе + +В одной программе можно создать сколько угодно переменных. Каждая хранит свои данные и не мешает другим: + +```php + + [Именование в + программировании](https://ru.hexlet.io/blog/posts/naming-in-programming?utm_source=code-basics&utm_medium=referral&utm_campaign=blog&utm_content=lesson) definitions: - name: Переменная description: >- diff --git a/modules/30-variables/12-change/SolutionTest.php b/modules/30-variables/12-change/SolutionTest.php index d60ed6be..b215a274 100644 --- a/modules/30-variables/12-change/SolutionTest.php +++ b/modules/30-variables/12-change/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = 'anneirB'; + $expected = 'доставлен'; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/30-variables/12-change/index.php b/modules/30-variables/12-change/index.php index 4409669e..340dea2a 100644 --- a/modules/30-variables/12-change/index.php +++ b/modules/30-variables/12-change/index.php @@ -1,9 +1,9 @@ новое значение +``` diff --git a/modules/30-variables/12-change/ru/README.md b/modules/30-variables/12-change/ru/README.md index 50bbb1fb..36f0468c 100644 --- a/modules/30-variables/12-change/ru/README.md +++ b/modules/30-variables/12-change/ru/README.md @@ -1,9 +1,11 @@ -Со временем внутри программы значения переменных могут изменяться: +Само слово "переменная" подсказывает, что ее значение может меняться. Это одна из главных причин, почему переменные вообще существуют. + +Вот простой пример: ```php Father! @@ -11,8 +13,38 @@ $greeting = 'Mother!'; print_r($greeting); // => Mother! ``` -Имя осталось тем же, но внутри другие данные. Переменные в PHP не требуют специального объявления. Вместо этого переменная объявляется при первом ее использовании в программе. +Здесь мы сначала записали в переменную одну строку (_Father!_), потом другую (_Mother!_). Имя переменной не изменилось, но значение внутри стало другим. + +```text +До: $greeting ──→ 'Father!' + ╳ +После: $greeting ──→ 'Mother!' +``` + +## Зачем вообще менять значение? + +В реальных программах переменные меняются постоянно. Вот несколько причин: + +- Программа реагирует на действия пользователя. Например, пока вы вводите какие-то данные, в формы на сайте, они, в этот момент, вполне вероятно, постоянно меняют переменные, которые эти данные содержат +- Промежуточные результаты. Часто данные проходят через серию преобразований, и на каждом этапе переменная обновляется новым значением. Подобный механизм даже есть в калькуляторах, когда промежуточные значения сохраняются с помощью клавиш `m+` или `m-`. +- Хранение состояния. Если вы пишете игру, то положение персонажа, его здоровье, счет и текущий уровень являются переменными, которые постоянно меняются. + +## Переменные создаются по мере использования + +В PHP переменную не нужно "объявлять заранее": она появляется в момент, когда вы впервые записываете в нее значение: + +```php + - Если в редакторе есть запись `// BEGIN` и `// END`, то код нужно писать - между этими строчками. +tips: [] definitions: - name: Переменная description: >- diff --git a/modules/30-variables/13-variables-naming/ru/README.md b/modules/30-variables/13-variables-naming/ru/README.md index 21792a4c..77bbf870 100644 --- a/modules/30-variables/13-variables-naming/ru/README.md +++ b/modules/30-variables/13-variables-naming/ru/README.md @@ -1,17 +1,45 @@ -В этом уроке мы поговорим об именовании. Изучать эту тему мы начнем с примера. Посмотрим на такую программу: +Представьте, что у нас есть такая программа: ```php [Именование в - программировании](https://ru.hexlet.io/blog/posts/naming-in-programming) + программировании](https://ru.hexlet.io/blog/posts/naming-in-programming?utm_source=code-basics&utm_medium=referral&utm_campaign=blog&utm_content=lesson) - > [Ошибки в именовании - переменных](https://ru.hexlet.io/blog/posts/naming-errors-1) -definitions: [] + переменных](https://ru.hexlet.io/blog/posts/naming-errors-1?utm_source=code-basics&utm_medium=referral&utm_campaign=blog&utm_content=lesson) +definitions: + - name: Переменная + description: >- + способ сохранить информацию и дать ей имя для последующего использования в + коде. diff --git a/modules/30-variables/14-errors/SolutionTest.php b/modules/30-variables/14-errors/SolutionTest.php deleted file mode 100644 index 83cd81d5..00000000 --- a/modules/30-variables/14-errors/SolutionTest.php +++ /dev/null @@ -1,17 +0,0 @@ -expectOutputString($expected); - require 'index.php'; - } -} diff --git a/modules/30-variables/14-errors/description.es.yml b/modules/30-variables/14-errors/description.es.yml deleted file mode 100644 index 66cf5aa3..00000000 --- a/modules/30-variables/14-errors/description.es.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- - -name: Errores al trabajar con variables -theory: | - Es necesario declarar una variable antes de utilizarla. Si se hace después, el programa no funcionará: - - ```php - - Targaryen and Dragon - - -tips: [] - -definitions: [] diff --git a/modules/30-variables/14-errors/en/EXERCISE.md b/modules/30-variables/14-errors/en/EXERCISE.md deleted file mode 100644 index ec8d9933..00000000 --- a/modules/30-variables/14-errors/en/EXERCISE.md +++ /dev/null @@ -1,8 +0,0 @@ - -Find an undeclared variable in the program and declare it by assigning the value `'Dragon'` to it. - -After running the program, the result on the screen should look like this: - -```text -Targaryen and Dragon -``` diff --git a/modules/30-variables/14-errors/en/README.md b/modules/30-variables/14-errors/en/README.md deleted file mode 100644 index c24131df..00000000 --- a/modules/30-variables/14-errors/en/README.md +++ /dev/null @@ -1,13 +0,0 @@ - -The main rule is that a variable must be declared before it can be used. If you do it later, the program simply won't work. - -```php - "Kingsroad" - -// Конкатенируем строку и переменную, в которой записана строка -$first = "Kings"; -$what = $first . "road"; -print_r($what); // => "Kingsroad" - -// Конкатенируем две переменные, в которых записаны строки -$last = 'road'; -$what = $first . $last; -print_r($what); // => "Kingsroad" -``` diff --git a/modules/30-variables/15-expressions/ru/data.yml b/modules/30-variables/15-expressions/ru/data.yml deleted file mode 100644 index 5de10e09..00000000 --- a/modules/30-variables/15-expressions/ru/data.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -name: Выражения в определениях -tips: - - | - Для перевода строчки можно использовать `\n` между выводом долларов и юаней. diff --git a/modules/30-variables/14-errors/Makefile b/modules/30-variables/15-variables-expressions/Makefile similarity index 100% rename from modules/30-variables/14-errors/Makefile rename to modules/30-variables/15-variables-expressions/Makefile diff --git a/modules/30-variables/15-expressions/SolutionTest.php b/modules/30-variables/15-variables-expressions/SolutionTest.php similarity index 100% rename from modules/30-variables/15-expressions/SolutionTest.php rename to modules/30-variables/15-variables-expressions/SolutionTest.php diff --git a/modules/30-variables/15-expressions/description.es.yml b/modules/30-variables/15-variables-expressions/description.es.yml similarity index 100% rename from modules/30-variables/15-expressions/description.es.yml rename to modules/30-variables/15-variables-expressions/description.es.yml diff --git a/modules/30-variables/15-expressions/en/EXERCISE.md b/modules/30-variables/15-variables-expressions/en/EXERCISE.md similarity index 100% rename from modules/30-variables/15-expressions/en/EXERCISE.md rename to modules/30-variables/15-variables-expressions/en/EXERCISE.md diff --git a/modules/30-variables/15-expressions/en/README.md b/modules/30-variables/15-variables-expressions/en/README.md similarity index 100% rename from modules/30-variables/15-expressions/en/README.md rename to modules/30-variables/15-variables-expressions/en/README.md diff --git a/modules/30-variables/15-expressions/en/data.yml b/modules/30-variables/15-variables-expressions/en/data.yml similarity index 100% rename from modules/30-variables/15-expressions/en/data.yml rename to modules/30-variables/15-variables-expressions/en/data.yml diff --git a/modules/30-variables/15-expressions/es/EXERCISE.md b/modules/30-variables/15-variables-expressions/es/EXERCISE.md similarity index 100% rename from modules/30-variables/15-expressions/es/EXERCISE.md rename to modules/30-variables/15-variables-expressions/es/EXERCISE.md diff --git a/modules/30-variables/15-expressions/es/README.md b/modules/30-variables/15-variables-expressions/es/README.md similarity index 100% rename from modules/30-variables/15-expressions/es/README.md rename to modules/30-variables/15-variables-expressions/es/README.md diff --git a/modules/30-variables/15-expressions/es/data.yml b/modules/30-variables/15-variables-expressions/es/data.yml similarity index 100% rename from modules/30-variables/15-expressions/es/data.yml rename to modules/30-variables/15-variables-expressions/es/data.yml diff --git a/modules/30-variables/15-expressions/index.php b/modules/30-variables/15-variables-expressions/index.php similarity index 100% rename from modules/30-variables/15-expressions/index.php rename to modules/30-variables/15-variables-expressions/index.php diff --git a/modules/30-variables/15-expressions/ru/EXERCISE.md b/modules/30-variables/15-variables-expressions/ru/EXERCISE.md similarity index 100% rename from modules/30-variables/15-expressions/ru/EXERCISE.md rename to modules/30-variables/15-variables-expressions/ru/EXERCISE.md diff --git a/modules/30-variables/15-variables-expressions/ru/README.md b/modules/30-variables/15-variables-expressions/ru/README.md new file mode 100644 index 00000000..fe116859 --- /dev/null +++ b/modules/30-variables/15-variables-expressions/ru/README.md @@ -0,0 +1,82 @@ +Мы уже знаем, что выражения можно составлять из нескольких операций. Но если записать все вычисление в одну длинную строку, код быстро становится трудным для чтения. + +Например, вот такая запись работает: + +```php + 431.875 +``` + +PHP легко вычислит это выражение. Но человеку читать такой код уже не так удобно. Сразу возникают вопросы: + +- Что означает `1.25`? +- Что означает `6.91`? +- Где заканчивается один шаг вычисления и начинается следующий? + +Чтобы сделать такие вычисления понятнее, переменные можно использовать внутри других выражений. Сначала программа сохраняет промежуточный результат в переменную, а затем подставляет значение этой переменной в следующее вычисление. + +Переменные помогают разбивать сложные вычисления на понятные части и сохранять промежуточные результаты. + +## Конвертация валют через промежуточную валюту + +Представим, что нужно перевести евро в юани, но напрямую такой курс нам недоступен. Тогда сделаем это в два шага: **евро -> доллары -> юани**. Так часто работают банки при оплате покупок за рубежом. + +## Шаг 1. Евро -> Доллары + +Допустим, курс: 1 евро = 1.25 доллара. Хотим перевести 50 евро: + +```php + 62.5 +``` + +В этой строке `50 * $dollarsPerEuro` является выражением, а `$dollarsCount` представляет собой переменную, в которую записывается результат. PHP сначала вычисляет выражение, а уже потом сохраняет результат в переменную. + +Интерпретатору все равно, как записано выражение: + +```php +$dollarsCount = 62.5; +``` + +или + +```php +$dollarsCount = 50 * $dollarsPerEuro; +``` + +Результат будет один и тот же. Но для человека второй вариант полезнее: по имени `$dollarsCount` сразу видно, что на этом шаге мы получили сумму в долларах. + +## Шаг 2. Доллары -> Юани + +Теперь переведем 50 евро в юани, используя доллар как промежуточную валюту. Допустим, курсы валют: 1 доллар = 6.91 юаней, 1 евро = 1.25 долларов. + +```php +- + способ сохранить информацию и дать ей имя для последующего использования в + коде. diff --git a/modules/30-variables/18-concatenation/Makefile b/modules/30-variables/18-concatenation/Makefile deleted file mode 100644 index d0d0a48c..00000000 --- a/modules/30-variables/18-concatenation/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -test: - @ test.sh diff --git a/modules/30-variables/18-concatenation/index.php b/modules/30-variables/18-concatenation/index.php deleted file mode 100644 index 234fef87..00000000 --- a/modules/30-variables/18-concatenation/index.php +++ /dev/null @@ -1,12 +0,0 @@ - "Kingsroad" -``` - -… а значит сумеем конкатенировать строку и одну переменную, в которой записана строка: - -```php - "Kingsroad" -``` - -… и даже конкатенировать две переменные, в которых записаны строки: - -```php - "Kingsroad" -``` diff --git a/modules/30-variables/15-expressions/Makefile b/modules/30-variables/18-variable-concatenation/Makefile similarity index 100% rename from modules/30-variables/15-expressions/Makefile rename to modules/30-variables/18-variable-concatenation/Makefile diff --git a/modules/30-variables/18-concatenation/SolutionTest.php b/modules/30-variables/18-variable-concatenation/SolutionTest.php similarity index 67% rename from modules/30-variables/18-concatenation/SolutionTest.php rename to modules/30-variables/18-variable-concatenation/SolutionTest.php index 69a3e0e3..6ec61939 100644 --- a/modules/30-variables/18-concatenation/SolutionTest.php +++ b/modules/30-variables/18-variable-concatenation/SolutionTest.php @@ -11,9 +11,9 @@ class SolutionTest extends TestCase public function test() { $expected = <<expectOutputString($expected); diff --git a/modules/30-variables/18-concatenation/description.es.yml b/modules/30-variables/18-variable-concatenation/description.es.yml similarity index 100% rename from modules/30-variables/18-concatenation/description.es.yml rename to modules/30-variables/18-variable-concatenation/description.es.yml diff --git a/modules/30-variables/18-concatenation/en/EXERCISE.md b/modules/30-variables/18-variable-concatenation/en/EXERCISE.md similarity index 100% rename from modules/30-variables/18-concatenation/en/EXERCISE.md rename to modules/30-variables/18-variable-concatenation/en/EXERCISE.md diff --git a/modules/30-variables/18-concatenation/en/README.md b/modules/30-variables/18-variable-concatenation/en/README.md similarity index 100% rename from modules/30-variables/18-concatenation/en/README.md rename to modules/30-variables/18-variable-concatenation/en/README.md diff --git a/modules/30-variables/18-concatenation/en/data.yml b/modules/30-variables/18-variable-concatenation/en/data.yml similarity index 100% rename from modules/30-variables/18-concatenation/en/data.yml rename to modules/30-variables/18-variable-concatenation/en/data.yml diff --git a/modules/30-variables/18-concatenation/es/EXERCISE.md b/modules/30-variables/18-variable-concatenation/es/EXERCISE.md similarity index 100% rename from modules/30-variables/18-concatenation/es/EXERCISE.md rename to modules/30-variables/18-variable-concatenation/es/EXERCISE.md diff --git a/modules/30-variables/18-concatenation/es/README.md b/modules/30-variables/18-variable-concatenation/es/README.md similarity index 100% rename from modules/30-variables/18-concatenation/es/README.md rename to modules/30-variables/18-variable-concatenation/es/README.md diff --git a/modules/30-variables/18-concatenation/es/data.yml b/modules/30-variables/18-variable-concatenation/es/data.yml similarity index 100% rename from modules/30-variables/18-concatenation/es/data.yml rename to modules/30-variables/18-variable-concatenation/es/data.yml diff --git a/modules/30-variables/18-variable-concatenation/index.php b/modules/30-variables/18-variable-concatenation/index.php new file mode 100644 index 00000000..daba7cd5 --- /dev/null +++ b/modules/30-variables/18-variable-concatenation/index.php @@ -0,0 +1,11 @@ + Kingsroad +``` + +Здесь все просто: две строки соединяются в одну. Так работает конкатенация: оператор `.` складывает строки, создавая новую строку. + +## Склеиваем строку и переменную + +Если в переменной `$first` лежит строка "Kings", мы можем спокойно склеить ее с другой строкой: + +```php + Kingsroad +``` + +PHP подставит значение переменной, выполнит операцию и создаст итоговую строку. + +## Склеиваем две переменные + +Точно так же можно объединить значения двух переменных, если обе содержат строки: + +```php + Kingsroad +``` + +Можно добавлять и пробелы: + +```php +$full = $first . ' ' . $last; +print_r($full); // => Kings road +``` + +```text +$first = 'Kings' +$last = 'road' + +$first + ' ' + $last +└─┬──┘ └──┬─┘ +'Kings' . ' ' . 'road' +└─────────┬────────────┘ + 'Kings road' +``` + +## А что если переменная содержит число? + +Попробуем так: + +```php + Age: 42 +``` + +В PHP такой код работает: оператор `.` всегда склеивает строки, поэтому число автоматически преобразуется в строку. Не во всех языках так — например, в Python склеивание строки и числа приводит к ошибке, и число приходится преобразовывать явно. + +То же самое касается переменных с результатами вычислений: + +```php + 431.875 +print_r('Price in yuans: ' . $price); // => Price in yuans: 431.875 +``` + +Автоматическое преобразование удобно, но требует внимательности: иногда в строку превращается не то, что вы ожидали. Подробнее о таком поведении мы поговорим в уроках про типы данных. diff --git a/modules/30-variables/18-concatenation/ru/data.yml b/modules/30-variables/18-variable-concatenation/ru/data.yml similarity index 52% rename from modules/30-variables/18-concatenation/ru/data.yml rename to modules/30-variables/18-variable-concatenation/ru/data.yml index 53c10189..925260ef 100644 --- a/modules/30-variables/18-concatenation/ru/data.yml +++ b/modules/30-variables/18-variable-concatenation/ru/data.yml @@ -6,4 +6,9 @@ tips: чтобы получить такой двухстрочный вывод тела письма. - > Помните, что можно создать строку, которая содержит только управляющую - последовательность `\n`. + последовательность `\n`. Вы можете конкатенировать эту строку с переменными + для правильного форматирования текста. +definitions: + - name: Конкатенация + description: > + операция соединения двух строк. Например, `print_r("King's " . ' Landing')` diff --git a/modules/30-variables/19-naming-style/SolutionTest.php b/modules/30-variables/19-naming-style/SolutionTest.php index 22947d8f..a67f68a5 100644 --- a/modules/30-variables/19-naming-style/SolutionTest.php +++ b/modules/30-variables/19-naming-style/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = "-110"; + $expected = "2000"; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/30-variables/19-naming-style/index.php b/modules/30-variables/19-naming-style/index.php index c15ecce0..b7131ef6 100644 --- a/modules/30-variables/19-naming-style/index.php +++ b/modules/30-variables/19-naming-style/index.php @@ -1,8 +1,8 @@ expectOutputString($expected); require 'index.php'; } diff --git a/modules/30-variables/20-magic-numbers/index.php b/modules/30-variables/20-magic-numbers/index.php index 0f94634c..1254f012 100644 --- a/modules/30-variables/20-magic-numbers/index.php +++ b/modules/30-variables/20-magic-numbers/index.php @@ -1,9 +1,11 @@ + [Магические + числа](https://ru.wikipedia.org/wiki/Магическое_число_(программирование)) diff --git a/modules/30-variables/23-constants/SolutionTest.php b/modules/30-variables/23-constants/SolutionTest.php index 64080d5b..4c0d2634 100644 --- a/modules/30-variables/23-constants/SolutionTest.php +++ b/modules/30-variables/23-constants/SolutionTest.php @@ -9,6 +9,6 @@ class SolutionTest extends TestCase public function test() { require 'index.php'; - $this->assertEquals(3, DRAGONS_BORN_COUNT); + $this->assertEquals(3, MAX_LOGIN_ATTEMPTS); } } diff --git a/modules/30-variables/23-constants/index.php b/modules/30-variables/23-constants/index.php index 51d5eead..63c81dd4 100644 --- a/modules/30-variables/23-constants/index.php +++ b/modules/30-variables/23-constants/index.php @@ -1,5 +1,5 @@ 3.14 ``` -Создание константы отличается от создания переменной. Оно начинается с ключевого слова `const` и последующего имени константы. При этом знак доллара не нужен. Далее ей присваивается нужное значение. +Здесь PI является константой, которая хранит значение числа π. Создание константы отличается от создания переменной: оно начинается с ключевого слова `const`, а знак доллара перед именем не нужен. Смысл константы в том, что ее значение не меняется в ходе работы программы. -Константы принято именовать буквами в верхнем регистре с `_` в качестве разделителя. Константа тоже может использоваться в любом выражении. Единственное ограничение — константу нельзя изменить. +## Чем отличается константа от переменной? -В PHP много встроенных констант, которые можно использовать в любом месте программы. Вот некоторые из них: +Концепт констант распространен в большинстве языков программирования. В PHP константа является отдельной сущностью языка: в отличие от переменной, ее значение нельзя изменить. Попытка определить константу повторно приводит к ошибке: + +```php + Date: Fri, 5 Jun 2026 19:34:54 +0500 Subject: [PATCH 04/29] =?UTF-8?q?feat(25-strings):=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20Python?= =?UTF-8?q?=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rename: 20-strings-concatenation -> 20-string-concatenation (slug по Python) - 10-quotes: теория RU до паритета (терминология строка/строчка, пустые строки, контрольный вопрос), иллюстрация strings.png, tip на доку PHP - 15-escape-characters: структура из Python + PHP-специфика про двойные кавычки, примеры расположения \n, вывод \n как текста, другие последовательности - 20-string-concatenation: схема вычисления, раздел про пробелы, управляющие последовательности, заключение; оператор . вместо + - 30-encoding: история ASCII, кракозябры, Unicode/UTF-8, зачем знать программисту; tips из Python - задания не тронуты: педагогически эквивалентны Python Co-Authored-By: Claude Opus 4.8 (1M context) --- modules/25-strings/10-quotes/ru/README.md | 98 +++++++++---- .../10-quotes/ru/assets/strings.png | Bin 0 -> 15764 bytes modules/25-strings/10-quotes/ru/data.yml | 4 +- .../15-escape-characters/ru/README.md | 134 +++++++++++++++--- .../Makefile | 0 .../SolutionTest.php | 0 .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../index.php | 0 .../ru/EXERCISE.md | 0 .../20-string-concatenation/ru/README.md | 85 +++++++++++ .../ru/data.yml | 4 + .../20-strings-concatenation/ru/README.md | 44 ------ modules/25-strings/30-encoding/ru/README.md | 87 ++++++++---- modules/25-strings/30-encoding/ru/data.yml | 6 +- 20 files changed, 347 insertions(+), 115 deletions(-) create mode 100644 modules/25-strings/10-quotes/ru/assets/strings.png rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/Makefile (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/SolutionTest.php (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/description.es.yml (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/en/EXERCISE.md (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/en/README.md (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/en/data.yml (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/es/EXERCISE.md (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/es/README.md (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/es/data.yml (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/index.php (100%) rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/ru/EXERCISE.md (100%) create mode 100644 modules/25-strings/20-string-concatenation/ru/README.md rename modules/25-strings/{20-strings-concatenation => 20-string-concatenation}/ru/data.yml (56%) delete mode 100644 modules/25-strings/20-strings-concatenation/ru/README.md diff --git a/modules/25-strings/10-quotes/ru/README.md b/modules/25-strings/10-quotes/ru/README.md index 8d2321d5..ee87503b 100644 --- a/modules/25-strings/10-quotes/ru/README.md +++ b/modules/25-strings/10-quotes/ru/README.md @@ -1,8 +1,8 @@ -В этом уроке мы разберем, что такое строки, зачем для них нужны одинарные и двойные кавычки. Также узнаем, что такое экранирующие последовательности и конкатенация. +Строки в программировании используются очень часто и в самых разных ситуациях. С их помощью мы работаем с текстом, выводим сообщения на экран, обрабатываем пользовательский ввод и взаимодействуем с внешними системами. -## Что такое строка +![Строки](./assets/strings.png) -Любой одиночный символ в кавычках — это **строка**. Например: +С точки зрения PHP строка представляет собой просто набор символов, заключенный в кавычки. Посмотрим на примеры: ```php Dragon's mother said "No" ``` -Нам нужно было добавить `\` для двойных кавычек, но не для апострофа, потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками. +Здесь мы экранируем двойные кавычки внутри строки, заключенной в двойные кавычки. + +Обратите внимание, PHP воспринимает `\"` как один символ-кавычку, а не два символа. То же самое касается `\'`, `\\` и других подобных последовательностей. Они выглядят как два символа в коде, но в строке считаются за один. + +То же самое работает и в обратном случае: ```php Death is \so terribly final +print_r('Dragon\'s mother said "No"'); +// => Dragon's mother said "No" ``` -Также нам может понадобиться вывести сам обратный слеш: +## Как вывести обратный слеш + +Чтобы вывести сам обратный слеш, его тоже нужно экранировать: ```php \ ``` - -Это тоже можно сделать через экранирование, но уже самого себя. diff --git a/modules/25-strings/10-quotes/ru/assets/strings.png b/modules/25-strings/10-quotes/ru/assets/strings.png new file mode 100644 index 0000000000000000000000000000000000000000..4cce328669ccf40fd56341be22d7b5e3e32fe3c8 GIT binary patch literal 15764 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 + [Строки в PHP](https://www.php.net/manual/ru/language.types.string.php) diff --git a/modules/25-strings/15-escape-characters/ru/README.md b/modules/25-strings/15-escape-characters/ru/README.md index 91c28914..f7a433bf 100644 --- a/modules/25-strings/15-escape-characters/ru/README.md +++ b/modules/25-strings/15-escape-characters/ru/README.md @@ -1,41 +1,143 @@ -Иногда нам необходимо расположить несколько строк друг за другом. Для этого нужно сказать интерпретатору «нажать на энтер» — сделать перевод строки после вопросительного знака. Это можно сделать с помощью символа перевода строки — `\n`: +Допустим, мы хотим вывести текст ниже в две строчки: + +```text +- Are you hungry? +- Aaaarrrgh! +``` + +Если мы просто передадим этот текст в `print_r()`, то PHP напечатает все в одну строчку. Технически можно написать два подряд идущих `print_r()`, но представим, что мы хотим это сделать с помощью одного: ```php - Are you hungry?- Aaaarrrgh! ``` +Чтобы каждая из них начиналась с новой строки, нужно добавить перевод строки, то есть «нажать Enter». В программировании это реализуется через добавление специальных символов, в данном случае `\n`. Да, это не опечатка. Несмотря на то, что мы видим здесь два символа, с точки зрения PHP это один символ: -Результат: +```php + Hello\nWorld +``` + +## Примеры использования `\n` + +Вот как PHP обрабатывает управляющую последовательность `\n`: + +```text +В коде "Hello\nWorld" + ↓ +На экране Hello + World +``` + +Местоположение `\n` меняет итоговый вывод: ```php Hello\nWorld + +// Если забыть указать второй слеш +print_r("Hello\nWorld"); +// Hello +// World +``` -Символ перевода строки не является специфичным для программирования. Во многих редакторах есть опция, которая позволяет включить отображение невидимых символов. С ее помощью можно понять, где они находятся. Хотя это всего лишь схематичное отображение, у этих символов нет графического представления, они невидимые. +В этом случае PHP понимает `\\` как обычный обратный слеш и показывает строку без перевода строки. -`\n` — это пример **экранирующей последовательности** (escape sequence). Их еще называют управляющими конструкциями. Таких символов не один десяток, но в программировании часто встречаются всего несколько. Программистам часто нужно использовать перевод строки `\n` для правильного форматирования текста. +## Другие управляющие последовательности -Экранирующие последовательности вроде `\n` работают только внутри двойных кавычек. +Кроме `\n`, в PHP есть и другие управляющие последовательности: -Если нам понадобится вывести `\n` именно как текст, то можно воспользоваться уже известным нам способом экранирования — добавить еще один `\` в начале. В итоге последовательность `\\n` отобразится как символы `\` и `n`, которые идут друг за другом. +- `\t` обозначает табуляцию (эквивалент клавиши Tab) +- `\r` обозначает возврат каретки (используется в Windows, но редко применяется в PHP-коде) +- В программировании чаще всего используют именно `\n`, его достаточно для большинства задач -В Windows для перевода строк по умолчанию используется `\r\n`. Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы. Например, когда в команде разработчиков есть пользователи как Windows, так и Linux. +## Важные детали -Последовательность `\r\n` имеет разную трактовку в зависимости от выбранной кодировки. Это мы рассмотрим позже. По этой причине в среде разработчиков принято всегда использовать `\n` без `\r`, так как LF всегда трактуется одинаково и отлично работает в любой системе. Поэтому нужно настроить свой редактор на использование `\n`. +- `\n` является одним символом, несмотря на то, что в коде он записан как два (`\` и `n`) +- Управляющие последовательности в PHP работают только внутри двойных кавычек +- На Windows по умолчанию используется комбинация `\r\n`, но в кроссплатформенной разработке принято использовать только `\n`, чтобы избежать проблем при переносе кода между системами. Поэтому стоит настроить свой редактор на использование `\n` diff --git a/modules/25-strings/20-strings-concatenation/Makefile b/modules/25-strings/20-string-concatenation/Makefile similarity index 100% rename from modules/25-strings/20-strings-concatenation/Makefile rename to modules/25-strings/20-string-concatenation/Makefile diff --git a/modules/25-strings/20-strings-concatenation/SolutionTest.php b/modules/25-strings/20-string-concatenation/SolutionTest.php similarity index 100% rename from modules/25-strings/20-strings-concatenation/SolutionTest.php rename to modules/25-strings/20-string-concatenation/SolutionTest.php diff --git a/modules/25-strings/20-strings-concatenation/description.es.yml b/modules/25-strings/20-string-concatenation/description.es.yml similarity index 100% rename from modules/25-strings/20-strings-concatenation/description.es.yml rename to modules/25-strings/20-string-concatenation/description.es.yml diff --git a/modules/25-strings/20-strings-concatenation/en/EXERCISE.md b/modules/25-strings/20-string-concatenation/en/EXERCISE.md similarity index 100% rename from modules/25-strings/20-strings-concatenation/en/EXERCISE.md rename to modules/25-strings/20-string-concatenation/en/EXERCISE.md diff --git a/modules/25-strings/20-strings-concatenation/en/README.md b/modules/25-strings/20-string-concatenation/en/README.md similarity index 100% rename from modules/25-strings/20-strings-concatenation/en/README.md rename to modules/25-strings/20-string-concatenation/en/README.md diff --git a/modules/25-strings/20-strings-concatenation/en/data.yml b/modules/25-strings/20-string-concatenation/en/data.yml similarity index 100% rename from modules/25-strings/20-strings-concatenation/en/data.yml rename to modules/25-strings/20-string-concatenation/en/data.yml diff --git a/modules/25-strings/20-strings-concatenation/es/EXERCISE.md b/modules/25-strings/20-string-concatenation/es/EXERCISE.md similarity index 100% rename from modules/25-strings/20-strings-concatenation/es/EXERCISE.md rename to modules/25-strings/20-string-concatenation/es/EXERCISE.md diff --git a/modules/25-strings/20-strings-concatenation/es/README.md b/modules/25-strings/20-string-concatenation/es/README.md similarity index 100% rename from modules/25-strings/20-strings-concatenation/es/README.md rename to modules/25-strings/20-string-concatenation/es/README.md diff --git a/modules/25-strings/20-strings-concatenation/es/data.yml b/modules/25-strings/20-string-concatenation/es/data.yml similarity index 100% rename from modules/25-strings/20-strings-concatenation/es/data.yml rename to modules/25-strings/20-string-concatenation/es/data.yml diff --git a/modules/25-strings/20-strings-concatenation/index.php b/modules/25-strings/20-string-concatenation/index.php similarity index 100% rename from modules/25-strings/20-strings-concatenation/index.php rename to modules/25-strings/20-string-concatenation/index.php diff --git a/modules/25-strings/20-strings-concatenation/ru/EXERCISE.md b/modules/25-strings/20-string-concatenation/ru/EXERCISE.md similarity index 100% rename from modules/25-strings/20-strings-concatenation/ru/EXERCISE.md rename to modules/25-strings/20-string-concatenation/ru/EXERCISE.md diff --git a/modules/25-strings/20-string-concatenation/ru/README.md b/modules/25-strings/20-string-concatenation/ru/README.md new file mode 100644 index 00000000..7c977b6a --- /dev/null +++ b/modules/25-strings/20-string-concatenation/ru/README.md @@ -0,0 +1,85 @@ +Часто строки нужно собирать из нескольких частей, например объединить имя и фамилию, добавить единицу измерения или составить текст из шаблона. Для этого используется операция конкатенации, то есть склеивания строк. + +## Как объединять строки + +В PHP строки объединяются с помощью оператора `.` (точка). Для сложения чисел используется оператор `+`, а для объединения строк в PHP существует отдельный бинарный оператор, который означает склеивание содержимого: + +```php + Dragonstone +``` + +Порядок имеет значение. Сначала идет левая часть (`'Dragon'`), потом правая (`'stone'`). Результат получается в том порядке, в котором указаны операнды. + +Вот как работает объединение нескольких строк. Код: + +```php + Kingswood +print_r('Kings' . 'road'); // => Kingsroad +// Здесь снаружи двойные кавычки, потому что внутри есть одиночная +print_r("King's" . 'Landing'); // => King'sLanding +``` + +PHP позволяет объединять строки, даже если они записаны в разных кавычках. Главное, чтобы обе части были строками. + +## Пробел тоже является символом + +При объединении PHP не вставляет пробелы автоматически. Если между частями должен быть пробел, его нужно указать вручную: + +```php + King's Landing + +// Пробел в начале второй строки +print_r("King's" . ' Landing'); // => King's Landing +``` + +Результат будет одинаковый. Но если пробел не добавить, то слова склеятся. + +## Управляющие последовательности + +В строках можно использовать управляющие последовательности, например `\n` для переноса строки или `\t` для табуляции. Не забывайте, что в PHP они работают только внутри двойных кавычек. При конкатенации они ведут себя так же, как и любые другие символы: + +```php + +// Hello, +// World! + +print_r('A' . "\t" . 'B'); +// => A B +``` + +## Заключение + +Конкатенация представляет собой объединение строк через оператор `.`, и строки можно объединять независимо от типа кавычек. + +- Склеивание происходит строго в порядке слева направо +- Пробелы не добавляются автоматически, их нужно включать в строки вручную diff --git a/modules/25-strings/20-strings-concatenation/ru/data.yml b/modules/25-strings/20-string-concatenation/ru/data.yml similarity index 56% rename from modules/25-strings/20-strings-concatenation/ru/data.yml rename to modules/25-strings/20-string-concatenation/ru/data.yml index 5b4c15a7..88fe3b7d 100644 --- a/modules/25-strings/20-strings-concatenation/ru/data.yml +++ b/modules/25-strings/20-string-concatenation/ru/data.yml @@ -1,5 +1,9 @@ --- name: Конкатенация +tips: + - > + Если в редакторе есть запись `// BEGIN` и `// END`, то код нужно писать + между этими строчками. definitions: - name: Конкатенация description: > diff --git a/modules/25-strings/20-strings-concatenation/ru/README.md b/modules/25-strings/20-strings-concatenation/ru/README.md deleted file mode 100644 index 62cb0633..00000000 --- a/modules/25-strings/20-strings-concatenation/ru/README.md +++ /dev/null @@ -1,44 +0,0 @@ -В веб-разработке программы постоянно оперируют строками. Все, что мы видим на сайтах, так или иначе представлено в виде текста. Этот текст чаще всего динамический — полученный из разных частей, которые соединяются вместе. Операция соединения строк в программировании называется **конкатенацией**. - -Мы уже знаем о математической операции сложения: - -```php - 8 -``` - -Такая программа выведет на экран `8` — результат работы бинарного оператора `+` с операндами `5` и `3`. - -Можно также «сложить» две строки. Такая программа выведет на экран `Dragonstone` — результат работы бинарного оператора `.` с операндами 'Dragon' и 'stone': - -```php - Dragonstone -``` - - -Склеивание строк всегда происходит в том же порядке, в котором записаны операнды. Левый операнд становится левой частью строки, а правый — правой. Вот еще несколько примеров: - -```php - Kingswood -print_r('Kings' . 'road'); // => Kingsroad -print_r("King's" . 'Landing'); // => King'sLanding -``` - -Строки можно склеивать, даже если они записаны с разными кавычками. - -Пробел — такой же символ, как и другие, поэтому сколько пробелов поставить в строке — столько и получится в итоговой строке: - -```php - King's Landing - -// Ставим пробел в правой части -print_r("King's" . ' Landing'); // => King's Landing -``` diff --git a/modules/25-strings/30-encoding/ru/README.md b/modules/25-strings/30-encoding/ru/README.md index dd47bb40..3c2a9ba3 100644 --- a/modules/25-strings/30-encoding/ru/README.md +++ b/modules/25-strings/30-encoding/ru/README.md @@ -1,40 +1,77 @@ +На самом базовом уровне компьютер работает только с нулями и единицами, что составляет так называемый двоичный код. Каждую единицу или ноль называют битом (от binary digit, «двоичная цифра»). -На самом глубоком уровне компьютер оперирует исключительно цифрами `0` и `1`. Это так называемый [двоичный код](https://ru.wikipedia.org/wiki/Двоичный_код), а единички и нули называются битами, от "binary digit" — «двоичная цифра». +Любые данные в компьютере представлены просто как последовательность битов, например изображения, музыка и текст. Привычные нам числа из десятичной системы тоже можно представить в двоичной форме. -Обычные, привычные нам числа в десятичной системе счисления, закодированы с помощью двоичных чисел: +- 0 → `0` +- 1 → `1` +- 2 → `10` -- 0 ← 0 -- 1 ← 1 -- 2 ← 10 -- 3 ← 11 -- 4 ← 100 -- 5 ← 101 +## Как закодировать текст? -Но как быть с текстом? Компьютер на самом деле не знает ничего о буквах, знаках пунктуации и прочих текстовых символах. Все эти символы также закодированы числами. +Компьютер не «понимает» текст. Чтобы работать с буквами и другими символами, их тоже нужно превратить в числа. Это делают с помощью кодировок, то есть таблиц, в которых каждому символу соответствует определенное число. -Можно взять английский алфавит и дать каждой букве число, начиная с единицы по порядку: +Самый простой способ состоит в том, чтобы пронумеровать буквы, начиная с 1. -- a ← 1 -- b ← 2 -- c ← 3 -- d ← 4 -- ... -- z ← 26 +- `a` → `1` +- `b` → `2` +- ...и так до `z` → `26` -В этом заключается суть **кодировок**. +Теперь мы можем представить слово hello как набор чисел. -Далее можно научить компьютер понимать эту таблицу и переводить текст в числа и наоборот — числа в текст: +```text +h e l l o +↓ ↓ ↓ ↓ ↓ +8 5 12 12 15 +``` +А *good* превращается в такую последовательность. -- `hello` → `8` `5` `12` `12` `15` -- `7` `15` `15` `4` → `good` +```text +g o o d +↓ ↓ ↓ ↓ +7 15 15 4 +``` -Подобные таблицы, в которых сопоставляются буквы и числа, называются кодировками. Кроме букв алфавита, в таблицы кодировок входят знаки препинания и другие полезные символы. Вы наверняка сталкивались с кодировками, например, [ASCII](https://ru.wikipedia.org/wiki/ASCII) или [UTF-8](https://ru.wikipedia.org/wiki/UTF-8). +Программа не знает, что это слово. Она просто видит инструкцию «нужно отобразить символ с кодом 8, потом с кодом 5 и т. д.». -Разные кодировки содержат разное количество символов. Изначально небольших таблиц вроде ASCII было достаточно для большинства задач. Но в ней есть только латинские буквы, несколько простых символов вроде `%` и `?`, и специальные управляющие символы типа перевода строки. +## ASCII. Первая массовая кодировка -С распространением компьютеров разным странам понадобились свои, более широкие таблицы. В том числе для кириллических букв, восточных иероглифов, арабской вязи, дополнительных математических и типографских символов, а впоследствии даже для эмодзи-смайликов. +Первые компьютеры работали в основном с английским языком. Для него в 1960-х годах придумали таблицу ASCII, включавшую 128 символов, в том числе латинский алфавит, цифры, знаки препинания, спецсимволы (@, #, !, \n) и управляющие коды. -Сегодня в большинстве случаев используется один из вариантов [юникода](https://ru.wikipedia.org/wiki/Юникод) – *utf-8*. Он включает в себя знаки почти всех письменных языков мира. Благодаря этому письмо, сформированное человеком в Китае на китайском, без проблем можно открыть и увидеть в первозданном виде на компьютере в Финляндии (поймет он его или нет, это уже другой вопрос). +Этого хватало для первых программ, но не для всего мира. -С кодированием текста и кодировками программисты встречаются в своей жизни регулярно. Поддержка юникода у разных языков программирования выполнена на разном уровне. Кроме того, кодировки нужно явно указывать при работе и с базами данных, и с файлами. +Когда компьютеры начали использовать в других странах, возникла проблема. В ASCII нет кириллицы, иероглифов, арабского письма, ударений, валютных символов и т. д. + +Каждая страна или компания начала делать свою кодировку на основе ASCII. + +- Windows придумала Windows-1251 для русского +- Apple создала Mac Roman +- Страны Восточной Европы, Азии и Ближнего Востока разработали свои варианты + +Все эти кодировки были несовместимы между собой. Код 226 в одной кодировке мог быть буквой é, в другой буквой и, в третьей вообще техническим символом. Это приводило к настоящему хаосу. + +## Как выглядели проблемы с кодировками + +Если вы видите в тексте вот это. + +```text +ÐÑивеÑ! +``` + +Это означает, что программа неправильно определила кодировку текста. Она получила последовательность байтов, но прочитала их не той таблицей. + +Это было нормой в 1990-х и 2000-х. Одна программа писала текст в Windows-1251, другая читала его как ISO-8859-1, и в результате получался мусор. + +## Unicode и UTF-8. Конец бардака + +Чтобы все починить, в 1990-х начали создавать универсальную таблицу Unicode, которая содержит символы всех письменных систем мира, в том числе латинский алфавит и кириллицу, китайское и арабское письмо, математические знаки, древнеегипетское письмо и даже эмодзи. + +Внутри Unicode есть несколько форматов хранения. Наиболее распространенным из них является UTF-8. Он компактно кодирует английские символы, но может расширяться под любые другие. + +Сегодня UTF-8 является стандартом по умолчанию в интернете, Linux, базах данных и редакторах кода. Исходный код PHP и строки в современных проектах тоже принято хранить в UTF-8. + +## Зачем это знать программисту? + +- Вы будете работать с текстом, и ошибки кодировки по-прежнему случаются, особенно при чтении файлов, обработке данных, взаимодействии с API и базами данных. +- PHP хранит строку как последовательность байтов, поэтому при работе с файлами и базами данных кодировку иногда приходится указывать явно. +- Нужно уметь диагностировать проблемы. Например, если видите «кракозябры», это почти наверняка ошибка кодировки. diff --git a/modules/25-strings/30-encoding/ru/data.yml b/modules/25-strings/30-encoding/ru/data.yml index d0e24fe7..e78d95cf 100644 --- a/modules/25-strings/30-encoding/ru/data.yml +++ b/modules/25-strings/30-encoding/ru/data.yml @@ -1,6 +1,10 @@ --- name: Кодировка -tips: [] +tips: + - | + [Таблица ASCII кодов](https://www.ascii-code.com/) + - | + [Что такое кодировки?](https://ru.hexlet.io/blog/posts/encoding) definitions: - name: Кодировка description: >- From 7dda4410e56f15bda6f3c56d304029a4443ffb27 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 5 Jun 2026 19:40:10 +0500 Subject: [PATCH 05/29] =?UTF-8?q?feat(25-strings):=20=D0=B2=D1=8B=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=BD=D1=8F=D1=82=D1=8C=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=83=D1=80=D0=BE=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=20=D1=81=D1=8E=D0=B6=D0=B5=D1=82=D1=8B=20Pyt?= =?UTF-8?q?hon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 10-quotes: сообщение о ненайденном файле с апострофом и кавычками - 15-escape-characters: подсказка с буквальным \n и переводом строки; исправлен namespace теста (Arithmetics -> Strings) - 20-string-concatenation: сборка URL из частей (адаптация: exercises-php) - 30-encoding: вывод символов по ASCII-кодам на отдельных строках en/es EXERCISE.md — на фазу перевода. Co-Authored-By: Claude Opus 4.8 (1M context) --- modules/25-strings/10-quotes/SolutionTest.php | 2 +- modules/25-strings/10-quotes/index.php | 2 +- modules/25-strings/10-quotes/ru/EXERCISE.md | 10 +++------- .../15-escape-characters/SolutionTest.php | 4 ++-- .../25-strings/15-escape-characters/index.php | 2 +- .../15-escape-characters/ru/EXERCISE.md | 11 +++++++---- .../20-string-concatenation/SolutionTest.php | 2 +- .../20-string-concatenation/index.php | 2 +- .../20-string-concatenation/ru/EXERCISE.md | 6 +++--- .../25-strings/30-encoding/SolutionTest.php | 2 +- modules/25-strings/30-encoding/index.php | 6 +++--- modules/25-strings/30-encoding/ru/EXERCISE.md | 19 ++++++++----------- 12 files changed, 32 insertions(+), 36 deletions(-) diff --git a/modules/25-strings/10-quotes/SolutionTest.php b/modules/25-strings/10-quotes/SolutionTest.php index ba54f2d0..3cba6099 100644 --- a/modules/25-strings/10-quotes/SolutionTest.php +++ b/modules/25-strings/10-quotes/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = "\"Khal Drogo's favorite word is \"athjahakar\"\""; + $expected = 'The file "user\'s_config.json" was not found.'; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/25-strings/10-quotes/index.php b/modules/25-strings/10-quotes/index.php index 12b5a98a..ed6e6303 100644 --- a/modules/25-strings/10-quotes/index.php +++ b/modules/25-strings/10-quotes/index.php @@ -1,5 +1,5 @@ expectOutputString($expected); require 'index.php'; } diff --git a/modules/25-strings/15-escape-characters/index.php b/modules/25-strings/15-escape-characters/index.php index 7087d669..24c8ea71 100644 --- a/modules/25-strings/15-escape-characters/index.php +++ b/modules/25-strings/15-escape-characters/index.php @@ -1,5 +1,5 @@ expectOutputString($expected); require 'index.php'; } diff --git a/modules/25-strings/20-string-concatenation/index.php b/modules/25-strings/20-string-concatenation/index.php index d3d4ee8c..7cb12677 100644 --- a/modules/25-strings/20-string-concatenation/index.php +++ b/modules/25-strings/20-string-concatenation/index.php @@ -1,5 +1,5 @@ expectOutputString($expected); require 'index.php'; } diff --git a/modules/25-strings/30-encoding/index.php b/modules/25-strings/30-encoding/index.php index 00a36996..d0d9d3c4 100644 --- a/modules/25-strings/30-encoding/index.php +++ b/modules/25-strings/30-encoding/index.php @@ -1,7 +1,7 @@ Date: Fri, 5 Jun 2026 20:05:26 +0500 Subject: [PATCH 06/29] =?UTF-8?q?feat(31-advanced-strings):=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BB=D1=8F,=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20Python=20?= =?UTF-8?q?=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Модуль 5 плана выравнивания: новый модуль 31-advanced-strings забирает уроки 25-interpolation, 30-symbols, 35-heredoc из 30-variables (35-heredoc → 90-multiline-strings, slug по Python) и получает новый урок 70-slices (substr() вместо срезов Python). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../30-variables/25-interpolation/index.php | 7 - .../25-interpolation/ru/EXERCISE.md | 5 - .../25-interpolation/ru/README.md | 34 ---- .../30-variables/25-interpolation/ru/data.yml | 8 - modules/30-variables/30-symbols/index.php | 9 -- .../30-variables/30-symbols/ru/EXERCISE.md | 9 -- modules/30-variables/30-symbols/ru/README.md | 49 ------ modules/30-variables/30-symbols/ru/data.yml | 3 - .../30-variables/35-heredoc/SolutionTest.php | 20 --- modules/30-variables/35-heredoc/index.php | 10 -- .../30-variables/35-heredoc/ru/EXERCISE.md | 5 - modules/30-variables/35-heredoc/ru/README.md | 19 --- modules/30-variables/35-heredoc/ru/data.yml | 6 - .../25-interpolation/Makefile | 0 .../25-interpolation/SolutionTest.php | 17 ++ .../25-interpolation/description.es.yml | 0 .../25-interpolation/en/EXERCISE.md | 0 .../25-interpolation/en/README.md | 0 .../25-interpolation/en/data.yml | 0 .../25-interpolation/es/EXERCISE.md | 0 .../25-interpolation/es/README.md | 0 .../25-interpolation/es/data.yml | 0 .../25-interpolation/index.php | 8 + .../25-interpolation/ru/EXERCISE.md | 7 + .../25-interpolation/ru/README.md | 81 ++++++++++ .../25-interpolation/ru/data.yml | 11 ++ .../30-symbols/Makefile | 0 .../30-symbols/SolutionTest.php | 4 +- .../30-symbols/description.es.yml | 0 .../30-symbols/en/EXERCISE.md | 0 .../30-symbols/en/README.md | 0 .../30-symbols/en/data.yml | 0 .../30-symbols/es/EXERCISE.md | 0 .../30-symbols/es/README.md | 0 .../30-symbols/es/data.yml | 0 .../31-advanced-strings/30-symbols/index.php | 7 + .../30-symbols/ru/EXERCISE.md | 1 + .../30-symbols/ru/README.md | 108 +++++++++++++ .../30-symbols/ru/data.yml | 6 + .../31-advanced-strings/70-slices/Makefile | 2 + .../70-slices}/SolutionTest.php | 4 +- .../70-slices/description.es.yml | 32 ++++ .../70-slices/en/EXERCISE.md | 5 + .../70-slices/en/README.md | 12 ++ .../31-advanced-strings/70-slices/en/data.yml | 9 ++ .../70-slices/es/EXERCISE.md | 5 + .../70-slices/es/README.md | 12 ++ .../31-advanced-strings/70-slices/es/data.yml | 9 ++ .../31-advanced-strings/70-slices/index.php | 7 + .../70-slices/ru/EXERCISE.md | 1 + .../70-slices/ru/README.md | 150 ++++++++++++++++++ .../31-advanced-strings/70-slices/ru/data.yml | 9 ++ .../90-multiline-strings}/Makefile | 0 .../90-multiline-strings/SolutionTest.php | 22 +++ .../90-multiline-strings}/description.es.yml | 0 .../90-multiline-strings}/en/EXERCISE.md | 0 .../90-multiline-strings}/en/README.md | 0 .../90-multiline-strings}/en/data.yml | 0 .../90-multiline-strings}/es/EXERCISE.md | 0 .../90-multiline-strings}/es/README.md | 0 .../90-multiline-strings}/es/data.yml | 0 .../90-multiline-strings/index.php | 12 ++ .../90-multiline-strings/ru/EXERCISE.md | 8 + .../90-multiline-strings/ru/README.md | 106 +++++++++++++ .../90-multiline-strings/ru/data.yml | 8 + .../31-advanced-strings/description.en.yml | 5 + .../31-advanced-strings/description.es.yml | 5 + .../31-advanced-strings/description.ru.yml | 5 + 68 files changed, 674 insertions(+), 188 deletions(-) delete mode 100644 modules/30-variables/25-interpolation/index.php delete mode 100644 modules/30-variables/25-interpolation/ru/EXERCISE.md delete mode 100644 modules/30-variables/25-interpolation/ru/README.md delete mode 100644 modules/30-variables/25-interpolation/ru/data.yml delete mode 100644 modules/30-variables/30-symbols/index.php delete mode 100644 modules/30-variables/30-symbols/ru/EXERCISE.md delete mode 100644 modules/30-variables/30-symbols/ru/README.md delete mode 100644 modules/30-variables/30-symbols/ru/data.yml delete mode 100644 modules/30-variables/35-heredoc/SolutionTest.php delete mode 100644 modules/30-variables/35-heredoc/index.php delete mode 100644 modules/30-variables/35-heredoc/ru/EXERCISE.md delete mode 100644 modules/30-variables/35-heredoc/ru/README.md delete mode 100644 modules/30-variables/35-heredoc/ru/data.yml rename modules/{30-variables => 31-advanced-strings}/25-interpolation/Makefile (100%) create mode 100644 modules/31-advanced-strings/25-interpolation/SolutionTest.php rename modules/{30-variables => 31-advanced-strings}/25-interpolation/description.es.yml (100%) rename modules/{30-variables => 31-advanced-strings}/25-interpolation/en/EXERCISE.md (100%) rename modules/{30-variables => 31-advanced-strings}/25-interpolation/en/README.md (100%) rename modules/{30-variables => 31-advanced-strings}/25-interpolation/en/data.yml (100%) rename modules/{30-variables => 31-advanced-strings}/25-interpolation/es/EXERCISE.md (100%) rename modules/{30-variables => 31-advanced-strings}/25-interpolation/es/README.md (100%) rename modules/{30-variables => 31-advanced-strings}/25-interpolation/es/data.yml (100%) create mode 100644 modules/31-advanced-strings/25-interpolation/index.php create mode 100644 modules/31-advanced-strings/25-interpolation/ru/EXERCISE.md create mode 100644 modules/31-advanced-strings/25-interpolation/ru/README.md create mode 100644 modules/31-advanced-strings/25-interpolation/ru/data.yml rename modules/{30-variables => 31-advanced-strings}/30-symbols/Makefile (100%) rename modules/{30-variables => 31-advanced-strings}/30-symbols/SolutionTest.php (75%) rename modules/{30-variables => 31-advanced-strings}/30-symbols/description.es.yml (100%) rename modules/{30-variables => 31-advanced-strings}/30-symbols/en/EXERCISE.md (100%) rename modules/{30-variables => 31-advanced-strings}/30-symbols/en/README.md (100%) rename modules/{30-variables => 31-advanced-strings}/30-symbols/en/data.yml (100%) rename modules/{30-variables => 31-advanced-strings}/30-symbols/es/EXERCISE.md (100%) rename modules/{30-variables => 31-advanced-strings}/30-symbols/es/README.md (100%) rename modules/{30-variables => 31-advanced-strings}/30-symbols/es/data.yml (100%) create mode 100644 modules/31-advanced-strings/30-symbols/index.php create mode 100644 modules/31-advanced-strings/30-symbols/ru/EXERCISE.md create mode 100644 modules/31-advanced-strings/30-symbols/ru/README.md create mode 100644 modules/31-advanced-strings/30-symbols/ru/data.yml create mode 100644 modules/31-advanced-strings/70-slices/Makefile rename modules/{30-variables/25-interpolation => 31-advanced-strings/70-slices}/SolutionTest.php (70%) create mode 100644 modules/31-advanced-strings/70-slices/description.es.yml create mode 100644 modules/31-advanced-strings/70-slices/en/EXERCISE.md create mode 100644 modules/31-advanced-strings/70-slices/en/README.md create mode 100644 modules/31-advanced-strings/70-slices/en/data.yml create mode 100644 modules/31-advanced-strings/70-slices/es/EXERCISE.md create mode 100644 modules/31-advanced-strings/70-slices/es/README.md create mode 100644 modules/31-advanced-strings/70-slices/es/data.yml create mode 100644 modules/31-advanced-strings/70-slices/index.php create mode 100644 modules/31-advanced-strings/70-slices/ru/EXERCISE.md create mode 100644 modules/31-advanced-strings/70-slices/ru/README.md create mode 100644 modules/31-advanced-strings/70-slices/ru/data.yml rename modules/{30-variables/35-heredoc => 31-advanced-strings/90-multiline-strings}/Makefile (100%) create mode 100644 modules/31-advanced-strings/90-multiline-strings/SolutionTest.php rename modules/{30-variables/35-heredoc => 31-advanced-strings/90-multiline-strings}/description.es.yml (100%) rename modules/{30-variables/35-heredoc => 31-advanced-strings/90-multiline-strings}/en/EXERCISE.md (100%) rename modules/{30-variables/35-heredoc => 31-advanced-strings/90-multiline-strings}/en/README.md (100%) rename modules/{30-variables/35-heredoc => 31-advanced-strings/90-multiline-strings}/en/data.yml (100%) rename modules/{30-variables/35-heredoc => 31-advanced-strings/90-multiline-strings}/es/EXERCISE.md (100%) rename modules/{30-variables/35-heredoc => 31-advanced-strings/90-multiline-strings}/es/README.md (100%) rename modules/{30-variables/35-heredoc => 31-advanced-strings/90-multiline-strings}/es/data.yml (100%) create mode 100644 modules/31-advanced-strings/90-multiline-strings/index.php create mode 100644 modules/31-advanced-strings/90-multiline-strings/ru/EXERCISE.md create mode 100644 modules/31-advanced-strings/90-multiline-strings/ru/README.md create mode 100644 modules/31-advanced-strings/90-multiline-strings/ru/data.yml create mode 100644 modules/31-advanced-strings/description.en.yml create mode 100644 modules/31-advanced-strings/description.es.yml create mode 100644 modules/31-advanced-strings/description.ru.yml diff --git a/modules/30-variables/25-interpolation/index.php b/modules/30-variables/25-interpolation/index.php deleted file mode 100644 index 4dfa44f7..00000000 --- a/modules/30-variables/25-interpolation/index.php +++ /dev/null @@ -1,7 +0,0 @@ -?`. Где вместо `` должна использоваться переменная `$stark`. Вывод должен получиться таким: - -```text -Do you want to eat, Arya? -``` diff --git a/modules/30-variables/25-interpolation/ru/README.md b/modules/30-variables/25-interpolation/ru/README.md deleted file mode 100644 index f867779a..00000000 --- a/modules/30-variables/25-interpolation/ru/README.md +++ /dev/null @@ -1,34 +0,0 @@ -Представим, что нам нужно создать заголовок письма из двух переменных и знаков препинания. Эту задачу можно решить так: - -```php - 'Hello, Joffrey!' -``` - -Это простой случай, но даже здесь нужно приложить усилия, чтобы увидеть, какая в итоге получится строка. Нужно следить за несколькими кавычками и пробелами, и с первого взгляда сложно понять, что и где начинается и заканчивается. - -Есть другой более удобный способ — **интерполяция**. Так это выглядит: - -```php - Hello, Joffrey! -``` - - -В этом примере мы создали одну строку и в нужном нам порядке вставили в нее переменные с помощью фигурных скобок (`{}`). Получился шаблон, куда внесены нужные значения. - -Теперь нам не нужно заботиться об отдельных строках для знаков препинания и пробелов. Эти символы записаны в строке-шаблоне. - -В одной строке можно делать сколько угодно блоков с фигурными скобками. Также интерполяция работает только со строками в двойных кавычках. - -Почти во всех языках интерполяция предпочтительнее конкатенации для объединения строк. Строка при этом получается склеенная, и внутри нее хорошо просматриваются пробелы и другие символы. diff --git a/modules/30-variables/25-interpolation/ru/data.yml b/modules/30-variables/25-interpolation/ru/data.yml deleted file mode 100644 index 390eab8f..00000000 --- a/modules/30-variables/25-interpolation/ru/data.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: Интерполяция -tips: [] -definitions: - - name: Интерполяция - description: >- - способ соединения строк через вставку значений переменных в строку-шаблон - с помощью фигурных скобок. Например, `\"Hi, {$name}!\"`. diff --git a/modules/30-variables/30-symbols/index.php b/modules/30-variables/30-symbols/index.php deleted file mode 100644 index c43db9c7..00000000 --- a/modules/30-variables/30-symbols/index.php +++ /dev/null @@ -1,9 +0,0 @@ - A -``` - -Квадратные скобки с цифрой — это специальный оператор извлечения строки. Эта цифра называется **индексом** — позицией символа внутри строки. - -Индексы начинаются с нуля почти во всех языках программирования. Чтобы получить первый символ, нужно указать индекс `0`. Индекс последнего элемента равен длине строки минус единица: - -```php - r - -// Вопрос на самопроверку. Что выведет этот код? -$magic = '\nyou'; -print_r($magic[1]); // => ? -``` - -Также допустимо использовать отрицательные индексы. В этом случае идет обращение к символам с конца строки. `-1` — индекс последнего символа, `-2` — предпоследнего и так далее. В отличие от прямой индексации обратный отсчет идет от `-1`: - -```php - r -``` - -Индексом может быть не только конкретное число, но и значение переменной. Вот пример, который приведет к тому же результату — выводу на экран символа `A`: - -```php - A -``` - -Здесь индекс внутри квадратных скобок записан не числом, а переменной. diff --git a/modules/30-variables/30-symbols/ru/data.yml b/modules/30-variables/30-symbols/ru/data.yml deleted file mode 100644 index 405090b7..00000000 --- a/modules/30-variables/30-symbols/ru/data.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -name: Извлечение символов из строки -tips: [] diff --git a/modules/30-variables/35-heredoc/SolutionTest.php b/modules/30-variables/35-heredoc/SolutionTest.php deleted file mode 100644 index e11976b3..00000000 --- a/modules/30-variables/35-heredoc/SolutionTest.php +++ /dev/null @@ -1,20 +0,0 @@ -expectOutputString($expected); - require 'index.php'; - } -} diff --git a/modules/30-variables/35-heredoc/index.php b/modules/30-variables/35-heredoc/index.php deleted file mode 100644 index 4fdcf328..00000000 --- a/modules/30-variables/35-heredoc/index.php +++ /dev/null @@ -1,10 +0,0 @@ - Пример строки, -// => охватывающей несколько строк, -// => с использованием heredoc-синтаксиса. -// => Здесь не нужно экранировать ни одинарные ', ни двойные " кавычки. -``` - -Перед закрывающим идентификатором, в нашем случае — `EOT`, не должны стоять пробелы, иначе PHP начнет ругаться на ошибку синтаксиса. diff --git a/modules/30-variables/35-heredoc/ru/data.yml b/modules/30-variables/35-heredoc/ru/data.yml deleted file mode 100644 index fd50d7c2..00000000 --- a/modules/30-variables/35-heredoc/ru/data.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -name: Heredoc -definitions: [] -tips: - - > - [Heredoc](https://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.heredoc) diff --git a/modules/30-variables/25-interpolation/Makefile b/modules/31-advanced-strings/25-interpolation/Makefile similarity index 100% rename from modules/30-variables/25-interpolation/Makefile rename to modules/31-advanced-strings/25-interpolation/Makefile diff --git a/modules/31-advanced-strings/25-interpolation/SolutionTest.php b/modules/31-advanced-strings/25-interpolation/SolutionTest.php new file mode 100644 index 00000000..4d26bbba --- /dev/null +++ b/modules/31-advanced-strings/25-interpolation/SolutionTest.php @@ -0,0 +1,17 @@ +expectOutputString($expected); + require 'index.php'; + } +} diff --git a/modules/30-variables/25-interpolation/description.es.yml b/modules/31-advanced-strings/25-interpolation/description.es.yml similarity index 100% rename from modules/30-variables/25-interpolation/description.es.yml rename to modules/31-advanced-strings/25-interpolation/description.es.yml diff --git a/modules/30-variables/25-interpolation/en/EXERCISE.md b/modules/31-advanced-strings/25-interpolation/en/EXERCISE.md similarity index 100% rename from modules/30-variables/25-interpolation/en/EXERCISE.md rename to modules/31-advanced-strings/25-interpolation/en/EXERCISE.md diff --git a/modules/30-variables/25-interpolation/en/README.md b/modules/31-advanced-strings/25-interpolation/en/README.md similarity index 100% rename from modules/30-variables/25-interpolation/en/README.md rename to modules/31-advanced-strings/25-interpolation/en/README.md diff --git a/modules/30-variables/25-interpolation/en/data.yml b/modules/31-advanced-strings/25-interpolation/en/data.yml similarity index 100% rename from modules/30-variables/25-interpolation/en/data.yml rename to modules/31-advanced-strings/25-interpolation/en/data.yml diff --git a/modules/30-variables/25-interpolation/es/EXERCISE.md b/modules/31-advanced-strings/25-interpolation/es/EXERCISE.md similarity index 100% rename from modules/30-variables/25-interpolation/es/EXERCISE.md rename to modules/31-advanced-strings/25-interpolation/es/EXERCISE.md diff --git a/modules/30-variables/25-interpolation/es/README.md b/modules/31-advanced-strings/25-interpolation/es/README.md similarity index 100% rename from modules/30-variables/25-interpolation/es/README.md rename to modules/31-advanced-strings/25-interpolation/es/README.md diff --git a/modules/30-variables/25-interpolation/es/data.yml b/modules/31-advanced-strings/25-interpolation/es/data.yml similarity index 100% rename from modules/30-variables/25-interpolation/es/data.yml rename to modules/31-advanced-strings/25-interpolation/es/data.yml diff --git a/modules/31-advanced-strings/25-interpolation/index.php b/modules/31-advanced-strings/25-interpolation/index.php new file mode 100644 index 00000000..f90f5d6d --- /dev/null +++ b/modules/31-advanced-strings/25-interpolation/index.php @@ -0,0 +1,8 @@ + Hello, Joffrey! +``` + +Но при этом в сложных выражениях становится трудно сразу увидеть, какой текст получится на выходе. Особенно если в строке используются пробелы, запятые или кавычки: они начинают мешать восприятию. Даже текущий пример требует небольшого напряжения, чтобы понять, какая получится строка. + +По этой причине во многих языках существует операция, которая называется интерполяцией. Интерполяция представляет собой способ встраивать значения переменных прямо внутрь строки. В PHP она работает в строках с двойными кавычками. Вот так: + +```php + Hello, Joffrey! +``` + +Имена переменных записываются внутри строки в фигурных скобках, и PHP автоматически подставляет нужные значения: + +```text +$firstName = 'Joff' +$greeting = 'Hello' + +"{$greeting}, {$firstName}!" + └────┬────┘ └────┬─────┘ + 'Hello' 'Joff' + └──────┬──────┘ + 'Hello, Joff!' +``` + +Сравните эти два примера рядом: + +```php + Hello, {$firstName}! +``` + +## Пример + +```php + Hexlet - online courses +``` + +Такая запись легко читается: пробелы, дефисы и символы видны сразу. Строка выглядит именно так, как она появится в выводе. Это делает код понятным и удобным в поддержке. По этой причине в большинстве языков интерполяция является более предпочтительной, чем конкатенация. + +## Почему это важно + +Интерполяция предпочтительнее конкатенации почти во всех современных языках программирования. Она: + +- Упрощает структуру строк. +- Улучшает читаемость кода. +- Снижает количество ошибок при работе с пробелами и знаками препинания. diff --git a/modules/31-advanced-strings/25-interpolation/ru/data.yml b/modules/31-advanced-strings/25-interpolation/ru/data.yml new file mode 100644 index 00000000..8dc1df0e --- /dev/null +++ b/modules/31-advanced-strings/25-interpolation/ru/data.yml @@ -0,0 +1,11 @@ +--- +name: Интерполяция +tips: + - > + [Интерполяция строк в + PHP](https://www.php.net/manual/ru/language.types.string.php#language.types.string.parsing) +definitions: + - name: Интерполяция + description: >- + способ получения сложной строки из нескольких простых с использованием + специальных шаблонов. Например, `\"Hi, {$name}!\"`. diff --git a/modules/30-variables/30-symbols/Makefile b/modules/31-advanced-strings/30-symbols/Makefile similarity index 100% rename from modules/30-variables/30-symbols/Makefile rename to modules/31-advanced-strings/30-symbols/Makefile diff --git a/modules/30-variables/30-symbols/SolutionTest.php b/modules/31-advanced-strings/30-symbols/SolutionTest.php similarity index 75% rename from modules/30-variables/30-symbols/SolutionTest.php rename to modules/31-advanced-strings/30-symbols/SolutionTest.php index 6a54da1a..c0f5cbd7 100644 --- a/modules/30-variables/30-symbols/SolutionTest.php +++ b/modules/31-advanced-strings/30-symbols/SolutionTest.php @@ -1,6 +1,6 @@ expectOutputString($expected); require 'index.php'; } diff --git a/modules/30-variables/30-symbols/description.es.yml b/modules/31-advanced-strings/30-symbols/description.es.yml similarity index 100% rename from modules/30-variables/30-symbols/description.es.yml rename to modules/31-advanced-strings/30-symbols/description.es.yml diff --git a/modules/30-variables/30-symbols/en/EXERCISE.md b/modules/31-advanced-strings/30-symbols/en/EXERCISE.md similarity index 100% rename from modules/30-variables/30-symbols/en/EXERCISE.md rename to modules/31-advanced-strings/30-symbols/en/EXERCISE.md diff --git a/modules/30-variables/30-symbols/en/README.md b/modules/31-advanced-strings/30-symbols/en/README.md similarity index 100% rename from modules/30-variables/30-symbols/en/README.md rename to modules/31-advanced-strings/30-symbols/en/README.md diff --git a/modules/30-variables/30-symbols/en/data.yml b/modules/31-advanced-strings/30-symbols/en/data.yml similarity index 100% rename from modules/30-variables/30-symbols/en/data.yml rename to modules/31-advanced-strings/30-symbols/en/data.yml diff --git a/modules/30-variables/30-symbols/es/EXERCISE.md b/modules/31-advanced-strings/30-symbols/es/EXERCISE.md similarity index 100% rename from modules/30-variables/30-symbols/es/EXERCISE.md rename to modules/31-advanced-strings/30-symbols/es/EXERCISE.md diff --git a/modules/30-variables/30-symbols/es/README.md b/modules/31-advanced-strings/30-symbols/es/README.md similarity index 100% rename from modules/30-variables/30-symbols/es/README.md rename to modules/31-advanced-strings/30-symbols/es/README.md diff --git a/modules/30-variables/30-symbols/es/data.yml b/modules/31-advanced-strings/30-symbols/es/data.yml similarity index 100% rename from modules/30-variables/30-symbols/es/data.yml rename to modules/31-advanced-strings/30-symbols/es/data.yml diff --git a/modules/31-advanced-strings/30-symbols/index.php b/modules/31-advanced-strings/30-symbols/index.php new file mode 100644 index 00000000..800066a9 --- /dev/null +++ b/modules/31-advanced-strings/30-symbols/index.php @@ -0,0 +1,7 @@ + A +``` + +Квадратные скобки с индексом внутри — это специальный оператор извлечения символа из строки. Индексы в PHP (и во многих языках) начинаются с нуля: + +```text +Символ A l e x a n d e r +Индекс 0 1 2 3 4 5 6 7 8 +``` + +Длина строки `Alexander` равна `9`, поэтому индекс последнего символа равен `8`, то есть `9 - 1`. + +Чтобы получить, например, последний символ, можно написать: + +```php + r +``` + +Если изменится длина строки, то последний элемент тоже сдвинется и придется указывать новый индекс, по которому расположен этот символ. + +А если выйти за границы строки, PHP сообщит о проблеме: + +```php + r, последний символ +print_r($firstName[-2]); // => e, предпоследний символ +``` + +```text +Строка: 'H' 'e' 'x' 'l' 'e' 't' +Индекс: 0 1 2 3 4 5 +С конца: -6 -5 -4 -3 -2 -1 +``` + +Отрицательные индексы работают так: + +- -1 соответствует последнему символу +- -2 соответствует предпоследнему +- и так далее + +Это удобно и безопасно, потому что работает правильно, даже если строка меняет свою длину. + +Индекс можно хранить в переменной: + +```php + A +``` + +Такой подход полезен, когда индекс вычисляется где-то в коде, а потом используется для доступа к нужному символу. + +## Спецсимволы + +При индексации учитываются обычные буквы, знаки и спецсимволы. Все они занимают позицию в строке и имеют свой индекс, даже если их "не видно" на экране. + +Например, в строке `"\nyou"` первый символ представляет собой `\n` (перенос строки), а под индексом 1 уже идет буква `y`. Поэтому обращение `$magic[1]` вернет именно `y`. Обратите внимание на двойные кавычки: в одинарных кавычках `\n` остался бы двумя отдельными символами — обратным слешем и буквой `n`. + +## Подумайте: что выведет этот код? + +```php + ? +``` + +Вывод будет: + +```text +y +``` diff --git a/modules/31-advanced-strings/30-symbols/ru/data.yml b/modules/31-advanced-strings/30-symbols/ru/data.yml new file mode 100644 index 00000000..b16dee92 --- /dev/null +++ b/modules/31-advanced-strings/30-symbols/ru/data.yml @@ -0,0 +1,6 @@ +--- +name: Извлечение символов из строки +tips: [] +definitions: + - name: Индекс + description: позиция символа внутри строки. diff --git a/modules/31-advanced-strings/70-slices/Makefile b/modules/31-advanced-strings/70-slices/Makefile new file mode 100644 index 00000000..d0d0a48c --- /dev/null +++ b/modules/31-advanced-strings/70-slices/Makefile @@ -0,0 +1,2 @@ +test: + @ test.sh diff --git a/modules/30-variables/25-interpolation/SolutionTest.php b/modules/31-advanced-strings/70-slices/SolutionTest.php similarity index 70% rename from modules/30-variables/25-interpolation/SolutionTest.php rename to modules/31-advanced-strings/70-slices/SolutionTest.php index 19afe7c3..a8817b82 100644 --- a/modules/30-variables/25-interpolation/SolutionTest.php +++ b/modules/31-advanced-strings/70-slices/SolutionTest.php @@ -1,6 +1,6 @@ expectOutputString($expected); require 'index.php'; } diff --git a/modules/31-advanced-strings/70-slices/description.es.yml b/modules/31-advanced-strings/70-slices/description.es.yml new file mode 100644 index 00000000..81bff07c --- /dev/null +++ b/modules/31-advanced-strings/70-slices/description.es.yml @@ -0,0 +1,32 @@ +--- + +name: Subcadenas +theory: | + Usa `substr()` para extraer parte de una cadena. El formato es `substr(cadena, inicio, longitud)`: + + ```php + World! + print_r(substr($text, 7, 5)); // => World + print_r(substr($text, -6)); // => World! (el índice negativo cuenta desde el final) + ``` + + Si se omite la longitud, PHP toma todo desde el índice inicial hasta el final de la cadena. + +instructions: | + Dada la variable `$url = 'https://hexlet.io'`, extrae e imprime el dominio sin el protocolo usando `substr()`: + + ```text + hexlet.io + ``` + +tips: + - > + [Función substr](https://www.php.net/manual/es/function.substr.php) + +definitions: + - name: Subcadena + description: >- + una parte de una cadena extraída según los parámetros dados: inicio y longitud. diff --git a/modules/31-advanced-strings/70-slices/en/EXERCISE.md b/modules/31-advanced-strings/70-slices/en/EXERCISE.md new file mode 100644 index 00000000..9a507b31 --- /dev/null +++ b/modules/31-advanced-strings/70-slices/en/EXERCISE.md @@ -0,0 +1,5 @@ +Given `$url = 'https://hexlet.io'`, extract and print the domain without the protocol using `substr()`: + +```text +hexlet.io +``` diff --git a/modules/31-advanced-strings/70-slices/en/README.md b/modules/31-advanced-strings/70-slices/en/README.md new file mode 100644 index 00000000..8965ba0d --- /dev/null +++ b/modules/31-advanced-strings/70-slices/en/README.md @@ -0,0 +1,12 @@ +Use `substr()` to extract part of a string. The format is `substr(string, start, length)`: + +```php + World! +print_r(substr($text, 7, 5)); // => World +print_r(substr($text, -6)); // => World! (negative index counts from the end) +``` + +If the length is omitted, PHP takes everything from the start index to the end of the string. diff --git a/modules/31-advanced-strings/70-slices/en/data.yml b/modules/31-advanced-strings/70-slices/en/data.yml new file mode 100644 index 00000000..7357bd89 --- /dev/null +++ b/modules/31-advanced-strings/70-slices/en/data.yml @@ -0,0 +1,9 @@ +--- +name: Substrings +tips: + - > + [substr function](https://www.php.net/manual/en/function.substr.php) +definitions: + - name: Substring + description: >- + a part of a string extracted by the given parameters: start and length. diff --git a/modules/31-advanced-strings/70-slices/es/EXERCISE.md b/modules/31-advanced-strings/70-slices/es/EXERCISE.md new file mode 100644 index 00000000..24e4cdb2 --- /dev/null +++ b/modules/31-advanced-strings/70-slices/es/EXERCISE.md @@ -0,0 +1,5 @@ +Dada la variable `$url = 'https://hexlet.io'`, extrae e imprime el dominio sin el protocolo usando `substr()`: + +```text +hexlet.io +``` diff --git a/modules/31-advanced-strings/70-slices/es/README.md b/modules/31-advanced-strings/70-slices/es/README.md new file mode 100644 index 00000000..31b04736 --- /dev/null +++ b/modules/31-advanced-strings/70-slices/es/README.md @@ -0,0 +1,12 @@ +Usa `substr()` para extraer parte de una cadena. El formato es `substr(cadena, inicio, longitud)`: + +```php + World! +print_r(substr($text, 7, 5)); // => World +print_r(substr($text, -6)); // => World! (el índice negativo cuenta desde el final) +``` + +Si se omite la longitud, PHP toma todo desde el índice inicial hasta el final de la cadena. diff --git a/modules/31-advanced-strings/70-slices/es/data.yml b/modules/31-advanced-strings/70-slices/es/data.yml new file mode 100644 index 00000000..c42e4492 --- /dev/null +++ b/modules/31-advanced-strings/70-slices/es/data.yml @@ -0,0 +1,9 @@ +--- +name: Subcadenas +tips: + - > + [Función substr](https://www.php.net/manual/es/function.substr.php) +definitions: + - name: Subcadena + description: >- + una parte de una cadena extraída según los parámetros dados: inicio y longitud. diff --git a/modules/31-advanced-strings/70-slices/index.php b/modules/31-advanced-strings/70-slices/index.php new file mode 100644 index 00000000..9a5f0349 --- /dev/null +++ b/modules/31-advanced-strings/70-slices/index.php @@ -0,0 +1,7 @@ + 2034 +``` + +Запись `substr($value, 6, 4)` означает: взять из строки `$value` четыре символа, начиная с индекса 6. Формат: + +```text +substr(строка, начало, длина) +``` + +Обратите внимание: третий параметр задает не индекс конца, а количество символов, которое нужно взять. + +```php + basics (6 символов с индекса 5) +print_r(substr($value, 0, 7)); // => code-ba (7 символов с начала) +print_r(substr($value, 2, 4)); // => de-b +``` + +Как все это считать? Если мы работаем с конкретной строкой, то почти всегда это делается на глаз. + +## Подстрока является строкой + +```php + 1 +substr($value, 3, 2); // => 12 +``` + +`substr()` всегда возвращает строку, даже если в ней только цифры. Это значит, что результат можно использовать, как обычную строку: конкатенировать, печатать, интерполировать и так далее. В том числе из него можно извлечь новую подстроку: + +```php + 12-9 +print_r(substr($part, 0, 2)); // => 12 +``` + +Сначала мы получили подстроку `'12-9'`, а потом извлекли из нее новую подстроку `'12'`. + +## Подстрока до конца или с начала + +Иногда нужно взять часть строки до конца или от начала. Такие ситуации тоже легко обрабатываются: + +```php + let (с индекса 3 до конца) +print_r(substr($value, 0, 3)); // => Hex (от начала, три символа) +``` + +Если длину не указать, PHP сам возьмет все символы от начального индекса до конца строки. + +## Отрицательные индексы + +PHP позволяет считать не только слева направо, но и с конца строки. Для этого используются отрицательные значения: + +```php + t (последний символ) +print_r(substr($value, -3)); // => let (последние три символа) +print_r(substr($value, 1, -1)); // => exle (с индекса 1 до предпоследнего символа) +``` + +Отрицательное начало означает отсчет от конца строки: `-1` соответствует последнему символу, `-2` — предпоследнему и так далее. Отрицательная длина означает «взять все, кроме указанного количества символов с конца». + +Это удобно, когда заранее неизвестна длина строки, но нужно взять «хвост» или «середину» строки относительно конца. + +## Переворот строки + +В некоторых языках, например в Python, у срезов строк есть параметр «шаг», с помощью которого можно взять каждый второй символ или перевернуть строку. У `substr()` шага нет, но для переворота строки в PHP есть отдельная встроенная функция `strrev()`: + +```php + telxeH +``` + +## Подстрока с переменными + +Параметры `substr()` не обязаны быть жестко зафиксированы числами. Можно использовать переменные: + +```php + exle +``` + +Это особенно полезно, когда границы вычисляются во время работы программы. + +## Осторожно: кириллица + +Функция `substr()` работает с байтами, а не с символами. Для латиницы это одно и то же, но символы кириллицы и других нелатинских алфавитов занимают больше одного байта. Для таких строк используется функция `mb_substr()` — подробнее о работе с кодировками мы поговорим в конце курса. + +## Быстрая шпаргалка + +```php + + [Функция substr](https://www.php.net/manual/ru/function.substr.php) +definitions: + - name: Подстрока + description: >- + часть строки, извлеченная по указанным параметрам: началу и длине. diff --git a/modules/30-variables/35-heredoc/Makefile b/modules/31-advanced-strings/90-multiline-strings/Makefile similarity index 100% rename from modules/30-variables/35-heredoc/Makefile rename to modules/31-advanced-strings/90-multiline-strings/Makefile diff --git a/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php b/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php new file mode 100644 index 00000000..d6b0e281 --- /dev/null +++ b/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php @@ -0,0 +1,22 @@ +expectOutputString($expected); + require 'index.php'; + } +} diff --git a/modules/30-variables/35-heredoc/description.es.yml b/modules/31-advanced-strings/90-multiline-strings/description.es.yml similarity index 100% rename from modules/30-variables/35-heredoc/description.es.yml rename to modules/31-advanced-strings/90-multiline-strings/description.es.yml diff --git a/modules/30-variables/35-heredoc/en/EXERCISE.md b/modules/31-advanced-strings/90-multiline-strings/en/EXERCISE.md similarity index 100% rename from modules/30-variables/35-heredoc/en/EXERCISE.md rename to modules/31-advanced-strings/90-multiline-strings/en/EXERCISE.md diff --git a/modules/30-variables/35-heredoc/en/README.md b/modules/31-advanced-strings/90-multiline-strings/en/README.md similarity index 100% rename from modules/30-variables/35-heredoc/en/README.md rename to modules/31-advanced-strings/90-multiline-strings/en/README.md diff --git a/modules/30-variables/35-heredoc/en/data.yml b/modules/31-advanced-strings/90-multiline-strings/en/data.yml similarity index 100% rename from modules/30-variables/35-heredoc/en/data.yml rename to modules/31-advanced-strings/90-multiline-strings/en/data.yml diff --git a/modules/30-variables/35-heredoc/es/EXERCISE.md b/modules/31-advanced-strings/90-multiline-strings/es/EXERCISE.md similarity index 100% rename from modules/30-variables/35-heredoc/es/EXERCISE.md rename to modules/31-advanced-strings/90-multiline-strings/es/EXERCISE.md diff --git a/modules/30-variables/35-heredoc/es/README.md b/modules/31-advanced-strings/90-multiline-strings/es/README.md similarity index 100% rename from modules/30-variables/35-heredoc/es/README.md rename to modules/31-advanced-strings/90-multiline-strings/es/README.md diff --git a/modules/30-variables/35-heredoc/es/data.yml b/modules/31-advanced-strings/90-multiline-strings/es/data.yml similarity index 100% rename from modules/30-variables/35-heredoc/es/data.yml rename to modules/31-advanced-strings/90-multiline-strings/es/data.yml diff --git a/modules/31-advanced-strings/90-multiline-strings/index.php b/modules/31-advanced-strings/90-multiline-strings/index.php new file mode 100644 index 00000000..24c25c8d --- /dev/null +++ b/modules/31-advanced-strings/90-multiline-strings/index.php @@ -0,0 +1,12 @@ + Hello, {$name}! +``` + +## Компьютер и человек воспринимают код по-разному + +PHP может обработать и строки с `\n`, и heredoc. Для интерпретатора это одно и то же. Но для человека, читающего код, heredoc намного удобнее и нагляднее. diff --git a/modules/31-advanced-strings/90-multiline-strings/ru/data.yml b/modules/31-advanced-strings/90-multiline-strings/ru/data.yml new file mode 100644 index 00000000..2a0195eb --- /dev/null +++ b/modules/31-advanced-strings/90-multiline-strings/ru/data.yml @@ -0,0 +1,8 @@ +--- +name: Многострочные строки +definitions: [] +tips: + - > + [Heredoc](https://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.heredoc) + - > + [Nowdoc](https://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.nowdoc) diff --git a/modules/31-advanced-strings/description.en.yml b/modules/31-advanced-strings/description.en.yml new file mode 100644 index 00000000..1f2b5c47 --- /dev/null +++ b/modules/31-advanced-strings/description.en.yml @@ -0,0 +1,5 @@ +--- + +name: Deeper Into Strings +description: + We continue studying strings and their relationship with variables. We cover interpolation, character extraction, substrings, and multiline strings. diff --git a/modules/31-advanced-strings/description.es.yml b/modules/31-advanced-strings/description.es.yml new file mode 100644 index 00000000..3b9f3636 --- /dev/null +++ b/modules/31-advanced-strings/description.es.yml @@ -0,0 +1,5 @@ +--- + +name: Más sobre cadenas de texto +description: + Continuamos aprendiendo sobre cadenas de texto y su relación con las variables. Exploramos la interpolación, la extracción de caracteres, las subcadenas y las cadenas multilínea. diff --git a/modules/31-advanced-strings/description.ru.yml b/modules/31-advanced-strings/description.ru.yml new file mode 100644 index 00000000..8946cc33 --- /dev/null +++ b/modules/31-advanced-strings/description.ru.yml @@ -0,0 +1,5 @@ +--- + +name: Глубже про строки +description: + Продолжаем изучать строки и их связь с переменными. Разбираем интерполяцию, извлечение символов, получение подстрок и многострочные строки. From 491a343d36efde29c19f1bb507a67ad9925e70a7 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 5 Jun 2026 21:35:37 +0500 Subject: [PATCH 07/29] =?UTF-8?q?feat(35-calling-functions):=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8?= =?UTF-8?q?=D0=B7=20Python=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 100-call, 150-expression, 270-deterministic: теория RU до паритета с Python - delete 120-function-signature (прецедент JS, тема влита в 135) - rename 135 -> calling-functions-default-params, 180 -> variadic-parameters (slug по Python) - задания выровнены под сюжеты Python, неймспейсы тестов по паттерну модуля Co-Authored-By: Claude Opus 4.8 (1M context) --- .../100-call/ru/EXERCISE.md | 2 +- .../100-call/ru/README.md | 139 ++++++++++++++---- .../100-call/ru/assets/function.png | Bin 0 -> 20044 bytes .../120-function-signature/description.es.yml | 87 ----------- .../120-function-signature/en/EXERCISE.md | 6 - .../120-function-signature/en/README.md | 28 ---- .../120-function-signature/en/data.yml | 7 - .../120-function-signature/es/EXERCISE.md | 5 - .../120-function-signature/es/README.md | 70 --------- .../120-function-signature/es/data.yml | 8 - .../120-function-signature/index.php | 7 - .../120-function-signature/ru/EXERCISE.md | 5 - .../120-function-signature/ru/README.md | 70 --------- .../120-function-signature/ru/data.yml | 8 - .../SolutionTest.php | 17 --- .../index.php | 7 - .../ru/EXERCISE.md | 2 - .../ru/README.md | 28 ---- .../ru/data.yml | 6 - .../Makefile | 0 .../SolutionTest.php | 4 +- .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../index.php | 17 +++ .../ru/EXERCISE.md | 19 +++ .../ru/README.md | 65 ++++++++ .../ru/assets/default-parameters.png | Bin 0 -> 64112 bytes .../ru/data.yml | 9 ++ .../SolutionTest.php | 2 +- .../index.php | 2 +- .../ru/EXERCISE.md | 6 +- .../ru/README.md | 102 +++++++++---- .../ru/data.yml | 5 + .../180-variadic-arguments/Makefile | 2 - .../180-variadic-arguments/ru/EXERCISE.md | 1 - .../180-variadic-arguments/ru/README.md | 16 -- .../180-variadic-arguments/ru/data.yml | 3 - .../Makefile | 0 .../SolutionTest.php | 4 +- .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../index.php | 0 .../180-variadic-parameters/ru/EXERCISE.md | 1 + .../180-variadic-parameters/ru/README.md | 41 ++++++ .../180-variadic-parameters/ru/data.yml | 9 ++ .../270-deterministic/SolutionTest.php | 10 +- .../270-deterministic/index.php | 2 +- .../270-deterministic/ru/EXERCISE.md | 4 +- .../270-deterministic/ru/README.md | 46 ++++-- .../ru/assets/deterministic.png | Bin 0 -> 104490 bytes .../270-deterministic/ru/data.yml | 5 + 61 files changed, 406 insertions(+), 471 deletions(-) create mode 100644 modules/35-calling-functions/100-call/ru/assets/function.png delete mode 100644 modules/35-calling-functions/120-function-signature/description.es.yml delete mode 100644 modules/35-calling-functions/120-function-signature/en/EXERCISE.md delete mode 100644 modules/35-calling-functions/120-function-signature/en/README.md delete mode 100644 modules/35-calling-functions/120-function-signature/en/data.yml delete mode 100644 modules/35-calling-functions/120-function-signature/es/EXERCISE.md delete mode 100644 modules/35-calling-functions/120-function-signature/es/README.md delete mode 100644 modules/35-calling-functions/120-function-signature/es/data.yml delete mode 100644 modules/35-calling-functions/120-function-signature/index.php delete mode 100644 modules/35-calling-functions/120-function-signature/ru/EXERCISE.md delete mode 100644 modules/35-calling-functions/120-function-signature/ru/README.md delete mode 100644 modules/35-calling-functions/120-function-signature/ru/data.yml delete mode 100644 modules/35-calling-functions/135-calling-functions-default-arguments/SolutionTest.php delete mode 100644 modules/35-calling-functions/135-calling-functions-default-arguments/index.php delete mode 100644 modules/35-calling-functions/135-calling-functions-default-arguments/ru/EXERCISE.md delete mode 100644 modules/35-calling-functions/135-calling-functions-default-arguments/ru/README.md delete mode 100644 modules/35-calling-functions/135-calling-functions-default-arguments/ru/data.yml rename modules/35-calling-functions/{120-function-signature => 135-calling-functions-default-params}/Makefile (100%) rename modules/35-calling-functions/{120-function-signature => 135-calling-functions-default-params}/SolutionTest.php (70%) rename modules/35-calling-functions/{135-calling-functions-default-arguments => 135-calling-functions-default-params}/description.es.yml (100%) rename modules/35-calling-functions/{135-calling-functions-default-arguments => 135-calling-functions-default-params}/en/EXERCISE.md (100%) rename modules/35-calling-functions/{135-calling-functions-default-arguments => 135-calling-functions-default-params}/en/README.md (100%) rename modules/35-calling-functions/{135-calling-functions-default-arguments => 135-calling-functions-default-params}/en/data.yml (100%) rename modules/35-calling-functions/{135-calling-functions-default-arguments => 135-calling-functions-default-params}/es/EXERCISE.md (100%) rename modules/35-calling-functions/{135-calling-functions-default-arguments => 135-calling-functions-default-params}/es/README.md (100%) rename modules/35-calling-functions/{135-calling-functions-default-arguments => 135-calling-functions-default-params}/es/data.yml (100%) create mode 100644 modules/35-calling-functions/135-calling-functions-default-params/index.php create mode 100644 modules/35-calling-functions/135-calling-functions-default-params/ru/EXERCISE.md create mode 100644 modules/35-calling-functions/135-calling-functions-default-params/ru/README.md create mode 100644 modules/35-calling-functions/135-calling-functions-default-params/ru/assets/default-parameters.png create mode 100644 modules/35-calling-functions/135-calling-functions-default-params/ru/data.yml delete mode 100644 modules/35-calling-functions/180-variadic-arguments/Makefile delete mode 100644 modules/35-calling-functions/180-variadic-arguments/ru/EXERCISE.md delete mode 100644 modules/35-calling-functions/180-variadic-arguments/ru/README.md delete mode 100644 modules/35-calling-functions/180-variadic-arguments/ru/data.yml rename modules/35-calling-functions/{135-calling-functions-default-arguments => 180-variadic-parameters}/Makefile (100%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/SolutionTest.php (73%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/description.es.yml (100%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/en/EXERCISE.md (100%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/en/README.md (100%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/en/data.yml (100%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/es/EXERCISE.md (100%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/es/README.md (100%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/es/data.yml (100%) rename modules/35-calling-functions/{180-variadic-arguments => 180-variadic-parameters}/index.php (100%) create mode 100644 modules/35-calling-functions/180-variadic-parameters/ru/EXERCISE.md create mode 100644 modules/35-calling-functions/180-variadic-parameters/ru/README.md create mode 100644 modules/35-calling-functions/180-variadic-parameters/ru/data.yml create mode 100644 modules/35-calling-functions/270-deterministic/ru/assets/deterministic.png diff --git a/modules/35-calling-functions/100-call/ru/EXERCISE.md b/modules/35-calling-functions/100-call/ru/EXERCISE.md index 081bc8d1..112cc739 100644 --- a/modules/35-calling-functions/100-call/ru/EXERCISE.md +++ b/modules/35-calling-functions/100-call/ru/EXERCISE.md @@ -1 +1 @@ -В коде программы определены две переменные, содержащие имена компаний. Посчитайте их общую длину в символах и выведите ее на экран. +Сайт проверяет, вместится ли реклама двух компаний-партнеров в одну строку. В коде определены их названия — посчитайте общее количество символов в обоих названиях с помощью функции `strlen()` и выведите на экран. diff --git a/modules/35-calling-functions/100-call/ru/README.md b/modules/35-calling-functions/100-call/ru/README.md index 5fdd3b8a..b73cdfb3 100644 --- a/modules/35-calling-functions/100-call/ru/README.md +++ b/modules/35-calling-functions/100-call/ru/README.md @@ -1,64 +1,147 @@ -Сложение, конкатенация и остальные рассмотренные операции — это базовые возможности языков программирования. Но со строками можно производить более сложные операции. Их можно переворачивать, менять регистр букв, удалять лишние символы. +Программирование нужно для того, чтобы выполнять самые разные операции. Иногда это простые действия, например сложение чисел или объединение строк. Но чаще это сложные процессы вроде перевода денег со счета на счет, оформления заказа в интернет-магазине, расчета налогов или подготовки отчета. -На более высоком уровне есть прикладная логика конкретного приложения. Программы списывают деньги, считают налоги, формируют отчеты. Количество подобных операций бесконечно и индивидуально для каждой программы. И все они должны быть выражены в коде. В этом помогают функции, с которыми мы познакомимся в этом уроке. +Такие операции невозможно выразить одной командой. За действием вроде «перевести деньги» могут скрываться десятки, сотни и даже тысячи строк кода. Это проверка баланса, списание суммы, учет комиссии, обновление базы данных, отправка уведомления пользователю. -## Какие бывают функции +Чтобы управлять этим кодом и не теряться в деталях, используют функции. Функция объединяет блок кода в единое целое, прячет реализацию и позволяет сосредоточиться на смысле. Для программиста достаточно вызвать функцию и доверить ей всю внутреннюю работу. -Для выражения любой произвольной операции в программировании существуют **функции**. Они бывают встроенными и добавленными программистом. С одной встроенной функцией мы уже знакомы — это `print_r()`. +![Функция](./assets/function.png) -**Функции** — одна из ключевых конструкций в программировании, без них невозможно сделать практически ничего. Сначала мы научимся пользоваться уже созданными функциями, а потом научимся создавать свои. +Представим функцию, которая переводит деньги с одного счета на другой. В реальности внутри нее могут быть сотни строк кода, но мы этого не видим. Снаружи все выглядит как одна простая команда: -## Как работать со встроенными функциями +```php + '!olleH' +// Да-да, print_r тоже функция +print_r('Хекслет!'); + +// Отправка письма пользователю +sendEmail('bob@example.com', 'Добро пожаловать!'); + +// Вычисление налога с указанной суммы +calculateTax(5000, 'Florida'); + +// Проверка, есть ли пользователь в системе +isRegistered('Alice'); + +// Получение случайного числа от 1 до 10 +randomNumber(1, 10); + +// Создание резервной копии базы данных +backupDatabase(); + +// Вычисление длины строки +strlen('Hexlet'); // Результат: 6 ``` -Мы создали переменную `$result` и указали интерпретатору записать в нее результат, который вернет вызов функции `strrev()`. В этом смысле функции идентичны операциям — они всегда возвращают результат своей работы. +В вызове функции сначала пишется ее **имя**, затем круглые **скобки**. Скобки показывают, что это именно вызов. Так мы понимаем, что перед нами функция, а не переменная. -Запись `strrev('Hello!')` означает, что вызывается функция с именем `strrev`, в которую был передан аргумент или параметр `'Hello!'`. +Внутри скобок указываются **аргументы**, то есть данные, которые функция получает для работы. Их может быть несколько, один или вовсе ни одного. -Аргументы нужны функциям для работы так же, как операторам нужны операнды. Функция `strrev()` переворачивает ту строку, которая передается ей в аргументах. +## Откуда берутся функции? -Вызов функции всегда обозначается скобками `()`. Они идут сразу за именем функции. В скобках может быть любое количество аргументов, а иногда — ни одного. Количество зависит от используемой функции. Например, функция `pow()` принимает на вход два аргумента и возводит число, переданное первым параметром, в степень, переданную вторым параметром: +Одни функции встроены в язык (built-in), другие создают сами программисты. + +**Встроенные функции** представляют собой функции, которые идут вместе с языком PHP. Их можно использовать сразу, без дополнительных действий. В качестве примера можно привести функцию `print_r()`. Как говорят, она доступна глобально. + +**Функции, определяемые программистами**, создаются тогда, когда нужно оформить свою логику в отдельный блок. Такую функцию можно назвать любым именем и использовать в коде так же, как встроенные. Мы научимся этому позже. + +Кроме того, существуют функции, которые находятся в отдельных библиотеках. Чтобы ими пользоваться, библиотеку нужно установить и подключить к программе. Подробно этот механизм мы пока не разбираем. Пока достаточно знать, что он позволяет подключить внешний набор функций и сделать их доступными в программе. + +## Функция с одним параметром + +Одной из самых часто используемых встроенных функций является `strlen()`. Она возвращает количество символов в строке. ```php 8 +$message = 'Hello!'; +$count = strlen($message); +print_r($count); // => 6 +``` + +Здесь в строке `'Hello!'` шесть символов, поэтому вызов `strlen($message)` вернет число `6`. -// В современном PHP появился специальный оператор для возведения в степень -$result = 2 ** 3; // 8 +```text +Аргументы Функция Результат +┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 'Hello!' │ ──→ │ strlen() │ ──→ │ 6 │ +└──────────┘ └──────────┘ └──────────┘ ``` -Теперь рассмотрим пример функции, которая не принимает аргументов. Функция `rand()` генерирует и возвращает случайное число: +## Возврат значения + +Возврат значения является одним из ключевых принципов работы функций. Благодаря ему мы можем соединять результаты разных действий и строить более сложную логику. Если функция возвращает значение, то мы можем сохранить его в переменную, передать в другую функцию или использовать в вычислениях. Именно так работает `strlen()`. Она считает количество символов и отдает результат наружу. ```php 12 +``` + +Если бы `strlen()` сразу печатала результат на экран (как делает `print_r()`), то мы бы увидели число, но не смогли бы его использовать: + +```php + 8 + +// 5 во 2-й степени: 5 * 5 +print_r(pow(5, 2)); // => 25 +``` + +По структуре вызов с несколькими параметрами не отличается от вызова с одним. Те же имя функции, скобки и аргументы через запятую внутри. + +## Параметры и аргументы + +В разговорах о функциях то и дело встречаются слова **параметры** и **аргументы**. Они связаны, но не одно и то же. + +О **параметрах** говорят при создании функции. Параметром называют переменную внутри функции, в которую попадает переданное значение. Об **аргументах** говорят при вызове. Аргументом называют то, что мы передаем в функцию. Это может быть число, переменная или любое выражение. + +```php + 8 -// В PHP такой синтаксис невозможен, но есть языки (например, lisp), -// где оно выглядит очень похоже +$x = 2; +// аргумент может быть выражением, оно вычислится до передачи в функцию +print_r(pow($x + 1, 3)); // => 27 ``` -Вопрос на самопроверку. Как узнать, что возвращает вызов `print_r()`? Проверьте. +Запоминать это не обязательно, но пригодится при чтении англоязычной литературы. diff --git a/modules/35-calling-functions/100-call/ru/assets/function.png b/modules/35-calling-functions/100-call/ru/assets/function.png new file mode 100644 index 0000000000000000000000000000000000000000..f89fee08cb4c01f424120130698bc0dddeec9190 GIT binary patch literal 20044 zcmaG{Wn7c}*B{;84WnU*fOO+Px+F$Vy1S&MQ>2j&L1M`0j!Cz4DYv6Bh>1xQb&aHzwcOp^OG-+p zS=d2>B3kD5l4?euznwrmLm&`H&C-oqTz*_!oQ|c7fVi}rx}K<<(%|l&+S*!rKAxtg zCIdV7XK!7fJ$sgxmi9V1?v#)hIE)IYt_z`?g;_1MbFN<&i- z#3{DE**!Eglvo09?I%NMr` z75#G|sRfadkuSx~*kmMgdRF}6GsFs#p$7gAPG*B`2RUII>8&#Xwr~~(?zo0ccZ-ke zk-_lH-9(?UAjcA^nmp^6@T3oc%JL9nQ*ACarH-QO(!_<#cLVXhjnOUe`lgQ%)nE>j z*Wrgh%6h+LP7Q%an&dhvp;iXM2D-)H=lz!_8t>1tyA~Zf>!DS}(4gF~&(m&Msa3EK zQdZ_)&iC}REMdjtu-Ysa+b}l|%jy2x=;&y{n1H6L#geXxq^}(T?>~Y)oxOald0nm3 zgBAn5QY!X0K15fQWcNZorU<7+MTZn*zi-g0zJCS)sFA6F<@Nkmj@AX#=-yEGo@Y^+ z)=Nc)xy)RB$iva^;z@q>e|yH#Y7H;i3;HlX=%JORP8$AFp5Q9* zmODV@s?kAx2Jy4z;i>r#YUumjU~_W}uPmpLfo;S zu!`YITs?4Pk`5qRHNm-3P90204xo;MzG**l+<%cpRpS%XwrATdu-*TI8G@|^Yy30> zdr@M#_O%n6@~dU-?iCnAv^?xBF(|T6lk+N~<=VD--qHL3UmVlAVt(uPE%!Y!Yi$dxl>=M)7=!= zaon|qrcEbhy1>3aiLvOYtwbyOdFxvsC3Lq;1J zcAqu0*Z#5*ZmjiTplNq}mUtO%?Gy6^S(8?bjR(%Jofwp!4@!HiaE`;x2_%ix_Im3B zVZXNQ3;hbKGoo;0&`WQ-fAiJdytg=7?{Ok~LqBvLLlh+M+WMU(d;0{RJ&lEp!@O|LOcBYnT4#&=7VOCF7IdRpuqlGqz1SwW7brjydPMExV}R z^}ppB6oZV9C4^%VwVWm$t)YhHSXP?@SJx*Vy1utWu(`DTsQyq73_Er52U7op*2#}K zx%cOA_7J^Kp3)>@a&!m1zg;v#*Y-rce&;MXFI{HwGe`QXX9kLCL%%&8z@H2qsf2Ql z?L7T!Ipv`0Zvemq#22*IaQWJ=9XwN3IQlklUg@-j4^VB{h#e*xE2>T%%IHA<|ntS7|V4mTk@hKV;=) z0)k%CchH)x>jycLW>BnR0j7S^gMKAN34QQ zXE+^)yeLttDda-=CJq@V!%DbQk(babo2{N(@HU>8N>A$_4F=%VMt+8Ml(K}mfv;wR zU;9Tz3`lvvvy;6)8)nchuaPWFo0W86UEEno@_TIVv`O~j_L^tZa-R?%GGHaV-GtU{ zlKQ^S`Motyxa>@hpF09hutT)~XO%BSzT9?rYkGI7Uiz>!IF(7WtO574 zB>L+x$JqypeC(8{RVjK62`R0PfCXqD@D4fI@~d77qrm(b10Rbb>+zr|5d+j60J2^_ zah6UsaLj=_R>2?QZd7}&%{2h!7CmSX;!Xqb1o|t3+2^Nx0Ed=xB)wlqH3`B75SED; zH{^1P`ocho*AMil-=r7TtW=em070~z5EU~myuqbVYl7CwDm$>Z*|iTQ^d){QiixVS zKHz2$JJW%9Ix;@v+qGo4fXGg2jbEe+aOp}=%iS7ZX&P7Q!=Es>w`%|tHIt5Ul#a3fe7h>V~$`(g;Mw9F7U>8X- zjK(aoFAO{Kc6Mrg*%>{sgzvu#dxK#KxU>vINl*U}f(l_|0G(6qvEd9Zr3e1(WXInc zKIEF9V6KYP!-Pv~!ePp6y!16~#g&KqpZ3x|OzD#37EqJGI-!XgZT{q~UobrYMH~9* z?WB_}(|$v+d(7&kk3%-cEl~yq&dZT>)!rOhUw+?r&NnR2J!X_#j(=y-nREGD7%w0) zaWScR1JLaJ{q`BklHu1jOexAo%HRma)bDSH>}ck6$@x?w?rBDTn`1ZlaV|2vxqcv~ zN~q&*M%mCK*q{tEGC1$BclO*Ed176q4d>_b z_Xa3uruYHHC}n4_a2l+zcxP}kUwP?nbJ=>&s_#}dsb(DEWnPxKab@mKKoT_?ZfT1! zvdI`xZ&@bqNCQZ!(KoKa5jNRzmWLk$JvlST2@{-;nS`-^rK?E0J!O8$m144X9(4h5 zB{MCy@P^Bc<&ME#od;hh&^Mn#nX zb8G`DAmX$@rNlT@DTS#`9Y9@2?ixlxLWXNlr_UWT?O@o<3CX;C!6$o#!TS|q>HN!D zz|yHthoJX3@9auyoY+Ye*M0##Ji`;~^~VA=yQ{~aBAJ`b$WgQe<3){qWc*&u0XR-O zYsP18rrVOaiKUi>xVo)v?B)CK=Zmmk74Q|al_9ZCz^SHC?E7q^GH5>~o|@lHBv{PB z;WEq6kJ6$8;C4j4pi;G=f!}gG(l98{i%z#;tL^(E^-MIiqe;i!C-)nkFbaV>XxR$F zvye95lY-!e?M;i0;*{b|A~bOV(}_{{XfZ{iNH@BMIp{Bd*oEueu?x!Z(17(T$U5t^ zt|a7(o6%DLJHiE)i zNr8})Re4A5-)1yvY%RK((^McqvVG;qQx#ih5mWO>s+tdErJWs={)tVySB@&`5|9Be zM15eoC|QX`q;q@5T)sKYdd7Vxg6!p>t@3?PeMupI0)Wv0@auO*if@lRPi!wD9s}Rt zlPDxQmqTC}Xt;Z`zR!x4Q1|iTU`Wl|!NOoc@p*E|hta_JonR&%-{^#MiCdlw<()ad-))K=;8)B@gdF z(<$+vKsQlE?2`hQbGEG+YT#DG#0M={7JUBTrI-HtJMu2hLHx|Ihfo|JGb*&TtT0B< z`kUX<9jr`j=vGHhA9#CpRt=?&9y?K1|N4;tA#e7AehOGQw_Zuni;gCBJsRsf>4=Gt zZq;HWJUzV~gqTQWjS(zx)-{G@?it+ehLoBk_q?og=C|fsGwgqp{4~zZPPAZh2%6iG z|I|6xA@*eHK+p%0Aq_{)@;^@Ic7{~$lNq(E>jnGOw38;h!%TP82tk#t{KL?tj)=@= zgxLF^M6$yXE#=rI)lK9?FL4g#&UHtvi$oD=_#iPjHqhU_LwVUI247^Y?c12IGQapo zD|?c9(GNFuPCt5Q76yHVgx`{0ZJc@?6z}qDJ>GG$1bh+kYa!loe^O9?amk-7&@g2a z#EW;HjmUwuUrLIBr)GyveIoDq#yse&8;Y$;+~0~Yw77Pk&puB)97I@BR}T>wa2M`s zD3sXkTYi4-kYTlgCce2M>i6<`EH$=-5d}2t}|~g>ml(tFgD8&F|%kN1-Isub0>Qw1+ZT77sC;wI=KN@Q-T* zA>b=EnS3DJHX4h2)_B^L?~1{T`STi#`D`m30W9Ivu44IizCGM~>h$FJ@eBT226RF- zq%-OE26pt7pKNWD;l71_k7o62BB)KINTseD!ehDKPrL@)Yl!JBqCV_vzz|87s&xDQ4FfC26C4lJT=9C7>$QKARUiXR-wt;lNE29Yr^Mcce5VbI);2&pI79|BFbj%C zyMc5n5QCg-&&-{1^;ZGD90+6CjlkPjdq%V{b~5-62V;|HV?Z~a{vW{Aj2L9%cj&$En1S)01Vwza?f_~9ojdw4b0*AciN8J^ zv9Ul{0a`ofEF6VgG^#``Q9ooKK#R1c${5BvTQ}pJ+&u(2#t36YCSxBhtU&!U)<(6q z-ZNlhe~KiDqRHYrg37Pgrs8!dMQr3|Ed5iWWYhE=fS^j~w?zZYi_AjX`zu;9&hS|K z$MeBVTy+;mnlVlNTwGT^Twsa4T5r7G8!Ut|b}}TGxrK*ZU%;0;Hnt>Kx98PTPKZ+k zS`jaK4b}6n6d+)L{pa2+)qq(o@|;b}h8v`|lg=^d8 zF}Wb&gbIi5+|)M5x6Y>;?ExwZ8O?S>1*E{~Q5VaIsV-Ut8q6_;3SUe5baaxG`hoTQ z8v2vz6eIWN)&7>-vN*t!$WgbaATFRnGbhX_Bda43S<9BSTX;0~$4NMl-hAh7k{TGl z+29d-SKpyVt?}c_MI{|D=kRipbZgk2$f=uZJ~=#g&-`%Ss(*Xr3e$hdx1i$)eAR>e z3TpX>Z}yPo{iRa~XGW~8&&`KO{#hXst;r4ag4h$#2@8!{`7ZO9fDEc=@QY^0J!Sie zj7kcUALl0WV7C4Xfz-p1MrSt5vk!`3U||HRMfncv$6ESsGU-5luKlsbd*zC+uY6+* z+Azt>o-VvBDGKUh3z`81|TnL=vKnrF{GZ`KhL z#pr8&t!!=R2c0>3#%lY9-t8U9@;qI(u$6t74QeO@dwq58bC)-ZPsU+5SpU2g1JrZ( zZMweFDS~}{NPa!+naN_iKYSeSF6cwG_~q*|zXnoYu8tkTuX+>g=23*25K zWHf#Raw^vCVUOu&3CcLV+(^m|d9Qe3Y`@^1EURnbizu2XMX(dyHwvSzp7)QQer2X3 zh9@MX)AeJ3`uZ)q^@xy7n1Qu^{42dU`(+xe4V;lGZ4cB3=8pl~e10fW+FE-0`Jq(kCIepD;BnC&Q$#FgV;oKCL+5u|MGwKW7BchSm3c3 zvL5pUXmSBdnm=vFzL+>&$YlF5M!9zm={Ey?HobF}$X8ioU}9ntZvl#bPgk~{*?0b~ zp95N4%edSBK%Ig-vLkV@vm4r|NLBEu5rWJ3_cS*;fj~zs)$g@q_3y%(LD~V_!9~M( z*WgA0ZgEcDlFBzOitq}x(}}EAJNreHP6IGFl#_idM|-5Q1~>EP%*%7rfc@zm+1h$0 zF@I$ek{UJD%uM@}yyn5z6I~Z0z6sr)9pQZ|@r|%bl-5tNu_A2jEtgEvma5x)&VL ze^V^0%n72g(E5xM)SBbydWDbx*}2~y4qo}MF;#;tWtKUN0HWk1)8#57(-lXs3M_Ye z9WXeToxLNOfw$k9QxVXKY{y&<_Q0lc-s@~F-%+>UCpMoexe~W-Wq5Nvs!3f)h_NxT z{RV){mR#r*dULdNajN>^&==;~^vbdCD*WX!$FX_P$X?k4wYKI&p9^${yYu9Zm1jk4 z9-*1_#4sQIHhJ>BR8$75sEw#<803ZSE#Qnrwli-?B6kgGMruaZ=lb-{*Au5^wG(S- z-`HbgQ`1v3$j~&LPQD%XC5+{vEjJYlWzv-Ze35ITzieAr3G2je|KJc-V`z$v?uy(+ zNa8h*W9dr4Sw_>f0^kcCu!OwKIv73pbBCzgjtAt8OBW|#1%pJVUe{B>r?hy*1Z^V! z!S!#1eh~Iq7SgJ9nYA18b_*xccUG$O8__UFd2o7X`Vr1GfD!vYV?;K<}2?q{XGOh}o|c?`4zwfF%1xng5y_}OKRzAzIB+huin^MAO;?Uj@VZx^Ni z4KeF_sMvWQ0?;WrS}zjJ zzuXc+YmxMCkDo)h(C$&&x8ZY&O?l^jQ*y-l*pxVSF4$m0m zP5lif%ShYWGU`bv7-%O4s5GRTD6OtlkJ6{I;S z{v%-m3eib)Ol|PC%0tvN^pNJnP&VR`=2CkOMV!0$64!b^E$dzw0d~S;m19c^c;OhI zhjs=f5;If#00qb>>fQX_NH!9u#i{3l*b9H7C56Wdn!Dx_HNUTmRd*h==Dwp0TSU_G zXvIXwN4LNFaxW+10XWb}Y+eYvyXL1?CN7s*v+|(IX?8Q0jA!&nx&QW?8k@7MN&)Dg-H__e;yjM>zHo%;;uo84h zq3?Z~@w5=hy!|cnwDfpX&Rn8iLXbB*U#U8B(jKpW(j6FhGV=&T8j&N&;~!Uv`8AQA zI+d=lxU{(N`s0`zVVrOM7(cP-^-GCGr%&m51RGmdBj0uHQAOKFSCeIl!Hqw+Tb$7B z>?i?8&1=4-y|Jb*WbT?8n)-+)>bkT-kMGBmTVj3RmlP5P_oDq!Yh_>tfk&k^5H9IwD>F;pNNrLdI<%FPIDCzy;-) zlkZOWXIR|QQ%eDZpIGadtP%`~-+sHrYagxV^v96jR$1x2dlGIlRekmh{cqn)CAlH- zRL?nX_^?Uiy9TrZZuXeD1b4DIivFm8y_4=GLmvmCS2AG6vu}63M(5hxcX0tE66F^1 zFVKrSW^USZSebxnm_N#?#oUb1!anR|ZoSM!3iO0yuXQ(zU2IaI>*RC_xId14?`nKT zqVxtZby@Jvclp8X4fFbu!b8JwfB1}?8qaK8i9EQ)NF`E%3Srua4IW!*#WvgK z*;8vJI3NRCuP&sQI}v{@QyxsXoVA0@ET9C;4?-=+qe4^F17r$cGKE zfrU4O-iKcnnyboey?&_~DeW7(7Ot!W$3Q8{>Dn-LIZN;K<6h3guKYU5L#W!v7u&1V z!p!Ir>TiVt5VPEE32#8WzSt_W_5vo>(PkKnr)3wi<|_W8MAytmRVF0QD}4Y;DkXDu zq=PuW%2aiE7ORoRhx8IJ?PQ!JTv@_mTdzrF)?S%(3&^*ZON6A3}`O zaih!&Erm#YVX!yUH&vY^o+k6v=Tqc(GG-x$02-+BX3-2PJGJRXgY`VPm+=#xbqsTT zc=2Sw3#a&)JI3{ZeW7QCUJgTtepAegb*7WHqX5j+32jYfsd`^ zP#)FmUCe4D-bGL5Qh&U6=4mD{DA(oWzR<%)r|i9Qm0D5LtunM;EECo+S+cGqFE8$$ z4-K;a<&&eHFzPHAz7kEyJA?P3@o%ae6y>i5V)?0QW87SOMx8ISom)^bnei@0%dkaR z;`@WAxYlf=4DYl`DtRyuGJ{Y@&dE?-u|Tkc9>NQg>C;~1*4y(HoP?}lWcM>}7I&Gt8ark1qness-{SAf; zBPaK@{J+u;s@!vA9M4Og(Jg4(mXXfnMv*j%B{RzCOEnxj4TP(la=xZ+UGWDq* z*+pSJ^*Mu|4r*+p*2@irUw;~8J*E#PvG8=satk>0wUE)Y0EgakHZrJYEWMrJQdyM! zmmdpbRWJgOgtH^K^JUW2G1YdIR%)g)dOyK^Yjn^-!D(@j7w3@oo=hV@LuiI=;+PCs zp66;%_MmRjKc3U#_tR@_Upc8>^{eU%x!CVZ>4G>%>bc&&T|V^bR(apq7R=cb3%b+7 z>?op#Gu9%TSqLk$@o8)S?s-z&V&MzAqj*7wa;R2|0*s>cH1cvkxW(_skDUgimM6sf zYBf@i`}eYUBl-L@!zqn>UH@XFK|5R^x}5#Ve)pj;gj~5@5J>Bzf&1I%utBw!u}I*Z z9>|Y3*e;GcP=Z9#^$%)#l?Z{saQB#8u0@Wj*wdIaBnQ3gaYbUgHn@fWxW=B_es57ob51EDsdJ|R240W!)~C2^c(n7phv-^#32 zp6Xa0*hoI(pw?AY=h7~$@UkOaoRcHFmrjk7VPw_EMP*#%4TjbHg`6Gxm8Tw^xHi*M zMD3DG$mpC^WgUx$&Wl2>#!=zLMWGds)bP_NWc!KHLo%feNzWCVNd(pn8yGDlJ_px5 zUp_sXBInIN`8Fi~`HjETUB>e8%y4lF5?s+U_@|n&`k{yy9D?*Dl1GiMzQw=w)ps4p z*GFqTV?Xt({Tm>vXk+z~WXSm!y9sH!nO=r+Wm>IJ<;zOum}^ntUPH8J3*dOPZEnei z$m_ZVRjobn+F(=!IQiM+7*}#=Z$~7%`qO}HP*-tO#_XRrsS5o6ptjOMW>RdHy-;Wy zc(S;CynSQM$38jz<;2Zl{~B-9f$x1-gOu_I!j(kKHCL4S74O1VW0)l5H6)%F9>a|n zp1s^I`#1XdF*3cM_V)FbtYVmG*AYdpt#?*DXvKq7kXL{dHPQ!z-(-}O|E)ZCsT^wx z)xXgsMF-)~Vhqu)AO{{YnE#taSecwevRt|<-;}SSh(qZhSX6+poZgFrO)QEltvB^u zeNOki#%%z=9D1f7k*wI4+`|2H)%&nsRBdXAxy;`Uu7|kL<{{pF3gpCm=uKUCxH#*3 zk_9g4z90?#ccpI#1>VfAfQbh^q^8^~@A{_)nwBsx{&{y z5Cr_PfdaOTAkq-NWx0M^jCENY_AYly8Z%+fPly_({b5y^`Y-e@I(x}Ek08pjn2-;A7oy<$ z90C@ifHh*t1|33wMENmBC|dVI%cPJfXrBkYD?k7R-@s=WkQm~BSQOd8W7SP@7914^ zyW6Xzuc0T zvVYsfVlSMugwCO6Q^eEO5fqK*eaH5Z2f|!-vhlwxDfd*`ku`{tMF!W6NnN0v9|WJY ziM2057@x>-Z?kR5Q>eP=E8V>+Y8=2sw#FWj1ZU5GaY0C7x+to4M!IdE84j1(?OLA;!LsmfAgCn5ky!Jb7WIuQlcMv)2Lp)1H%@I^q698KLd7R z`3+1?9%%m-Imz6RB8!K)kL4svv}2$HlqrbPtxhPl8JpC4sONXDvm z{c6Y>PnCX(&Ld@dRBCIf?n@IM?jze5?y97k zi2v$H^NARAoHsu&9arJZR#RfISnPejRWc)Q{;wVI%Naor#$LSCmAYuE*J+VgNi}MU z9=e3RG;a9Fax)J=?|5S+?V8rqC9Ipg=|`h?3bDwJQSJS${$Zab$n0j&_vg`(e3Ky( z@o6e?7D;b%PHzFBA)@ETkoT7(eet)Q@{i35}mGH^q_Hx4wA#sp|fRfOtOG6$8T4xUi zE>n`jRv@sSYFkpsbVyi*UzgE~Ui;Ugl{Ij(JoIfESZ5o20|!F6X1c&#+X*dNrS|>XU3sJ(gL3GxEy{StmeR$JAK7Pd=eB^= zx8U~(V0{t`q^tG#a)UDc?!n^P(CfnNBMCAHpVWvZjIzIqzgL_xDAB*nY8pBtz@|N9o_z+Z>(WR z{^5M{=CLTh0?Ob~-%z&J$0$&DsJ>`a>40ZIhCsc&fgXEK8d51Vw~jI@oyc73AX(Uy zVKgP-K6?|61}*gYfm3?BmDw5bP?S$*{%~bCqm!w76izx`(0YR|2`G#_ErQ}WP-tn3 z$MS}zj~N13IS;4s`?~m{cgj4tsH~mgZ`BoWOINmN53q{#;41xz75A#`R)<3%Ava%oz)6l^NN*bdI>)ras zfkI^A7)ALW2nj~@TR~5QsscoS9g5rYKk@H^$T5TUi~TPgb{#P2;!K&5b}IJ zUY2*he=K5=7Dj-?5CWeIq%>GGnuE<5+B!$WUc+gzDSI=*easW-H}Xb2J;&9fp(ys8 z5)e1Lc`n5%)nJnq;UjO#e{L(Fe8(OaP=PD;&ib0b9gf|gG#U&9>Nia=yt%+*=0srr ztB_6M$59T>+H4(S5a2ix>u?p5v*S?RXGPmJ=tsyw@M`S&zeEp)L%EZ&U0sFdA5uLz zLf&MgEh-%+CnDqL0zvrg#NV3Y&A>WgHsm^iHJXOUd$a8fx|c{sUht}W4W z#ZX>)z_@lfdbQ$m9Vb#X#owyi_5ROoWfuOTL3SlRj)4*JA4gsi(6=O7ScOsLaY4Jh zr&T`9*azqihR1&zVpiRRV&af2+TS^8W)Y(F!t4+Rd0a!2I4?+1?m6Oq`qy^lTzQQd zD-%i0#z{iEq9V9);tCF;|5gPYb!8r7aAPSD9f~_u4?|dOv)vnU@ z?G&9s(H~=^S4(l7nA}~@yzxlPXr;mPCPC-51Z^H-h#XjFddYZAj%TUEzpv%&1Z%l| zV@mQz1d#vyNVDY)s@{-@IJg}GzZI7>n0LMIaafILxcuI-`>+^M7;I&@b;G>JDghbu z$~)q#({U63*fI5p7KeVQ7Wko>4hOTE=iV{1mP46SO0u7(8#~+v!vZ+X>rpCc&nXDu zeAA$tEapJ_=N3AH2xyp+zH#j*T)3o0RN-wY-&I+#L-f({W;lS5j3JgkY=*zZjD(z_ z2Up?OO)sQ6RYf3t@)9#9yPm$D0^v4zg0(O(T+U(>VZ5SeTQ(E(C+~<_WWvc2(eBSk zZ_Z8&t6~;cizmjYX0{o^nbI^P-q$Uy{!c|7o-R;D_n8Gv&rl;I==lir0fZT2i0lad z*i!Vd_%sHS4@HI%PgscX#t-4_$A^#336;r2GQ#)gi0$y}!#D2!8QSpey`@cr=MdJI z+v{aQSDb4@Amjro3&NPtwu~p4$N;j@x&Ff2Z#yo+hm(%pTtgZn{#5hi*9oO?Y}**g zL#U$T>BVg7rmN$tMMql zJfWgR`WTFC>2xTASE@7)op$K>v+MX;!GB7720DUG(4EnRyX9NF5YxC=9koL*xrCgbCbJY75w&|eqf!Xq^$v$zJY+TG@^f8blpmlcMLatQ3C znC|dt?WsERqXk?3KRGto$gZH*$@v0W+hjp3u>)4Q$u)hiz1uXpD+#CH@l zN8b-;nGJdH0fW||W7*Waby|XZ3b+fEvb;VCDui7Q=BG~$=68sk4TI@Q47GJn#Df=4 z{8CiaLvB|`oCizdPcfM(wx>@q99)zg{+-)8{8p7&<>t|d9IjkoeF`xPCCTT2II-5F zC|FkibP}FHi@=aG*UlNzsq(ZtTZAe!b*K3I1j7qJ{j7Tprj~?yTIpy*%xR2 z)*#hdXAJ26@x{T3+PNk=9yuw|0%_NTOQFVk-Ai+}laE+ks+hbF74|WR_WZ5Z>){QQ zxBNUW+Mh`+^27OPU~{MF+ApOb3&z2B6bqIyl9!JkR8GbtkSRE@*VD^90rW^#hL^d} zGU9Im8OCH919_|xw)<524)E1lzJA=#-=pACTIs9L41(6Y-@h;WscyS2J>Mg$oe?4Y zM`wC6+y{YYK${y)e@L3pp;*AO--b3xc4#b%o;M(gqQ`}y;)wyayV_@J zLkBzJ`x-a&!7c<|lm<03slw_SRe_&H(GByWSC>LZN=uOI2p@4EAr9GprHI_@2G|BI zBM4Plo}6STK?+*h;Ri!(15QM|lHw&P$Zd|{2Jx;_0WN{PaFevTqaPB!qt3taQen78 zJ>14)l9%$3UkK~a$Nz1{XDG_H5hY@4TLAg6kJB$`4bih&Vo=y`J$!>GR9}mvp3is- z(F(s2?Zqf^S>ZNIb6EoiW^hU;z_&7}{;-al|FUEK<8&?*2OX~{7a=(E=K0ves_jFm zD8d+dDDf78gvY8P?4oQIWRdG`$D0w98!L7wiwwq7f{0T5{ye(s-}`zT16e){5)i5d9|A5s7FOAXQ_nZ=IKw|xgU*C>$?@>fZ3&9L<} zk1BNxpn_%50=!uv;g+LMxCTk|O&o1Uqt2K*1kcdz_OCSHg!X`MNl<-<_=i(onBahh z1xU^KbfqlLZHW;|McEYEL7*HoysvE`DU6Ts7^>0qmCiL0&#!i-Q;) z=kPopl0KFfFj^OmQM;>O!5B;I?wHLBU=jwEjz@9PAk<&>`xZL3o~pSOU>yD~MgD3g z!LZhRUHbWR_%G80lquKUp~-3`B_;Dtf7zhNy^^|`G&l1vozmULxq~VfM}u?HT3X^3+*k=J&h1ZQHV4DS4-rn7gzq&IooT)|+aEp*i26Cc zcBN;V8rCF`qmhRTO0g}!Ke^E-Xm}l8Lrb?^fo|i}Ed95b+f+(i=#9Sk?tCaZXbKU~ zt=IXO40S1jF&NkV+TSDNgj!)u)-o@CEu{_PsmIRbR*ZTL0hKcPs@^`u@+@GRFJ^C^ zVNpJzPYaGLZeyyAy1@&WrWu^F9Xx-pmH)Ey2PNUV#1Ojgf2n57V}paheXyEt5eFhd0>-oxZ_4m8<-b%(734^@a=bzW%+E;&hEQ3BJV@1G zJ$qlX5MW&|_kLP~R&Lw+UAlX`kI4i_y>W!TOQ1fRa*j*ZvodE&!AGP!*YNA0h7<9J zwxxrypZe`??rLtB6Q@+M6=8S0AGl|DS0>vhxfVZ-_-|VHwb4em9NMIr5f+kr!u@k2 z>egg3R_IOBlA#Y3hXuiI3CBT!9j}O_q$O_Bezj1Nrr`dtM{jaw6V7|%RXzHa&(}D@ zz`|-HIQ?VAgm|)3j4@uYhg&`E5FOM%bquNjJ@5I+NjFrHx-Kgw$ zxhK-V(BeU<@eO@XfkxZ7@=r94sthHz z!5h39;~#E12Y5l73hCjox&uiib2CxUYHbs5_C2KtWqH)CnJAKVy>$B|`7&c-9c&=E z_wIOCnx<81xh;pU;N`>b^+)miJn>5bWr-h;krGmsd>L$fPrlJ8{(1NdvBvFkt4o4Z zqz7J@P8z>hcJ}Xx7RAIMxlStfS`~eZi-Fnr1S=(IVOiqLkUK`_dAqzUn%u|s#=F)K zjmbV?Lc+{OnJ)$8$ifX8;`2g!Oagjov$UYZJ@k2410Kd0-lo#@`9;qq{VVPNz zYRtkvY=3eXKX77|fBIwek1q|`a!Co|{YStpy z2^YnrAuK>vNRDB01l!%p>jQVTg|stW>FMNJo(V{We3x{i=$8h#?L30vhIqKDL2M1O;$Y2P>2#JY)0w?(?!m z6|$E#<}Lvx*n$vAWKLKhW%!x&wN*J{RET!N^A-yqYe-?2CatWx#1Ab+3opMSMol@dTRx}Osd`=W z@Io&C!_|y6cBKCjkDnSe`-h9>D_XT7HYFfje+wF=+_ELZWbN?|YV##+be{J=XFl+4 zf1eX6rXyM%A4Qg55)QXm?aRs5qGaj-ysVxjy8eM+7h^{D z$DOOU2Rfcy40K260+IT2zRq?Md0aw4)DJ&GZIEec_jg4pkvK%$zekpf1+ox-$V#}#^U1!Jpy$&5^7`_3Lmdk|C;4LGC z`ode_y|WhFwV_c!nC(dOdXjUbCHMz9=7s@wW)l=c`C$LA8)5|>i$nD#70y}axb>%x zO@Cct60nAYsHcRLYmKP{Ec`7DSA54{TtDc-`NpfoaW4VH+INujnkEd71wt7i9B`GD z^MTiQ9{jMhIdArX5(Mt{)CR zfAd`jbK@Cy<~$T9>6Nmh{WAx+Iq9@z>eo6M;Vdxh{io4}ESj)fW=LiPyD+0rntnZW zJ&90i_on5#`fb_D1Ka#K?GV89r(n2^G(`8OaO$M+1t`fE{m>_U#+PG`<@)9X*hh%D zLD?$iC=MzA_0C#&2Y10L0TIxZHDjsLRCN33IHNBBX!#b=X<~sa_$NexJy4j7ku0+}_Bn9tZhK zFpgfm-x!?co6`RKE(g^Zx1=~-7L&(OVq5_{@~M25x%gbQuLlbD*jJ?9 zT(7@KK&6Y9f$%aHdHYA})HAA-Y7R3iXEH+=o&nsO%&>zFlo_5j(!hzH!3Djq=41F>Uqd5_T7rcSLfC;@L{FqRHKIt z$+7FHy@Reh1*f9oKK(YiPZrrmogIoOYbvDVO+n{tTD2kd_HJ62Nn$3Ck*fAx$du!H zds%*?$zP}8Qv%ibp?~*I+}t4@HrHIO`%RP1{3J&E%@=4RnZ{K-|gtd}= z+tQzA<*nM=nkd zm`vdJVLameNtg+a!5dgne_;1CG2flB-KBjc&=4!i`2Jzh4$pMd8&+S(0h1pO9a@(o zwoE-O1AjBMw#lVNBvedBGMwX2Z&fs$@QjZKI?D7Ibo)@U}!<@Ub5Fep0Dc0f;@ z5*}uNH8kboIm-y4<=oN`euzicVfs=QHR_9q^|hY+Q}sDz?!pN@KZpFR8Iw~I+0Q8g zrK^2X(&Q*0RGl=&x~aiJf^(!PuyS#b=5;J{1dw{Cx0g1H1d-PgKK zlHpyz#KP$77Q`UHaCfiXDi1kVjWgV{o+ls9!}(THs81r0KR!Q@s0a{7+gKf;mosXK&t}jW%-a$W3u8dTeXPwTpY!#(5D&_ z9Aclikcr8)xuy7AKK*y-e@(P050vg~@;1M7HAb*r1ayRbYPl!>nLf{z@)DF5K=^ub z@Y*X0ikp1He{`TU^_)$VNzc>+>F~AT&2X1_eQD&2w7E%J&C6W8#x1-eT{4_8@~+@a zIv9hLMO|{(yTw_g6*K#H>%lDTVz44QeCz-u?1Dh5?p*eU<-#nH+V~pgC79~O7$G}1 zwbQg!fU#V@p;(^qyV0*$+iw7=j!LM3lYqJ*^moIzi1&H3xa3D6>9j)+Wt2e;tKdooQ~I>%yxV*q%>0v0n7J9;3Q491J3Awcl3TsQUrSzDm;E0dGNl zNm(=Y;VTTG&4j8!DQvb+wS-7gO?uR`E<~GSxtXfE4eUa2_Jm(DB zI5APRWdC9GC!!6nUnvf)qQMrSZ4*6j6nYZyTljid%140o>d(sy(Ob!H+OMEy^wN`w zG;g*hTg)$;e&$iy{~wyK%ch=fNeP_Avg5WclJ4#OzB9Z z#T<D>MbwCSv1>4ov?5a`gmekqtnc5GmOy{GH5W@GPyFj7RD7?Cd#53=bIj%?LR&!oT z@LOdh9+F*|shQmS5cY$fy(fa|?gOfgV(6@b3>IB7Cvx9kX?0}LEI2=VWUe@9H=}zh zY-v<*XvGpi`+I;DYa^AUd0a%bfl#ylHR%Bh6Zm+iQida?I|mf)YYSx(aZ*+A2LX`o zTT9LTDZ?!PYB_^{E|6i&0Q#0q0*y1jo%ga@^SQ$9URs`XX3ba>@vYV@s} zPsekhQVUW^E*E@j2ab>mwmVJ&v%X3zl#V*GjROW-P)f)QnwMAPv)yiR{Uh+}KZlYs z1s4K3J>rZ&J%#twbEXKgKE8knL}zHjaB)-c`Dx>gBF+1HR`)LT0pX;lU(kz zl}Q^o(MKV4$DAeY#~u?b%Um^c=TS_0Nwd|4*G5M4h#d^2xM2+9IePVJgeYDg`Yxac znz?Q&J^_ulxcV3m0c>C>u-A*#&?tc7=CKGmAq;_DWAMpT8^w24TYjo1YWn1mF27az z<>>2IwX8+385t}|(M}IC?g`LYZ;bukp3VcEim57@P$*M|NQt7Zq2L;Yl?RWIg5IUE z&T)2~j9B{_O0LH7nLM2Gc?O;Sy?mRGlzi`4(oe#A9E!*r5ynaRzHln6&W9Sl<~lv#^un$r)ppEa^ow zF-u=33)R6_4I#H*#?o1l zUL5H3V2%X~hBaHL`Imq0y{pxAT7u%Q6*~_3lxPl)4c(-NM>Tt6)KU6B()=q+^7@`j1NpXazno}B#6P)Vz+YUcLs zKQeE=g?t*CPA?IXt1120W2l|?1Y{(Cb0 zyoWl;N=9ojr9haeR44YzC^r1UypkT|xtt{^b}!_6s9)bh`nD%0SljK|ZS=QOfg{A@ z!43lz&`;M#ET4z>#?z}E(<0Uk;nhDdj4b+>#0IQ=#*~3q($>VryQTQkZ#a;j?OZA$ zBJB}RQ-(Hqw+1Ii+;ScfG?SAJx7ZJYK zBBQxEi(QKE244}rlyyN^|5L3K$HF4f;OGm-v zmn+6477gS)WmjTAI6tH;k*jTFDKDvY__>{Jr*8Kc8*v*AG>ag-5nFWz5ZE%nbe&S- zDn871woNg?F6KO@G7Hc1G#i1-JtvEB(29?ErbAZnxz?x z6(b z$OF1mFStRJuv5IFg@}0BUeNo`txE_<%k)JIX22io{_GAkK4UqH>Pk$#clr>Y6%w1$ zw>Ww*zBN7H^+EaRa=x~kOg=Z?>m1_Yqca gf4#3|K>rJv0`ct3Z?Nybd~6?JZ*%cnEec2e4`=(- - is a formal description of the types of arguments and the type of return - value of a function. diff --git a/modules/35-calling-functions/120-function-signature/es/EXERCISE.md b/modules/35-calling-functions/120-function-signature/es/EXERCISE.md deleted file mode 100644 index 9c293162..00000000 --- a/modules/35-calling-functions/120-function-signature/es/EXERCISE.md +++ /dev/null @@ -1,5 +0,0 @@ -Ahora es tu turno de mirar la firma de una función en la documentación y entender cómo usarla. Puedes leer la documentación en español, pero un programador debe ser capaz de leer la documentación en inglés. Utiliza diccionarios o traductores si es necesario. Es mejor acostumbrarse y mejorar tus habilidades de lectura en inglés desde el principio, de lo contrario, tendrás dificultades en el futuro. - -En PHP, hay una función llamada `ucfirst()`. Estudia su firma en la página [https://php.net/manual/es/function.ucfirst.php](https://php.net/manual/es/function.ucfirst.php). - -Escribe un programa que utilice la función `ucfirst()` con la variable `$text` y muestre el resultado en pantalla. El valor de la variable `$text` ya está definido. diff --git a/modules/35-calling-functions/120-function-signature/es/README.md b/modules/35-calling-functions/120-function-signature/es/README.md deleted file mode 100644 index 4ae1e666..00000000 --- a/modules/35-calling-functions/120-function-signature/es/README.md +++ /dev/null @@ -1,70 +0,0 @@ -En esta lección aprenderemos a trabajar con la firma de una función. También aprenderemos cómo una función recibe y devuelve valores. Analizaremos las funciones `abs()` y `round()`. - -## Función abs() - -La función `abs()`, que devuelve el valor absoluto, recibe un parámetro: un número. Si llamamos a `abs()` sin parámetros, PHP mostrará el siguiente mensaje de error: - -```text -TypeError: abs() expects exactly 1 argument, 0 given -``` - -Esto indica que la función espera un parámetro, pero la llamamos sin ninguno. - -Los parámetros de `abs()` solo pueden ser números. Si intentamos pasarle una cadena de texto, obtendremos el siguiente error: - -```text -TypeError: abs(): Argument #1 ($num) must be of type int|float, string given -``` - -El resultado de llamar a esta función siempre es un número. Otra función puede tener un número diferente de parámetros y diferentes tipos de parámetros. Por ejemplo, puede existir una función que reciba tres parámetros: un número, una cadena de texto y otro número. - -¿Cómo sabemos cuántos y qué tipo de parámetros necesita la función `abs()` y qué tipo de valor devuelve? Lo vemos en la **firma** de la función. La firma define los parámetros de entrada y sus tipos, así como el parámetro de salida y su tipo. - -Puedes leer más sobre la función `abs()` en la [documentación oficial de PHP](https://www.php.net/manual/es/function.abs.php). En la sección "Descripción" encontrarás el siguiente texto: - -```txt -abs(int|float $num): int|float - -Devuelve el valor absoluto de num. -``` - -Esta es la firma de la función y una breve explicación en español. - -La información se interpreta de la siguiente manera: - -* El nombre de la función es `abs` -* La función recibe un parámetro: un número (num) -* La función devuelve un número -* La función devuelve el valor absoluto de num - -Si hay más de un parámetro, debemos pasarlos en el mismo orden en que están definidos en la firma. Cualquier función siempre devuelve solo un valor. Esta es una limitación del lenguaje y no puede ser violada. - -## Argumentos por defecto - -Veamos la función `round()`. Esta función redondea un número: - -```php -- - descripción formal de los tipos de argumentos y el tipo de valor devuelto - por una función. diff --git a/modules/35-calling-functions/120-function-signature/index.php b/modules/35-calling-functions/120-function-signature/index.php deleted file mode 100644 index a826b95e..00000000 --- a/modules/35-calling-functions/120-function-signature/index.php +++ /dev/null @@ -1,7 +0,0 @@ -- - формальное описание типов аргументов и типа возвращаемого значения - функции. diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/SolutionTest.php b/modules/35-calling-functions/135-calling-functions-default-arguments/SolutionTest.php deleted file mode 100644 index 3cabcbe8..00000000 --- a/modules/35-calling-functions/135-calling-functions-default-arguments/SolutionTest.php +++ /dev/null @@ -1,17 +0,0 @@ -expectOutputString($expected); - require 'index.php'; - } -} diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/index.php b/modules/35-calling-functions/135-calling-functions-default-arguments/index.php deleted file mode 100644 index 26ce445f..00000000 --- a/modules/35-calling-functions/135-calling-functions-default-arguments/index.php +++ /dev/null @@ -1,7 +0,0 @@ -expectOutputString($expected); require 'index.php'; } diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/description.es.yml b/modules/35-calling-functions/135-calling-functions-default-params/description.es.yml similarity index 100% rename from modules/35-calling-functions/135-calling-functions-default-arguments/description.es.yml rename to modules/35-calling-functions/135-calling-functions-default-params/description.es.yml diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/en/EXERCISE.md b/modules/35-calling-functions/135-calling-functions-default-params/en/EXERCISE.md similarity index 100% rename from modules/35-calling-functions/135-calling-functions-default-arguments/en/EXERCISE.md rename to modules/35-calling-functions/135-calling-functions-default-params/en/EXERCISE.md diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/en/README.md b/modules/35-calling-functions/135-calling-functions-default-params/en/README.md similarity index 100% rename from modules/35-calling-functions/135-calling-functions-default-arguments/en/README.md rename to modules/35-calling-functions/135-calling-functions-default-params/en/README.md diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/en/data.yml b/modules/35-calling-functions/135-calling-functions-default-params/en/data.yml similarity index 100% rename from modules/35-calling-functions/135-calling-functions-default-arguments/en/data.yml rename to modules/35-calling-functions/135-calling-functions-default-params/en/data.yml diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/es/EXERCISE.md b/modules/35-calling-functions/135-calling-functions-default-params/es/EXERCISE.md similarity index 100% rename from modules/35-calling-functions/135-calling-functions-default-arguments/es/EXERCISE.md rename to modules/35-calling-functions/135-calling-functions-default-params/es/EXERCISE.md diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/es/README.md b/modules/35-calling-functions/135-calling-functions-default-params/es/README.md similarity index 100% rename from modules/35-calling-functions/135-calling-functions-default-arguments/es/README.md rename to modules/35-calling-functions/135-calling-functions-default-params/es/README.md diff --git a/modules/35-calling-functions/135-calling-functions-default-arguments/es/data.yml b/modules/35-calling-functions/135-calling-functions-default-params/es/data.yml similarity index 100% rename from modules/35-calling-functions/135-calling-functions-default-arguments/es/data.yml rename to modules/35-calling-functions/135-calling-functions-default-params/es/data.yml diff --git a/modules/35-calling-functions/135-calling-functions-default-params/index.php b/modules/35-calling-functions/135-calling-functions-default-params/index.php new file mode 100644 index 00000000..68240885 --- /dev/null +++ b/modules/35-calling-functions/135-calling-functions-default-params/index.php @@ -0,0 +1,17 @@ +zs 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

P*bykV=CdV) zyXKRX49OxE7VaqVC7H!Wq_~39_?gQyEN+tUb@R0m{d2KK9+vsgvNOnqTRwPGObM_I zzU}+?rzjEHmZr5GuTyqOxnFZv6;Z}qd@&YVlz!{e{7v>xiy`P-oveRVsrxXXgB+XZ zZbNQ0;3@dLu%?32g(@3*z;!uR{&C}bz@OLU^`vArfFB~SVH>O3HHQ>@HRQ~Xnske| z9aF4wm7k5*P61b<3E?vJNnVIki@pnU!1S+p2#hMMdpLTZ-X_o&>*gLT()A!U=q-M!NNVxhH!ex}Rx1hGd>Su4>O&@vzmgRU zb1!}l?us>UAK>na_4RR}DkP{7q-So&S%Hx(dxfI?l2&}oBV zXCga?EVnp*p*$WuL@>Kd>y4@nPNAe&a9584iVM5XH&_z^GL^_A70xqbF_Mmh^U*%b zDXe^ZD-C|Wk#@divQ^d z&*?`C9JA``^_pnb#MD~Y&=oFIiFi35ARAUhJ8PeHk&ZnNJn&~i33`Y#y^$23uoQpr zy*UWB5X?n%bdSZ85`Is2RIPdWtM6)qp#m=aA>E{FIUYVhgbOI3qMKt7!)UyHI@RgrLdu9o2*zpZez~}uANCf zvpzlC>J-XS@o*d<%j_!QZH=yZwBTln54;+_IW472M#nn|_@#Rpk^uM8`2l{;x@>3(F^WPrtt&CPWJ4$&t@>Dq{`Y z=K>xdbAYg3)j$e{8+Co3SC*u)CJft?uGZBM_m%p+N*=c0C>V|8L`WIkfp9MA3eVy zS_;@0hqv-1jxjN6#i!HL)d~+xFM*syMFW1abf%K-)O`a^xEh;9hNj2 zX3Fy{Yd(dy{POnDY0t`4S~YIjN@!KD#?;;I7ASR7YyRT%Gd+IsUlewrPEV>W3^Kd( zB2ftTK%kGeQ>*_FIuj!^Lj*o`%rPkm`Z19(s4fr!Kbc97?ecdl>6eR0vclmk>^XO#p(OLIHw2K;(i{3CY9Ji)2qoR;)D>uw|P(eXhk^W|1U%XVd zV~M$X@^L4t+s*7$tph{ZB| zNr9CP@LgnDr9@me1`{>7$2zd~bFhC*?x{s^DJ5|S$h`^kI@&|%Q=-k-Xrizs;wasH z9b)v;qEP|;^)~Qz7B#A*L#W$3Hp}i6WB(U8 z$fhc>CU!rM6_O}%U|GxlEW>K{brl!jNddQ39hcJllg(wLf}lY$Ef39n9n6an!gyEh ztEQ3hjTlluMFQ|I2Zq!A9yHS(o($i|>3igiSU03Jp366E*_)MyV8Z+Y?WoPoBZZ4N zLTVzOsd*;C8YBRdmBxVgWh@81QTfOGP;&#u}sS6?JXjp;c z7R)%&A@k!Ctb)=Mvg^vvnPP^T8en-apLaiLW1ki!W=o_9i`5l_GH4 z{i|dFb>Tazrk+;Ti)p<@%k&Vvf+F|)RII^sSZ1sYny~SoFjWtJ8SJ539~2Kk&a-}+ zx$CE})mEW2#@Z#NIU6`jdb)5tSOw{2b1MroC%&eR`sEX}j;1tFOvlj~DAw zPU{G{D-7L>Un*0=SxWb!{@D654_zSjzg{UB4yeY$u1Fw4i(@81Dib$_O0r zavLn|-6pqCX>3Byz9S;3l4c|9Gk=2sin3c#{4Lll9RDoO^UkIs``# z2yau4U;~W@Cc+Qzj}cNBo969l-}-A|=qh|U_Vw_}_UL83uFii!5dbR9z75;>y&jxy z|0M+O7FheW5po62B!+|kfyxIMy3X*uLBALmgbb%MtlxrQcJ_m^msAi~CwMVk*ecN8 znX{*Qmo)yt*WZmxas)Pumqk+An*Zr114lBW@jT-dk3@S0`&>Wg0>~I4cJ}NsPc;NZ z%#DR(Fb74rXP=^YD-@qUc$lVONgP;-v71VDV~Fvg#Al;M2~wda`=eX@NB+L2F&iFN zc+9=DUR0Lob|3Sl{QAGx+J;>_9_(8cB&eud1IYD94@(uVatDFDHDq zmym%{ic_=0OMc6FIp%W-E`SXGhS~Vor6I0OdWhYE(;e<>%2Q$j1=Vg_DvWA0Oqlux z^fU$3(>gmX#z0^Zm;cT>Ww0NDgLiH|^oPQFx13yX9u?T`A5GOVqcBbR1@(P+lH5O? zs!1dl?{~aahe)P2T+GZcx62WuOK;R*Hx6r^Vr}7*rP|VhYMrp{Kb762${JRH>Z?;N zLgAqtU^~!_MERLey-oR*432_i+PO7P?{_~=aC_Lw?YvN!VPK%pnEIykqlu%J!b|muLc96I=#SJ8;yVDYIwe$f z#Il&;wrtu@A%hOr0a#k#{K1^D)=4F@`&xkF2^#$u-B`f|Oe!Pp#=*$wrGQQf3E#w? z48#V_P|p)+5RfVH^P%)+H$4fEk;hW3v(`JCwzD=Mfv+Hg&!$2QS9XY9;;(IUjAJiP z^suOK4doooLqEAp=Oj?jx;7&9R)_?X9UG@y5JOdnW!0!r&($f=SFF$_XBy+OcbT&J zML3fycsVl1(+76+mP-L+dlPqo{>UhXk8kZ5iN zwcORH(5`HQpU{&Wm$@Js6h1ZN#U0>pG81GwWOVey-TG0(3G3%Yim{}pbM9RSxtt_y zDHoqiWw-FWJBvNu5Tn(IWwB$TRR{~AMXl^C4$@&S_CDVttVSfdziWH4-^n@Vdi^2P z0_B!>eSt2RDx13IZr|{jS1k74Y?)k^~K^@jt>LgK8G0`KR4~D!Cw0^r9}5b!3yd ze>yGdide=F_d@l6>P_2x*A3`bD>2d+xer-m1*X)-#wWf z1$X)Fj{isiWbn;;9wHNzHa5*@VyCN&AV|K2TKdGd9Mn3!#nBXPdyPCVkh1fE{G5_R zej3e*>Kj3WIw3jma8xY9Ogg@3F zu}pnmyw-3*(d%^XeuVR~+?ixQXP_Dwr?x(3jftTBHyn?^zE%E68M@|MyG@pF5_STS z8@g2$o^@expQGp#0oC1xQ~H4_KuMP_Gh&-LCW7_fVOrpWS~27f>ig#B?`yYXQE@Ig@tl$Yq;ZsBaG9rvmVAPX) z=*@3;cXmwg021_P2mOmMGt8`QID9r*)YWu*1_>l~QCbrZd znB;BqPF*%;Ulo!2X3lHJcyBFF?~TDpJ>==>c|3V-^QWsTY+a{C7G>Do z^YkvjsZIhl&o1ku6_MU#=D))gv_I-ko>R!o;Wi>aaHW}^mVEX3;lNQ(SLiWw%sv>A zo4z$u$Fpwx!!S+Lz5B9hP&H>Y-%9}B=G`4|uqp50MUpUQbMl3MwvKV_LReg#X;Y`E z%Xf}S-Oqvse@ViQ5#vP&&1Ljilqv)Irvc1;g>+(-V=HB1BARXgb9_VF*H}-geW5F!&c? z?EYRfez>ZhN?}~i*kRjeb%TC45#3sTKZTDoNx!Qu2Ue$_V`A)>7+vNtpx9J!w_z5X zkl}a7ulH34kib9X=0WfDLmw-(mibN%5QzXw>>3CqhRhF*_5w~Z#JnvmBB~?&L)g%B z4~IYZA3-JD!VHutcU!CX!|2G-;YKwzK_i9f)=|&S4&{B}{oT~JA-+_1fm}yXoYkTD zr_o&Si}!l(wS}YO1@s*a>+60{gt97ljd%CM91#bJPj3kzMH|k4?lw7=dS*YVGh@** z7ChQ{qCWZH7w6lf0|C=rI{*7CUtpo3)L`G2+RwEaI9Ffnmwrq+%jgxQxZqwq-h_23DUq4?LtL;gH z6QR=|!(W2?VU^a^qnJ=Xiunj81) zMOO!$eAu6($J9RmUJ(uE>~GDJCy8>~S8L`v0kFgu3yxAu#T1Mm#+qY~6 zvLPvKVSTWR=OFMhBi$dd`Se;o@KF#_I*U?97!JLZVMI4J_!a${cC ze1~SVLfkat>_r4LFzk@Qr%f>=Ff4!>V^dQcFUJ`C;)Wn&Yl6wqip+p{Uu{1((<=Tg zM;tv3y4Zc*Bk;Ag(|#BpGBsZ3^(-Ol>?2M#|FO(_ny8lr!M;7q#}})UFSUqPyTa%J zbDc2};5O=Ee(I+4&KdJqhd}vew$GZI4FvvzO1LzGJl9DY4Qryz41n85WZ&w`nkOu9=_` zBKyt}u{i`q2>0PX$#}thww8b0$XrkNySjzbf%Z8A29-^B=vq@lnwnHkb=*{Q0uUM5 z**{hyh%$`v%`M4dcer7%?BSOw=i0p#e_EN~j8Vp8&#C#mUf5XnF>JQ)Od(}SK%QY! zbt`J*5krKB{$0_5u_uhdfg_GWK+P|8wv*G7DR$|lD;D(Qv(-lnfSvKbLen$8h?HN( z(a0=Ud&To6PW0jzEVjDF9j~+ufo`^>{FvHSOw{x^OA*=Cw|t z)mUXAXp*0bVA5^%*NfqR&+WFrk#;A)M}3tYM>pj;-?UN@em9fNS8S>qHes*K4sSdrQ47YR3frvF#nF7%4F}n;w;(j8|F7qiGy)j zDeQm72b>^%ZlyN~VrR)Q| zCw8&!JRUW7=u@>UJXyR9%r7`6!!-&;75+RveE7hZp z1!t?o%e~b1xOC6(I>39z&mBDkR~->tzkTFQ;x>Ng<6F##Z)VZEQ`*Y@Orz44^GatSgz0v7=r3nB zy<7i>rLT@_`g`9dlS)2*N{mQ^ zUXg$fr0@mpfdBQd3euHm)bppwjvxMoU zDhnGbUEplR6qt|~H|M(MGyjnBhayIZ(HVYS`QH`k2M1s;L43*sR);p@cmLWNMj z@?QegK5=*pL+rtR{M2Z2(=rOAHZQlE162axZ*(}|d1Di|NOx-m;(usXbY3PFHXn;H zZ18N;trYqt{U^fT4k~taiq-YL5X(5eE9tCi#jQrm7aKd@GwnvAw&@mLYl@v5Zn;QP zF1-5H zGL$qByvaNY3FO}g{j@?qA&7i3gq^=fj}`CDe$UWHsOguzO~RT=5UKA9+GhE}+R$L9 zY%%`DHV#hjaVA*gcyk>}Fraitc)U~_m4(H?t>zkq4CG$#m6EnY+7U6YgI^e3-=xvV z3%Cdq1t$7;xt-sR7Ts7D#Rnz!=G>kasRF!ly$q^RYKd+0mCxwF0AenYKV(m2TiAH&wwy=T-L(1_+hf2Y^eu?a@N83yMujJ;;3 z1<4<7s;l?heKV0_wMM`~?~m{;7ffs@UjzT9)B895l2xQ2oN{s95%JMVpUeN$=<@a# zkS;0C@AS|(`2j!sueGr!(~1csCh_jA?oWgDc36s2XXT#d@es8}fGe3b(SqLn$?+fibq)!2lm{<} z2HeidxdU6>L20t`w5I;S+kZRcau$hdM{~R$PUVCduUNxW+%T^`2c+Baa1|z!C&*M) zsZ*o>X6x!{v3P2|NJPoszoav(Y!zUy`ni>M)zxYB!hNS*7s-n@STSQdusf+`swgyp z9QN$M)+kx}B>KY1sYPfM2KPvAQ}+>()~PvV@f=Ik)I>g79VX9kB0)v2&%f_ILAR&W z4+7YUh$KwIQCv?rlG4!gMO9v9rxL{F36RGlEr-*=ohGRN7Ovu`GhRR4$iWmeXQhPE zC}hLuUq74_-_D)8&WuVyYjtS$!VfF5nDgHLQtUcPiMVWW<$YmP6Nct9^*w5S36AL3 z88CSamb+|w@Xs9u%f17vZ=aE0uQPna`(Ubdfx&r5gTX2rS;JwS$`FDqq&`(eN@8Nq z#V-gAb`D;nPk3;16QmnL`9CB?PgR;~V%q%HZ*5%PU5}L==faolkcd6<9=sOVtFZ5C zJf6iz#`tcbI{$T9T-xVkZL%+0#rwx4^fv>K#gBxq?%e|ld4>t7y3--ry6P8lzhKTp zXP1`rzRoAp@q|ZqqkBIK!iBR;0}hyOng1qd!w0q_G=NTCFsMIA2CZ~^%Ipx` zG6ik)%wX3^C5@CzJ%Vtp7zu(b_Z9x481HCqFH+2qv@{r7(sIHgRfg}gSr3`1={sWY z!jN}?Y5W$W7!~4x&sK2FpC2;%wSoMw8MAPr+}bf2(m5M+Ddy_P3xe{n`GOQTre#AL zIfZ_1%6O>4s@cFOPtX4r?!qM3>aVi(tn!}QOPL1KO&VG8Lvlfk^dx1eR&?tX115G& zRpkx)Yq3F+W+33Ee-$9WRqzm-2kbw7lDOYkx!^W(=J2n>=r8J&p+GZ#{YQPwfxZp@ zgN*ycXqI_@iq2#$I$&uXLEK3n~Z;iGjO;SRMy`J7#6N zQK*Ipqrprp9gSgpy6eIBsKHbh2}C7*JV3J;qZBj1M&MJ@@( z&QkPzA`<$A)9gjS#JTg-X-`^X{a>8}GX0A4qbYOu0}D@!L@pShxmER@ZYak(ts+On z0J53K#%)L|4!-a<5}<}8ejABcx`T+#Vzy6e7wb%9`P6~zbzN}&+E=racJBtKfs64=BU^^+ECR;#9u z$_!qTjCb{yN@QCNl=TUEZzQTogV7?n<DNUG{pUcA%LHE_!*dhl!}5@p zr|Zaqr76x^VS)%sDnj?+n((1=kXSBU))Z+a3^=Y+?iBoyq+cq?F3NynR%DQc+ zt{*48*I;HlOB%o=uOI3HXR6daY+$V<15CjKS~vW!CGIPT^zp}Fy@GFf&*-?uki6PxDO7vJR(J*GbB$&sY>K>HR_=YVzR@9!io z6z7DsN4o96rAW{5TQ_KvND96KNk@Guu3d^=h&$RNR)48~C!#c=e-9`tAKhCmH>HD2 zl!qbCj()QAJj>rE4{0rIPi!1`(`YjB$*1d)E|Nt6tzzTZ*z0(~6dG|j^G2Tm{6>H3 z5)(;gl%e}lvb&|R;jFa6IXwcXk`f6(a{JoQKW^ttlI%7B-7kmGD=_k+r5VA{Q*|g@ z-c=R%?`kxypQ9Zh-6uq9O$M>=exhsXKYsv>^-ofKQsgIp9T;(_zAeA5->OiXf_q z*I)14D!f@sRDQ<4Dm?szDx{K~8qaPqjOG>=J>Hl7!xU4a9Oqfk1deyE%wA=pD zond(|b-h79tI@+IPO1Cp9-A15ctbxR`N_1K1s!wwQ;#3~|0Oi0M{y0gMFk|>F(5=} zFaRp>5-nJk1!floi%xjyB@EYpaw?rtI#qz%z8XkbyC_}uErEnM@-$)7dB5}IC=KyD zCfDmg$4-*AaoN!JvFc0GSb7DqbR`IRmm(2q!xe5XCW5jL^5jZ-1vw+uNF8k<=x>jW zkpq%P)@n2@mF4q6GZpkIF%v@qlIm97ny3*sjR)tj5PZ+n*i& zlIMP+?c$ju_>Ol!MwdFpEhFj=_xXDAW_CD{Y58f0DLt|qYtP+h!JV~(sa2-`jq*f5 zwC?xPYm+jmq~=sS0HqD**PO=~YVK|aP+CI2KXAbHzxQEUqQr<~VyU~+7dyF+3NPQT z^AK@jV$ntlDUBkMM)#0wEFO(1`w>Pg9}qbJPrR7BC6_kX(!w1e0lcsw02OAC7Gop> zv{LgY0Z7LucG51Xb#(7H3N35|ACBcC`M4Q$kfnSeIpgms0iE7#r% zSIJ8H8aqLHm;2Zgy1$i@FVO`;Tik&vyBC>KI$5e?S=Xiy!O*&qLTU?o z5f0bMzRq%!B0BKk_^XL8HU=VbslIF7biJ3ssQ}A zy@I458q8a1T8zvhQF6pFMmyn7ynkxtw%-BW>)^Q1V7gW2u zX@?>RR{VK7bzJqbpelW{r+7yw8!l^z9Q!X(`EUNOnnfE6>i6v@yr6Gdj7XCOZjk)X z#xcZpMJHXnzra>3FZzB(v8Q}ALjcFvINLj`Y=_&<^sUL`9GBXMai;1I^B3N7ud_tG z)5{MqZPX*}TCq~?9p6N2mNt+5l{5O7w`{WuFeDmDu~Da#6F(JCP_YYGQtuV zvm%R^FnApw+CyH^D75yDi}kG_uL^3o;6=U-(L|uDJx?vwZR(17K%O#3HeEYZi04Fc z>N36p&Ln^q<3h^}x|q;d=|Kal?A}~8f&7{%argz$sl<`xqtg62?)TE#u+yYY;_0Zz ziA)ZY{2C!Qjcwqa$s&T47{6-%;%4W$TPHd&4oTz%P=%yr=~-n-uN4iHP(^#+ntC=a zFpe~af~3zAIACjs+?iT@BgrivAcW@J7eGgd^Hd$)7|Rp&@dv$$DcL!VKzvQn4WUm& z#RIqc;9;YEkfMn_-%X>+!^{s9pP2Z>4SYsbE!Z5kz97{#e}W-_+Au3aJZ614dW@4-o~i z#1KfMc1JRVwO8CWU&Y6`+BkM7%F~TzvG9 z>6Z1;lNEx2@kjw)oc0y!t3MF^cojp@zV zhkruo#gDL88@*I<1+6aF6G_ZuwOH(4yiM7@sUKAP7t!L$ovGK8f`XZLdSe3U8+kk< zAr4qtoy{ktVtybC_~PpJ2p{_c5gn#6F^bNc+s)E~8@$5q=R=EUe{2CQU2XOJNb+j$ zd0lAY|GW_X)smJQPz|5+?wdUnr$%WwSZp6LU zA@8pjjAE@QzsNRIWIip%ZtqC=;gA^yJ1)_0%coMl*Ntt-@9C|0(#zK1lqusw9h-(1 z&f5t{@BO5pn7K6oj*{Pe9@ zc(I&@M>$de{goKtl@etfj8hFt0E#7O5xT!rSfP*!3=*B3Zr@03{Mk4~;Gez*8%B;Y zJ^(-XzxbSmt=gus8BxyFDlHflCvKSRB@cbxv=vx5%XAhZ$BgulB{N8dD0o<;hU z4t$mXX@lQN39=_*YrBt=%)u{PM4qZ=k$H{aX7r@7&1IXXzpDU`eJ3xw@&CNG@t1TG zwVUI2e9Mr_vxUf8`Fur(2eyp#<2mq9dKMB{4b>Aob>9s_Nyk8<|BC$I7#n;eQZP_D zP)uU%#geVZT63V2*hZ4_<3KH0nxUi3&72~5bd(lM`(Lf2jXD+16huJ)H}|URS5D9* z8IIpRp9gdCss~y)0d8@e+@ttd zhw>s;d0#lr#sV2tVaK*e+fcH|q9-7UEywu_{{H0s-RFK@Z%LoOtlx|Ln$eF5*tPIa z-BNGDVh2Acz@((?8h@=b2`DDw*8*>=IpM!4>se&|(sep?`uX>g&x@-;77~XCiTz%% zj)=#4IPR7($_VITLDOmLoueq3=pf~F*DT>HY6XPk`pixRTu1=4~dc@}6*L@lAQ!n@FO-X3$7Golcnyy=wIPq>Ngd>$>kzN4@efub+>@V5v@WoZ_ zs-l7wL#Ikw(QVMjn>^kkSU{EHz6bIKICIn7_JpJ_6&O8f&gh|>_r+8Ipam-|=w=OS zSXqnCO49FMblls&WK#LdK|)D7@eZF3oPI)lyX)T@m4ihyy4Z`F|Jrfi?2k1hkE>I>f4xl>?e|+jl%V|QdS(mm8i&Ya_gbxXGz&cO#>Ly z=LJC=x^)5W<%#9U$MoaD-q8a!3gx|ChPxOqJ6Cx>nK_C?I zg@Kj(vH<##8?C}xY3SANm|7*euwQLal{{nFOan<$bznp}xN+Qg9tPE2`MwEzh_jf= zC-c=Y654m?wj=WGc!5Q85U=7hCzuW_od^-x-+Y{i#ilCwWa<{hEE&q!qlcGd=0lT$ z8b<*1l=8aZ^;Cric_MqQH}L+sh5wf6hwL_!p+;#dYIy_YUouA1(tk`Z9L^toWPKc@ zl?Q9M`+d#1-#CL1K|fkpVo`^d#KX!HavENnl~1|N|D=A%)vixW=2s#*=*fo4dQ^Lc z8i!Cg#+_*z8CX0@CAsYq^>~gkAQ^u73`0oL_wEnV=LXK;#ZcjvhmGjT)NRd>pc(7p z(-0yO00qe{DUrk9MBgX6Rb#NFWQNHRyX%b*;O}c;pwsRC6x=(KCFVOyEso`3;`G%P z5nxvW^J(zW#v?Pm9-Xev+{jLXqlS<^CEm34a$y9}PXPS@+oJJ;^lhFCV9*nN zOi9Uy4D%umuYMjS_~Kei!RplVAwi*$#MFJwE#qddZw1gKq~*QiHsX{zYB#o3+r9vbY>iBmvR}$Uq4h)se&`A{X?YFw{6v~UmoB@ZsBE<=yq-4 z555w&-80cm%t}>FNu2lWk=HKM~lX zU2-`kHzz@APKgo)q*UIj6z6>fA5yaY46#eQUc!=f>8vWAPd!4eAr!M)C@`rdP$EMl4HlPT6Y z_-M&kcFP0RWL7g$%Y6SEgQeP56hY?`DkQPjO^UotiDm4_ff1xV^o`& z7ZPZ-pI|r@5y-C)2W<>hzU|EYzKGMkY}H7A8WQj8x>P0RIK_=3+`w}hH}>K@!NU%L zQRNUyRgR6eiDkFbw|BYDx6$-7o&x8%iMK5%X7lwj zoAaRDT7NcQ{q^Hvt-+*DN7KzGf$wRN&efEln5qZ8y;@DRd<|TIX`4On8sMl$T?u!* z1jyZzQx+o701BzW|G z;S-pi$ICCw(_iC8{OqP2yF%lTA$b6PzW=~sAH7O-=iCE2_4>jr9%AWKYMH|tOet-O za$b^&xOO)F92ojOzo^##GFtKin=NUo#wdAo-1VxAv!B&zZP(_eta{H9$)(?*4p?;8 zLTH{79;wfd)RUb`-`=v&5XQ|f-bkm6pU2=G^^n*nDkZfb6b@%u|cUMCiKOmY10B!PIAc0j- z9?fj=!p(3L4A^}@R`$uFsrr`qdlTSib2V)tMoq6s-#iY^SNHlrD!*IBbn&1&T9@D! z(7F0s{Fb)t;?+nYe-q_8X@pR3&-7gbmKhT#YdeQ(q>fojFIc7-1f zNa73my5(j&d&Qy8iNkA8g+n9{7dZ0pOFp%P*;|P0Jv+C^+t-UWqwKZwUS2Jq;wWB! z+Veqy$N*jB)+T-ZQbUgZC~CQtO=aBtbcp*CN9(8mN%UxQ5Th%IK-K-xfa7aTHAXM^ z^&Mju9mR~v;(?9?LNl5ttEy=;aK*RQ0%+58L<-JSHKs?JlJ3*X%^v>o`@kg=tEWfH zU^&B7>vfbY5!$=gI<^tAwHBH+QKDKw`1U1S^M0eIvz{CSP=S-WWd<)s{^ypBY@i2k z;u`l{c&Q!NDz|5Cv{6wLp+Cj2H)kv3l%Kj3rDekI3(2iDuHAL>-iH{g!R8^$G_{-< zwTua@KL|Ck{y?{ogBMys)75)DoFug62+>bbC?;rl&q_{B;aL~63{oK$@&vveRD_g& z9|*zy1wq08Ynxn25Oh7m(41}lSPf1%(6Uo(wN~}xura{J1BM%As-n?8b z{A3Xc7;qrFeKwrK(;ekMqjCvGg{e%;ZLo1$9%cDaBL(pQH|*A-Uw6r7rEdJwp$w$& z-#vXU8T7r)5w$(tP7Ml=Hdgw?u>R+L;GrerrQ85vo+@R!s*@~I^V%)Yp-2h3Od7I9 z#L@Kjci+C>PYVhC{L(Op=6;w?`P@$Im1O0<(u!V1Eiu|;78m_U9c?y!Wo9CzU%N>2 zJz>Q2{*8%4!K6da;zsa9|3+Uy>t~PczjHg80}+VTg0 za|{2?c%=P=mAL15`jw(jaUvSi-`X@ChOGW>US{$>EEDFHVu%NDt02TaC%|8J3NX<< zh{hv1nwu9U_8b)5ybEJ6`=Ee57fgiyNQ4fG7p1H$WW30ljP5qqWE5*lQ4uhbC#P=f zk(vontDajY^nuQZ(GjCR#ZqwKpLY*^@+d26khU3K$noQ8D}7)$VE!8-jVWjbCQb+@&zUsydH_C9rBvu6m^U(< zKBRJ)D?etUTJY(YTnQx&3)k+pID3TZ4RGWSGL_4Kl{3vYiF3-4y$O z;(8Ek>uZy-qM9>%J>+LYKQ zkqeI1(@<}J)4q-+f2(Gt{L|}16MgWdQBLEjYFp;|x}{p18raLpsAKYQ+m=9>P(hn@ z6$;R=sHFkDe-L-~bh=+oE^@TCc(mFUs1p0Vy%-lPpLQ8DL4g(byCwGS`UrE~YYQh$ zArF7MW{1;9^i|q__4(I8f?A8Sl!d^|`6pMsN>NcP-%Hni-CZ6-)jxk zN-)x^)R^?GNOqy}`kdve#UMk~SO^Ix#$)R)JEg9#S3H+A2d-`#&2VP;yo{NKK;s>8 z@f={2L>PT*4<}2C?rkN(#&2SkcK&`1{Wf`pEeI9#>ypLI6U%|*%5;E|7z0(ad3yLb z%G;M2=Hrwa2vs!}L1w#1&e*>MOjDf)u-VeeB9Jfm?*-p|1hnUnh~oof`QQuO*ko1s ze#0>PaE3~#%ALcB_L-H5>p@!8Y501LV?AVY*K^VL_rvH(58_*jScoH>k$*!Gr%^X# z{*uFE9hW_Awre7c*=km$<=gk13ep*3P&E;{Ef(dVfgqKgTz>;d$kCoX*}zk%0xj8M zKBmhlhAXdaI!bX`j;=#GPks{tm>+<_*rOy(hJ(5&(9-=FQwRdtD?y`uI%k#WQ?q13 z_fINX<#)M*AB`Gak}<{05PmAFp(HAXIC3Xq^H+Gf5*n2m=c5I6e0_hXU*0k~hAlXm z7-rm=uBVy#S&Fuhc)s)#s#sHnd5WFY!9Esdewn?^r#2I zXLogW=;3QvvNAu+FNF;_kOLP3aWKxWtDVe+;>1nudfD%@*T_>TFw!29=X*?dIU@%c3*|6OzA^#Ak%i+l)XN5Y=AONAoRK{p z(G33P@Y*~h^`LBfo>=c^Q4rWd??v9%4=&P2!&6p|l2h-M`=hm0& z5Ki__Do*4aB9Hcl+sqU3aP-aByB-#viLPm;DrRhxUttJfwP1WCz1SRs&bRPi=xiS1Ye?^@^XN+j-M_NVGLz|rn z*29e2jK(@hn`R(VKjUEc+C;OLHCD7du=S`SaYO2!M6v_ z)i}i9oQN4<*^m;e!2bh^dbRR%)l8dKEH(kcMw%e{5Ut2Fx`^}D^bC7&#_Yo@M%6@$ z)NiP|2!^AhRNPy`ok6d{i_R<^Ea@ipCIPZ{;*_DRy6Xr>`~k6_kCK08Ze(*P%YnDL z#KJi?N0sm0M_Dnf#=i@6QP{(?qcpR>QTdCP5fx>*qjSl-c5bOD%l}vi13F%Ai;r%l z-_NNJ^A!;qBSc+9J|+Xb>)oVnjr1ad{}0) z&_{d#kJpJT12KSALBpDqkv^C)exo~f3(hzJS>?5 z2l`Ci>s1o{=rX7Vc}nnz*ccHR&bKtp>Z8O3tNVBXEX2cPOsV$)k2QV#r6F;@SnD0V zggK2Yg-|o9Ih=oIH-|<1$^Y>u7^N?m>whURD!*Ie;$e%Aq);lqUK9om1b_NVqk|;* z-3QlHb=od6_b*v0~x%8%wA5njJgJ!7BCl^aJVPUpwzi z#mP?d&#q8)Cxb@A&jhKNGSdaX3+#qm>oM@YeGyTTxT&Tg3vEha73SaOG5NAq0w3YI z-_}!Y;smQ=ISFHtD6u=qPPVy=){#KgnC8p0L{yXW{k|Ng(~+c41GrTNV8nd0g&r~} zJV=oitkfr+ue)PNbhJ>;h@IEK5^dZU75*`ydhetKK6A)JTjcXYSV(vW<<*GEuoeCv z_N4&n;9+@2Rp3%)Ebu<6X~r-5rC%yOau^m;79gH!p12vDXFzS*#UrXi04f}~B>bn9 z_D?nh-JMq7m%X0{$~TDtT!Yy;E4S`SbRHQ~CoHAww}nSXrc6r9^D*g~IOwq_6Y7aab`8$wS`kA|y=}n#32A z0f^PvaYmZ%s3}^^Q0e2X0%h6f-abZLnaC;qvyq2S1RowVf_0C+)63-bT{uud_0`h96NSH?&oJj{g%^4L8>QNR22IegT#?(BI&2{Pn2TG|7R}03k)n zw}i=5cKjR{lK^=bp1?j(v&GbG&G(LKz+hL(YRCM)`92U7PH7Q5fmv{!eI7Sn`3#7I z4F?8qhKcdHy8A6Ft@(Q0UC$ENP}Ek&eOI4QsGBrOFT+IWE5K3=4$~{S+73Z~vvjdnV$-S*WwB^nl4&s$$lE1jSKH6kQelK&QdlF~JZEnBrYY-Y|CaThsoYBdAX6=6Enc|S2FIjuS z$+q>ZR7JxZ?;jy6p3pkUplr#m?%7P+!2lI?Facyb@LHv-rfDzA5GaeAml!1!;rmte z;xZOlF~aykQtX$ruz+_|(ELv-Kw|YL7vnqO8|R9Ql*d@yaHxn_2{`ZG3SmTFH+hJU z!4Ewzur(if&)6Ledg_nM3!)XbM#{b@?~xd@;nthYNZ1Ry`$^ z6iQQWbND~q0zZwE{=(g%c-l!Cs&FBczTi9{r~pRtMmNx7X#p;8;8n$K$9wj6d62ra zs~g>JBuZk~vwdprrxSN#a!S;mP<_`=C`0{-;>8CytaboXnu9NvR0HiHSR2JIq63cd zvG?%tf_TKOkSaV-7Lc-q$zGM0(!Hcu->%3Xi!t~D;VesvoG$&nSS2$M_aC4=-Vo6X zO^}N#kF7oZDCAAu0&HXE9DURnkRmsZ zJf(!(glL+-R#7F3!G^H#50#>w!8QADECBVSw>=+Vl2hp9gO$cM1EWJHBYi93FedV_ zrO;|S_qbxc673hBA|t$J=>6v{&wgZ7#a&-xukgX9u4Ib!>Wg>>oF05*1UB=R0wBNe zbdc`P>)`_@_+IWL0E5MR0sP&k0QJlaVJ7S)nbk>1x6`g0F22dQYa*;gAncBB$<@dm zzEU}1x_seTUvPJ3${mSoH!qsZnj3A03Y1EuNPIuvCt#fB-%DwezDaM0`ao!&IOAW! z3Ld(s{DJzX$H0nWha+R90FGGQ@Kokkr6L`v26HKZh?bfE8}6?;qojINA=Lj(rgdr# z^H6i|5bC5HQcAa8pd>b05s$QMgKH1Nf$0!JL_{k}&*Z3>2{jWVpm0$Ox>zISGLo1 z7tJJ#u{CNP#tNB0OzYIA2uW#RnQ6ReCHh|CW{T4xagwQviOdTi<-3mhl@>M~WX<#U zaFt|bSz9EW!3`~=F73CORlgeC>KEX2D06YUjyP!P&J?H!x5L66Xd^&Yo%XVeTf|Ww za2M2U{9i#sae&iljW%$`=x^d30Nu3>45_Ou?G^5sT98`_X(h|H@?nb?{@Z3}e0f83 z!h<{%iXaxj7JOq&N{@k0^CU~51jAsFvP<y=0tx@C$rmtP$Pw!lViv4CNmFy8|pPj3)cB z((0Lc@Nb_DV9|u9iPJ*MET!Noj?dXBTkwutbmqJE(3IuU(B9M(@~bmBRUjcJ?9ixH z7`eXs--KUysV+%z#6ZYs36n=mf-i+T3EQ3;@}m>;C%%lvRr)pGQHWgrDD>H$1KBIN z;PluV&*?uAD#YdLz@_^NhrupsO=N9pe$>ZaR! z$S~@ju~P*ivf-xzuVv z5jztf-pU1USG&~0_3MnfOT`oNa{-|laD?G@AWe5dLSwLVH_mAAH^iGV03q8D@O0sQqKAE_i@alI^Gmj4VFDypo)%N8-->vR z0$OEks`W29z_td72C7NnUct=z>r>$Ji-=!5U>B&AGPXUqCnt7jUHP`o8Wq(U$w2ci z>phemMH*LO?d9HWi7NX(eOE@Q{$Y($VrSf)1_LdUg|QGYg4wk^4g{FSj-3-aq6;x} zfxpdjo6k`SU%h*3%KK%`!?4MTr5c%mmko|uCW*s}s-d2T%q~^j)9;|4PWGzZmvH-6 z2g8CXcvuS)`mya(UIKf!yzh6%ElZ~KY_o=r_OIFpB@ZG`hSOSE9@usJ7$bZ4c=^^Z zaY0x6r7_rfGoi6uQYx52RJMQzTAMNgSa8k#^6eeM2c6fQa6P}q!rK%kSkA@`YoZ|D z;DwP^$(Ed)GZ#E%Let8PhOmweU2e@wsbuB)uvOmFrPrY` zWdvwq>G_Xw`le}7{*b=Bun-zBGcRa9K~$`Ixi=f~{_;={G|G>oafFFN4 z@1MVAe$Q3e!J>oA%ZBI67-S1Cub0S8Rf?18r3e1NwB@s}_9fb}6nZpW>wnWa2xOs~ zPU{WF<^}=r##30Dm6<(B#-{H$r-N~{;5$E$cT(>)FINd8Wd0U!iee8j0D)Gk`5!oK zK6bU~AP+dCi+}uW3zG0<@bg)}U6+|EGvM{!c?gm|c4W(ipJl_p(JFZ7&bCZNwZ@i< zmD9>ipF*8?*hz^2xWo?8k}jY37R_NjwR$byQ5NNXeI}h$Y>ovD5uwHCs|G~s)b1^c zQ5Ol;LGBT=1&8l~gS$REtaSvw8x0K!5A2<*LE-%q1kkz-(Z^JNYanNGQGc{cK%e6| z@H)^TZitYC5&PBMlKnw(1p9G_pEn=OixXBV09yX#G7dT0gY5RPP}yU>#rp;4k_CTbBO)2=vc0*UF=$rrW^a7*Q=0ry5jRGt^d#wpiIK(0ohLu zoG>pg7-D^}on znu!-=mMH31YFViV4y4S}n^8lMhd*vT4#GA}Sf}RkxS#&b+Kc^GbVNW8I}PQr|6GS0 zB1tOyrF?t&t%SQ-XKh2wiP;?e&A)G#7cIvN3dCN6b{6`$kI4+&=3-2!{e9Zsg@3N= zTOiJ~B`2&_4LEc3H0=R(#~0R*SrYCeLH&=oF#Zf~UuK$!&g!K_zJ3Hw=82Irh0gFV zv(jL&heQGsMdLxE(>x?#cM+1+;E%=@3ZlFezW=pZF@kOZU-mUC{F_FDVP z*JI)vOzGk^r|#rDt9G#o{ZB|m(eu}FX)?RdMalOmxYIt09ZM;^2Slcey=Bd-8>+9^0y=5 zz!!%T*7Sv&G%~Ezyz7BWtxb(EXkt7XCn=zt#wTZ`OO!=6t$DUDfy)?VbbE#QJvR_E z+(*Y)4oH_{oWymdm}3dS_G-<hOPu;xW65ls&L(4Y7WK62s4-XzS0XI`W{zdSWfG zpXix3J#D;Bi7jg3@f=iZjn8nNaS6T9*IQUt;N{`@tK_(<$7;kVlwtxHu-_2;tp5%HO45uUpm_4i{sTQ66(IK z2L0w@Wja+e5Ahh!SOES(u1>dp=HLzQyFWY6!{DD+N}Yu|xg@d8S-HWPm_Xa{jRGMa z)^i;eGBqJ}_L*;e*-y6?(+25Vo~#uRdP>)bOCoP0qt&)-3Y*K7bJ2on4{5IFMrLwMqol3sFzFzj^46@%OcFE zK|cf$jv3n~tdt5CO^d>=B+;pD_>nr{%IQikbctIyvLmy9Yu#OY+#fDQ-?N#Yf5Bk1 zB$-4QKJTBV)vk&h0oN+ASGA8<5b_|O?wbRx{sXngz|Vw>b&A{<`<#4Bax~HmL3US#UYDW1u!y{#L%3^!fsh_%!CbD8CT z<^}hC;bx5-lmC26sg~8iT0qcN*6RG7M}ZO(zVqDbbeuIM52RtwJtVJYAQ;>B0-ijf z?R7toLhbJs%x`SmN*&q#UE5d+afQ<}p(`FZnC{i=s6PJo>8qhf7I|lZe_6Fet+W`< z>HG@={~WbrF|^uNfYDxtZJQAWtaw0OPIzlIS7$>jvXA+r*2G;YuyqG#=fWHGG6X>( zI5ExK@uKnUWfdJaxdeRR-iF}nGy7?Asz%kJ@nW#;QPK3{*shKrf4h^&FgP#@u=lUQ z&h)Tf<9zrlUM`PjV+l5@MXl$8hRK+o#Xw&=15_3gF1p!3!|_FA-DKdHxJH3yLKR$( zpXj%%F18^>mf=Wu+*ti^3WOvQKS2)JtS$KaBgSBl7W)!`T8LLL zYYP9J+WkA?V+kB<>^d!1tx%2f8QgB~<$SSgoMoi=#?Ql(crVd-WmW5VRDIZPrLF=W zpz^dLT)rh+@Ar6_XW&LP#`3Be<2u zgD#*ZO8R#<PM9Tog2Z5UA{BXl=0mw&h7O|te$BvnFv!tF?AQ?`*cEJgqcbF198m}^dBN|+3T*}pYSHW8tvqE##j!CrP zA!IdLL2aeK6^GsZ<%eowu}6$(#lat1!)at-ZGpIc?{rZ_gho~t=Is0D-vk?99Ctb* zFqH|`kGcBolg@jcPqjmpynvQ3&o~?GwbE%fa_9896d4lL0 z-tgEt_(KPeE1;pmDRCXBQA#F~^TK;VP^gNCPM+uAm|MYzq1o7sn zV_@|{{5@g+La$}Vtv$P?y`B0ZAbxuH5CG{ zU;6G0Bb|kgO6|};Ndxxo`qUfTM`1PLEI+#VJ~2Y>JvZkeUIUZZLQku0UCey59}LFj zG$K6ZmV2DByWZYdxB0Bww;S>bH@)Ck1D7m6AbnpF$sWfBQigEkm|m0qaP)3b<0sds z+Z28GYtlL7F2Pd{n-UL#IWuYQOFGZl{97US-x8z@|G7wMqb*pf`q}K_@nnM&nBBy% zPWGK2!k#wV@>iKlH}=AUiuituF9oTFTBxCME%YOtY?fEtJAwUBls=CYl?d=lXcyUG zmmBR@f|y7{*B*4HTp^_wd=pcM#XLr%kcLRRqw(`k>)#i)tI_tjv1q#K$ob}5s~?opFWVwQ)lsAOD|OWV@xZu9?_{$#DfFZSY(H9(R761e60J2 zex!Q=4S=I`(UT$$zuND9+0%TLI7JrWK8)S}^i_Wy&#v!08CYsRG$v~s3SSy0m!>kl ztX)o8*1m}R28e$tfM@rB8J)WOa>d2al>_%j{E}1*RGJAJspih5)gFU{mvN&vrPbfw zj&bb$6A89@9^X%|rctLi8h3xwt5{MpMe+Z5`UZexOF9MVTIojVMx>=g zmagS95GkdbrAt7%q(ne^>272ffkj|pY3}-a?!EuOdEPTKXU>^9GxPd(3T~NATx7O0 zw;5C)gIpzh0aoCGGL{J;0Qjqx z^iL0iwk}mG1_Xd1xNi?>@Yg5Rzx}ZXVzu{{um330nRR`2)XMm(7u-DZm*FFynq~u1 zWOv~m+#^4P4ArH4m6iH$31X0Hvq?npc4E8H{kOMDAucCVstgQrHrynC6)ayaj~6pjk=7I^%iiX3&+!KV=697&!&9(S!LE_vpl?CE z%5?cBFB#SiGt=n-=@0U+9z8={UR-TYd$H@a+BcE=?3dn_}ai}GEySb?TkcR?T3-;YiV+A z6KpsY`S$X4%N$M>%?oEIb#W-qJ<>u6(Mbg|fNH8~ba8k>I*8lc+K$6^C5RH0T6eCl z)k?QMC+jYU2S(n?aQ<6h%b#V;XJG2*G^Va)Fq`Nm8}DA2Yo6~=AB_*G0?7L`*D%ks zch8Bbcsgs_pgMoN19anc$I83cC}sz&{@@{KO_Lvk$au~N5}g;=dR`&05)hz@N=yuQ{kN9%1T8$N&N;B43y__pDsHQ<6MKEfMKOHwsRc_mu0AC$d|7R$`gkZkW z|K6xzSCFcxXiC}W@yB!leaq9CO0Ba~ky3&~LB-SRKX~SdZ{6ycnSBg&xxEP2*}g*P z@~t?a`p_ZY=4|J;Raa;yjd!`E`En%GiUWzlO7^(S{==BwJbJWKyEZdV$eXIYliu|! zAX0ak9go$uIvBr=Xyrlvl-QR_(qv>s>W=E}&5JL&!!jJu66Mlk8Fb7rL#CyQ;+bEE zH$!|@Rgj5iBF~(2dueZ)Uk&Hu3~6hA@$)MintvdaUzhiOJ@mK9l}d*$MTjesA(u~t zYyrHo9MD|l=JL?^)|S@u#+P!oFTXF;zv|ydS?cgLW~~o4TA*yj2KTrWIt1U0{oEL_ zWZM*0ZdOG>;p1V2kAy8@J4B4 zk_`_NHPB&ptLoP9&;8x`0MsQWph1xy-0mTxzXOSs$)q{l9my8w84gwT279MIth z`ALzAH3H+PoF~h=nF7V-V}LB=$u6HKlu}kIznPjvFu#BdAmhLuu)Lvfb}4NCmTh)B zQ|(^(;YDP~gi2>TVW@ZM%ST>+M;7adR_atyj_Y0JmciCQ$SM`r1%F1@^SxV1o!$5e zHPrWa=pxd?5HeQvfUl^LjfaNDk_2a2o*KLp_cSJ?e(}s@hZ-aVE6uyP{%LoT@6lXd zA6ZN#T2XnYkAEqDK)>Sf$*sLZgt0U%R~@%mi+dgK-qX^|L%Zliw!>v9}_8Um`U+cV&x<~I!0nj?;)F=*(*6O7yD5TFkR;dzvVBC zp(<#0tIb8*NBZy3?8>G2i3Y0AZ(R_$BO|PAH#I)E{XH%Tng@XGm<#@` zVM>RrRtG^MY&mh+(N`?ZeKpeqze)`rTC1%+(;l_LGk*QlI?d@CFGS`g+I5!X7@@JgHMK%6qe-gNS*vqTb=%5-tI?+Of>H*{m>JIZY9PQQ5@66q_^%n z+UvhtjjSCX7AHfgDTJPtJscl)aCFo?_<`Awkon zv!4}iinGjxPYh3!EWOn_5Xz|o8bkL*PYsHj1|Env(oXs)fnX}t%6WLBMQS9rz>wp4 z%KVeli}NcTgqohzr?R8hb>%#))aPa8mb)A{{gvX}Puj=!akpd_C?VmOO&@VlwHxOr zC7~7a`=_sF^!Xn7twe|A7rS9C1KG0( z8psQXWhiBJ^0157z1#mOJUVru=qY{P4#8R3?mP7BjHic_@*lr}{3Xw*W&d1lt;b?D zbu$cys$|cj$7@7*cI*6@eXGIJ?oay9 z37>2D7SA2=onC7iIC0r&!`9z^B200fLEydgSu-*lDevOs6m@AbWjG0X&7!Wcs|zv*4bli6l;JqzS8rtE1vQLq&A#4#ki1 zgX*W%y%?_O!_LWXYlZmGM9hTfBV_*bz4h{?D9yMwQ%(2$=?D7B$5lNqoNQRqgKkk?hZef!T9;uy=l z#aF@l-g}X+;8!`VgCA*U@ot9Ju40)CZhE*QQN-uIn~*Mwb&DqyC8+zyQl_Szcy)yd zYKSt&Kc^kqZ*9Y_pXx|Y>|7AT;w(KWL_zTOLfI86GZQZp!nv{bOdZ)mF@@r|USDR2 z4B#>umV2DVRV`vyBKrMJa(pxuc2@Ct7SdU@t1HJ{IhCcX)aAT;(7b*E!E)?(I2JNwLnn$kQ07$lhUxek(ZqbVWr{(*@1~aGf-9ZnaaFs=GCKJ`<=wGjfz^)rAXq&+CjZ8wN(c}QKzT82 z84~yUR^&_6sG0<;+9#8~b{d8Bt<93pK5WTVAolkWmdh@ey_iBR`umq_PB_k;J)COro{-A3ABnT)urEVB#hkrDQ0gP zmg_K)(>WtrK=vCX`Fr8bw_Dp zGV^uI3K%XP|DhMM(zDJKpLDFh+DNRK@qB1^^IFddm^|cauAji5L=~bSu?no1$PIBIRsQH@G>Rz@dLL%s3lz=cx2-asHXZKeI%57-Jl*Th> z?G%-2agu4%Su7X(eM+0cl+}PuXzV`SY_=Y{>s;JyCj{WW3EoOz0d$N6bYx3@9|AnU z!>G;!+fD$p;zHdF8=r?6nMJI>CN{y;WoN7Bqy*VK`MpgVrN_0%)G;P(I8)(z?5yqI z=iSrjw>seXE-@Wsd%&}Sl;A`P7Ns%>iwGy9?@WU@d9<#kx~ z{JN5a40}D=BHiIe{@Cb8a_Z4mCAg#e;bQgooc>V@ zMOB`g{rfTLzk4dJAYo`}CWKu3A?*Z`;9BQ!iwbLegYk;9H=LfWbp+%mF2N1kUEpGlJ+%rc2zv zU+&f82;Tc2bL(uFz00c#y!nOZ%Ndu|;1TiyPkkggF$m6eFg7xmpy^?0FZq6Dz>wYK z#fvkIi++(iDs)#azHQ~q7#QCEXbJ=^ z_irkZOGCEHv6-9=^VE<&Z>5&oe;hXVT5vLLdzAlBSN%+>-w66nSibF^NL;uJk4so55 z9v@i_`6z*;QR(Kky*yEVhLSr{4Bdr!ZF%T`+r|s=Zo_;s1s{MW1{g-cO8^N_QCk28 zv*<27-9GSNoTD4AiLJ0ICWb`%>XmA>RS(8bR00t^6qwXQIdsQJ%YGPRuHAd%NB(n% zK?q-wBQsIox%wsFONbf^lZ~d_O2T)hf~206dnmhk(9K+0C{H`(CByHZtt1%PEVvO* z7>ZlAT%twQ0334^h*w6Q-)rIWqSOB%$f?GtfX_5e zz_`MqU2Q*gag-*N*0N(4k74^ZEnMB&1du#wMDOiki}=kOF6+13E*z{k58gaIV|1Vx zcvPG*=@%!p(8y@#H%rGF*1{*HI=A!PkaA^;OU%l>>q?9lZMNR@^EHGX_2kr9`*X-j zc3%uAMMKuEfU4+}C`}qSvmK_$r%IMBq;>e5O zL3?ayGq9vrEi*$$Jcs*FoJ~j`bHoKcy+|kdL!98qFyOA8mZj>No}ot}^(%r~7crk1 zgI$*nZe6o;<%G&-&h4zEhR&p#GtPg$EjQ(Fd~(2m%A=anV0>7#BX5{Yiq?lH5szvf z?w%o8Q(^Sa8&wGsY@j}&vCWuoP3@61meV!{~0`$396s99{*8w}0P~N!8?d&~%F;Te>N^H~F;FlF6Tl$c-P`qj* z$!pE=W+x#1?y7Ff;d9Q+Cx9oWxT|8}_4u&KcgSiJ`)W^6_4QDoEML{zUEifOr>CR4^pjQ#$ro8Pu&*vq# zjygMO`dAFU3e_|oOjEaF*B0ljwcvB}1ZTRtm}6qy=Cuc}(P*H_Wu1)vjzB_c5YMud zT7+1I-|b-S80Ljg%4>7*`|Q9 z$~k#f%y5U?-I0wjY4UR_N@$}Y2@JjS#N8wwnaa&y35KY3Uudy6$8Rj!G(=ubsQ_HJ zC7u#^Q~fN;Mmv`-q>;iDi4k{KkA0d9>zm}nCnR}ng8JHB-pi#69L>s=tE;zv`EvW( z75rN{RO^t;r|9sY%coN}{01*j=dV*B2wF)o{X7aYM;h5xgUmH0i_y8?Dh@EW)K9(h zI8dWQ^-WZ#$K-7=bsIKsjLqQv0U`#HG6*;vPL@&9Gec+Yu8#^I#-&n4t0ww1-Z-!` zNYtI1J+>b`aAehWbFeNLKovdf0n|AIFdLA&Ji)3Ueh%#1S%#3z?-rJ-;j?f$Ypop` zip)!*G~f8|7FGfd@2+Q?Euvf`z3Pc-#dJ%%uY^H19>sE&3k6cJPEa?LC`OL3j$G(X zB?*Qu4Zx7|nSg&8DW%@t%6)msA$Xq!w%VG@;Mm%J*6_9bueIPf)_c7LQP}FFIz0IF zHvP@?dD^al_w?@35S*g}$d;HCoyMmz^@1M{!b%R!6Rxt6zmt7p#PEVk+Hi%){mf#G zyy3uI$DOOyH8cOh$L^!ZZU=ijhEbe#q~9}j4e(J?Cm~Wl#+?(G^T3+Ace7wSe9P}b z#8JY66E5DtzU9k9sHouRVGP)goMABIl+LU8s;sc!_p?gpC{*KXYO_b%!4a-x*7)lx z>#b5yGG>N2Ynos|4C?=U4hUP;IzPYjZ6&CjEHa(9otl#THbeqP?8w-UU zMpQwWa@sSYVv6X%JM;4nZu^g%9a3_T2#S`(=msOgwgseZDe2jBOEmQjnpznQmkr#p z*=<|XR}rZOEGr%eGVPBhjVlOAC@UQT!-|3ChyIacoo|!?ZO667h25PUg{)6S7Uz(o z<3Ko+87cGHBBM^`4Ue!xk5}}~BZ3cJ4)O(NzarBJ{{?pv2#NpR54R25`j@E2puFDq zy+3GQZ)oIhzu8&#>$)%RLnZc;5^?y!d24?0s=HXXC`T4S)$!RMi7}gcY1$l44^e+C zI0hgk_W}$jQ_sbGa=0Xc7;{5iluZ|>#n+tg2x6lSSrS8_8>3!C`&ZHews=iN~M(`;N z!b6E@Wq1(d{zL-aTmybVDqHh72doZ&aycQ4RR8<a<8(r8=|eX>ceV z;N5ylK(XPA7|Uv_iY_KV*h9okklR7eh{b^`r48c!NV@_4@cSBBnm5y8ihG z)TV~$YX?sud{r>K@)zE-3ECp^oNsn3-~5_c&w8;%;&KKWdQMbdffHhRTO$1Ta};68 z9NmThsCT68F)#LXL$`S5ev1-GYh#N)BI~;nrIBNkUpYfq$kKKVwr>XxS~)G2kj=Qf z(L6%6g?mfFZh^4RY=IQet2)`|c)Z~|A4bFU`33dyf-e{EF?{;uAol133jakVHn(kY zFAhNkM3@*KSSyKC;~wwP^bMaWTtdfwEv_^n{x0_9n2_#?UFCf1RKM`nC-?TA1@>El^fhAQx1^6W4^gm{D@|ip|F`JLe9bg zy*J#OzrQ3fLtpMo5C$fY7Px$;-Sv2=^nh_oaaOtIgY5|uX<;7$Y8<9CKTt$k zTkFK}RhKda%Dr@%(T93NT=Hu*3i76Rf{E~hQ}j!MKc9FnEg1!R9JsHSvjKUm;o`)F z#R*dHk6RG5^qbOfov6ME_jr<{08d6jZ)?qh1}|Vp>#`Pu=p0hl3|0YZW2MoxuX$i) zCm}a30XU_vmj%4)gRDB>16rP5BK-@zpZ>uJkWoCr$B0I*lDNI=eAq5;vB431?2r-T z9@@6|bTAS{C|K69U3^$wpXMSpGbfd!8^W%O$O7DQ6a?M-6hnwm!ds<%wEnI(%4 ze7xY%lu4*r?h*eJXd@;VPbixm*}3I&uD8+no?v9r++N-ehj3z@2Rlafpfw9nFFdK%&&*tziJx9 zeZT&wEi!Q2oWm;hE1b@?U?jl0AQlif2Du9&jwD}CZr+L_z(mO;5%Za+Ebje&^8kYE z-TVnz1AlW1a}F|Cq%i~U_yY(FBJL$q5u?I|d?p=`byVX^%gm`N@bA>djP@^v<0|DS zbI8C&ojLeyRWLL;rkp9?F2NomFH}JI@`1&zvRG^+VeX8u7J&tX^NU>9m#N7_yb ze-b~P_k=HvmlKqGQn-{gMTj{BUf*X&r1?72oJ|7U_MSGSQK8HVidD^-2r(6-V-#@N z>Xnn#q~#!+pq`T`Mu;77rI|}V7>54oTi3jlg?3U%AGlDdTWY21AZa~}lANPP*hDJE zabmV}=Bx5aOp!OmU6T?g#vKaN_lD#rsCqp|pE;vgwg+H(Q|A(1urd4vwG>{JU|L3a z1Rmrwj7lEi4(rIbHP3ai6yBEh2|+!u_mM|jjX`*(L#n4Vt$2oq7y5roU^oG4_!wS6 zpVKEWPXl=#xnMnt|B$X@pO>Q*2acT_i-1!9ABiPtr0_m}w)SD1xM7mmoR`i0mB{wO zWX8#b^<~T=r`J$dP~M*a!{lhOB8rz_j7zsj-92ewwm}NDQ`0$7jDY!fZ-d0N%l9i< zX``P6ym}DeKTJjTWj|99R`>pgA>cyr^m__&U?=A&2yg-L>XuOwnPzU98v-!YapK`) z5U_CN_PNNt@cmf?p9S}4_O@`9dR}n`xBphe^f-%1SX;Ced^fuKkFI$szor7NF&U(Y z8adz!?{TRPD?%*I#NY=onDrO(y6owVNAx#o78GNsarXDou;@T98+E%~FfT7$!#;W# zm+son8@KaHCWE!5w9c3@HCybQ9NgSENEIO60`$Cm^?)m6D5Hnlxw@|&<6Rc~-QDSY zBuN%($4DMk=>Gwh6I^}N_#|#l>Zc~_L|fZ#J)Mv|#jQt$ZN4hK!GlL#hPR8*=!|8V z4rX%1u5re9h$8fVXlVADFEI~La<;v8F><2G!s)?;AI`MZY06+MkzCceJ5mTbz;qSk zrYOyByDIcfzB%+JY|&pTXeHpn6BD_=lL-nohs-GxyRO8pG2q6TO8;rvE(yqzmh)KC zCN(h3%lX^Ly~TelQBK8cmEc)){usUECG>XR#;x3pKhn2@z{_J&rQ?gocXw{}TrOy6;k$ z#AanQ(gbh?qzo%pmggA-sY0nX8inVe26Mk9=g4Ugy})3(ujgrM4jl^q1s|H&#%vf+ zr^CWmqAIGTvdjDSbF*>Wg9CJ$28}ECau{mp!@sj!UuP4b4AZamr)V93|Bf{+Gvee) zc&hQ+$yu)6&E?2jy!jv%FKwzpsfSgBx#6PBiIZd+#piAP)`paMu|Sq}hqfBYQ?ci0JP_4QGAo6Y`?PDAC0{qojWbfQQz zsTO#)0p7Aq{J)T>XWuON^?K0B)!N8SSl%>kldha=?3#YKJ`x%DP4nN`uWutxACV%B z=VVg4ba;fJZ|v4H6Z~PgXgvWR;pQ&H0XGs7s&raC#2F41xZ@81TCN6VUUx<*JPfW$ zdIm}O@gR-hiK2XmXY?0~f;%q6#>eU_`lgMMrrA}k`Dk0hXIq<21c|c%+(iWozn@8W zll8DVzrF(7_P3#e8>z=z+j-Tr@Imp(4_h*iY-sc6HXOI$R{1xsHRsnA3O%87?x)7@NO)rHfeZtPNMZnP=hWn{24#l z1@GM1`5M|o*86CU>T>0mT;4`1iX-MVGBR9*1#(9&9Y>9_5R2CNSYM;_zK=e+%UUX8 z&D)r%gDBUfXZn}0()B4&lMf%-mD-YM9cjD6fIj(8wS{Z=4@1}o?9;YYP?(PuF2TFq z6TgSWxdOsxiOV>zLdn^!;S7wdnA7BeXn;R3i{|KUguD0YtwfP#ijf# ziDUUUCaR>W4~#NyP$z_Tkb2O(5gXE1)UAl=-Mmbjul{a%=FSSxe}n71;>Vx_eJamV z8o#%0ggdWEl!2lKu8V1niEW2ZRAdK!(4b04JO)ZUF^u%}hHtnonP4*bP~2ach$(kT ztC&~Zd!s?uj6@vIQjV_9?oVGgcv8}1%KuV_s5gX5DK_yiYaAfia&WW_6g{08YHm$i zM%i>|8F?#?=okqX3XF*k(bQP3`h$CQdPi5f`#YKfpt?r;pNh|g7j>YYf(S1!i=IPR z0Bx=GX`mbyZ2Jz5n7}*Q)=m!$tH2Ed$m=xE*nTNEhe#Uq)3c(+G6la;z$TwR{v&f_ zO^$kGx=C2W0AqDxr|0}HpQt%S-{4ozVQz8lhH7Y3jPpkt6GuFAXXWfRz;M3+|n;a4Vn<0NTN!g&|055T>Fv z0}RywFv|Ieuc*84LBK7SvLvCThth8ngcs~@x3}Ru&cyKd&qoF{R z5VjPSuixrPm+u6D^Xvot71P$neA^@Zgv# zhs$@W!wcIt8YF&HU()k~CgnHI-S{b*?%d@Fs8Dc3wroD&JVGd_$p=Uv$yOXt|50Bw zE8dJy@F>NSAe255qvR)yD8Tr^cDTe8oIm!HFK*Nln?l>oP9U&@5Kg*(O6m!ORm0Fa zLZT`1>|s5fZ#$p1aL=a3#M3{}cSJ+&%O*t@6}#+!ygDD|OnCMjX(3D7F>q@YY<_yJG@g>r>C@A)X`b9Jp2Fj=j&7M#>|wceCSf1?OhiWa0paTfxbWc+ELv5a*Ga-=VqS8RU6Vk9p~3k-erExIp3#o3GI)ONz$JiUaP|~60nAxDand{tY8_Q>Ii;gb z!{<+`vm1u=w5mA>|A`31WAnr3-NVB)zbGq%p^fltMwiAc`)uI>L`5e*Q2AmKKXa0o zSi4JlzKh=uJ}{fbA6v*S!+kq&d9OqX5Tm>xd2L4SgO0j$2)_F~05hhHIqm<{pjfLT zBvsp0B)Eeh^s>-E|J7sAWl|YzjJ5Mcu;|6*BJGS_qP@?x8iq^&!3qrV>JbxKCm0ca zJ8IY6PyjX$2Vz=drUZ#mHSkm(fxx-W`m+nC$lSNDYikXB{UfWJ+8G$dD^o1YgF+~{3p2_D8^In@jaB$w^~{ec*GFV zz@8LfEs7YrNb&O3$lapvVJnsQ@7_%mc>MiyA7!`^x89Igz*;CVz-pg8AFC`nZ3c;; zp_j)zaaL@wS{@gUT5_`SsAAJ4$;Wj;DZAv*2QY(CL@vI}M$ukt)>fxa3^WDcQ2>m6 z;Iz$?l9Srx;lB}I0xAZhhEa38hR#2-T4>o3By4%jcJRCb5Q+^x+%d%l)7KPvo9s10 z!ikHg`6q7P_nE*J1|cG{l5f5D!7UDPX)3a{q%Zs$RlPeZtkJiP+vOiTfh}2&cL_vA zX;2nv`3vJhNg80)0Wm(GU9m3*`DF zRcw=46!9QH&@GAEurj6TLF{8~D-%y6z1WU2c;Q>%OUA`_fsgULFS*XMpPUuP-<;Rx zNjIgy65hSI%M{eTx>yZCw+?ez3;6WgU$VnKy*AJOp+6TQ+pM$WP#Xdn++_(Shb@A1 zC%$+CLrLnjCoYV~EonJy7hXnJ#!#cC-Ik8=QNECgjdhjLb2mGyseLi!ae)bzHY&t` zFpse0+TA2oIn^;uEcz4YlKrHp;Ad0Y7A5k&m0YUH&auGQzRL&b+`&hR57KN9&gG#%ijOMl(@xSp^~{}65MrWDbJmL3CBpE# zq%n1mk+*+e#e2Qgf3Vb?p!8>t0A`H`O)ykdN15zxBsJ9vG;Ljf(^wEI1z{`OZNYa|6M z3XA!8wNXigVh7~dXsOG)M8NT|7Z_4-C%ZF0#nR~~%yyGio0^DQ@piKtzQmC2uy zLTz;%{H|g8LazGhA-^D{M6L8=e=PN$2v+}qfJYTuL`ESI;LBT(lypNe8X!uyW#qOu zaAp{i91BA~b<5wTsT@#n+U}cVmj2L)}on( zw}vwx&@o1i3HCntY+LtfnhDrk4vXeZ^-5Zn0IviQ4mAL3T245Hh?b+lRV0^5iQ~xE zdM}FLI;HBC)Ov%0R~R6_q_?T-c(^#IZ4F{TAcaKhdQ`{yx*pglAADx@y>8nIXKx{1 zdmWUp7WlH|2PMm4;bugP0F}wM8P*fR1sG z1%JQVuP1gL37_wtwyz|H`t|IO%-b?x?CC*c)|zpbi!8=({W3m@OO?avW- z_(&>Xi+*|gNd3dp%x*?aO&6n(pYXnZN)p*u@jB+#fr}eX((H#-8TwMlVUx*HwQ-AV zzYBl|pvt*D;8RbBdIkC7e#T~o*nCJ90H>eP(wc!UmPwr9U6TUXwyKTtavIbt#z6Nc z%Z;2l55Slt8bF!)KS-6I1grdHn6W~0MT&zISs|%G+S^h6E`odhxmQZ>tf+|*76f! zc7&I?2)vcwY7EfUz98gO2x6QcauD_Vy*jGIm>!&~gKqZu zqzJTmbF1PW{>z*-_#^px2NCKP6vhWZjTwj{a+J~fgFA{Co}9MQ8+Y4n3tlt`^QiHj zy6|NA1`Dtw@Aah>3L^EF#6$!UXXJ6D$_eBZw)f%wt*i8GhHlI|tK(Wh$dq8pfAzbL zNilE0ri`{27=w=~#sG{t;1rc5n)=JkI)ifV9$|AU-dja)31v^0$KxJ%kLE|A?!jq* zD|T?6@)xAaCsbJiDl7PR9%!hrpA7)j@Mkq4gsyf}TrKz)S-@n#9S}aXYIzPReUVq) zSt+?5-|N5F_qT=jsaZP@pD6x_W}A?(L+<16)3QejkXpXIzi|~bD1_PaN2Dp-4$!TB zR7aM~krpD#jg|jq4|MDkh0owJN@{El*)BL*&Ff)hNi0q-z#Q&cjmI$saA{d;WZ`H| z=C+P9q|02ZxWe(1@0-#36iMP?cBy48JDjWQS_j`e45U^>Xwg`z=kd9a<>XTm64xau z*&5ZfmB_7pbIqJFJuPdA-(_nnvRKO^#cKezwUO~7A}l2Wy)3P!I`7^N`!_W0XnoQ= z!e!@Dhsz23Kg~}E0yeGG&6TAczI@%a*4)RF(>W>Ya&zzfqUd2X13D6TbB04#+ZsiTQF9GHRWbTGLTZ~w z85;Cq*EVmbhz#!N46TiTq~aWUIVUjxsxnK&4l3UNr-YLQCJ zgenC(O-y8AXLj`cPBZp+!V9i84wK?m9y8_&O_o|Uvbe0gjLFRS=N4>L2{k02rWR&(MO4=`>t zvy6|gCoSgCEYDZ)@$3!feuJ$3gNJ!rEc96nNf-}_x?)|BaiFrPCA|>`L3lh>Ay`6` zP7i*U;TOiT`1IoT^&}^hjPhA(edS;ZQmf(zGSKf-wsA{CXwrT9H3czh`w1f_CBkOB z{v8GMxG#lDW{PqqgFaj+8=RxSV*~n?p@XS#cH^NOZw5|3d>djj!;CJE_wp9m9_f1+ z=4Al;?@W_T4QUj$qQrBmsvk3E`S-ljC)Aqu;o5YdbY3sqpSc^y<8VG9#tk$zTLyo@ zFd5=OX;BWe*9`4MioEDY=}1a3!1s?ws`z4dq4%+k>mD@*Rl}HXYQArPwQ9kdxT7nQ zgsYMu()DsfZ-8?`eJU=V#U#5zTRU5Jdx&#hZcL^=2sG9$GRA3_PyF`0of zc2h2F&N>@l6MjX2X*r0Tiq;Ab8+j&m?nuwS<{d<`GmMSA{ZWhjJQNYG zz&lQI*j}#|45LSXHB16QEv;l_Zb^v4>D*-t-VM&bD&#m z&eR<~ar`KsYbe_rBs~!%Jm?`3rN~L$SP;Pvy8H$i@8aYI1SEcF(#>tD&|DkMov;kb z{ln##t=Ljdvx{Vcdmojadbozt!hX&#zyJ68phNs-JIoit%N6itc;+QUzo!3ABtLr3 zwocmypJklvqtxYEixQ3b7kv$*xA>PwctC|F;!svGgoT~8FndNqS;e&`mg9GOVtSUq z1B6%j3)+;qRNy5S{U(dMyi44v7}*38=-M012MT@-aZ%XHV3+qXVe3U+feLQBb^&BbR>NVlwZ9xNxFKa@#6%UtzknB)kt)@PLa@Qi3OJ z*Pr?bkTSgW1AGf{XQ@Ib*aYdn+BV8O);dty`S3!83Xq(gL>Tkuc^-@(s0UULObw7~a=P^&P#B{SfFi%n8L5wGyF#;0})k%d5qQ zCNbvYGCJ-;Y-;imuaVmHh3fy3qiV=GF_@ymf)y^Q%8wWr!Kv(c4?hk8em>yC@KkOy z7ehZlD`g-rrL}56U(j>&OfA@Ghtdwn5=H~ekyE8$MNLb%VX6)+xF;1x-6v~&BK64! z3!;%~C#szlYY;OXfIjMbW)P*$zXV%?m|hCGcV8+3Dh`9fO;UoVJx zSD`Jl|J6Vh>u0dPOo%%mkrJUo5WMVsEF&{mBNABb^|w}9prLu^lx>Xogl#fNUB3Cx ziIvumpv3G`mQR>&F*_|g86fjv{1+C`z~c$_;B!bG!Lu>R7sq{`TW<8cy1qNbCOq(A z{5@(LF=pq%=kKn#E;p*Ba3gJwyQU)*ZA+wE@v48O?VVd(g#HHM1^)nPY{<{@d;hlz zx)}4`wDcQ2$lXjq5eh-R*z})LB1-!SP{7m{>d^;9xeEgYhbuW0@+N1(F5Y_QPcD<< ziNpD+*p#(1Y+JHCY7GIQnLBc13alr@>Isp@P|z2G}MYXR{( z!=)BPa3rT#UAyuph}RMI8Z|#cK%t89keVM_lONM2vXja2P`DSnzdUmzX_b= zMEEFnDT9vz$pWu&v0)rS1#p>m7@xob^nMwtKzK{aiux*omLRVOe{%nVCU(Jo>u|PI zbuo<@sq`%20prg0ln6Rj04`|a!;j)OM6DFFdP$DBN!~pNbQnoT)NUv zL1Xn~j<2n%Sjf=T@F{|ePN8(y)*M5Gk^6rz4K(=f4CrJz+XU(GR-oO8iZadEo_V|t@az?z#Dz}rczav(Be7yZat6nUzCYPyV@1X?r73*s!ys5RurXIs^PZVsQ zLZ5{{#KrZeOhkREuF5fs9L88z0lUK%L$g9@hW8Eo*!unq-s&0lpAO#=1`o5K=m*S% zK9_Yw>uCcIvMlO;MpHR z-;;NWhZ;|9@{Ji@O=QRaSpKRxK3<=)L>L6I+rAnhS4#L4PrfTDZQu@2JflNx$1F84 zt4D}RpOC?rL`2Ur=jtJ;_&&3pjm}mUlH$u|mSouPc7}i3Qz=$OSrZK*6!%d+1SrM9 znx7|&@w|v~OhrF zA}(hfFq2r8`2-%1g0Ir|)MO*KOx7V02}GyM&A`Bfm;Eq`Fap_&O#&CDFX%2`-b}Eh zhXR&E<$+)=q!g4RW*4vqO2=|OAVRHuAixCupU%EJ8m{l{_l!}Zix8b4dW#mFk%SOI zB6=s@4D-*yY3(FS?jDd z%Q^ewDf`*abM}7re&EfP-B(EaNYYJ6t8^BK6>)LIY2O8_g`2H>4PPEe<%CM@y4 zzN$rA^W=_8gOMGZFv5}NfgKAn{9NT>`#g@yXVwLiA|ve;k36MKNy+9Buxa@sY~#9q zHsNbE&(8`C%4UKg)LqAXKn8-8;c{H0PlqioOSI$^ax*374B?Qae$Kbzx{ zMvSA!?u{Nb&73P9Eq|c4nbR4ENt7i<4DK)n*pz+$~BOI zI^@vx?AkrBU^+1U!kY$xYD&Lsv)`gQvwDYVtt~7)BXb=Kq6Jg&1i~esLvc&Yy-}V# zXq|9#g^wX7$moIZznzr#N{8~ySZi9H-Qzz2te<5mPWNO^X}hdlu;L&enT$PLH127o zk^Oymm_AJ73aOAzXPx&NMeGXBskOfO>-!&+g!2+aGZ?N0!M8$qb3O4%M3bKK_WrML zKI*UTqCQeVFEZ#j5YiWOFV+Edk3J3jm@1@af(i`)1DP10Cx=Z?@YRbV{Fk@Kh5-(A(?b%kzu<95Y&#f|dcTXKMXwGlM=AVQoCDwth>qZ}> zcNZvhSDD#XUC-MM{mi^bt9?7U8ip7Gh7unExP@bpor_^({d4KpluK$`3Oe8#DgJxi z8a{j7%Nrsl{y^qv*#lV4ed@YRHOQXqJC^*_c`{-K8R{IOlj^burTmr#Qnk}`x2kq^ zE=M5WhSLZb%PB+$h&xL;P@x9b`f4OF1LUX%qx#AhWXMFx=_BG9D?nS!+^GQ zeu_e5*t<({Ncg7D&YL&wEuIlnKS)P3oOmTvtgilCkCbj8YlqapKDNLZADhCXpZ4VL zfm~{?a73KNhtXFhbn|OoYr^Qpz(<2D0BV;Ls;7Y-z{2|5S{8%$#JQLxYG1Unb2mkl z-HLkO5)!zXym^?bFctgv#>%uk3}=D4xuy_r`9^Jq6AK$ja(y~$7}FuSt%lJ-stBP( z?~xQqRVOxSAI2>S>bnoRGCbiL^=fP1E{{a$P+1ch2^p*Le!6X^DoZAYC8E=fqleCg zBqyHX{pzc44O#Ct>%RU_H zJ)HmQ;q zPdu?5wY~_57xa0VRu)u!_~l#IHV(n^IXQFXnHafA@qc8|9i@ zVeD5USWdaO5Z1hv<{E0!x$~LhhL-gFPj3U*3@enZI!K!3(@r~@&9;`!;}U^%O;q@`rS>!B2w!$W7LKO6?Wm0SQF?p`nuYqt*E8J&uQ`}{Qt zXUd4{r3ZRRH8G^~C3l`sSSpfs3f~VrTbgA+nlN0BAQgcsxRBKJ_u?nH)=K@QoJR+f zVrB?V%_1sf*}V&^^_&szo~aK#)G1yu(?A;V~;5o)1lfAtquq7EB=Y0|@3 za@MDAXL{X6nY8kFCpok9*o31?gaTQ-BFzH@?hy4#;z*1Bn9+>&TPo)fG<^wrRvygTsY6`r82rb43>i>Wa-PVoxWkr(Go&YFT+%!!8K`Z}WWck6 zYP-|;k8t9^sv1U?0?CiT$A9nKR`J|wGGQ;hztFzzrZj6@)$<|2(cRM$fT$@*6QhES zjl$tsF;2gB$x~O|c?FR&clZ=eA|x`_hf5q60aEg`B&Jt|cZv(3I7l=w$ac;MAL4pe25HLzm}!xgNA7n71Fc*#NfNM|Iht3xAjFwT!lU)R{k z*w*foSS{miG13$%Z&{V1^ir~K0Q5hP{eB4&P+e8Ryh*4PXRrw;%V1JHswQRjq6(Y7p~zHI zSL5-A-M-OUhaDrnONfz!9m$LQ8GuHAjX{hY09KlA&c-z*a=k*Kd>BXha_E#w)cc>c^;Xnu!X>GD|))@*Q0g zG$)#k2BLv}N9K}UdgHCRWC@peQVvxuhzFG$CI(>h@0X(sP)-%l{aQ9|K?40H{pR? z#K20!6Y=XwnZ`v5hWL*rI3Kr=MNxE|<5Nw+*SYsd(LY?n#Kzt4gW0gV9dXm^dfjb> z%q>sH>E0|r!*>O(Sxe?2fw>8Ttd`QmwGpJUW!=vpR=}x3VH=8f@vq8W;BdU?EM{SJ zC?}p!^knk*ffGsxQPlX#BQFA%%geZQbkbg;3+7nHo z?oe5mF4M55H~#^|-a+dx&Ln)>~c_$he5G zO7yHZX56PjadltoEz=e=VrJN{MnqpYg!<=+xHIf4?uDjxQA#OUKg*!IcT8eNOWel~ zO8h@x-20D&HXdAfD@cfkY0qSqDp#!DPl%EHwiaH9KH&>lnOsz0zp+3Nt<-O3f8?Ir zWYRceJ|$I=-$QHuW{qmwEI!Eb*YCUSf;3Uj`N&TjuByE*bX`;Y@DlSUYGLRWnj{ytf|_9-T|&g6QV=9phIu6wnc`OeHd;e<0nkhpao?VNruG^o?a zy?m*o`pq?aDoGfM4jg@BEvPl2j!cWChzIA;;d5Z6@FvpONW?au78E4Ys{u<+eFZa&SK3$Q*~~g0mYP7e6lB7*Y{MB*9RbChl(z zGoSHZ`MWzgKJ&|>``5GYhJxC6gACC|cag9*z)lV1LfDn9+|QYns-IFbciXk`K7ROy z0eD>dSJP}8&_ok56#cx7{cM`!IOrWT%j%Q&ZSvctpU247K;8X^q81l z=^DEcr3(>Q@|M(h)aW+XE{7DwBo-{C0yrPKuA65hDuGx)^_Ip#L9wyF{rL2Py-Pzu z))qszyCnr`pn2b)X{SZPfBFdBc>N6a?p&8^OD<=H2#p|N*_QP{1e5&j98 zPbC=!Ca<$CTh$oBSV2ShqZ!E6l^P*4EOF`Fv#;>lUw8@>pYr41YFi9fm@(^Q#6eN4 zgSZbXIy22~RXZwaAc10Z|V)7K)D+mq`y9e%&t4t8gO)8(dP4MNM4=rsIM z%#s{^*AQI|hmKZo*)hIMFT+L%+7IrcTE3h478)(OA_Y*hkz13C7@ zzHbU7j=lRpHx&vykt(^W*ngcuwH|Fr+hIvA?+yo&SkbfAkrlLLNP5J!j&=8FIKxa` zrASQ7bE7YkoY0NY>g2-bP%u@Sd;A5A2pyq7E#34;0NwE|a^&6~jQged@BupSS=nG_ ze&-`L$goRHmlaC4?ahn(qAFZY3!d^pRie!nYc(a|n&Hj0S8&C>mfWD&%iIlvG#lJg29g22FT?cUyeV1_}Pmh2sX?*9L0K}N>td<$pJA8UThNGB| z0yJnKG1Xja`S^ zc!5E=`i_8NwJjdf)_(c@y}#?HcQG~aQd+P8otwW@_7l{ zJrJ594;pU{qG#cTFydU~ed;So_W7hz2tU$oYYYQb2C_+sR-oK1KKZ{_WR5+i>yt_M=8~|0>^B3e*CNk9#hnGvQ0AIKtxdJ0)~alO;VW{RP2cg^O@g6=DZzB{@|-zbD~QFd1zX|vFR2P=q$5591 zHMlaHho=@*?ZWw-)Mvkp=i?m#R!V%%`_mgXGjyNH?krj@{@^9KuX`-lWw`PE?-N_@ z_qc0gqCQ$Pe~X8ohAp3t$X;%I2f^B^$r_c^3et1!u$ z-2qjJR$cMPP~Y6x$gKkdhGAnss8eLf{9u;}Unb!|K?NxRmQuw+Mrd9*fu$RyeXCNU z?+gsJHYPBKRZ$+CSf8N7176!+z|ewjooN2T&r+B@wd6`e1f}Zjh_s$`mJ}l(Mc>8uFjVU+r-qDaT`oCz);+0 z@|@FD%cS6Gy7v39g9*dMrT3B9vPQ4-nBN-_nBsmWPD;$~Yxm13nOmbhExAchxqGSj zNfvZnC_1!RmnYmLo*7z*RU2Rqyo2VY{V(SKL}__+KbA!(O_uSa{*X5f`u-tn3-L2V zle`i+@>aEM)>b0Now@uf&yMoea%THowI8XO5m~?;n%{r3Ilj6AN*OhxSaRq+!Wgee z_$TE{=m);{l^?p}$5FWZ1L~y=gi7YH5O40L@Sn6$FYuRCd-OkIZDfcwnfvJw2T7IA z+^nG_rS)2@-IDFvU1{QYb)7yiQD}=m;#=~JZ>`sFWr8BUwZpQn^pi%7l=-4Y!ScRT zt9-63v+?bdtHubK4GK+akOFE$8}%vXj`BDw4ENPBC}3$?8*^nsi{+fT8kd4+$!kX@ z`x-t`gNm?YVnU5Q427)uaA5qHtG{1zc!1tRP~#@zlnimkJH;9AhL0qi@2sC=4*Lj0 zn{{7O?FLz$JwDF-Qg7Cla0(&~7(|)WnscbAk&kNrO#=Pz!wt@J)}&iz8Ep<#Ue z01;8?RM2I$O9osGoM6qV;(AR8gSYLcAw<9wxLvO8y)wS{Pc)bounWydK$P`+WhE0t znRR!R9R0FO?N#o!EyDYUX+PYIOhXK;k^0Myk`PR~&d6sdQLf>3fasMmBEb9bR4-DkcvvP zK%V?tuC$w80SK*y=%HKak3VGw@=y7X7n%c)$O!Tx)JQT76>zyvF%=1Okhq0B{`N^x z;f~l4oaoat?tvq#c`)C|sDrvsd8Z10iVXCfTMMySJVz)*bhhp|LRoJ~%SM)A){X|Z z;6E8&m`A<3WVJo(9OE$BU}%=(pV?m zcCgf`h3GUOq3TC^q!q$EOu9Il^keabSCDsXh>zl%0>^Au|BZPU zq#zj*>-ba>qsLr582NiEzGG zPv-)@Q4@Y>YjM7Je2K_YwE8KNm$OVCL9fMIlqNS!O;B#0p5vX`Jys6Q_y(qGr;njS zHL9T%T(jeRr4h1r^PieWroy_NoI;mO{H#K_0BJ5?jg^A326EzGOo>bN?Qe+APbOFX z?s<2!#2H~mi%AvVn=x#_v;`MO`pP}&k#~HyIUDAFjzA|96dwKZ=UQTB7@%ynq~=x{ zoI3z75{Rq@P^h2%L73)-1j1Li2K`6-u;G_T`j>*>nI%y|l~m}87t(Ycf(LT#Yp)4c z)`srzA-<(~tCPF7Y9hUK{tES`rjwFpt`F`?1JBMwv_Q@UD2{L7Zd%+zO?c{?{~(1O zVAu>XnfF*`met(V-|DupOmi@-S8Is}lrlaWdN&4TIu2Dx&rO8s;QfJ%f}j~`EVt#@ zbd5#uy^J&H-LdGr-_KBZ0U}q8tfpzpBON0ls>-RJ|3NHhb;vFI?>+AlfjI+?J4bD% zuzEd=L}YGmt6b)1CMfILw6j>yWmJps2=dYl{~1$u97rvLUkmPncLzc#SK$#6S*T}M zn|iYugG_~4_*P~qzz3vl&xi=z1PT))0J%uG-WypWksc=n3Le=O8{8Rx4gkpmz6%9W<62{Gt!yU#}Lv+YOXAK+7rb=1V1 zOVCv`@>2f>GkWrOGZZ|vb?_0g;FR3O6Up0DAvvnJq9PNR%X{t4LW z`DA|>ro2MEUxP72hb-&?b~;+)co4OIywHN{l=w6{`0ed*O~)K%oQ1Wn8@2D#B9}vV zaQKZ!K=XdLox2d1`?TZQ-y$ET=P#-{&-v>U#$<(;7b zpmD#rbvT0{$VRS;MG~%R2}JP+hRMY5{ z&9uZjhb?d_87^&6AlcoIjDcKE7x)!VG7Sdk?ctnEB<}^}w`BMd%VKbFvL;S=j6L$j0MD;)%`5g01LjFWP#+y81-ESFGL=LGbDH>!n$pOO$ zAeHW>r&^~@=3WJ%O(>f4FV-fW3@)FR($)x?8x55RJ)fG2We@yOBn-A4+XFMrRuy^I}L=^IRf=K9Ne zV90X>90iJh6f^e<)5~*0+|zLh@^`wq`N;Xp8;||diUji=k~QTZi~+(e2b*l-E!82; zP;F1M1+(gvH}&LbVUo`*5mphG?%5e%k;&YwSTQdqC`NM44YY2~etdi?PI`U;^3_hy zHIQdrkE3|)Wg9zwK6lEHsP`|d0beLM_N=p`<$LlQw6v7NFJOd0CHsTW2vjF#%=2F7_whykNe4rlSV4y zA~uBiE)M5wL3?nC4n+@rv6M_dnl*jc*FXsy~x1@ZsGbP+! zc==_MLZM=rB*^)Rg%0*;$p9RScYmlLyN3Fz5hOdYp)E9=717j|(_f92mV@65?XbYL z`2M+)^R|ReHCo!mBs=}NbR=>^-;z}Ec&VX%K9m)|t}Z5RfN8F$B0?8FIWbnaWF|WW zADW$x_H7p|^5$W!nZL|PvaQUfZAEyy}hXnzf(B_Uww~0AiaAJKS4fU$B@P z&oAqDb)XUT<3wJG444zvq5dzX(t$SS;cnHiJO51F`Z$@}nZn@Xee&4F8_$({YB1(J zape)}jPSL!xXs;8R(M7sX2tvY;1eO9U*?q?N#7d(MHOJz3gth%i3xvKo|Di2 z`sW$P74B^DO?Vq${4IGy`L0#1wZXn#mn7$N-wt0Kz0E<&2q(MY%RZCv>4;A-6>N4a zJjn9kzpW;FJF%8;2lleH@w||>xn|1iDL2@lGw~3&FgjjCyC%^o_~(V%s(;qkpdrjD z2f_32@&oXc8p(4*tIBc%Sw1#N_hani(94G(nfms#wdcs8S#Ge|Ct22t&@xk&SE8;p zyG!f7dMW&-o7}JZ&q8lw00-u1X-4FQQY6;?iB*zz9%GwkzOjU`PHfxL6*{6Wq8S~u zuFV%_bJ(H*p!@4*W?X8t)W3^Wmi!(&ge1xa8h7MJlQ)9(=-N!dW?{-O2FNFL3y-Atm5`JUg-sGxa^wOBSlf)JURQ zM_(k|MuMvfLnMv4uo3i)){QjrxX=D9#onfO=T7!^Af75U5%lGe8C9TDhpx>Qv;$JS z_SfOE(bBYpGH99kjyNYrDID`H;|zhF;AOND;NtBYX87z=srTu-?~-$RUgR8s-#ujh zNI8K*(MGxZ_RnNS&Y=e}25`IQ;cF^&JMxd|&^M50e5-(lU6c30PE+TVEPI*Cg5PHE ztvZH1_$1~Y#CL~vc4O=ZJOld?NoeENFG?^3U7G?J1LZKkrlh~V-XDBVzl&mB)=*e+y{O%hHuQ?_F|#{ znDHD0y6F4k?1Z}%^&y=%Dg6EW2TQI48Y5yMtRtQ>DtA6(Du5Y^9r5&Ex?z``!J;VX z8;mce+h&tyxS|P^cQ2{Cfc12$1d3y`Csu>+{4^v*%QUO$>1p%P4dN_}v)8TVN_HBAXNAUc{!we zs(r$Evm-;)w6}`~{9-W1&ptKq*KIr+pAej3E)3CjZ}s)-Fr;gf19@b24G7feSK8@R zM2|!Yz-;s4YWLqSY~dtJwRn{wG%9QYCvG0EA0#>_)t>vy4M>et*Cvjxu~`>mVV^7n zDD8NlM{9p*8>SiBjOp40K%Muo@q`{k=ucUwEpp3?1DaWSYb7_r(7Mgj&UXEwGbusZ zl*(h|irO_37S)KQX@eT9EF`WS7&;&HX25F>Xy8D0W8!R z#X&Ynyv~CKd#(ick0zisvis8$vB6Omq(JjZQE{)dR5{OIPQ8zq3W}UbpkrBXDhxO; z3zciL#Ur`ho`~RV4bw^1*%X;OS~0Qwr+@q#Wnjb|h9Ez-Ca>ebzt({5h=NGNrQgxD zI`WOEhs`rcNC4*mTEKDy9tClcH0H;S9K#s1tqSqXPK~s@)_na4^e4yRG%zyvbK_@O z(_B|-XWJdEl3jb6j-JsLe4Egs1M(Dx6vGOG&GEMxOH>1<8q_7bRfhd3!-T*bRDcet zY6VFJPr#DinY&Ym8E=jB&xBUU2l;n>5r7K3CM#wdTvCz29W7HawEjoeyiL#N_IBFq z#OZHaJM%=8@~YnWxA|#|I7fT?RU$dSFAKSo*?oyYG(PaCYd_Va4ABDNKM!Pdm>Ne%r;fUg?Un5$`-y7_GcN{3gUSi^1je{Mp^O*9}a1btU zBDP`Q+)AcL10wdSUVnQw87d)lCF0`g*hoz?8{Lc6gS0ff?9@tNYu%6FO!qutQ5SHW zUR6coa#;1FeEg^k-c1{CA#bhE0sZjyh>VzEdzVw=Ffl!j;s%@d~|4K7`fBpN55ZEwAiOUFe24qRBrRgp~Ow!;^DTT8TJIJ zstPa$fYQqoskm%ox+P(t594A=*Cun4zW$B_`zZBM-}$hX<9u~Vt>4o&OF8!_dRqcZ z=!hx9PV1`Bvi}FzFQsJ2GKxP-E&l?{2M^gD4v`|nCfxd*A04sPxl{Lk_)!^?bCZ;a>7S-iU zM_?T9M;d00;H(b4*?WG89hQd495rm6_~G+6@--=O;}}{>9Il9}i*Ist^WPVjE^Epi znCtdltdI(yxWAdUCVxRK{NoZiCGG$tL(w=-p6S(0^5?31MwFj3wyzb)Kd{>Ur8FK@}6y;fmcY;4if(YOCWziClqJ>;-E+X>&OrF?W>EqeB` zDR<+PSKiHQ_iETlAsEUOcRS+Q*Ptdh*1f*ysu$B6{db&daFemV;U&*e^YBpKe%s@WD=Yf8t%Z=UOgtB+|Oj6Wc~-KJd4ddnAV)aLvCfMse031=Zw0qNu&>s?W*Iz zu6yR<4W3*@t?Gw)jT*Yf(I=tEVRoc|;`Bo>i588347V=p;5_-v{uU`qe%oW$peKGD z)^P-1eC@*Q&Q59xh%MJ8D6Q>ATbfQjM*a8yosH&&=e9iRY#LGupm`bE>bElF0%%DZ z+!EXW^)Ih45*@&Gn;ck*K`qX&U66S#yKFn(C0qQ*dSs zcZDc%O}-q+4(}?{j`QEI7r8jK^KBSt&K1CY7>oJyJj7VW+pT9 zSrt5Np@fgn>ZkNwzApEt!}D8uUY6fa8r9nZkRSO>X2`j*h0cxU?H?{U`=S_Sc8VEx zJCK6MgqbiMed3n!u6D@!<%&$x3HBt61Xwi+Sv87*E3dzfg?p{?oivE!IK5>1sLScX1IM8??Yf(VI zgNJQ$`L=dmxgDk4sz(qQS?Nrp`ifSYs_s0}@_ZD-BYvn>fSl*E@N`iM5G?8e8Z%$w zYZO~=Mrbx&m&F;Q)!$Ss7&VfAzAnWwRzg$DK6N3RE@C~_wT;!G)#cYrXZ<iqN5Ifd`0M>*+b=257D{CSgP5b1wi)J*$)Bfmb(O z$bcvnnW5EVMHs;E@3`c{08nI1epuiJ@+Wvl`R;4pzW~&_nayr8uC^|P3{8;(mDZ`= zv$>)FFdo?rQSt!hHU0JC8c#y5KmZe3n+i?FPFghjfBiUhUSaSAVj}^{TOSx{R1pVx zbtb;1yz5@n@^Azi^Z&lPD)D~X=Tw302j3V;;PRxO + [Значения параметров по + умолчанию](https://www.php.net/manual/ru/functions.arguments.php#functions.arguments.default) +definitions: + - name: Параметр по умолчанию + description: необязательный параметр функции. diff --git a/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php b/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php index 959e513b..adaf1c55 100644 --- a/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php +++ b/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - $expected = "First: N\nLast: t"; + $expected = "First: H\nLast: !"; $this->expectOutputString($expected); require 'index.php'; } diff --git a/modules/35-calling-functions/150-calling-functions-expression/index.php b/modules/35-calling-functions/150-calling-functions-expression/index.php index 811c0cdc..440a29fc 100644 --- a/modules/35-calling-functions/150-calling-functions-expression/index.php +++ b/modules/35-calling-functions/150-calling-functions-expression/index.php @@ -1,6 +1,6 @@ 150 ``` -Особенность выражений в том, что они возвращают результат, который можно, например, присвоить переменной или вывести на экран. Например: +В программировании для этого используется понятие **выражение**. Оно обозначает конструкцию, которая вычисляется и дает результат. В примере выше `$rate * $hours + 100` является выражением, составленным из переменных (`$rate`, `$hours`), числового литерала (`100`) и арифметических операций. Все вместе оно возвращает результат, который можно сохранить в переменную или использовать дальше. + +Что нам дает это знание? Мы понимаем, что выражения можно комбинировать бесконечно, постепенно усложняя логику. Каждое новое выражение становится частью большего: ```php 150 + +// Можно комбинировать еще сложнее +$rate = 10; +$hours = 15; +$bonus = 50; +print_r($rate * $hours + $bonus); // => 200 ``` -В этом коде нет нового синтаксиса. Мы только соединили уже известные части, опираясь на их природу. Можно пойти еще дальше: +Функция `print_r()` просто получает готовое значение и выводит его на экран. Способ получения этого значения функции безразличен. Именно поэтому вызовы функций отлично сочетаются с любыми выражениями. + +## Вызов функции внутри функции + +Так как вызов функции сам по себе является выражением, его результат можно сразу передавать другой функции. Это позволяет строить еще более сложные конструкции. ```php 2 +$name = 'python'; + +// Вызов strlen($name) возвращает 6 +// Этот результат сразу используется как аргумент print_r() +print_r(strlen($name)); // => 6 +``` + +Здесь `strlen($name)` вычисляется первым и возвращает число 6. Затем это значение подставляется в вызов `print_r()`. Такая комбинация может быть сколько угодно глубокой. Результат одной функции можно передать в другую, потом в следующую. + +Чтобы правильно читать такие конструкции, нужно помнить про порядок вызова. + +1. Сначала выполняется функция, которая находится «внутри», в нашем случае `strlen($name)`. +2. Затем ее результат подставляется на место вызова. +3. После этого выполняется внешняя функция, в данном случае `print_r()`. + +Таким образом, код `print_r(strlen($name))` можно мысленно разложить так: + +```text +print_r(strlen('python')) + +Шаг 1: strlen('python') → 6 +Шаг 2: print_r(6) → выводит 6 ``` -Все это справедливо для любых функций, например, строковых: +1. `strlen($name)` → `6` +2. `print_r(6)` +3. На экране появляется `6`. + +Этот принцип работает всегда. Сначала вычисляются вложенные вызовы, потом внешний. + +## Использование функций в составе выражений + +Функции возвращают значения, а значит их вызовы можно использовать как аргументы других функций и как часть любых других выражений. ```php Имя пользователя: Toto +$name = 'python'; + +// Вызов strlen($name) возвращает 6 +// Мы вычитаем 1, чтобы получить индекс последнего символа +$lastIndex = strlen($name) - 1; +print_r($lastIndex); // => 5 + +// Можно использовать результат функции в арифметике +$text = 'hexlet'; +$double = strlen($text) * 2; +print_r($double); // => 12 ``` + +Здесь вызовы `strlen($name)` и `strlen($text)` являются полноценными выражениями. Они возвращают значения, которые можно комбинировать с числами, переменными и другими операциями. diff --git a/modules/35-calling-functions/150-calling-functions-expression/ru/data.yml b/modules/35-calling-functions/150-calling-functions-expression/ru/data.yml index d587eabd..46ef8cf7 100644 --- a/modules/35-calling-functions/150-calling-functions-expression/ru/data.yml +++ b/modules/35-calling-functions/150-calling-functions-expression/ru/data.yml @@ -1,2 +1,7 @@ --- name: Вызов функции — выражение +definitions: + - name: Выражение + description: > + последовательность действий над данными, приводящая к какому-то результату, + который можно использовать. diff --git a/modules/35-calling-functions/180-variadic-arguments/Makefile b/modules/35-calling-functions/180-variadic-arguments/Makefile deleted file mode 100644 index d0d0a48c..00000000 --- a/modules/35-calling-functions/180-variadic-arguments/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -test: - @ test.sh diff --git a/modules/35-calling-functions/180-variadic-arguments/ru/EXERCISE.md b/modules/35-calling-functions/180-variadic-arguments/ru/EXERCISE.md deleted file mode 100644 index 92bfe495..00000000 --- a/modules/35-calling-functions/180-variadic-arguments/ru/EXERCISE.md +++ /dev/null @@ -1 +0,0 @@ -Посчитайте программно (а не в голове) минимальное число среди 3, 10, 22, -3, 0 — и выведите его на экран. Воспользуйтесь функцией `min()`, которая работает аналогично `max()`. diff --git a/modules/35-calling-functions/180-variadic-arguments/ru/README.md b/modules/35-calling-functions/180-variadic-arguments/ru/README.md deleted file mode 100644 index 948a5016..00000000 --- a/modules/35-calling-functions/180-variadic-arguments/ru/README.md +++ /dev/null @@ -1,16 +0,0 @@ -В этом уроке разберем одну особенность некоторых функций. Они могут принимать переменное число параметров. Но речь идет не о значениях по умолчанию. Посмотрим на этот пример: - -```php -expectOutputString($expected); require 'index.php'; } diff --git a/modules/35-calling-functions/180-variadic-arguments/description.es.yml b/modules/35-calling-functions/180-variadic-parameters/description.es.yml similarity index 100% rename from modules/35-calling-functions/180-variadic-arguments/description.es.yml rename to modules/35-calling-functions/180-variadic-parameters/description.es.yml diff --git a/modules/35-calling-functions/180-variadic-arguments/en/EXERCISE.md b/modules/35-calling-functions/180-variadic-parameters/en/EXERCISE.md similarity index 100% rename from modules/35-calling-functions/180-variadic-arguments/en/EXERCISE.md rename to modules/35-calling-functions/180-variadic-parameters/en/EXERCISE.md diff --git a/modules/35-calling-functions/180-variadic-arguments/en/README.md b/modules/35-calling-functions/180-variadic-parameters/en/README.md similarity index 100% rename from modules/35-calling-functions/180-variadic-arguments/en/README.md rename to modules/35-calling-functions/180-variadic-parameters/en/README.md diff --git a/modules/35-calling-functions/180-variadic-arguments/en/data.yml b/modules/35-calling-functions/180-variadic-parameters/en/data.yml similarity index 100% rename from modules/35-calling-functions/180-variadic-arguments/en/data.yml rename to modules/35-calling-functions/180-variadic-parameters/en/data.yml diff --git a/modules/35-calling-functions/180-variadic-arguments/es/EXERCISE.md b/modules/35-calling-functions/180-variadic-parameters/es/EXERCISE.md similarity index 100% rename from modules/35-calling-functions/180-variadic-arguments/es/EXERCISE.md rename to modules/35-calling-functions/180-variadic-parameters/es/EXERCISE.md diff --git a/modules/35-calling-functions/180-variadic-arguments/es/README.md b/modules/35-calling-functions/180-variadic-parameters/es/README.md similarity index 100% rename from modules/35-calling-functions/180-variadic-arguments/es/README.md rename to modules/35-calling-functions/180-variadic-parameters/es/README.md diff --git a/modules/35-calling-functions/180-variadic-arguments/es/data.yml b/modules/35-calling-functions/180-variadic-parameters/es/data.yml similarity index 100% rename from modules/35-calling-functions/180-variadic-arguments/es/data.yml rename to modules/35-calling-functions/180-variadic-parameters/es/data.yml diff --git a/modules/35-calling-functions/180-variadic-arguments/index.php b/modules/35-calling-functions/180-variadic-parameters/index.php similarity index 100% rename from modules/35-calling-functions/180-variadic-arguments/index.php rename to modules/35-calling-functions/180-variadic-parameters/index.php diff --git a/modules/35-calling-functions/180-variadic-parameters/ru/EXERCISE.md b/modules/35-calling-functions/180-variadic-parameters/ru/EXERCISE.md new file mode 100644 index 00000000..f8343173 --- /dev/null +++ b/modules/35-calling-functions/180-variadic-parameters/ru/EXERCISE.md @@ -0,0 +1 @@ +За неделю были зафиксированы такие температуры воздуха: 3, 10, 22, -3, 0 градусов. Найдите минимальное значение с помощью функции `min()` и выведите его на экран. diff --git a/modules/35-calling-functions/180-variadic-parameters/ru/README.md b/modules/35-calling-functions/180-variadic-parameters/ru/README.md new file mode 100644 index 00000000..58dce7cc --- /dev/null +++ b/modules/35-calling-functions/180-variadic-parameters/ru/README.md @@ -0,0 +1,41 @@ +Некоторые функции обладают особенностью: они принимают переменное число аргументов. Это не связано со значениями по умолчанию, как в случае с `round()`. Речь идет о том, что количество передаваемых данных не ограничено фиксированным числом. + +Рассмотрим функцию `max()`. Она находит наибольшее значение из переданных данных. + +```php + 10 +print_r(max(1, -3, 2, 3, 2)); // => 3 +``` + +Откроем [документацию](https://www.php.net/manual/ru/function.max.php) и посмотрим на сигнатуру `max()`: + +```php +max(mixed $value, mixed ...$values): mixed +``` + +Это значит: + +- функция требует как минимум одно значение (`$value`); +- дальше можно передавать еще сколько угодно значений (`...$values`) — переменное число аргументов обозначается многоточием `...`; +- функция вернет наибольшее из переданных. + +Тип `mixed` в сигнатуре означает «любой тип»: функция умеет сравнивать не только числа, но и другие значения. + +Если среди аргументов есть несколько одинаковых максимальных значений, возвращается первый из них. + +```php + 5 +``` + +Аналогично работает функция `min()`, только она ищет наименьшее значение: + +```php + 1 +print_r(min(1, -3, 2, 3, 2)); // => -3 +``` diff --git a/modules/35-calling-functions/180-variadic-parameters/ru/data.yml b/modules/35-calling-functions/180-variadic-parameters/ru/data.yml new file mode 100644 index 00000000..70466495 --- /dev/null +++ b/modules/35-calling-functions/180-variadic-parameters/ru/data.yml @@ -0,0 +1,9 @@ +--- +name: Функции с переменным числом параметров +tips: + - > + [Пример функции с переменным числом + параметров](https://www.php.net/manual/ru/function.max.php) +definitions: + - name: Аргумент по умолчанию + description: необязательный аргумент функции. diff --git a/modules/35-calling-functions/270-deterministic/SolutionTest.php b/modules/35-calling-functions/270-deterministic/SolutionTest.php index 6daa6fe6..571f06eb 100644 --- a/modules/35-calling-functions/270-deterministic/SolutionTest.php +++ b/modules/35-calling-functions/270-deterministic/SolutionTest.php @@ -1,6 +1,6 @@ getActualOutputForAssertion(); + $randomRoll = $this->getActualOutputForAssertion(); $this->assertThat( - $randomSide, + $randomRoll, $this->logicalAnd( - $this->greaterThanOrEqual(1), - $this->lessThanOrEqual(6) + $this->greaterThanOrEqual(0), + $this->lessThanOrEqual(10) ) ); } diff --git a/modules/35-calling-functions/270-deterministic/index.php b/modules/35-calling-functions/270-deterministic/index.php index 7176b646..ff3027d2 100644 --- a/modules/35-calling-functions/270-deterministic/index.php +++ b/modules/35-calling-functions/270-deterministic/index.php @@ -1,5 +1,5 @@ 2*e3X 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 literal 0 HcmV?d00001 diff --git a/modules/35-calling-functions/270-deterministic/ru/data.yml b/modules/35-calling-functions/270-deterministic/ru/data.yml index 3f4b91c4..1e05afaf 100644 --- a/modules/35-calling-functions/270-deterministic/ru/data.yml +++ b/modules/35-calling-functions/270-deterministic/ru/data.yml @@ -4,3 +4,8 @@ tips: - > [Детерминированные функции](https://ru.wikipedia.org/wiki/Чистота_функции#Детерминированность_функции) +definitions: + - name: Побочный эффект + description: >- + действие, которое изменяет внешнее окружение (среду выполнения). Например, + вывод на экран или отправка письма. From ecb8e21c47e13d9d93ce024df4c7175f9c8d54ea Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 5 Jun 2026 22:12:43 +0500 Subject: [PATCH 08/29] =?UTF-8?q?feat(40-define-functions):=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20?= =?UTF-8?q?Python=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rename 100-define → 100-define-function (namespace DefineFunction), задание sayHello по Python - 200-return: паритет теории с Python 150-return (методы заменены функциями PHP), задание truncate из удалённого 300-parameters - delete 300-parameters (тема покрыта 340 и теорией define) - add 250-named-arguments: именованные аргументы PHP 8, задание trimAndRepeat - add 300-type-annotations: объявления типов PHP, тест через Reflection - add 350-modules: адаптация под require/include, задание amountPerPerson на ceil() - add 400-packages: адаптация под Composer/Packagist, задание generatePin на rand()+srand - 340-default-parameters: паритет теории, namespace DefaultParameters, тест выровнен с Python - новые уроки: RU полноценно, en/es — краткая выжимка + es-дубль description.es.yml - удалены неиспользуемые ассеты func_arg.png, func_return.png Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Makefile | 0 .../SolutionTest.php | 6 +- .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../index.php | 6 +- .../100-define-function/ru/EXERCISE.md | 9 ++ .../100-define-function/ru/README.md | 127 +++++++++++++++++ .../ru/data.yml | 2 +- .../100-define/assets/func_arg.png | Bin 174919 -> 0 bytes .../100-define/ru/EXERCISE.md | 9 -- .../100-define/ru/README.md | 68 --------- .../200-return/SolutionTest.php | 4 +- .../40-define-functions/200-return/index.php | 6 +- .../200-return/ru/EXERCISE.md | 30 +++- .../200-return/ru/README.md | 130 ++++++++++-------- .../200-return/ru/data.yml | 4 +- .../Makefile | 0 .../250-named-arguments/SolutionTest.php | 18 +++ .../250-named-arguments/description.es.yml | 50 +++++++ .../250-named-arguments/en/EXERCISE.md | 15 ++ .../250-named-arguments/en/README.md | 24 ++++ .../250-named-arguments/en/data.yml | 6 + .../250-named-arguments/es/EXERCISE.md | 15 ++ .../250-named-arguments/es/README.md | 24 ++++ .../250-named-arguments/es/data.yml | 6 + .../250-named-arguments/index.php | 10 ++ .../250-named-arguments/ru/EXERCISE.md | 24 ++++ .../250-named-arguments/ru/README.md | 84 +++++++++++ .../250-named-arguments/ru/data.yml | 6 + .../300-parameters/SolutionTest.php | 16 --- .../300-parameters/description.es.yml | 111 --------------- .../300-parameters/en/EXERCISE.md | 32 ----- .../300-parameters/en/README.md | 73 ---------- .../300-parameters/en/data.yml | 2 - .../300-parameters/es/EXERCISE.md | 31 ----- .../300-parameters/es/README.md | 77 ----------- .../300-parameters/es/data.yml | 2 - .../300-parameters/index.php | 12 -- .../300-parameters/ru/EXERCISE.md | 31 ----- .../300-parameters/ru/README.md | 77 ----------- .../300-parameters/ru/data.yml | 2 - .../300-type-annotations/Makefile | 2 + .../300-type-annotations/SolutionTest.php | 25 ++++ .../300-type-annotations/description.es.yml | 54 ++++++++ .../300-type-annotations/en/EXERCISE.md | 16 +++ .../300-type-annotations/en/README.md | 27 ++++ .../300-type-annotations/en/data.yml | 6 + .../300-type-annotations/es/EXERCISE.md | 16 +++ .../300-type-annotations/es/README.md | 27 ++++ .../300-type-annotations/es/data.yml | 6 + .../300-type-annotations/index.php | 10 ++ .../300-type-annotations/ru/EXERCISE.md | 21 +++ .../300-type-annotations/ru/README.md | 115 ++++++++++++++++ .../300-type-annotations/ru/data.yml | 6 + .../340-default-parameters/SolutionTest.php | 12 +- .../340-default-parameters/index.php | 2 +- .../340-default-parameters/ru/EXERCISE.md | 17 ++- .../340-default-parameters/ru/README.md | 69 ++++++++-- .../40-define-functions/350-modules/Makefile | 2 + .../350-modules/SolutionTest.php | 18 +++ .../350-modules/description.es.yml | 55 ++++++++ .../350-modules/en/EXERCISE.md | 18 +++ .../350-modules/en/README.md | 25 ++++ .../350-modules/en/data.yml | 7 + .../350-modules/es/EXERCISE.md | 18 +++ .../350-modules/es/README.md | 25 ++++ .../350-modules/es/data.yml | 7 + .../40-define-functions/350-modules/index.php | 11 ++ .../350-modules/ru/EXERCISE.md | 18 +++ .../350-modules/ru/README.md | 88 ++++++++++++ .../350-modules/ru/data.yml | 7 + .../40-define-functions/400-packages/Makefile | 2 + .../400-packages/SolutionTest.php | 27 ++++ .../400-packages/description.es.yml | 49 +++++++ .../400-packages/en/EXERCISE.md | 16 +++ .../400-packages/en/README.md | 21 +++ .../400-packages/en/data.yml | 7 + .../400-packages/es/EXERCISE.md | 16 +++ .../400-packages/es/README.md | 21 +++ .../400-packages/es/data.yml | 7 + .../400-packages/index.php | 14 ++ .../400-packages/ru/EXERCISE.md | 16 +++ .../400-packages/ru/README.md | 48 +++++++ .../400-packages/ru/data.yml | 7 + 89 files changed, 1486 insertions(+), 644 deletions(-) rename modules/40-define-functions/{100-define => 100-define-function}/Makefile (100%) rename modules/40-define-functions/{100-define => 100-define-function}/SolutionTest.php (63%) rename modules/40-define-functions/{100-define => 100-define-function}/description.es.yml (100%) rename modules/40-define-functions/{100-define => 100-define-function}/en/EXERCISE.md (100%) rename modules/40-define-functions/{100-define => 100-define-function}/en/README.md (100%) rename modules/40-define-functions/{100-define => 100-define-function}/en/data.yml (100%) rename modules/40-define-functions/{100-define => 100-define-function}/es/EXERCISE.md (100%) rename modules/40-define-functions/{100-define => 100-define-function}/es/README.md (100%) rename modules/40-define-functions/{100-define => 100-define-function}/es/data.yml (100%) rename modules/40-define-functions/{100-define => 100-define-function}/index.php (60%) create mode 100644 modules/40-define-functions/100-define-function/ru/EXERCISE.md create mode 100644 modules/40-define-functions/100-define-function/ru/README.md rename modules/40-define-functions/{100-define => 100-define-function}/ru/data.yml (61%) delete mode 100644 modules/40-define-functions/100-define/assets/func_arg.png delete mode 100644 modules/40-define-functions/100-define/ru/EXERCISE.md delete mode 100644 modules/40-define-functions/100-define/ru/README.md rename modules/40-define-functions/{300-parameters => 250-named-arguments}/Makefile (100%) create mode 100644 modules/40-define-functions/250-named-arguments/SolutionTest.php create mode 100644 modules/40-define-functions/250-named-arguments/description.es.yml create mode 100644 modules/40-define-functions/250-named-arguments/en/EXERCISE.md create mode 100644 modules/40-define-functions/250-named-arguments/en/README.md create mode 100644 modules/40-define-functions/250-named-arguments/en/data.yml create mode 100644 modules/40-define-functions/250-named-arguments/es/EXERCISE.md create mode 100644 modules/40-define-functions/250-named-arguments/es/README.md create mode 100644 modules/40-define-functions/250-named-arguments/es/data.yml create mode 100644 modules/40-define-functions/250-named-arguments/index.php create mode 100644 modules/40-define-functions/250-named-arguments/ru/EXERCISE.md create mode 100644 modules/40-define-functions/250-named-arguments/ru/README.md create mode 100644 modules/40-define-functions/250-named-arguments/ru/data.yml delete mode 100644 modules/40-define-functions/300-parameters/SolutionTest.php delete mode 100644 modules/40-define-functions/300-parameters/description.es.yml delete mode 100644 modules/40-define-functions/300-parameters/en/EXERCISE.md delete mode 100644 modules/40-define-functions/300-parameters/en/README.md delete mode 100644 modules/40-define-functions/300-parameters/en/data.yml delete mode 100644 modules/40-define-functions/300-parameters/es/EXERCISE.md delete mode 100644 modules/40-define-functions/300-parameters/es/README.md delete mode 100644 modules/40-define-functions/300-parameters/es/data.yml delete mode 100644 modules/40-define-functions/300-parameters/index.php delete mode 100644 modules/40-define-functions/300-parameters/ru/EXERCISE.md delete mode 100644 modules/40-define-functions/300-parameters/ru/README.md delete mode 100644 modules/40-define-functions/300-parameters/ru/data.yml create mode 100644 modules/40-define-functions/300-type-annotations/Makefile create mode 100644 modules/40-define-functions/300-type-annotations/SolutionTest.php create mode 100644 modules/40-define-functions/300-type-annotations/description.es.yml create mode 100644 modules/40-define-functions/300-type-annotations/en/EXERCISE.md create mode 100644 modules/40-define-functions/300-type-annotations/en/README.md create mode 100644 modules/40-define-functions/300-type-annotations/en/data.yml create mode 100644 modules/40-define-functions/300-type-annotations/es/EXERCISE.md create mode 100644 modules/40-define-functions/300-type-annotations/es/README.md create mode 100644 modules/40-define-functions/300-type-annotations/es/data.yml create mode 100644 modules/40-define-functions/300-type-annotations/index.php create mode 100644 modules/40-define-functions/300-type-annotations/ru/EXERCISE.md create mode 100644 modules/40-define-functions/300-type-annotations/ru/README.md create mode 100644 modules/40-define-functions/300-type-annotations/ru/data.yml create mode 100644 modules/40-define-functions/350-modules/Makefile create mode 100644 modules/40-define-functions/350-modules/SolutionTest.php create mode 100644 modules/40-define-functions/350-modules/description.es.yml create mode 100644 modules/40-define-functions/350-modules/en/EXERCISE.md create mode 100644 modules/40-define-functions/350-modules/en/README.md create mode 100644 modules/40-define-functions/350-modules/en/data.yml create mode 100644 modules/40-define-functions/350-modules/es/EXERCISE.md create mode 100644 modules/40-define-functions/350-modules/es/README.md create mode 100644 modules/40-define-functions/350-modules/es/data.yml create mode 100644 modules/40-define-functions/350-modules/index.php create mode 100644 modules/40-define-functions/350-modules/ru/EXERCISE.md create mode 100644 modules/40-define-functions/350-modules/ru/README.md create mode 100644 modules/40-define-functions/350-modules/ru/data.yml create mode 100644 modules/40-define-functions/400-packages/Makefile create mode 100644 modules/40-define-functions/400-packages/SolutionTest.php create mode 100644 modules/40-define-functions/400-packages/description.es.yml create mode 100644 modules/40-define-functions/400-packages/en/EXERCISE.md create mode 100644 modules/40-define-functions/400-packages/en/README.md create mode 100644 modules/40-define-functions/400-packages/en/data.yml create mode 100644 modules/40-define-functions/400-packages/es/EXERCISE.md create mode 100644 modules/40-define-functions/400-packages/es/README.md create mode 100644 modules/40-define-functions/400-packages/es/data.yml create mode 100644 modules/40-define-functions/400-packages/index.php create mode 100644 modules/40-define-functions/400-packages/ru/EXERCISE.md create mode 100644 modules/40-define-functions/400-packages/ru/README.md create mode 100644 modules/40-define-functions/400-packages/ru/data.yml diff --git a/modules/40-define-functions/100-define/Makefile b/modules/40-define-functions/100-define-function/Makefile similarity index 100% rename from modules/40-define-functions/100-define/Makefile rename to modules/40-define-functions/100-define-function/Makefile diff --git a/modules/40-define-functions/100-define/SolutionTest.php b/modules/40-define-functions/100-define-function/SolutionTest.php similarity index 63% rename from modules/40-define-functions/100-define/SolutionTest.php rename to modules/40-define-functions/100-define-function/SolutionTest.php index 8a3a538a..264a143d 100644 --- a/modules/40-define-functions/100-define/SolutionTest.php +++ b/modules/40-define-functions/100-define-function/SolutionTest.php @@ -1,6 +1,6 @@ expectOutputString($expected); - printMotto(); + sayHello(); } } diff --git a/modules/40-define-functions/100-define/description.es.yml b/modules/40-define-functions/100-define-function/description.es.yml similarity index 100% rename from modules/40-define-functions/100-define/description.es.yml rename to modules/40-define-functions/100-define-function/description.es.yml diff --git a/modules/40-define-functions/100-define/en/EXERCISE.md b/modules/40-define-functions/100-define-function/en/EXERCISE.md similarity index 100% rename from modules/40-define-functions/100-define/en/EXERCISE.md rename to modules/40-define-functions/100-define-function/en/EXERCISE.md diff --git a/modules/40-define-functions/100-define/en/README.md b/modules/40-define-functions/100-define-function/en/README.md similarity index 100% rename from modules/40-define-functions/100-define/en/README.md rename to modules/40-define-functions/100-define-function/en/README.md diff --git a/modules/40-define-functions/100-define/en/data.yml b/modules/40-define-functions/100-define-function/en/data.yml similarity index 100% rename from modules/40-define-functions/100-define/en/data.yml rename to modules/40-define-functions/100-define-function/en/data.yml diff --git a/modules/40-define-functions/100-define/es/EXERCISE.md b/modules/40-define-functions/100-define-function/es/EXERCISE.md similarity index 100% rename from modules/40-define-functions/100-define/es/EXERCISE.md rename to modules/40-define-functions/100-define-function/es/EXERCISE.md diff --git a/modules/40-define-functions/100-define/es/README.md b/modules/40-define-functions/100-define-function/es/README.md similarity index 100% rename from modules/40-define-functions/100-define/es/README.md rename to modules/40-define-functions/100-define-function/es/README.md diff --git a/modules/40-define-functions/100-define/es/data.yml b/modules/40-define-functions/100-define-function/es/data.yml similarity index 100% rename from modules/40-define-functions/100-define/es/data.yml rename to modules/40-define-functions/100-define-function/es/data.yml diff --git a/modules/40-define-functions/100-define/index.php b/modules/40-define-functions/100-define-function/index.php similarity index 60% rename from modules/40-define-functions/100-define/index.php rename to modules/40-define-functions/100-define-function/index.php index 7970eae4..7d4380b6 100644 --- a/modules/40-define-functions/100-define/index.php +++ b/modules/40-define-functions/100-define-function/index.php @@ -4,11 +4,11 @@ // They are needed here for technical reasons // Just ignore them, they do not affect development -namespace HexletBasics\DefineFunctions\Define; +namespace HexletBasics\DefineFunctions\DefineFunction; // BEGIN -function printMotto() +function sayHello() { - print_r("Winter is coming"); + print_r('Hello, World!'); } // END diff --git a/modules/40-define-functions/100-define-function/ru/EXERCISE.md b/modules/40-define-functions/100-define-function/ru/EXERCISE.md new file mode 100644 index 00000000..9cf719e4 --- /dev/null +++ b/modules/40-define-functions/100-define-function/ru/EXERCISE.md @@ -0,0 +1,9 @@ +Сайт выводит приветствие для каждого посетителя. Реализуйте функцию `sayHello()`, которая выводит на экран фразу `Hello, World!`. + +```php + Hello, World! +``` + +В задачах, в которых нужно реализовать функцию, эту функцию вызывать не нужно. Вызывать функцию будут автоматизированные тесты, которые проверяют ее работоспособность. Пример с вызовом выше показан только для того, чтобы вы понимали, как ваша функция будет использоваться. diff --git a/modules/40-define-functions/100-define-function/ru/README.md b/modules/40-define-functions/100-define-function/ru/README.md new file mode 100644 index 00000000..20a03ada --- /dev/null +++ b/modules/40-define-functions/100-define-function/ru/README.md @@ -0,0 +1,127 @@ +До этого момента мы использовали только уже готовые функции: `print_r()`, `strlen()`, `round()` и другие. Но в PHP можно создавать свои собственные функции и пришла пора научиться это делать. + +## Зачем определять функции + +Допустим, у нас есть несколько похожих участков кода: + +```php + Hello, Hexlet! +sayHello('world'); // => Hello, world! +sayHello('PHP'); // => Hello, PHP! +``` + +Вроде бы количество кода не стало меньше, но появилось кое-что другое. Если эта функция будет использоваться в разных местах, то при необходимости изменить текст, нам будет достаточно поправить только определение функции. И чем сложнее будет задача и чем чаще она будет использоваться в разных местах, тем важнее нужно выделять логику в свои функции. + +Определение собственных функций значительно упрощает поддержку программ еще и потому, что позволяет объединять сложные операции в одну. Например, отправка письма на сайте — это достаточно сложный процесс, который включает взаимодействие с внешними системами. Но вся сложность может быть скрыта за одной простой функцией `send($email, $title, $body)`. Один маленький вызов — и много логики внутри. + +## Синтаксис определения + +```php +function имяФункции(параметры) +{ + тело +} +``` + +```text +function greet($name) ← ключевое слово, имя функции и параметр +{ + return 'Hello, ' . $name; ← тело функции +} +``` + +Ключевое слово `function` начинает определение. В `имяФункции` допускается любое имя, как у переменной (но без знака `$`); в скобках указывается список параметров через запятую. Тело функции заключается в фигурные скобки, внутри пишется обычный PHP-код. + +В отличие от обычных данных, функции выполняют действия, поэтому их имена практически всегда должны быть глаголами: «построить что-то», «нарисовать что-то», «открыть что-то». + +Фигурные скобки показывают, какой код относится к телу функции. Посмотрите на пример: + +```php + Hi! +print_r('Программа продолжается…'); +``` + +Тело выполняется в тот момент, когда запускается функция. Причем каждый вызов функции запускает тело независимо от других вызовов. Тело может быть даже пустым: + +```php + 5 +``` + +Здесь `$a` и `$b` являются входными параметрами, `$total` содержит их сумму, `$average` получается делением суммы на 2, а `print_r()` выводит результат. + +При вызове `printAverage(6, 4)` на экран выведется `5`. + +## Переиспользование и читаемость + +Функции помогают избегать дублирования и делают программы более понятными. Название функции само по себе говорит, что она делает. Это особенно важно в больших проектах, где код читают другие программисты (или вы сами через месяц). + +Кстати, создание функции еще называют реализацией, определением и имплементацией. Такие слова часто встречаются на практике. diff --git a/modules/40-define-functions/100-define/ru/data.yml b/modules/40-define-functions/100-define-function/ru/data.yml similarity index 61% rename from modules/40-define-functions/100-define/ru/data.yml rename to modules/40-define-functions/100-define-function/ru/data.yml index d4032eb1..e93d5487 100644 --- a/modules/40-define-functions/100-define/ru/data.yml +++ b/modules/40-define-functions/100-define-function/ru/data.yml @@ -3,4 +3,4 @@ name: Создание (определение) функций tips: - > [Именование в - программировании](https://ru.hexlet.io/blog/posts/naming-in-programming) + программировании](https://ru.hexlet.io/blog/posts/naming-in-programming?utm_source=code-basics&utm_medium=referral&utm_campaign=blog&utm_content=lesson) diff --git a/modules/40-define-functions/100-define/assets/func_arg.png b/modules/40-define-functions/100-define/assets/func_arg.png deleted file mode 100644 index 996bd114536fa9c76475053bd3eabe184f3e4e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174919 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 z 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 H-&_9x$zHG! diff --git a/modules/40-define-functions/100-define/ru/EXERCISE.md b/modules/40-define-functions/100-define/ru/EXERCISE.md deleted file mode 100644 index b53e5363..00000000 --- a/modules/40-define-functions/100-define/ru/EXERCISE.md +++ /dev/null @@ -1,9 +0,0 @@ -Реализуйте функцию с именем `printMotto()`, которая выведет на экран фразу *Winter is coming*. - -```php - "Winter is coming" -``` - -В задачах, в которых нужно реализовать функцию, эту функцию вызывать не нужно. Вызывать функцию будут автоматизированные тесты, которые проверяют его работоспособность. Пример с вызовом выше показан только для того, чтобы вы понимали, как ваша функция будет использоваться. diff --git a/modules/40-define-functions/100-define/ru/README.md b/modules/40-define-functions/100-define/ru/README.md deleted file mode 100644 index 4552b862..00000000 --- a/modules/40-define-functions/100-define/ru/README.md +++ /dev/null @@ -1,68 +0,0 @@ -Напомним, что функции бывают встроенными и добавленными программистом. С первыми мы уже познакомились. А в этом уроке научимся создавать собственные. - -Определение собственных функций значительно упрощает написание и поддержку программ. Функции позволяют объединять сложные операции в одну. Например, отправка письма на сайте — это достаточно сложный процесс. Он включает в себя взаимодействие с внешними системами. - -Благодаря возможности определять функции, всю сложность можно скрыть за одной простой функцией: - -```php - 'Hello, Hexlet!' -``` - -В отличие от обычных данных, функции выполняют действия, поэтому их имена практически всегда должны быть глаголами: «построить что-то», «нарисовать что-то», «открыть что-то». - -Все, что описывается в фигурных скобках после имени функции, называется телом функции. Внутри тела можно описывать любой код. Можно сказать, что это маленькая самостоятельная программа, набор произвольных инструкций. - -Тело выполняется в тот момент, когда запускается функция. Причем каждый вызов функции запускает тело независимо от других вызовов. - -Тело функции может быть пустым: - -```php -assertEquals($expected, sayHurrayThreeTimes()); + $this->assertEquals('he...', truncate('hexlet', 2)); + $this->assertEquals('it w...', truncate('it works!', 4)); } } diff --git a/modules/40-define-functions/200-return/index.php b/modules/40-define-functions/200-return/index.php index 76ff85f7..57cbbc71 100644 --- a/modules/40-define-functions/200-return/index.php +++ b/modules/40-define-functions/200-return/index.php @@ -3,9 +3,9 @@ namespace HexletBasics\DefineFunctions\ReturnInstruction; // BEGIN -function sayHurrayThreeTimes() +function truncate($text, $length) { - $word = 'hurray!'; - return "{$word} {$word} {$word}"; + $cuttedString = substr($text, 0, $length); + return "{$cuttedString}..."; } // END diff --git a/modules/40-define-functions/200-return/ru/EXERCISE.md b/modules/40-define-functions/200-return/ru/EXERCISE.md index 04778a80..c338e463 100644 --- a/modules/40-define-functions/200-return/ru/EXERCISE.md +++ b/modules/40-define-functions/200-return/ru/EXERCISE.md @@ -1,11 +1,33 @@ +Реализуйте функцию `truncate()`, которая обрезает переданную строку до указанного количества символов, добавляет в конце троеточие и возвращает получившуюся строку. Подобная логика часто используется на сайтах, чтобы отобразить длинный текст в сокращенном виде. -Реализуйте функцию `sayHurrayThreeTimes()`, которая возвращает строку 'hurray! hurray! hurray!'. +Функция принимает два параметра: + +1. Строка, которую нужно обрезать +2. Число символов, которые нужно оставить + +Пример того, как должна работать написанная вами функция: + +```php + 'hurray! hurray! hurray!' +$word = 'welcome!'; +$length = 3; +substr($word, 0, $length); // 'wel' ``` -Вам не нужно вызывать свою функцию, только определить её. +С точки зрения проверочной системы не имеет значения, каким из способов будет реализована функция `truncate()` внутри. Главное — чтобы она выполняла поставленную задачу. diff --git a/modules/40-define-functions/200-return/ru/README.md b/modules/40-define-functions/200-return/ru/README.md index d3c8510d..0a2620d1 100644 --- a/modules/40-define-functions/200-return/ru/README.md +++ b/modules/40-define-functions/200-return/ru/README.md @@ -1,129 +1,150 @@ -Функции, которые мы определяли в предыдущих уроках, заканчивали свою работу тем, что печатали на экран какие-то данные: +Функции, которые мы определяли в предыдущем уроке, заканчивали свою работу тем, что печатали на экран какие-то данные. Пользы от таких функций не очень много, так как результатом их работы невозможно воспользоваться внутри программы. В этом уроке мы научимся писать функции, которые **возвращают значения**. Такие функции отвечают на вопрос и отдают результат своей работы, как будто говорят: «Вот, держи, я посчитала». + +Например, функция может вернуть строку с обработанным текстом или число, вычисленное по формуле. Возвращенное значение можно использовать дальше. Его сохраняют в переменную, передают в другую функцию или выводят на экран. + +![Как работает функция суммирования в PHP](./assets/sum-php.jpg) + +Чтобы функция отдала результат, в ней используется специальное ключевое слово `return`. Оно завершает выполнение функции и указывает, что именно нужно вернуть. + +Вот пример функции, которая делает текст заглавным: ```php HEXLET + +$result2 = shout('code-basics'); +print_r($result2); // => CODE-BASICS ``` -Этот код стал возможен только благодаря возврату значения. Функции `trim()` и `strtolower()` ничего не печатают на экран. Они возвращают результат своей работы, и поэтому мы можем записать его в переменные. +В отличие от `print_r()`, `return` ничего не печатает. Оно просто возвращает значение. Решение о том, что с ним делать, принимает вызывающий код. + +При вызове функции `shout('hexlet')` сначала выполняется выражение `strtoupper($name)`. Оно возвращает строку `'HEXLET'`. Затем `return` отдает это значение наружу, туда, откуда была вызвана функция. В нашем случае это значение сохраняется в переменную `$result`, а потом выводится на экран через `print_r()`. -Если бы функции вместо возврата результата печатали на экран, мы бы не могли присвоить результат их работы переменной. Как мы не можем сделать с определенной выше функцией `greeting()`: +А что вернет функция, в которой нет `return`? Проверим на функции из прошлого урока, которая только печатает текст: ```php NULL ``` -Изменим функцию `greeting()` так, чтобы она начала возвращать данные вместо их печати. Для этого нам понадобится выполнить возврат вместо печати на экран: +Функция без возврата всегда возвращает `null` — специальное значение, которое означает «ничего нет». + +## Возврат вычисленного выражения + +Функции не обязаны просто возвращать параметр. Обычно в `return` указывается **выражение**, которое сначала вычисляется, а потом результат передается наружу. ```php 'Hello, Hexlet!' -// И даже выполнить какие-то действия над результатом -print_r(strtoupper($message)); // => 'HELLO, HEXLET!' +$name = fullName('aria', 'stark'); +print_r($name); // => Aria Stark ``` -Любой код после `return` не выполняется: +Возвращать можно и значение переменной. Здесь нужно руководствоваться принципами читаемости кода: ```php HEXLET +``` + +Подобный код встречается в реальных программах постоянно. Например, когда пользователь регистрируется на сайте, он может ввести email с лишними пробелами или буквами в разном регистре: ` SuppORT@hexlet.IO`. Перед записью в базу данных такой email готовят точно так же: обрезают пробельные символы и приводят к нижнему регистру. + +## Код после `return` + +Когда PHP доходит до инструкции `return`, выполнение функции останавливается. Все, что написано после нее внутри функции, **не будет выполнено**: ```php ? ``` diff --git a/modules/40-define-functions/200-return/ru/data.yml b/modules/40-define-functions/200-return/ru/data.yml index b9db59ab..62b6f777 100644 --- a/modules/40-define-functions/200-return/ru/data.yml +++ b/modules/40-define-functions/200-return/ru/data.yml @@ -1,3 +1,5 @@ --- name: Возврат значений -tips: [] +tips: + - | + [Инструкция return](https://www.php.net/manual/ru/function.return.php) diff --git a/modules/40-define-functions/300-parameters/Makefile b/modules/40-define-functions/250-named-arguments/Makefile similarity index 100% rename from modules/40-define-functions/300-parameters/Makefile rename to modules/40-define-functions/250-named-arguments/Makefile diff --git a/modules/40-define-functions/250-named-arguments/SolutionTest.php b/modules/40-define-functions/250-named-arguments/SolutionTest.php new file mode 100644 index 00000000..b720f7a8 --- /dev/null +++ b/modules/40-define-functions/250-named-arguments/SolutionTest.php @@ -0,0 +1,18 @@ +assertEquals('python', trimAndRepeat('python')); + $this->assertEquals('on', trimAndRepeat('python', offset: 4)); + $this->assertEquals('pythonpython', trimAndRepeat('python', repetitions: 2)); + $this->assertEquals('onon', trimAndRepeat('python', offset: 4, repetitions: 2)); + } +} diff --git a/modules/40-define-functions/250-named-arguments/description.es.yml b/modules/40-define-functions/250-named-arguments/description.es.yml new file mode 100644 index 00000000..f68282a5 --- /dev/null +++ b/modules/40-define-functions/250-named-arguments/description.es.yml @@ -0,0 +1,50 @@ +--- + +name: Argumentos con nombre +theory: | + A partir de PHP 8, los argumentos se pueden pasar por el nombre del parámetro. El nombre se escribe sin `$`, seguido de dos puntos: + + ```php + 1 235 + ``` + +instructions: | + Completa la función `trimAndRepeat()`. Recibe una cadena, un `offset` — el número de caracteres que hay que recortar por la izquierda (0 por defecto), y `repetitions` — cuántas veces hay que repetir la cadena (1 por defecto). La firma ya está definida en la plantilla. La función devuelve la cadena resultante: + + ```php + + [Argumentos con nombre en la + documentación](https://www.php.net/manual/es/functions.arguments.php#functions.named-arguments) diff --git a/modules/40-define-functions/250-named-arguments/en/EXERCISE.md b/modules/40-define-functions/250-named-arguments/en/EXERCISE.md new file mode 100644 index 00000000..518258da --- /dev/null +++ b/modules/40-define-functions/250-named-arguments/en/EXERCISE.md @@ -0,0 +1,15 @@ +Finish the `trimAndRepeat()` function. It takes a string, an `offset` — the number of characters to cut off from the left (0 by default), and `repetitions` — how many times to repeat the string (1 by default). The signature is already defined in the template. The function returns the resulting string: + +```php + 1 235 +``` diff --git a/modules/40-define-functions/250-named-arguments/en/data.yml b/modules/40-define-functions/250-named-arguments/en/data.yml new file mode 100644 index 00000000..94a8a2c2 --- /dev/null +++ b/modules/40-define-functions/250-named-arguments/en/data.yml @@ -0,0 +1,6 @@ +--- +name: Named arguments +tips: + - > + [Named arguments in the + documentation](https://www.php.net/manual/en/functions.arguments.php#functions.named-arguments) diff --git a/modules/40-define-functions/250-named-arguments/es/EXERCISE.md b/modules/40-define-functions/250-named-arguments/es/EXERCISE.md new file mode 100644 index 00000000..061c63fd --- /dev/null +++ b/modules/40-define-functions/250-named-arguments/es/EXERCISE.md @@ -0,0 +1,15 @@ +Completa la función `trimAndRepeat()`. Recibe una cadena, un `offset` — el número de caracteres que hay que recortar por la izquierda (0 por defecto), y `repetitions` — cuántas veces hay que repetir la cadena (1 por defecto). La firma ya está definida en la plantilla. La función devuelve la cadena resultante: + +```php + 1 235 +``` diff --git a/modules/40-define-functions/250-named-arguments/es/data.yml b/modules/40-define-functions/250-named-arguments/es/data.yml new file mode 100644 index 00000000..aaa5d118 --- /dev/null +++ b/modules/40-define-functions/250-named-arguments/es/data.yml @@ -0,0 +1,6 @@ +--- +name: Argumentos con nombre +tips: + - > + [Argumentos con nombre en la + documentación](https://www.php.net/manual/es/functions.arguments.php#functions.named-arguments) diff --git a/modules/40-define-functions/250-named-arguments/index.php b/modules/40-define-functions/250-named-arguments/index.php new file mode 100644 index 00000000..7aa577d2 --- /dev/null +++ b/modules/40-define-functions/250-named-arguments/index.php @@ -0,0 +1,10 @@ + HiHiHi +``` + +Именованные аргументы можно комбинировать с позиционными, при этом позиционные идут первыми. Такой вызов позволяет указывать только те параметры, которые нужно переопределить: + +```php + HiHiHi +``` + +## Когда использовать именованные аргументы + +Именованные аргументы полезны, когда у функции есть несколько параметров и не все из них нужно менять. В таких случаях можно указать только те параметры, которые важны в конкретном вызове, а остальные оставить со значениями по умолчанию. + +Вы уже знаете, что у встроенной функции `round()` второй параметр необязательный. В именованном вызове используются имена параметров из сигнатуры в документации — `round(int|float $num, int $precision = 0)`: + +```php + 1 235 + +// С именованными — указываем только нужный +number_format(1234.567, thousands_separator: ' '); // => 1 235 +``` + +Разделитель указывать стало проще, даже несмотря на то, что перед ним в списке параметров идут еще два. Именованные аргументы делают вызовы понятнее. Читая код, сразу видно, какое значение к какому параметру относится. diff --git a/modules/40-define-functions/250-named-arguments/ru/data.yml b/modules/40-define-functions/250-named-arguments/ru/data.yml new file mode 100644 index 00000000..ac1151f4 --- /dev/null +++ b/modules/40-define-functions/250-named-arguments/ru/data.yml @@ -0,0 +1,6 @@ +--- +name: Именованные аргументы +tips: + - > + [Именованные аргументы в + документации](https://www.php.net/manual/ru/functions.arguments.php#functions.named-arguments) diff --git a/modules/40-define-functions/300-parameters/SolutionTest.php b/modules/40-define-functions/300-parameters/SolutionTest.php deleted file mode 100644 index f5468f49..00000000 --- a/modules/40-define-functions/300-parameters/SolutionTest.php +++ /dev/null @@ -1,16 +0,0 @@ -assertEquals('Hex...', truncate('Hexlet', 3)); - $this->assertEquals('Hello...', truncate('Hello world', 5)); - } -} diff --git a/modules/40-define-functions/300-parameters/description.es.yml b/modules/40-define-functions/300-parameters/description.es.yml deleted file mode 100644 index 4be527b6..00000000 --- a/modules/40-define-functions/300-parameters/description.es.yml +++ /dev/null @@ -1,111 +0,0 @@ ---- - -name: Parámetros de funciones -theory: | - Las funciones no solo pueden devolver valores, sino también recibirlos como parámetros. Ya nos hemos encontrado con parámetros de funciones: - - ```php - '¡fun...' - ``` - - Puedes implementar esta función de diferentes maneras, solo te daremos una pista. Para resolverlo de esta manera, necesitarás extraer una subcadena de la cadena pasada como primer parámetro a la función `truncate()`. Para hacer esto, utiliza la función [substr()](https://www.php.net/manual/es/function.substr.php). Piensa, en función de la tarea, desde qué índice y con qué longitud debes extraer la subcadena. - - ```php - 'it w...' -``` - -This function can be implemented in different ways, we'll tell you just one of them. To do it this way, you need to take a substring from the string passed as the first parameter to the `truncate()` function. Use the [substr()](https://www.php.net/manual/en/function.substr.php) function to do this. Think, based on the assignment, which index should you extract the substring from, and how long should it be? - - ```php - '¡fun...' -``` - -Puedes implementar esta función de diferentes maneras, solo te daremos una pista. Para resolverlo de esta manera, necesitarás extraer una subcadena de la cadena pasada como primer parámetro a la función `truncate()`. Para hacer esto, utiliza la función [substr()](https://www.php.net/manual/es/function.substr.php). Piensa, en función de la tarea, desde qué índice y con qué longitud debes extraer la subcadena. - - ```php - 'it w...' -``` - -Реализовать эту функцию можно различными способами, подскажем лишь один из них. Для решения этим способом вам понадобится взять подстроку из строки, переданной первым параметром в функцию `truncate()`. Используйте для этого функцию [substr()](https://www.php.net/manual/ru/function.substr.php). Подумайте, исходя из задания, с какого индекса и какой длины вам надо извлечь подстроку? - - ```php - $parameter->getType()?->getName(), + $reflection->getParameters() + ); + $this->assertEquals(['string', 'int'], $parameterTypes, 'You should add type declarations for parameters!'); + $this->assertEquals('string', $reflection->getReturnType()?->getName(), 'You should add a return type declaration!'); + + $this->assertEquals('python', wordMultiply('python', 1)); + $this->assertEquals('pythonpythonpython', wordMultiply('python', 3)); + $this->assertEquals('', wordMultiply('java', 0)); + } +} diff --git a/modules/40-define-functions/300-type-annotations/description.es.yml b/modules/40-define-functions/300-type-annotations/description.es.yml new file mode 100644 index 00000000..2f23b237 --- /dev/null +++ b/modules/40-define-functions/300-type-annotations/description.es.yml @@ -0,0 +1,54 @@ +--- + +name: Declaraciones de tipos +theory: | + PHP admite **declaraciones de tipos** (también conocidas como type hints): puedes indicar los tipos de los parámetros y del valor de retorno de una función. Los tipos de los parámetros se escriben antes del nombre del parámetro, y el tipo de retorno va después de la lista de parámetros, separado por dos puntos: + + ```php + 5 + ``` + + A diferencia de muchos lenguajes, PHP comprueba los tipos en tiempo de ejecución. Un valor incompatible provoca un `TypeError`, mientras que los valores compatibles se convierten automáticamente (`add('2', 3)` devuelve `5`). + + En esta etapa, basta con los tipos simples: `int`, `float`, `string`, `bool`. Si una función no devuelve nada, el tipo de retorno es `void`: + + ```php + phpphp + print_r(wordMultiply($text, 0)); // => + ``` + + Añade declaraciones de tipos a la definición de la función. + + ## Pistas + + * No olvides la declaración del tipo de retorno + * Usa `str_repeat()` para repetir la cadena + +tips: + - > + [Declaraciones de tipos en la + documentación](https://www.php.net/manual/es/language.types.declarations.php) diff --git a/modules/40-define-functions/300-type-annotations/en/EXERCISE.md b/modules/40-define-functions/300-type-annotations/en/EXERCISE.md new file mode 100644 index 00000000..529a0350 --- /dev/null +++ b/modules/40-define-functions/300-type-annotations/en/EXERCISE.md @@ -0,0 +1,16 @@ +Implement the `wordMultiply()` function. It takes a string and a number, and returns the string repeated that many times. If zero is passed, it returns an empty string: + +```php + phpphp +print_r(wordMultiply($text, 0)); // => +``` + +Add type declarations to the function definition. + +## Hints + +* Don't forget the return type declaration +* Use `str_repeat()` to repeat the string diff --git a/modules/40-define-functions/300-type-annotations/en/README.md b/modules/40-define-functions/300-type-annotations/en/README.md new file mode 100644 index 00000000..a83f78b0 --- /dev/null +++ b/modules/40-define-functions/300-type-annotations/en/README.md @@ -0,0 +1,27 @@ +PHP supports **type declarations** (also known as type hints): you can specify the types of parameters and the return value of a function. Parameter types are written before the parameter name, the return type goes after the parameter list, separated by a colon: + +```php + 5 +``` + +Unlike many languages, PHP checks types at runtime. An incompatible value causes a `TypeError`, while compatible values are coerced automatically (`add('2', 3)` returns `5`). + +At this stage, the simple types are enough: `int`, `float`, `string`, `bool`. If a function returns nothing, the return type is `void`: + +```php + + [Type declarations in the + documentation](https://www.php.net/manual/en/language.types.declarations.php) diff --git a/modules/40-define-functions/300-type-annotations/es/EXERCISE.md b/modules/40-define-functions/300-type-annotations/es/EXERCISE.md new file mode 100644 index 00000000..580515ae --- /dev/null +++ b/modules/40-define-functions/300-type-annotations/es/EXERCISE.md @@ -0,0 +1,16 @@ +Implementa la función `wordMultiply()`. Recibe una cadena y un número, y devuelve la cadena repetida esa cantidad de veces. Si se pasa cero, devuelve una cadena vacía: + +```php + phpphp +print_r(wordMultiply($text, 0)); // => +``` + +Añade declaraciones de tipos a la definición de la función. + +## Pistas + +* No olvides la declaración del tipo de retorno +* Usa `str_repeat()` para repetir la cadena diff --git a/modules/40-define-functions/300-type-annotations/es/README.md b/modules/40-define-functions/300-type-annotations/es/README.md new file mode 100644 index 00000000..c82bbbb7 --- /dev/null +++ b/modules/40-define-functions/300-type-annotations/es/README.md @@ -0,0 +1,27 @@ +PHP admite **declaraciones de tipos** (también conocidas como type hints): puedes indicar los tipos de los parámetros y del valor de retorno de una función. Los tipos de los parámetros se escriben antes del nombre del parámetro, y el tipo de retorno va después de la lista de parámetros, separado por dos puntos: + +```php + 5 +``` + +A diferencia de muchos lenguajes, PHP comprueba los tipos en tiempo de ejecución. Un valor incompatible provoca un `TypeError`, mientras que los valores compatibles se convierten automáticamente (`add('2', 3)` devuelve `5`). + +En esta etapa, basta con los tipos simples: `int`, `float`, `string`, `bool`. Si una función no devuelve nada, el tipo de retorno es `void`: + +```php + + [Declaraciones de tipos en la + documentación](https://www.php.net/manual/es/language.types.declarations.php) diff --git a/modules/40-define-functions/300-type-annotations/index.php b/modules/40-define-functions/300-type-annotations/index.php new file mode 100644 index 00000000..269e7836 --- /dev/null +++ b/modules/40-define-functions/300-type-annotations/index.php @@ -0,0 +1,10 @@ + phpphp +print_r(wordMultiply($text, 0)); // => +``` + +Укажите объявления типов при определении функции. + +## Подсказки + +* Не забудьте, что тип также нужно указать и у возвращаемого значения +* Повторить строку поможет функция `str_repeat()` diff --git a/modules/40-define-functions/300-type-annotations/ru/README.md b/modules/40-define-functions/300-type-annotations/ru/README.md new file mode 100644 index 00000000..1382028b --- /dev/null +++ b/modules/40-define-functions/300-type-annotations/ru/README.md @@ -0,0 +1,115 @@ +В PHP в функцию можно передать любые значения. Иногда это усложняет понимание кода: не всегда ясно, что именно ожидает функция и что она возвращает. Чтобы сделать код понятнее, в PHP есть **объявления типов** (их еще называют аннотациями типов или type hints). С их помощью можно явно указать, какие значения принимает функция и какой результат она возвращает. Таким образом мы решаем сразу несколько задач: + +- Улучшаем работу редактора кода, получаем подсказки, лучше автодополнение и тому подобное. +- Помогаем ИИ-агентам быстрее видеть структуру и принимать более правильные решения, минимизируя случайные ошибки. +- Появляется возможность проверять корректность программы без ее запуска, за счет статической проверки. Такая проверка не гарантирует, что логика программы написана правильно, но, по крайней мере, в ней не будет ошибок типов. + +## Как указывать типы параметров + +Объявление типов описывает два элемента. Типы параметров указываются прямо в определении функции перед именем каждого параметра. Тип возвращаемого результата указывается после списка параметров через двоеточие. + +Разберем на примере функции, которая вычисляет сумму двух переданных значений: + +```php + 5 +``` + +```text +function concat(string $a, string $b): string + │ │ │ + │ │ └── тип возвращаемого значения + │ └── тип параметра $b + └── тип параметра $a +``` + +Теперь редактор кода будет подсказывать, что функция `add()` принимает два числа и возвращает число. Если попытаться передать неподходящее значение, редактор подсветит это как проблему и предупредит. + +Кстати, такие записи вы уже видели. В уроке про необязательные параметры мы разбирали сигнатуру функции `round()` из документации — `round(int|float $num, int $precision = 0): float`. Это и есть объявления типов. + +## Типы проверяются при выполнении + +В отличие от многих языков, PHP не только подсказывает типы редактору, но и проверяет их во время работы программы. Если передать значение несовместимого типа, программа завершится с ошибкой `TypeError`: + +```php + 5 +``` + +Это то же самое поведение, которое мы разбирали в уроке про слабую типизацию. + +## Какие типы используются в объявлениях + +На этом этапе достаточно знать объявления для простых, примитивных типов данных: + +- `int` для целых чисел, `float` для чисел с плавающей точкой +- `string` для строк +- `bool` для логических значений (true или false) + +```php + Anna, 25 лет, рост 1.7 +``` + +Если функция ничего не возвращает, то в качестве возвращаемого типа указывается `void`. Например, функция может только печатать текст на экран: + +```php + Hello, Anna! +``` + +## Пример с параметрами по умолчанию + +Объявления типов работают одинаково как для обязательных параметров, так и для тех, у которых есть значение по умолчанию. Сначала указывается тип, потом имя параметра и через `=` стандартное значение: + +```php + Hello, Anna +print_r(greet('Kirill', 'Hi')); // => Hi, Kirill +``` + +В этом примере `$name` является обязательным параметром, а `$greeting` имеет значение по умолчанию. Объявления показывают типы обоих параметров и возвращаемого результата. + +## Объявления типов и проверка кода + +Кроме проверки во время выполнения, существуют инструменты **статической проверки кода**, то есть проверки, выполняемой без запуска. «Статическая» значит, что проверка происходит еще до запуска программы. Инструмент читает исходный код и сверяет, соответствуют ли переданные значения указанным типам. Например, если функция принимает строку, а вы передадите число, то при статической проверке это будет показано как ошибка. + +Особенно удобно, когда такие ошибки подсвечивает редактор прямо во время написания кода. Это позволяет сразу увидеть проблему и исправить ее, не дожидаясь запуска программы. Благодаря этому многие неожиданные ошибки отлавливаются заранее и в работающем коде их становится меньше. + +Объявления типов не являются обязательными. Функции можно писать и без них, PHP все равно будет работать. Но когда объявления есть, код становится понятнее для людей и удобнее для редакторов. Указание типов в своем коде считается хорошей практикой. diff --git a/modules/40-define-functions/300-type-annotations/ru/data.yml b/modules/40-define-functions/300-type-annotations/ru/data.yml new file mode 100644 index 00000000..b7924f91 --- /dev/null +++ b/modules/40-define-functions/300-type-annotations/ru/data.yml @@ -0,0 +1,6 @@ +--- +name: Объявления типов +tips: + - > + [Объявления типов в + документации](https://www.php.net/manual/ru/language.types.declarations.php) diff --git a/modules/40-define-functions/340-default-parameters/SolutionTest.php b/modules/40-define-functions/340-default-parameters/SolutionTest.php index b776f354..6fa03059 100644 --- a/modules/40-define-functions/340-default-parameters/SolutionTest.php +++ b/modules/40-define-functions/340-default-parameters/SolutionTest.php @@ -1,6 +1,6 @@ assertEquals($expected1, $actual1); - - $expected2 = '**4321'; - $actual2 = getHiddenCard('1234123412344321', 2); - $this->assertEquals($expected2, $actual2); + $this->assertEquals('****1234', getHiddenCard('1234123412341234')); + $this->assertEquals('****4321', getHiddenCard('1234123412344321')); + $this->assertEquals('***4321', getHiddenCard('1234123412344321', 3)); } } diff --git a/modules/40-define-functions/340-default-parameters/index.php b/modules/40-define-functions/340-default-parameters/index.php index d4d986c5..5b270f3d 100644 --- a/modules/40-define-functions/340-default-parameters/index.php +++ b/modules/40-define-functions/340-default-parameters/index.php @@ -1,6 +1,6 @@ Hi +print_r(repeat('Hi', 3)); // => HiHiHi +``` + +В этом примере используется встроенная функция `str_repeat()`. Она работает так: берется исходная строка и повторяется указанное количество раз. Например, `str_repeat('A', 5)` вернет `'AAAAA'`. Эта функция часто применяется при генерации шаблонов, разделителей и повторяющихся фрагментов текста. + +```text +function repeat($text, $times = 2) ← $times имеет значение по умолчанию { - return $x ** $base; + ... } -// Три во второй степени (двойка задана по умолчанию) -myPow(3); // 3 * 3 = 9 -// Три в третьей степени -myPow(3, 3); // 3 * 3 * 3 = 27 +repeat('go') → $times = 2 (по умолчанию) +repeat('go', 5) → $times = 5 (явно указано) ``` Значение по умолчанию выглядит как обычное присваивание в определении. Оно срабатывает только в том случае, если параметр не передан. К этому нужно привыкнуть. @@ -28,22 +42,47 @@ function myPrint($text = 'nothing') print_r($text); } -myPrint(); // => "nothing" -myPrint("Hexlet"); // => "Hexlet" +myPrint(); // => "nothing" +myPrint('Hexlet'); // => "Hexlet" ``` -Параметров со значениями по умолчанию может быть сколько угодно: +## Пример: склейка слов с разделителем + +По умолчанию слова соединяются пробелом, но можно указать другой символ: ```php King Road +print_r(joinWords('Dragon', 'stone', '-')); // => Dragon-stone ``` -У значений по умолчанию есть одно ограничение. Они должны идти в самом конце списка параметров. С точки зрения синтаксиса невозможно создать функцию, у которой после необязательного параметра идет обязательный: +## Пример: несколько параметров по умолчанию + +Функция может содержать более одного параметра со значениями по умолчанию. Например, сделаем функцию, которая строит строку-разделитель. По умолчанию символом является дефис, а длина равна 10: + +```php + ---------- +print_r(makeLine('*')); // => ********** +print_r(makeLine('*', 5)); // => ***** +print_r(makeLine('#', 3)); // => ### +``` + +## Ограничение на порядок параметров + +Необязательные параметры всегда указываются в конце списка параметров. С точки зрения синтаксиса невозможно создать функцию, у которой после необязательного параметра идет обязательный: ```php assertEquals(75, amountPerPerson(300, 4, 0)); + $this->assertEquals(90, amountPerPerson(300, 4, 20)); + $this->assertEquals(129, amountPerPerson(350, 3, 10)); + $this->assertEquals(34, amountPerPerson(100, 3, 0)); + } +} diff --git a/modules/40-define-functions/350-modules/description.es.yml b/modules/40-define-functions/350-modules/description.es.yml new file mode 100644 index 00000000..a53d8140 --- /dev/null +++ b/modules/40-define-functions/350-modules/description.es.yml @@ -0,0 +1,55 @@ +--- + +name: Módulos +theory: | + A medida que un programa crece, el código se divide en archivos separados. En PHP, un archivo se conecta con la instrucción `require` — después de eso, todas sus funciones quedan disponibles: + + ```php + Hi! + ``` + + Las pruebas de este curso usan el mismo mecanismo: cargan tu solución con `require 'index.php';`. + + `include` se diferencia de `require` en cómo se gestiona un archivo inexistente: `include` emite una advertencia y el programa continúa, mientras que `require` se detiene con un error. `require_once` carga un archivo solo una vez, lo cual es importante para archivos con funciones: volver a declarar una función provoca un error. + + A diferencia de muchos lenguajes, las funciones integradas de PHP están disponibles en todas partes sin necesidad de importar nada. Por ejemplo, `floor()` redondea un número hacia abajo y `ceil()` hacia arriba: + + ```php + 7 + print_r(ceil(7.1)); // => 8 + ``` + + Para evitar conflictos de nombres, PHP tiene **espacios de nombres** — has visto la línea `namespace HexletBasics\...;` al principio de cada ejercicio. Se estudian en detalle más adelante, en Hexlet. + +instructions: | + Implementa la función `amountPerPerson()`. Recibe el total de la cuenta de un restaurante, el número de personas y el porcentaje de propina, y devuelve la cantidad que paga cada persona. El resultado se redondea hacia arriba — nadie debe pagar de menos. + + Usa la función integrada `ceil()` para redondear. Está disponible de inmediato — no hay que cargar nada. + + ```php + 90 + + // Cuenta 350, 3 personas, propina del 10% — 385 en total, cada uno paga 129 + print_r(amountPerPerson(350, 3, 10)); // => 129 + ``` + + ## Pista + + * Primero calcula el total con la propina, luego divídelo entre el número de personas y redondea hacia arriba + * `ceil()` devuelve un `float`, mientras que la función debe devolver un `int` — la conversión de tipos te ayudará + +tips: + - | + [La instrucción require](https://www.php.net/manual/es/function.require.php) + - | + [La instrucción include](https://www.php.net/manual/es/function.include.php) diff --git a/modules/40-define-functions/350-modules/en/EXERCISE.md b/modules/40-define-functions/350-modules/en/EXERCISE.md new file mode 100644 index 00000000..a300ed2d --- /dev/null +++ b/modules/40-define-functions/350-modules/en/EXERCISE.md @@ -0,0 +1,18 @@ +Implement the `amountPerPerson()` function. It takes a restaurant bill total, the number of people, and a tip percentage, and returns the amount each person pays. The result is rounded up — no one should underpay. + +Use the built-in `ceil()` function for rounding. It is available right away — nothing needs to be loaded. + +```php + 90 + +// Bill 350, 3 people, 10% tip — 385 in total, everyone pays 129 +print_r(amountPerPerson(350, 3, 10)); // => 129 +``` + +## Hint + +* First calculate the total with the tip, then divide it by the number of people and round up +* `ceil()` returns a `float`, while the function must return an `int` — type casting will help diff --git a/modules/40-define-functions/350-modules/en/README.md b/modules/40-define-functions/350-modules/en/README.md new file mode 100644 index 00000000..8f12c224 --- /dev/null +++ b/modules/40-define-functions/350-modules/en/README.md @@ -0,0 +1,25 @@ +As a program grows, the code is split into separate files. In PHP, a file is connected with the `require` statement — after that, all functions from it become available: + +```php + Hi! +``` + +The tests in this course use the same mechanism: they load your solution with `require 'index.php';`. + +`include` differs from `require` in how a missing file is handled: `include` emits a warning and the program keeps running, while `require` stops with an error. `require_once` loads a file only once, which matters for files with functions: redeclaring a function causes an error. + +Unlike many languages, PHP's built-in functions are available everywhere without any imports. For example, `floor()` rounds a number down, and `ceil()` rounds it up: + +```php + 7 +print_r(ceil(7.1)); // => 8 +``` + +To deal with name conflicts, PHP has **namespaces** — you have seen the `namespace HexletBasics\...;` line at the beginning of every exercise. They are studied in detail later, at Hexlet. diff --git a/modules/40-define-functions/350-modules/en/data.yml b/modules/40-define-functions/350-modules/en/data.yml new file mode 100644 index 00000000..fc8464ad --- /dev/null +++ b/modules/40-define-functions/350-modules/en/data.yml @@ -0,0 +1,7 @@ +--- +name: Modules +tips: + - | + [The require statement](https://www.php.net/manual/en/function.require.php) + - | + [The include statement](https://www.php.net/manual/en/function.include.php) diff --git a/modules/40-define-functions/350-modules/es/EXERCISE.md b/modules/40-define-functions/350-modules/es/EXERCISE.md new file mode 100644 index 00000000..7b0552ca --- /dev/null +++ b/modules/40-define-functions/350-modules/es/EXERCISE.md @@ -0,0 +1,18 @@ +Implementa la función `amountPerPerson()`. Recibe el total de la cuenta de un restaurante, el número de personas y el porcentaje de propina, y devuelve la cantidad que paga cada persona. El resultado se redondea hacia arriba — nadie debe pagar de menos. + +Usa la función integrada `ceil()` para redondear. Está disponible de inmediato — no hay que cargar nada. + +```php + 90 + +// Cuenta 350, 3 personas, propina del 10% — 385 en total, cada uno paga 129 +print_r(amountPerPerson(350, 3, 10)); // => 129 +``` + +## Pista + +* Primero calcula el total con la propina, luego divídelo entre el número de personas y redondea hacia arriba +* `ceil()` devuelve un `float`, mientras que la función debe devolver un `int` — la conversión de tipos te ayudará diff --git a/modules/40-define-functions/350-modules/es/README.md b/modules/40-define-functions/350-modules/es/README.md new file mode 100644 index 00000000..134debf7 --- /dev/null +++ b/modules/40-define-functions/350-modules/es/README.md @@ -0,0 +1,25 @@ +A medida que un programa crece, el código se divide en archivos separados. En PHP, un archivo se conecta con la instrucción `require` — después de eso, todas sus funciones quedan disponibles: + +```php + Hi! +``` + +Las pruebas de este curso usan el mismo mecanismo: cargan tu solución con `require 'index.php';`. + +`include` se diferencia de `require` en cómo se gestiona un archivo inexistente: `include` emite una advertencia y el programa continúa, mientras que `require` se detiene con un error. `require_once` carga un archivo solo una vez, lo cual es importante para archivos con funciones: volver a declarar una función provoca un error. + +A diferencia de muchos lenguajes, las funciones integradas de PHP están disponibles en todas partes sin necesidad de importar nada. Por ejemplo, `floor()` redondea un número hacia abajo y `ceil()` hacia arriba: + +```php + 7 +print_r(ceil(7.1)); // => 8 +``` + +Para evitar conflictos de nombres, PHP tiene **espacios de nombres** — has visto la línea `namespace HexletBasics\...;` al principio de cada ejercicio. Se estudian en detalle más adelante, en Hexlet. diff --git a/modules/40-define-functions/350-modules/es/data.yml b/modules/40-define-functions/350-modules/es/data.yml new file mode 100644 index 00000000..01ba90f1 --- /dev/null +++ b/modules/40-define-functions/350-modules/es/data.yml @@ -0,0 +1,7 @@ +--- +name: Módulos +tips: + - | + [La instrucción require](https://www.php.net/manual/es/function.require.php) + - | + [La instrucción include](https://www.php.net/manual/es/function.include.php) diff --git a/modules/40-define-functions/350-modules/index.php b/modules/40-define-functions/350-modules/index.php new file mode 100644 index 00000000..a07898c6 --- /dev/null +++ b/modules/40-define-functions/350-modules/index.php @@ -0,0 +1,11 @@ + 90 + +// Счет 350, 3 человека, чаевые 10% — итого 385, каждый платит 129 +print_r(amountPerPerson(350, 3, 10)); // => 129 +``` + +## Подсказка + +* Сначала посчитайте итоговую сумму с чаевыми, затем разделите на количество человек и округлите вверх +* `ceil()` возвращает число типа `float`, а функция должна вернуть `int` — пригодится приведение типов diff --git a/modules/40-define-functions/350-modules/ru/README.md b/modules/40-define-functions/350-modules/ru/README.md new file mode 100644 index 00000000..66e8d442 --- /dev/null +++ b/modules/40-define-functions/350-modules/ru/README.md @@ -0,0 +1,88 @@ +Пока программа маленькая, весь код можно хранить в одном файле. Такой подход удобен для простых примеров и небольших задач. Но со временем программа начинает расти. Когда кода становится много, ориентироваться в одном файле становится сложно. Между тем реальные приложения состоят из десятков тысяч строк (как минимум) и сотен файлов. + +Чтобы разделить программу на отдельные логические части, код раскладывают по файлам. Во многих языках такие файлы называются модулями. В PHP модуль — это обычный файл с кодом и расширением `.php`. А язык предоставляет механизм для обращения к функциям и константам из других файлов — подключение файлов. + +## Как подключить файл + +Инструкция `require` подключает указанный файл и делает его содержимое доступным: + +```php + Hi! +``` + +После подключения все функции из файла `helpers.php` доступны так, как будто они были определены прямо в текущем файле. + +Кстати, вы уже видели этот механизм в действии. Автоматизированные тесты в этом курсе подключают файл с вашим решением строкой `require 'index.php';` — и после этого могут вызывать функции, которые вы определили. + +## require, include и require_once + +У `require` есть близнец — инструкция `include`. Разница проявляется, когда подключаемый файл не найден: `include` выведет предупреждение, и программа продолжит работу, а `require` остановит выполнение с ошибкой. Если без подключаемого кода программа не имеет смысла, используют `require`. + +Есть и третий вариант — `require_once`. Он подключает файл только один раз, даже если инструкция встречается в программе многократно. Это важно для файлов с функциями: повторное определение функции с тем же именем приводит к ошибке. + +## Встроенные функции доступны без подключения + +Стандартная библиотека PHP устроена проще, чем во многих других языках: встроенные функции доступны в любом месте программы сразу, без какого-либо подключения. Например, функции округления: `floor()` округляет число вниз до ближайшего целого, `ceil()` округляет вверх: + +```php + 7 +print_r(ceil(7.1)); // => 8 +print_r(ceil(7.0)); // => 7 +``` + +Разница заметна, когда число не целое. `floor(7.9)` дает 7, а не 8, потому что 7 — ближайшее целое снизу. + +Встроенные функции, конечно, доступны и в теле своих функций: + +```php + 4 +``` + +Обратите внимание: `ceil()` возвращает число типа `float`, поэтому результат приводится к `int` — так, как мы делали в уроке про преобразование типов. + +## Конфликты имен + +В больших программах разные части кода могут содержать функции с одинаковыми названиями. В PHP нельзя определить две функции с одним именем в одном пространстве — программа завершится с ошибкой `Cannot redeclare function`. + +Для борьбы с конфликтами имен в PHP существуют **пространства имен** (namespaces). Вы видели их в начале каждого задания этого курса — строка `namespace HexletBasics\...;` как раз объявляет пространство имен. Благодаря им мы можем создавать сколько угодно функций с одинаковыми именами, главное чтобы они находились в разных пространствах. Это работает даже со встроенными функциями: + +```php + custom floor +print_r(\floor(3.7)); // => 3 +``` + +Внутри пространства `App\Custom` имя `floor` ссылается на нашу функцию. Встроенная функция при этом никуда не делась — она доступна по полному имени `\floor()`, где обратный слеш означает глобальное пространство. Это особенно важно при использовании сторонних библиотек, потому что разные разработчики могут выбирать одинаковые имена для функций. Подробно пространства имен изучаются дальше, на Хекслете. diff --git a/modules/40-define-functions/350-modules/ru/data.yml b/modules/40-define-functions/350-modules/ru/data.yml new file mode 100644 index 00000000..88b35ae1 --- /dev/null +++ b/modules/40-define-functions/350-modules/ru/data.yml @@ -0,0 +1,7 @@ +--- +name: Модули +tips: + - | + [Инструкция require](https://www.php.net/manual/ru/function.require.php) + - | + [Инструкция include](https://www.php.net/manual/ru/function.include.php) diff --git a/modules/40-define-functions/400-packages/Makefile b/modules/40-define-functions/400-packages/Makefile new file mode 100644 index 00000000..d0d0a48c --- /dev/null +++ b/modules/40-define-functions/400-packages/Makefile @@ -0,0 +1,2 @@ +test: + @ test.sh diff --git a/modules/40-define-functions/400-packages/SolutionTest.php b/modules/40-define-functions/400-packages/SolutionTest.php new file mode 100644 index 00000000..74cb5e70 --- /dev/null +++ b/modules/40-define-functions/400-packages/SolutionTest.php @@ -0,0 +1,27 @@ +assertEquals('string', $reflection->getReturnType()?->getName(), 'You should add a return type declaration!'); + + foreach ([1, 7, 42] as $seed) { + srand($seed); + $result = generatePin(); + + srand($seed); + $expected = sprintf('%d%d%d%d', rand(0, 9), rand(0, 9), rand(0, 9), rand(0, 9)); + + $this->assertSame($expected, $result); + $this->assertSame(4, strlen($result)); + } + } +} diff --git a/modules/40-define-functions/400-packages/description.es.yml b/modules/40-define-functions/400-packages/description.es.yml new file mode 100644 index 00000000..25c814b6 --- /dev/null +++ b/modules/40-define-functions/400-packages/description.es.yml @@ -0,0 +1,49 @@ +--- + +name: Paquetes +theory: | + En el ecosistema PHP, la unidad de reutilización y distribución de código es el **paquete** (paquete de Composer). Los paquetes se gestionan con **Composer**, el gestor de paquetes de PHP. Un proyecto describe sus dependencias en el archivo `composer.json`: + + ```json + { + "name": "hexlet-basics/exercises-php", + "require": { + "php": "^8.4", + "nesbot/carbon": "^3.0" + } + } + ``` + + El nombre de un paquete consta de dos partes separadas por una barra: el nombre del editor (vendor) y el nombre del propio paquete, por ejemplo `nesbot/carbon`. El comando `composer install` descarga los paquetes en el directorio `vendor/`. Una sola línea los hace disponibles todos — este mecanismo se llama autocarga (autoloading): + + ```php + por ejemplo, "4823" o "0571" + print_r(generatePin()); // => por ejemplo, "1942" o "0037" + ``` + + Añade la declaración del tipo de retorno. + + ## Pista + + Genera cada uno de los cuatro dígitos con `rand(0, 9)` y construye la cadena usando interpolación. + +tips: + - | + [Composer](https://getcomposer.org/) + - | + [El registro de paquetes Packagist](https://packagist.org/) diff --git a/modules/40-define-functions/400-packages/en/EXERCISE.md b/modules/40-define-functions/400-packages/en/EXERCISE.md new file mode 100644 index 00000000..f04beba6 --- /dev/null +++ b/modules/40-define-functions/400-packages/en/EXERCISE.md @@ -0,0 +1,16 @@ +Implement the `generatePin()` function. It returns a random four-digit PIN code as a string. + +Each digit of the PIN code is an independent random integer from 0 to 9. + +```php + e.g. "4823" or "0571" +print_r(generatePin()); // => e.g. "1942" or "0037" +``` + +Add a return type declaration. + +## Hint + +Generate each of the four digits with `rand(0, 9)` and build the string using interpolation. diff --git a/modules/40-define-functions/400-packages/en/README.md b/modules/40-define-functions/400-packages/en/README.md new file mode 100644 index 00000000..684b4640 --- /dev/null +++ b/modules/40-define-functions/400-packages/en/README.md @@ -0,0 +1,21 @@ +In the PHP ecosystem, the unit of code reuse and distribution is a **package** (a Composer package). Packages are managed by **Composer** — the PHP package manager. A project describes its dependencies in the `composer.json` file: + +```json +{ + "name": "hexlet-basics/exercises-php", + "require": { + "php": "^8.4", + "nesbot/carbon": "^3.0" + } +} +``` + +A package name consists of two parts separated by a slash: the vendor name and the package name itself, e.g. `nesbot/carbon`. The `composer install` command downloads the packages into the `vendor/` directory. A single line makes all of them available — this mechanism is called autoloading: + +```php + por ejemplo, "4823" o "0571" +print_r(generatePin()); // => por ejemplo, "1942" o "0037" +``` + +Añade la declaración del tipo de retorno. + +## Pista + +Genera cada uno de los cuatro dígitos con `rand(0, 9)` y construye la cadena usando interpolación. diff --git a/modules/40-define-functions/400-packages/es/README.md b/modules/40-define-functions/400-packages/es/README.md new file mode 100644 index 00000000..88606da7 --- /dev/null +++ b/modules/40-define-functions/400-packages/es/README.md @@ -0,0 +1,21 @@ +En el ecosistema PHP, la unidad de reutilización y distribución de código es el **paquete** (paquete de Composer). Los paquetes se gestionan con **Composer**, el gestor de paquetes de PHP. Un proyecto describe sus dependencias en el archivo `composer.json`: + +```json +{ + "name": "hexlet-basics/exercises-php", + "require": { + "php": "^8.4", + "nesbot/carbon": "^3.0" + } +} +``` + +El nombre de un paquete consta de dos partes separadas por una barra: el nombre del editor (vendor) y el nombre del propio paquete, por ejemplo `nesbot/carbon`. El comando `composer install` descarga los paquetes en el directorio `vendor/`. Una sola línea los hace disponibles todos — este mecanismo se llama autocarga (autoloading): + +```php + например, "4823" или "0571" +print_r(generatePin()); // => например, "1942" или "0037" +``` + +Укажите объявление типа возвращаемого значения. + +## Подсказка + +Сгенерируйте каждую из четырех цифр через `rand(0, 9)` и соберите строку через интерполяцию. diff --git a/modules/40-define-functions/400-packages/ru/README.md b/modules/40-define-functions/400-packages/ru/README.md new file mode 100644 index 00000000..48f53f4a --- /dev/null +++ b/modules/40-define-functions/400-packages/ru/README.md @@ -0,0 +1,48 @@ +По мере роста программы увеличивается не только количество строк кода, но и количество файлов. Кроме того, удобный код хочется переиспользовать в разных проектах, а не копировать из одного в другой. + +В Python для группировки модулей используют пакеты-директории. В экосистеме PHP единицей переиспользования и распространения служит **пакет** (Composer-пакет). Пакет — это набор PHP-файлов с функциями и классами, который публикуют и устанавливают целиком. + +## Composer + +Пакетами управляет **Composer** — менеджер пакетов PHP. Проект описывает свои зависимости в файле `composer.json`: + +```json +{ + "name": "hexlet-basics/exercises-php", + "require": { + "php": "^8.4", + "nesbot/carbon": "^3.0" + } +} +``` + +Команда `composer install` скачивает все перечисленные пакеты и складывает их в директорию `vendor/`. Добавить новый пакет можно командой `composer require`, например: + +```bash +composer require nesbot/carbon +``` + +## Имя пакета + +Имя пакета состоит из двух частей, разделенных слешем: `nesbot/carbon`. Первая часть — имя издателя (vendor), вторая — имя самого пакета. Такая схема решает конфликты имен: разные разработчики могут опубликовать пакеты с одинаковым названием, и они не будут мешать друг другу — точно так же, как пространства имен позволяют существовать одинаковым функциям. + +## Автозагрузка + +Установленные пакеты попадают в директорию `vendor/`, но подключать каждый файл вручную через `require` не нужно. Composer генерирует специальный файл-автозагрузчик, и одной строки достаточно, чтобы стали доступны все установленные пакеты: + +```php + Date: Fri, 5 Jun 2026 23:09:32 +0500 Subject: [PATCH 09/29] =?UTF-8?q?feat(48-conditionals):=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20?= =?UTF-8?q?Python=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 30-if, 40-if-else, 50-else-if: теория доведена до паритета с Python (блоки кода, ASCII-схемы, предикаты, вложенные if, ошибка с else) - 60-ternary-operator: чистка оформления, namespace Logic → Conditionals - add 70-match: новый урок про match-выражение PHP 8 (строгое сравнение, отличие от switch, UnhandledMatchError), RU/EN/ES - задания 30/40/50/60 выровнены с Python (викторина, normalize_url с расширенными тестами, светофор, flip-flop) - решения переведены на объявления типов (паттерн из 45-logic) Co-Authored-By: Claude Opus 4.8 (1M context) --- modules/48-conditionals/30-if/index.php | 2 +- modules/48-conditionals/30-if/ru/EXERCISE.md | 6 +- modules/48-conditionals/30-if/ru/README.md | 88 ++++++++++++-- .../40-if-else/SolutionTest.php | 23 ++-- modules/48-conditionals/40-if-else/index.php | 11 +- .../48-conditionals/40-if-else/ru/EXERCISE.md | 32 +++-- .../48-conditionals/40-if-else/ru/README.md | 94 +++++++++++++-- .../50-else-if/SolutionTest.php | 10 +- modules/48-conditionals/50-else-if/index.php | 14 ++- .../48-conditionals/50-else-if/ru/EXERCISE.md | 20 ++-- .../48-conditionals/50-else-if/ru/README.md | 75 +++++++----- .../60-ternary-operator/SolutionTest.php | 2 +- .../60-ternary-operator/index.php | 4 +- .../60-ternary-operator/ru/EXERCISE.md | 2 +- .../60-ternary-operator/ru/README.md | 52 ++++----- modules/48-conditionals/70-match/Makefile | 2 + .../48-conditionals/70-match/SolutionTest.php | 22 ++++ .../70-match/description.es.yml | 110 ++++++++++++++++++ .../48-conditionals/70-match/en/EXERCISE.md | 23 ++++ modules/48-conditionals/70-match/en/README.md | 78 +++++++++++++ modules/48-conditionals/70-match/en/data.yml | 5 + .../48-conditionals/70-match/es/EXERCISE.md | 23 ++++ modules/48-conditionals/70-match/es/README.md | 78 +++++++++++++ modules/48-conditionals/70-match/es/data.yml | 5 + modules/48-conditionals/70-match/index.php | 15 +++ .../48-conditionals/70-match/ru/EXERCISE.md | 23 ++++ modules/48-conditionals/70-match/ru/README.md | 78 +++++++++++++ modules/48-conditionals/70-match/ru/data.yml | 6 + 28 files changed, 780 insertions(+), 123 deletions(-) create mode 100644 modules/48-conditionals/70-match/Makefile create mode 100644 modules/48-conditionals/70-match/SolutionTest.php create mode 100644 modules/48-conditionals/70-match/description.es.yml create mode 100644 modules/48-conditionals/70-match/en/EXERCISE.md create mode 100644 modules/48-conditionals/70-match/en/README.md create mode 100644 modules/48-conditionals/70-match/en/data.yml create mode 100644 modules/48-conditionals/70-match/es/EXERCISE.md create mode 100644 modules/48-conditionals/70-match/es/README.md create mode 100644 modules/48-conditionals/70-match/es/data.yml create mode 100644 modules/48-conditionals/70-match/index.php create mode 100644 modules/48-conditionals/70-match/ru/EXERCISE.md create mode 100644 modules/48-conditionals/70-match/ru/README.md create mode 100644 modules/48-conditionals/70-match/ru/data.yml diff --git a/modules/48-conditionals/30-if/index.php b/modules/48-conditionals/30-if/index.php index d9f7efb0..6cf473a6 100644 --- a/modules/48-conditionals/30-if/index.php +++ b/modules/48-conditionals/30-if/index.php @@ -3,7 +3,7 @@ namespace HexletBasics\Conditionals\IfStatement; // BEGIN -function guessNumber($guess) +function guessNumber(int $guess): string { if ($guess === 42) { return 'You win!'; diff --git a/modules/48-conditionals/30-if/ru/EXERCISE.md b/modules/48-conditionals/30-if/ru/EXERCISE.md index b3fc91e3..0617bbd3 100644 --- a/modules/48-conditionals/30-if/ru/EXERCISE.md +++ b/modules/48-conditionals/30-if/ru/EXERCISE.md @@ -1,9 +1,9 @@ -Реализуйте функцию `guessNumber()`, которая принимает число и проверяет, равно ли число заданному (пусть это будет 42). Если равно, то функция должна вернуть строку `'You win!'`, в противном случае нужно вернуть строку `'Try again!'`. +В викторине загадано число 42. Участник называет число, и программа сразу говорит — угадал он или нет. Реализуйте функцию `guessNumber()`, которая принимает число и проверяет, равно ли оно 42. Если равно — возвращает `'You win!'`, иначе — `'Try again!'`. ```php 3) { + print_r('Yes, it is true'); +} +``` + +Здесь строка `'Yes, it is true'` напечатается, потому что условие `5 > 3` истинно. + +```text +┌───────────┐ +│ условие? │ +└─────┬─────┘ + true │ + ↓ +┌───────────┐ +│ тело if │ +└───────────┘ +``` + +## Блоки кода + +После слова `if` в круглых скобках пишется условие, а затем в фигурных скобках описывается блок кода. Все инструкции внутри фигурных скобок входят в один блок: ```php normal +print_r(getTypeOfSentence('Hodor?') . "\n"); // => question ``` -`if` — это инструкция. В скобках ей передается выражение-предикат, а затем описывается блок кода в фигурных скобках. Этот блок кода будет выполнен, только если предикат — истина. Если предикат — ложь, то блок кода в фигурных скобках пропускается, и функция продолжает свое выполнение дальше. +Здесь используется сразу два `return`. Если условие внутри `if` выполняется, срабатывает `return 'question';` и функция завершается. Если условие не выполняется, управление переходит на следующую строку с `return 'normal';`. + +Таким образом, у функции есть несколько возможных точек выхода. Это частая практика. В зависимости от условий функция может завершаться по-разному. + +Несмотря на то, что функция `getTypeOfSentence()` использует `if`, она возвращает строки, а значит, предикатом не является. В качестве предиката рассмотрим функцию, которая проверяет, достаточно ли денег для покупки: + +```php += $price) { + return true; + } + + return false; +} + +var_dump(hasEnoughMoney(100, 50)); // => bool(true) +var_dump(hasEnoughMoney(30, 50)); // => bool(false) +``` + +## if и логические выражения + +Функцию `hasEnoughMoney()` мы написали через `if`. Но в таком виде она могла бы обойтись и без него, потому что результат сравнения сам по себе уже является логическим выражением: + +```php += $price; +} +``` -В нашем случае следующая строчка кода — `return 'normal';`. Она заставит функцию вернуть строку и завершиться. Как видите, `return` может находиться где угодно в функции, в том числе — внутри блока кода с условием. +В простых случаях лучше сразу возвращать такое выражение. `if` нужен там, где внутри блока выполняются дополнительные действия помимо возврата результата. Чем более сложные программы мы будем писать, тем чаще такие ситуации начнут встречаться. diff --git a/modules/48-conditionals/40-if-else/SolutionTest.php b/modules/48-conditionals/40-if-else/SolutionTest.php index 8fe41501..959aa5a3 100644 --- a/modules/48-conditionals/40-if-else/SolutionTest.php +++ b/modules/48-conditionals/40-if-else/SolutionTest.php @@ -10,12 +10,21 @@ public function test() { require 'index.php'; - $expected1 = 'https://yandex.ru'; - $actual1 = normalizeUrl('yandex.ru'); - $this->assertEquals($expected1, $actual1); - - $expected2 = 'https://yandex.ru'; - $actual2 = normalizeUrl('http://yandex.ru'); - $this->assertEquals($expected2, $actual2); + $this->assertEquals('https://yandex.ru', normalizeUrl('yandex.ru')); + $this->assertEquals('https://yandex.ru', normalizeUrl('http://yandex.ru')); + $this->assertEquals('https://yandex.ru', normalizeUrl('https://yandex.ru')); + $this->assertEquals('https://httpsecurity.com', normalizeUrl('httpsecurity.com')); + $this->assertEquals( + 'https://httpbin.org/redirect-to?url=http://google.com', + normalizeUrl('https://httpbin.org/redirect-to?url=http://google.com') + ); + $this->assertEquals( + 'https://httpbin.org/redirect-to?url=https://google.com', + normalizeUrl('httpbin.org/redirect-to?url=https://google.com') + ); + $this->assertEquals( + 'https://httpbin.org/redirect-to?url=http://google.com', + normalizeUrl('httpbin.org/redirect-to?url=http://google.com') + ); } } diff --git a/modules/48-conditionals/40-if-else/index.php b/modules/48-conditionals/40-if-else/index.php index 2bb7ff20..d38d8adc 100644 --- a/modules/48-conditionals/40-if-else/index.php +++ b/modules/48-conditionals/40-if-else/index.php @@ -3,19 +3,20 @@ namespace HexletBasics\Conditionals\IfElse; // BEGIN -function normalizeUrl($url) +function normalizeUrl(string $url): string { - if (strpos($url, 'https://') === 0) { + $prefix = 'https://'; + + if (str_starts_with($url, $prefix)) { return $url; } - if (strpos($url, 'http://') === 0) { + if (str_starts_with($url, 'http://')) { $domain = substr($url, 7); } else { $domain = $url; } - return "https://{$domain}"; + return "{$prefix}{$domain}"; } - // END diff --git a/modules/48-conditionals/40-if-else/ru/EXERCISE.md b/modules/48-conditionals/40-if-else/ru/EXERCISE.md index e59a9f51..f4b95d70 100644 --- a/modules/48-conditionals/40-if-else/ru/EXERCISE.md +++ b/modules/48-conditionals/40-if-else/ru/EXERCISE.md @@ -1,20 +1,34 @@ -Реализуйте функцию `normalizeUrl()`, которая выполняет так называемую нормализацию данных. Она принимает адрес сайта и возвращает его с `https://` в начале. +Реализуйте функцию `normalizeUrl()`, которая выполняет нормализацию данных. Она принимает адрес сайта и возвращает его с `https://` в начале. -Функция принимает адреса в виде `АДРЕС` или `http://АДРЕС`, но всегда возвращает адрес в виде `https://АДРЕС` +Функция принимает адреса в виде `АДРЕС` или `http://АДРЕС`, но всегда возвращает адрес в виде `https://АДРЕС`. На вход функции также может поступить адрес в уже нормализованном виде `https://АДРЕС`, в этом случае ничего менять не надо. -Есть два пути решения: +Примеры вызова: + +```php + py +``` + +Так вот, с помощью `substr()` можно также отбросить определенное количество символов: ```php thon ``` diff --git a/modules/48-conditionals/40-if-else/ru/README.md b/modules/48-conditionals/40-if-else/ru/README.md index 6ccd6caf..2507f708 100644 --- a/modules/48-conditionals/40-if-else/ru/README.md +++ b/modules/48-conditionals/40-if-else/ru/README.md @@ -1,9 +1,9 @@ -Попробуем изменить функцию из предыдущего примера так, чтобы она возвращала не просто тип предложения, а целую строку *Sentence is normal* или *Sentence is question*: +Посмотрите на функцию ниже. Она определяет тип предложения по последнему символу: если предложение заканчивается вопросительным знаком, функция вернет `Sentence is question`, иначе — `Sentence is normal`: ```php Sentence is normal +print_r(getTypeOfSentence('Hodor?') . "\n"); // => Sentence is question ``` -Мы добавили `else` и новый блок с фигурными скобками. Этот блок выполнится, только если условие в `if` — ложь. +Мы добавили `else` и новый блок в фигурных скобках. Он выполнится, если условие в `if` окажется ложным. Еще в блок `else` можно вкладывать другие условия `if`. Else переводится «иначе», «в ином случае». -Существует два способа оформления конструкции *if-else*. С помощью отрицания `!==` можно изменить порядок блоков: +```text + ┌───────────┐ + │ условие? │ + └─────┬─────┘ + true │ │ false + ↓ ↓ +┌──────────┐ ┌──────────┐ +│ тело if │ │ тело else│ +└──────────┘ └──────────┘ +``` + +Пример вложенных блоков: ```php 10) { + print_r('Number is greater than 10'); +} else { + if ($number === 10) { + print_r('Number is exactly 10'); + } else { + print_r('Number is less than 10'); + } +} +``` + +Оформить конструкцию `if-else` можно двумя способами. С помощью отрицания `!==` можно изменить порядок блоков: + +```php + 0) { + print_r("Число положительное\n"); + } + + if ($number > 10) { + print_r("Число больше 10\n"); + } else { + print_r("Число не положительное\n"); + } +} + +checkNumber(3); +// => Число положительное +// => Число не положительное +``` + +В примере выше мы забыли вложить второй `if` внутрь первого, поэтому `else` теперь относится ко второму `if`. Программа сообщает, что число одновременно положительное и не положительное. + +```php + 0) { + print_r("Число положительное\n"); + + if ($number > 10) { + print_r("Число больше 10\n"); + } + } else { + print_r("Число не положительное\n"); + } +} + +checkNumber(3); +// => Число положительное +``` + +Теперь второй `if` вложен в первый, а `else` на одном уровне с первым и противопоставляется ему. diff --git a/modules/48-conditionals/50-else-if/SolutionTest.php b/modules/48-conditionals/50-else-if/SolutionTest.php index cd7b4523..48498f72 100644 --- a/modules/48-conditionals/50-else-if/SolutionTest.php +++ b/modules/48-conditionals/50-else-if/SolutionTest.php @@ -10,10 +10,10 @@ public function test() { require 'index.php'; - $this->assertEquals('friend', whoIsThisHouseToStarks('Tully')); - $this->assertEquals('friend', whoIsThisHouseToStarks('Karstark')); - $this->assertEquals('enemy', whoIsThisHouseToStarks('Lannister')); - $this->assertEquals('neutral', whoIsThisHouseToStarks('Martell')); - $this->assertEquals('neutral', whoIsThisHouseToStarks('undefined')); + $this->assertEquals('go', getTrafficLightAction('green')); + $this->assertEquals('slow down', getTrafficLightAction('yellow')); + $this->assertEquals('stop', getTrafficLightAction('red')); + $this->assertEquals('unknown', getTrafficLightAction('blue')); + $this->assertEquals('unknown', getTrafficLightAction('purple')); } } diff --git a/modules/48-conditionals/50-else-if/index.php b/modules/48-conditionals/50-else-if/index.php index 1d4cab63..06e82989 100644 --- a/modules/48-conditionals/50-else-if/index.php +++ b/modules/48-conditionals/50-else-if/index.php @@ -3,14 +3,16 @@ namespace HexletBasics\Conditionals\ElseIfStatement; // BEGIN -function whoIsThisHouseToStarks($houseName) +function getTrafficLightAction(string $color): string { - if ($houseName === 'Karstark' || $houseName === 'Tully') { - return 'friend'; - } elseif ($houseName === 'Lannister' || $houseName === 'Frey') { - return 'enemy'; + if ($color === 'green') { + return 'go'; + } elseif ($color === 'yellow') { + return 'slow down'; + } elseif ($color === 'red') { + return 'stop'; } - return 'neutral'; + return 'unknown'; } // END diff --git a/modules/48-conditionals/50-else-if/ru/EXERCISE.md b/modules/48-conditionals/50-else-if/ru/EXERCISE.md index 5594dead..f7f3a11e 100644 --- a/modules/48-conditionals/50-else-if/ru/EXERCISE.md +++ b/modules/48-conditionals/50-else-if/ru/EXERCISE.md @@ -1,21 +1,19 @@ -На электронной карте Вестероса, которую реализовал Сэм, союзники Старков отображены зеленым кружком, враги — красным, а нейтральные семьи — серым. +Реализуйте функцию `getTrafficLightAction()`, которая принимает цвет светофора и возвращает, что нужно делать водителю. -Напишите для Сэма функцию `whoIsThisHouseToStarks()`, которая принимает на вход фамилию семьи и возвращает одно из трех значений: `'friend'`, `'enemy'`, `'neutral'`. +Правила: -Правила определения: - - * Друзья (`'friend'`): 'Karstark', 'Tully' - * Враги (`'enemy'`): 'Lannister', 'Frey' - * Любые другие семьи считаются нейтральными +* `'green'` → `'go'` +* `'yellow'` → `'slow down'` +* `'red'` → `'stop'` +* Любой другой цвет → `'unknown'` Примеры вызова: ```php Sentence is normal +print_r(getTypeOfSentence('No') . "\n"); // => Sentence is normal +print_r(getTypeOfSentence('No!') . "\n"); // => Sentence is exclamation ``` -Мы добавили еще одну проверку (_exclamation_ переводится «восклицание»). Технически функция работает, но с точки зрения семантики есть проблемы: +Мы добавили проверку восклицательных предложений (_exclamation_ переводится «восклицание»). Технически эта функция работает, но вопросительные предложения трактует неверно. Еще в ней есть проблемы с точки зрения семантики. Наличие восклицательного знака проверяется в любом случае, даже если уже обнаружился вопросительный знак. Ветка `else` описана для второго условия, но не для первого. Поэтому вопросительное предложение становится `normal`. -* Проверка на наличие вопросительного знака происходит в любом случае, даже если уже был обнаружен восклицательный знак -* Ветка `else` описана именно для первого условия, но не для второго - -Правильнее будет воспользоваться еще одной возможностью условной конструкции: +Чтобы исправить ситуацию, воспользуемся еще одной возможностью условной конструкции: ```php Sentence is question +print_r(getTypeOfSentence('No') . "\n"); // => Sentence is normal +print_r(getTypeOfSentence('No!') . "\n"); // => Sentence is exclamation +``` -Конструкция `elseif` — это «если не выполнено предыдущее условие, но выполнено текущее». Получается такая схема: +Теперь все условия выстроились в единую конструкцию. Ключевое слово `elseif` означает «если не выполнено предыдущее условие, но выполнено текущее». + +```text + ┌─────────────────┐ + │ условие 1? │ + └────┬────────┬───┘ + true │ │ false + ↓ ↓ +┌──────────┐ ┌─────────────────┐ +│ тело if │ │ условие 2? │ +└──────────┘ └────┬────────┬───┘ + true │ │ false + ↓ ↓ + ┌────────────┐ ┌──────────┐ + │тело elseif │ │ тело else│ + └────────────┘ └──────────┘ +``` -* Если последний символ `?`, то `'question'` -* Иначе, если последний символ `!`, то `'exclamation'` -* Иначе `'normal'` +Логика функции устроена так. Если последний символ `?`, возвращается `'question'`. Если последний символ `!`, возвращается `'exclamation'`. Во всех остальных случаях возвращается `'normal'`. -Выполнится только один из блоков кода, относящихся ко всей конструкции `if`. +Выполнится только один из блоков кода, который относится ко всей конструкции `if`. diff --git a/modules/48-conditionals/60-ternary-operator/SolutionTest.php b/modules/48-conditionals/60-ternary-operator/SolutionTest.php index bef19d58..488742a9 100644 --- a/modules/48-conditionals/60-ternary-operator/SolutionTest.php +++ b/modules/48-conditionals/60-ternary-operator/SolutionTest.php @@ -1,6 +1,6 @@ = 0) { return $number; @@ -12,8 +12,8 @@ function abs($number) return -$number; } -abs(10); // 10 -abs(-10); // 10 +print_r(abs(10) . "\n"); // => 10 +print_r(abs(-10) . "\n"); // => 10 ``` Можно ли записать ее лаконичнее? Что-то вроде `return ОТВЕТ В ЗАВИСИМОСТИ ОТ УСЛОВИЯ`? Для этого справа от `return` должно быть выражение. Но есть проблема: `if` — это инструкция, а не выражение. @@ -25,7 +25,7 @@ abs(-10); // 10 ```php = 0 ? $number : -$number; } @@ -41,35 +41,35 @@ function abs($number) Давайте перепишем начальный вариант `getTypeOfSentence()` аналогично. Посмотрим, как было: - ```php - normal +print_r(getTypeOfSentence('Hodor?') . "\n"); // => question +``` Вы уже могли догадаться, что тернарный оператор можно вкладывать в тернарный оператор. Это возможно, но лучше так не делать. Такой код тяжело читать и отлаживать, поэтому вложенные тернарные операторы считаются очень плохой практикой. diff --git a/modules/48-conditionals/70-match/Makefile b/modules/48-conditionals/70-match/Makefile new file mode 100644 index 00000000..d0d0a48c --- /dev/null +++ b/modules/48-conditionals/70-match/Makefile @@ -0,0 +1,2 @@ +test: + @ test.sh diff --git a/modules/48-conditionals/70-match/SolutionTest.php b/modules/48-conditionals/70-match/SolutionTest.php new file mode 100644 index 00000000..4cabd23b --- /dev/null +++ b/modules/48-conditionals/70-match/SolutionTest.php @@ -0,0 +1,22 @@ +assertEquals(600, calculateDeliveryCost('canada', 0.5)); + $this->assertEquals(600, calculateDeliveryCost('canada', 1)); + $this->assertEquals(900, calculateDeliveryCost('canada', 2)); + $this->assertEquals(800, calculateDeliveryCost('usa', 1)); + $this->assertEquals(1200, calculateDeliveryCost('usa', 3)); + $this->assertEquals(700, calculateDeliveryCost('germany', 0.3)); + $this->assertEquals(1000, calculateDeliveryCost('germany', 1.5)); + $this->assertNull(calculateDeliveryCost('france', 1)); + } +} diff --git a/modules/48-conditionals/70-match/description.es.yml b/modules/48-conditionals/70-match/description.es.yml new file mode 100644 index 00000000..fc34e8b2 --- /dev/null +++ b/modules/48-conditionals/70-match/description.es.yml @@ -0,0 +1,110 @@ +--- + +name: Expresión match +theory: | + La estructura `switch` de la lección anterior no es la única versión especializada de `if` en PHP. A partir de PHP 8, el lenguaje cuenta con la expresión `match`. También se debe usar donde hay una cadena de `if else` con comprobaciones de igualdad: + + ```php + 'El pedido está en proceso', // $status === 'processing' + 'paid' => 'El pedido está pagado', // $status === 'paid' + 'new' => 'Pedido nuevo', // $status === 'new' + default => 'Estado desconocido', // else + }; + ``` + + ```text + match (valor) { + │ + ├── 'a' → resultado 1 + ├── 'b' → resultado 2 + ├── 'c' → resultado 3 + └── default → resultado por defecto + } + ``` + + En cuanto al número de elementos, `match` es una estructura compleja. La descripción externa incluye la palabra clave `match` y la variable cuyos valores usa `match` para elegir el comportamiento. Dentro hay ramas, cada una de las cuales describe el resultado para uno de los valores de la variable. Cada rama corresponde a un `if` del ejemplo anterior. La rama `default` es un caso especial que corresponde a la rama `else` de las estructuras condicionales. + + La principal diferencia entre `match` y tanto `switch` como un `if` normal es que se trata de una **expresión**. Toda la estructura se evalúa a un valor, por lo que su resultado se puede asignar directamente a una variable o devolver desde una función. No se necesita ningún `break`: se ejecuta exactamente una rama y aquí es imposible la caída en cascada. + + Dentro de `match` solo se permite la sintaxis mostrada arriba. A la izquierda de la flecha `=>` se indica el valor a comparar, y a la derecha, la expresión que se convertirá en el resultado. Si varios valores llevan al mismo resultado, se enumeran separados por comas: + + ```php + 'small', + 'm' => 'medium', + 'l', 'xl' => 'large', + }; + ``` + + Hay otras diferencias con respecto a `switch`: + + * `match` compara los valores de forma estricta, como el operador `===`. En cambio, `switch` usa la comparación no estricta `==`, que realiza una conversión automática de tipos. + * Si ninguna rama coincide y no se especifica `default`, el programa termina con un error `UnhandledMatchError`. En la misma situación, `switch` simplemente no haría nada. + + A menudo el resultado de `match` debe devolverse desde la función que lo contiene. Para ello, se coloca un `return` normal antes de `match`: + + ```php + 'one', + 2 => 'two', + default => null, + }; + } + + print_r(countItems(2)); // => two + ``` + + Aunque la expresión `match` aparece en el código, técnicamente siempre se puede prescindir de ella. Su beneficio clave es que expresa mejor la intención del programador cuando hay que comprobar valores concretos de una variable. Ese código es más fácil de leer que los bloques `elseif`. + +instructions: | + Implementa una función `calculateDeliveryCost()` que reciba el país de entrega y el peso del paquete en kilogramos. La función debe devolver el costo de la entrega. + + Cada país tiene dos tarifas: una para paquetes de hasta 1 kg inclusive y otra para paquetes más pesados: + + * `'canada'`: 600 para paquetes de hasta 1 kg, 900 para el resto + * `'usa'`: 800 para paquetes de hasta 1 kg, 1200 para el resto + * `'germany'`: 700 para paquetes de hasta 1 kg, 1000 para el resto + + Si el país es desconocido, la función debe devolver `null`. + + Ejemplos de llamada de la función: + + ```php + ` puede ir cualquier expresión, incluido el operador ternario. + +tips: + - | + [match](https://www.php.net/manual/es/control-structures.match.php) diff --git a/modules/48-conditionals/70-match/en/EXERCISE.md b/modules/48-conditionals/70-match/en/EXERCISE.md new file mode 100644 index 00000000..1e35a5fe --- /dev/null +++ b/modules/48-conditionals/70-match/en/EXERCISE.md @@ -0,0 +1,23 @@ + +Implement a function `calculateDeliveryCost()` that takes a delivery country and a parcel weight in kilograms. The function should return the delivery cost. + +Each country has two rates: one for parcels weighing up to and including 1 kg, and another for heavier parcels: + +* `'canada'`: 600 for parcels up to 1 kg, 900 for the rest +* `'usa'`: 800 for parcels up to 1 kg, 1200 for the rest +* `'germany'`: 700 for parcels up to 1 kg, 1000 for the rest + +If the country is unknown, the function should return `null`. + +Function call examples: + +```php +` arrow, including the ternary operator. diff --git a/modules/48-conditionals/70-match/en/README.md b/modules/48-conditionals/70-match/en/README.md new file mode 100644 index 00000000..33b01c02 --- /dev/null +++ b/modules/48-conditionals/70-match/en/README.md @@ -0,0 +1,78 @@ +The `switch` construct from the previous lesson is not the only specialized version of `if` in PHP. Starting with PHP 8, the language has the `match` expression. It should also be used where there is an `if else` chain with equality checks: + +```php + 'Order is being processed', // $status === 'processing' + 'paid' => 'Order is paid', // $status === 'paid' + 'new' => 'New order', // $status === 'new' + default => 'Unknown status', // else +}; +``` + +```text +match (value) { + │ + ├── 'a' → result 1 + ├── 'b' → result 2 + ├── 'c' → result 3 + └── default → default result +} +``` + +In terms of the number of elements, `match` is a complex construct. The outer description includes the `match` keyword and the variable whose values `match` uses to choose the behavior. Inside, there are arms, each describing the result for one of the variable's values. Each arm corresponds to an `if` in the example above. The `default` arm is a special case that corresponds to the `else` branch in conditional constructs. + +The main difference between `match` and both `switch` and a regular `if` is that it is an **expression**. The whole construct evaluates to a value, so its result can be directly assigned to a variable or returned from a function. No `break` is needed: exactly one arm is executed, and fall-through is impossible here. + +Only the syntax shown above is allowed inside `match`. To the left of the `=>` arrow is the value to compare, and to the right is the expression that becomes the result. If several values lead to the same result, they are listed separated by commas: + +```php + 'small', + 'm' => 'medium', + 'l', 'xl' => 'large', +}; +``` + +There are other differences from `switch`: + +* `match` compares values strictly, like the `===` operator. Meanwhile, `switch` uses loose comparison `==`, which performs automatic type conversion. +* If no arm matches and `default` is not specified, the program terminates with an `UnhandledMatchError`. In the same situation, `switch` would simply do nothing. + +Often the result of `match` needs to be returned from the function that contains it. To do this, a regular `return` is placed before `match`: + +```php + 'one', + 2 => 'two', + default => null, + }; +} + +print_r(countItems(2)); // => two +``` + +Although the `match` expression appears in code, technically you can always do without it. Its key benefit is that it better expresses the programmer's intent when specific values of a variable need to be checked. Such code is easier to read than `elseif` blocks. diff --git a/modules/48-conditionals/70-match/en/data.yml b/modules/48-conditionals/70-match/en/data.yml new file mode 100644 index 00000000..05b81e0f --- /dev/null +++ b/modules/48-conditionals/70-match/en/data.yml @@ -0,0 +1,5 @@ +--- +name: Match expression +tips: + - | + [match](https://www.php.net/manual/en/control-structures.match.php) diff --git a/modules/48-conditionals/70-match/es/EXERCISE.md b/modules/48-conditionals/70-match/es/EXERCISE.md new file mode 100644 index 00000000..252b73c2 --- /dev/null +++ b/modules/48-conditionals/70-match/es/EXERCISE.md @@ -0,0 +1,23 @@ + +Implementa una función `calculateDeliveryCost()` que reciba el país de entrega y el peso del paquete en kilogramos. La función debe devolver el costo de la entrega. + +Cada país tiene dos tarifas: una para paquetes de hasta 1 kg inclusive y otra para paquetes más pesados: + +* `'canada'`: 600 para paquetes de hasta 1 kg, 900 para el resto +* `'usa'`: 800 para paquetes de hasta 1 kg, 1200 para el resto +* `'germany'`: 700 para paquetes de hasta 1 kg, 1000 para el resto + +Si el país es desconocido, la función debe devolver `null`. + +Ejemplos de llamada de la función: + +```php +` puede ir cualquier expresión, incluido el operador ternario. diff --git a/modules/48-conditionals/70-match/es/README.md b/modules/48-conditionals/70-match/es/README.md new file mode 100644 index 00000000..4a6265e8 --- /dev/null +++ b/modules/48-conditionals/70-match/es/README.md @@ -0,0 +1,78 @@ +La estructura `switch` de la lección anterior no es la única versión especializada de `if` en PHP. A partir de PHP 8, el lenguaje cuenta con la expresión `match`. También se debe usar donde hay una cadena de `if else` con comprobaciones de igualdad: + +```php + 'El pedido está en proceso', // $status === 'processing' + 'paid' => 'El pedido está pagado', // $status === 'paid' + 'new' => 'Pedido nuevo', // $status === 'new' + default => 'Estado desconocido', // else +}; +``` + +```text +match (valor) { + │ + ├── 'a' → resultado 1 + ├── 'b' → resultado 2 + ├── 'c' → resultado 3 + └── default → resultado por defecto +} +``` + +En cuanto al número de elementos, `match` es una estructura compleja. La descripción externa incluye la palabra clave `match` y la variable cuyos valores usa `match` para elegir el comportamiento. Dentro hay ramas, cada una de las cuales describe el resultado para uno de los valores de la variable. Cada rama corresponde a un `if` del ejemplo anterior. La rama `default` es un caso especial que corresponde a la rama `else` de las estructuras condicionales. + +La principal diferencia entre `match` y tanto `switch` como un `if` normal es que se trata de una **expresión**. Toda la estructura se evalúa a un valor, por lo que su resultado se puede asignar directamente a una variable o devolver desde una función. No se necesita ningún `break`: se ejecuta exactamente una rama y aquí es imposible la caída en cascada. + +Dentro de `match` solo se permite la sintaxis mostrada arriba. A la izquierda de la flecha `=>` se indica el valor a comparar, y a la derecha, la expresión que se convertirá en el resultado. Si varios valores llevan al mismo resultado, se enumeran separados por comas: + +```php + 'small', + 'm' => 'medium', + 'l', 'xl' => 'large', +}; +``` + +Hay otras diferencias con respecto a `switch`: + +* `match` compara los valores de forma estricta, como el operador `===`. En cambio, `switch` usa la comparación no estricta `==`, que realiza una conversión automática de tipos. +* Si ninguna rama coincide y no se especifica `default`, el programa termina con un error `UnhandledMatchError`. En la misma situación, `switch` simplemente no haría nada. + +A menudo el resultado de `match` debe devolverse desde la función que lo contiene. Para ello, se coloca un `return` normal antes de `match`: + +```php + 'one', + 2 => 'two', + default => null, + }; +} + +print_r(countItems(2)); // => two +``` + +Aunque la expresión `match` aparece en el código, técnicamente siempre se puede prescindir de ella. Su beneficio clave es que expresa mejor la intención del programador cuando hay que comprobar valores concretos de una variable. Ese código es más fácil de leer que los bloques `elseif`. diff --git a/modules/48-conditionals/70-match/es/data.yml b/modules/48-conditionals/70-match/es/data.yml new file mode 100644 index 00000000..a0497120 --- /dev/null +++ b/modules/48-conditionals/70-match/es/data.yml @@ -0,0 +1,5 @@ +--- +name: Expresión match +tips: + - | + [match](https://www.php.net/manual/es/control-structures.match.php) diff --git a/modules/48-conditionals/70-match/index.php b/modules/48-conditionals/70-match/index.php new file mode 100644 index 00000000..cf95fdb6 --- /dev/null +++ b/modules/48-conditionals/70-match/index.php @@ -0,0 +1,15 @@ + $weight <= 1 ? 600 : 900, + 'usa' => $weight <= 1 ? 800 : 1200, + 'germany' => $weight <= 1 ? 700 : 1000, + default => null, + }; +} +// END diff --git a/modules/48-conditionals/70-match/ru/EXERCISE.md b/modules/48-conditionals/70-match/ru/EXERCISE.md new file mode 100644 index 00000000..068cf120 --- /dev/null +++ b/modules/48-conditionals/70-match/ru/EXERCISE.md @@ -0,0 +1,23 @@ + +Реализуйте функцию `calculateDeliveryCost()`, которая принимает страну доставки и вес посылки в килограммах. Функция должна вернуть стоимость доставки. + +Для каждой страны есть два тарифа: для посылок весом до 1 кг включительно и для более тяжелых посылок: + +* `'canada'`: 600 для посылок до 1 кг, 900 для остальных +* `'usa'`: 800 для посылок до 1 кг, 1200 для остальных +* `'germany'`: 700 для посылок до 1 кг, 1000 для остальных + +Если страна неизвестна, функция должна вернуть `null`. + +Примеры вызова функции: + +```php +` может стоять любое выражение, в том числе тернарный оператор. diff --git a/modules/48-conditionals/70-match/ru/README.md b/modules/48-conditionals/70-match/ru/README.md new file mode 100644 index 00000000..4f54a3c2 --- /dev/null +++ b/modules/48-conditionals/70-match/ru/README.md @@ -0,0 +1,78 @@ +Конструкция `switch` из прошлого урока — не единственная специализированная версия `if` в PHP. Начиная с PHP 8 в языке есть выражение `match`. Его тоже нужно использовать там, где есть цепочка `if else` с проверками на равенство: + +```php + 'Заказ в обработке', // $status === 'processing' + 'paid' => 'Заказ оплачен', // $status === 'paid' + 'new' => 'Новый заказ', // $status === 'new' + default => 'Неизвестный статус', // else +}; +``` + +```text +match (значение) { + │ + ├── 'a' → результат 1 + ├── 'b' → результат 2 + ├── 'c' → результат 3 + └── default → результат по умолчанию +} +``` + +С точки зрения количества элементов `match` является сложной конструкцией. Внешнее описание включает ключевое слово `match` и переменную, по значениям которой `match` будет выбирать поведение. Внутри расположены ветки, каждая из которых описывает результат для одного из значений переменной. Каждая ветка соответствует `if` в примере выше. При этом `default` является особой ситуацией, которая соответствует ветке `else` в условных конструкциях. + +Главное отличие `match` от `switch` и обычного `if` в том, что это **выражение**. Вся конструкция вычисляется в значение, поэтому ее результат можно сразу присвоить переменной или вернуть из функции. Никаких `break` не нужно: выполняется ровно одна ветка, «проваливание» здесь невозможно. + +Внутри `match` допустим только тот синтаксис, который показан выше. Слева от стрелки `=>` указывается значение для сравнения, справа — выражение, которое станет результатом. Если одному результату соответствует несколько значений, они перечисляются через запятую: + +```php + 'small', + 'm' => 'medium', + 'l', 'xl' => 'large', +}; +``` + +Есть и другие отличия от `switch`: + +* `match` сравнивает значения строго, как оператор `===`. А вот `switch` использует нестрогое сравнение `==`, при котором происходит автоматическое преобразование типов. +* Если ни одна ветка не совпала и `default` не указан, программа завершится с ошибкой `UnhandledMatchError`. `switch` в такой ситуации просто ничего не сделает. + +Часто результат `match` нужно вернуть из функции, которая его содержит. Для этого перед `match` ставится обычный `return`: + +```php + 'one', + 2 => 'two', + default => null, + }; +} + +print_r(countItems(2)); // => two +``` + +Выражение `match` хоть и встречается в коде, но технически всегда можно обойтись без него. Ключевая польза при его использовании в том, что он лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. Такой код читать легче, чем блоки `elseif`. diff --git a/modules/48-conditionals/70-match/ru/data.yml b/modules/48-conditionals/70-match/ru/data.yml new file mode 100644 index 00000000..b3972cc5 --- /dev/null +++ b/modules/48-conditionals/70-match/ru/data.yml @@ -0,0 +1,6 @@ +--- +name: Выражение match +tips: + - | + [match](https://www.php.net/manual/ru/control-structures.match.php) +definitions: [] From b35ae41301d70584b6256336971edccbac067c57 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 5 Jun 2026 23:28:10 +0500 Subject: [PATCH 10/29] =?UTF-8?q?feat(50-loops):=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20Python?= =?UTF-8?q?=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 23/25/26/30/55/70: теория доведена до паритета с Python (схемы, переворот строки, работа по шагам, нейтральный элемент) - rename 30-syntax-sugar → 30-syntactic-sugar, 55-return-from-loop → 55-return-from-loops (namespace SyntacticSugar/ReturnFromLoops) - delete 28-build-strings (дублирует 23-aggregation-strings) - add 80-for-in-range: foreach + range() с PHP-семантикой включения границ; задание FizzBuzz; RU/EN/ES - add 90-debug: отладка, stack trace, типы ошибок, отладочная печать (сообщения PHP 8.4 проверены запуском); задание compress RLE; RU/EN/ES - задания 10/30/55/70 выровнены с Python (printCountdown, buildProgressBar, hasAtSymbol, normalizeFilename) - решения переведены на объявления типов (паттерн из 45-logic) - 29-edge-cases и 50-mutators не тронуты (29 заберет сессия бонусов) Co-Authored-By: Claude Opus 4.8 (1M context) --- modules/50-loops/10-while/SolutionTest.php | 4 +- modules/50-loops/10-while/index.php | 6 +- modules/50-loops/10-while/ru/EXERCISE.md | 18 +-- .../50-loops/20-aggregation-numbers/index.php | 2 +- .../20-aggregation-numbers/ru/README.md | 52 +++--- .../50-loops/23-aggregation-strings/index.php | 2 +- .../23-aggregation-strings/ru/README.md | 28 +++- .../25-iteration-over-string/index.php | 2 +- .../25-iteration-over-string/ru/README.md | 37 ++++- .../26-conditions-inside-loops/index.php | 2 +- .../26-conditions-inside-loops/ru/README.md | 71 +++++++- .../ru/assets/conditions-inside-loops.png | Bin 0 -> 89259 bytes .../28-build-strings/SolutionTest.php | 17 -- .../28-build-strings/description.es.yml | 65 -------- .../50-loops/28-build-strings/en/EXERCISE.md | 15 -- .../50-loops/28-build-strings/en/README.md | 42 ----- modules/50-loops/28-build-strings/en/data.yml | 2 - .../50-loops/28-build-strings/es/EXERCISE.md | 14 -- .../50-loops/28-build-strings/es/README.md | 43 ----- modules/50-loops/28-build-strings/es/data.yml | 3 - modules/50-loops/28-build-strings/index.php | 18 --- .../50-loops/28-build-strings/ru/EXERCISE.md | 13 -- .../50-loops/28-build-strings/ru/README.md | 42 ----- modules/50-loops/28-build-strings/ru/data.yml | 3 - .../Makefile | 0 .../30-syntactic-sugar/SolutionTest.php | 17 ++ .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 modules/50-loops/30-syntactic-sugar/index.php | 22 +++ .../30-syntactic-sugar/ru/EXERCISE.md | 16 ++ .../50-loops/30-syntactic-sugar/ru/README.md | 71 ++++++++ .../ru/data.yml | 0 .../50-loops/30-syntax-sugar/SolutionTest.php | 20 --- modules/50-loops/30-syntax-sugar/index.php | 22 --- .../50-loops/30-syntax-sugar/ru/EXERCISE.md | 10 -- modules/50-loops/30-syntax-sugar/ru/README.md | 12 -- .../55-return-from-loop/SolutionTest.php | 17 -- .../50-loops/55-return-from-loop/index.php | 21 --- .../55-return-from-loop/ru/EXERCISE.md | 16 -- .../Makefile | 0 .../55-return-from-loops/SolutionTest.php | 18 +++ .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../50-loops/55-return-from-loops/index.php | 19 +++ .../55-return-from-loops/ru/EXERCISE.md | 12 ++ .../ru/README.md | 37 ++++- .../ru/data.yml | 0 modules/50-loops/70-for/SolutionTest.php | 7 +- modules/50-loops/70-for/index.php | 22 +-- modules/50-loops/70-for/ru/EXERCISE.md | 18 +-- modules/50-loops/70-for/ru/README.md | 87 +++++++++- .../Makefile | 0 .../50-loops/80-for-in-range/SolutionTest.php | 18 +++ .../80-for-in-range/description.es.yml | 111 +++++++++++++ .../50-loops/80-for-in-range/en/EXERCISE.md | 28 ++++ modules/50-loops/80-for-in-range/en/README.md | 74 +++++++++ modules/50-loops/80-for-in-range/en/data.yml | 5 + .../50-loops/80-for-in-range/es/EXERCISE.md | 28 ++++ modules/50-loops/80-for-in-range/es/README.md | 74 +++++++++ modules/50-loops/80-for-in-range/es/data.yml | 5 + modules/50-loops/80-for-in-range/index.php | 30 ++++ .../50-loops/80-for-in-range/ru/EXERCISE.md | 28 ++++ modules/50-loops/80-for-in-range/ru/README.md | 74 +++++++++ modules/50-loops/80-for-in-range/ru/data.yml | 6 + modules/50-loops/90-debug/Makefile | 2 + modules/50-loops/90-debug/SolutionTest.php | 20 +++ modules/50-loops/90-debug/description.es.yml | 153 ++++++++++++++++++ modules/50-loops/90-debug/en/EXERCISE.md | 23 +++ modules/50-loops/90-debug/en/README.md | 123 ++++++++++++++ modules/50-loops/90-debug/en/data.yml | 3 + modules/50-loops/90-debug/es/EXERCISE.md | 23 +++ modules/50-loops/90-debug/es/README.md | 123 ++++++++++++++ modules/50-loops/90-debug/es/data.yml | 3 + modules/50-loops/90-debug/index.php | 34 ++++ modules/50-loops/90-debug/ru/EXERCISE.md | 23 +++ modules/50-loops/90-debug/ru/README.md | 123 ++++++++++++++ modules/50-loops/90-debug/ru/data.yml | 4 + 87 files changed, 1618 insertions(+), 485 deletions(-) create mode 100644 modules/50-loops/26-conditions-inside-loops/ru/assets/conditions-inside-loops.png delete mode 100644 modules/50-loops/28-build-strings/SolutionTest.php delete mode 100644 modules/50-loops/28-build-strings/description.es.yml delete mode 100644 modules/50-loops/28-build-strings/en/EXERCISE.md delete mode 100644 modules/50-loops/28-build-strings/en/README.md delete mode 100644 modules/50-loops/28-build-strings/en/data.yml delete mode 100644 modules/50-loops/28-build-strings/es/EXERCISE.md delete mode 100644 modules/50-loops/28-build-strings/es/README.md delete mode 100644 modules/50-loops/28-build-strings/es/data.yml delete mode 100644 modules/50-loops/28-build-strings/index.php delete mode 100644 modules/50-loops/28-build-strings/ru/EXERCISE.md delete mode 100644 modules/50-loops/28-build-strings/ru/README.md delete mode 100644 modules/50-loops/28-build-strings/ru/data.yml rename modules/50-loops/{28-build-strings => 30-syntactic-sugar}/Makefile (100%) create mode 100644 modules/50-loops/30-syntactic-sugar/SolutionTest.php rename modules/50-loops/{30-syntax-sugar => 30-syntactic-sugar}/description.es.yml (100%) rename modules/50-loops/{30-syntax-sugar => 30-syntactic-sugar}/en/EXERCISE.md (100%) rename modules/50-loops/{30-syntax-sugar => 30-syntactic-sugar}/en/README.md (100%) rename modules/50-loops/{30-syntax-sugar => 30-syntactic-sugar}/en/data.yml (100%) rename modules/50-loops/{30-syntax-sugar => 30-syntactic-sugar}/es/EXERCISE.md (100%) rename modules/50-loops/{30-syntax-sugar => 30-syntactic-sugar}/es/README.md (100%) rename modules/50-loops/{30-syntax-sugar => 30-syntactic-sugar}/es/data.yml (100%) create mode 100644 modules/50-loops/30-syntactic-sugar/index.php create mode 100644 modules/50-loops/30-syntactic-sugar/ru/EXERCISE.md create mode 100644 modules/50-loops/30-syntactic-sugar/ru/README.md rename modules/50-loops/{30-syntax-sugar => 30-syntactic-sugar}/ru/data.yml (100%) delete mode 100644 modules/50-loops/30-syntax-sugar/SolutionTest.php delete mode 100644 modules/50-loops/30-syntax-sugar/index.php delete mode 100644 modules/50-loops/30-syntax-sugar/ru/EXERCISE.md delete mode 100644 modules/50-loops/30-syntax-sugar/ru/README.md delete mode 100644 modules/50-loops/55-return-from-loop/SolutionTest.php delete mode 100644 modules/50-loops/55-return-from-loop/index.php delete mode 100644 modules/50-loops/55-return-from-loop/ru/EXERCISE.md rename modules/50-loops/{30-syntax-sugar => 55-return-from-loops}/Makefile (100%) create mode 100644 modules/50-loops/55-return-from-loops/SolutionTest.php rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/description.es.yml (100%) rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/en/EXERCISE.md (100%) rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/en/README.md (100%) rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/en/data.yml (100%) rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/es/EXERCISE.md (100%) rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/es/README.md (100%) rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/es/data.yml (100%) create mode 100644 modules/50-loops/55-return-from-loops/index.php create mode 100644 modules/50-loops/55-return-from-loops/ru/EXERCISE.md rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/ru/README.md (51%) rename modules/50-loops/{55-return-from-loop => 55-return-from-loops}/ru/data.yml (100%) rename modules/50-loops/{55-return-from-loop => 80-for-in-range}/Makefile (100%) create mode 100644 modules/50-loops/80-for-in-range/SolutionTest.php create mode 100644 modules/50-loops/80-for-in-range/description.es.yml create mode 100644 modules/50-loops/80-for-in-range/en/EXERCISE.md create mode 100644 modules/50-loops/80-for-in-range/en/README.md create mode 100644 modules/50-loops/80-for-in-range/en/data.yml create mode 100644 modules/50-loops/80-for-in-range/es/EXERCISE.md create mode 100644 modules/50-loops/80-for-in-range/es/README.md create mode 100644 modules/50-loops/80-for-in-range/es/data.yml create mode 100644 modules/50-loops/80-for-in-range/index.php create mode 100644 modules/50-loops/80-for-in-range/ru/EXERCISE.md create mode 100644 modules/50-loops/80-for-in-range/ru/README.md create mode 100644 modules/50-loops/80-for-in-range/ru/data.yml create mode 100644 modules/50-loops/90-debug/Makefile create mode 100644 modules/50-loops/90-debug/SolutionTest.php create mode 100644 modules/50-loops/90-debug/description.es.yml create mode 100644 modules/50-loops/90-debug/en/EXERCISE.md create mode 100644 modules/50-loops/90-debug/en/README.md create mode 100644 modules/50-loops/90-debug/en/data.yml create mode 100644 modules/50-loops/90-debug/es/EXERCISE.md create mode 100644 modules/50-loops/90-debug/es/README.md create mode 100644 modules/50-loops/90-debug/es/data.yml create mode 100644 modules/50-loops/90-debug/index.php create mode 100644 modules/50-loops/90-debug/ru/EXERCISE.md create mode 100644 modules/50-loops/90-debug/ru/README.md create mode 100644 modules/50-loops/90-debug/ru/data.yml diff --git a/modules/50-loops/10-while/SolutionTest.php b/modules/50-loops/10-while/SolutionTest.php index 5d790409..4c7fb0c1 100644 --- a/modules/50-loops/10-while/SolutionTest.php +++ b/modules/50-loops/10-while/SolutionTest.php @@ -10,8 +10,8 @@ public function test() { require 'index.php'; - $expected = "3\n2\n1\nfinished!"; + $expected = "4\n3\n2\n1\nGo!"; $this->expectOutputString($expected); - printNumbers(3); + printCountdown(4); } } diff --git a/modules/50-loops/10-while/index.php b/modules/50-loops/10-while/index.php index 5f2aa2be..ad81e528 100644 --- a/modules/50-loops/10-while/index.php +++ b/modules/50-loops/10-while/index.php @@ -2,14 +2,14 @@ namespace HexletBasics\Loops\WhileLoop; -function printNumbers($firstNumber) +function printCountdown(int $seconds): void { // BEGIN - $i = $firstNumber; + $i = $seconds; while ($i >= 1) { print_r("{$i}\n"); $i = $i - 1; } - print_r('finished!'); + print_r('Go!'); // END } diff --git a/modules/50-loops/10-while/ru/EXERCISE.md b/modules/50-loops/10-while/ru/EXERCISE.md index 17badff6..1ffeda83 100644 --- a/modules/50-loops/10-while/ru/EXERCISE.md +++ b/modules/50-loops/10-while/ru/EXERCISE.md @@ -1,16 +1,14 @@ -Модифицируйте функцию `printNumbers()` так, чтобы она выводила числа в обратном порядке. Для этого нужно идти от верхней границы к нижней. То есть, счетчик должен быть инициализирован максимальным значением, а в теле цикла его нужно уменьшать до нижней границы. +Напишите функцию `printCountdown()`, которая имитирует обратный отсчет перед стартом. Функция принимает количество секунд и печатает числа от этого значения до `1`. +После завершения отсчета функция должна вывести на экран строку `Go!`. ```php 4 +// => 3 +// => 2 +// => 1 +// => Go! ``` diff --git a/modules/50-loops/20-aggregation-numbers/index.php b/modules/50-loops/20-aggregation-numbers/index.php index e6ce3b10..b646e63d 100644 --- a/modules/50-loops/20-aggregation-numbers/index.php +++ b/modules/50-loops/20-aggregation-numbers/index.php @@ -3,7 +3,7 @@ namespace HexletBasics\Loops\AgregationNumber; // BEGIN -function multiplyNumbersFromRange($start, $finish) +function multiplyNumbersFromRange(int $start, int $finish): int { $i = $start; $result = 1; diff --git a/modules/50-loops/20-aggregation-numbers/ru/README.md b/modules/50-loops/20-aggregation-numbers/ru/README.md index ab1f1dc5..309c23ff 100644 --- a/modules/50-loops/20-aggregation-numbers/ru/README.md +++ b/modules/50-loops/20-aggregation-numbers/ru/README.md @@ -32,23 +32,23 @@ sumNumbersFromRange(100, 100); // 100 ```php abc +print_r('abc' . ''); // => abc +``` + +Поэтому именно пустая строка всегда используется как начальное значение при агрегации строк. diff --git a/modules/50-loops/25-iteration-over-string/index.php b/modules/50-loops/25-iteration-over-string/index.php index 13bd7ef1..a2889972 100644 --- a/modules/50-loops/25-iteration-over-string/index.php +++ b/modules/50-loops/25-iteration-over-string/index.php @@ -3,7 +3,7 @@ namespace HexletBasics\Loops\IterationOverString; // BEGIN -function printReversedWordBySymbol($word) +function printReversedWordBySymbol(string $word): void { $i = strlen($word) - 1; while ($i >= 0) { diff --git a/modules/50-loops/25-iteration-over-string/ru/README.md b/modules/50-loops/25-iteration-over-string/ru/README.md index 40e5237c..cd207491 100644 --- a/modules/50-loops/25-iteration-over-string/ru/README.md +++ b/modules/50-loops/25-iteration-over-string/ru/README.md @@ -3,7 +3,7 @@ ```php 'a' ``` +Цикл проходит по каждому символу строки по очереди: + +```text +'Arya' + │ │ │ │ + A r y a + ↓ ↓ ↓ ↓ +каждый символ обрабатывается по очереди +``` Самое главное в этом коде — поставить правильное условие в `while`. Это можно сделать сразу двумя способами: @@ -31,3 +40,29 @@ printNameBySymbol($name); * `$i <= strlen($name) - 1` Оба способа приводят к одному результату. + +## Переворот строки + +Вместо печати можно собирать новую строку. Например, напишем функцию, которая переворачивает строку: + +```php += 0) { + $result = $result . $text[$i]; + $i = $i - 1; + } + + return $result; +} + +print_r(reverseString('Arya') . "\n"); // => ayrA +print_r(reverseString('hexlet') . "\n"); // => telxeh +``` + +Переменная `$result` инициализируется пустой строкой как нейтральным элементом для конкатенации. Цикл начинается с последнего индекса (`strlen($text) - 1`), двигается к нулю и завершается, когда индекс становится меньше нуля. На каждом шаге к результату добавляется текущий символ. В итоге строка строится в обратном порядке. diff --git a/modules/50-loops/26-conditions-inside-loops/index.php b/modules/50-loops/26-conditions-inside-loops/index.php index 5caffcba..38094993 100644 --- a/modules/50-loops/26-conditions-inside-loops/index.php +++ b/modules/50-loops/26-conditions-inside-loops/index.php @@ -3,7 +3,7 @@ namespace HexletBasics\Loops\ConditionsInsideLoops; // BEGIN -function countChars($str, $char) +function countChars(string $str, string $char): int { $i = 0; $count = 0; diff --git a/modules/50-loops/26-conditions-inside-loops/ru/README.md b/modules/50-loops/26-conditions-inside-loops/ru/README.md index 47c7af57..dd567d33 100644 --- a/modules/50-loops/26-conditions-inside-loops/ru/README.md +++ b/modules/50-loops/26-conditions-inside-loops/ru/README.md @@ -1,7 +1,64 @@ +Тело цикла, как и тело функции — это место выполнения инструкций. Значит, мы можем использовать внутри него всё изученное ранее, например — условные конструкции. Так программа повторяет одно действие несколько раз, но на каждом повторе принимает решение. -Тело цикла, как и тело функции — это место выполнения инструкций. Значит, мы можем использовать внутри него всё изученное ранее, например — условные конструкции. +![Условия внутри цикла](./assets/conditions-inside-loops.png) -Представьте себе функцию, которая считает сколько раз входит буква в предложение. Пример её работы: +Пусть нужно пройти числа от `1` до `10` и напечатать только четные. Цикл перебирает все числа подряд, а условие внутри цикла решает, какие из них попадут на экран. + +Для перебора нужен счетчик. Он хранит текущее число и увеличивается после каждого повтора. Печатать число нужно только тогда, когда оно проходит проверку: + +```php + 2 +// => 4 +// => 6 +// => 8 +// => 10 +``` + +Цикл `while` перебирает числа от `1` до `10`. Условие внутри цикла проверяет текущее число. Если `$number % 2 === 0`, число делится на `2` без остатка, и программа выводит его на экран. + +Счетчик увеличивается после проверки в любом случае. Это важно. Если увеличивать `$number` только внутри `if`, цикл остановится на первом нечетном числе и будет работать бесконечно. + +## Работа по шагам + +Перед первым повтором `$number` равен `1`. + +**Шаг 1.** Условие цикла `$number <= 10` истинно, поэтому программа входит в тело цикла. Число `1` нечетное, блок `if` не выполняется. Затем `$number` увеличивается до `2`. + +**Шаг 2.** Условие цикла снова истинно. Число `2` четное, поэтому программа печатает `2`. Затем `$number` увеличивается до `3`. + +Дальше цикл продолжает проверять каждое число. Нечетные числа он пропускает, а четные выводит на экран. Когда `$number` станет равен `11`, условие `$number <= 10` станет ложным, и цикл завершится. + +## Условия меняют действие, а не движение + +В таких циклах удобно разделять две части. Счетчик переводит программу к следующему значению, а `if` решает, что делать с текущим значением. + +```php + 5) { + print_r("{$number}\n"); + } + $number = $number + 1; +} +``` + +Здесь цикл проходит тот же диапазон от `1` до `10`, но условие внутри другое. Поэтому программа печатает только числа больше `5`. + +## Агрегация с условием + +Условия внутри циклов отлично сочетаются с агрегацией. Представьте себе функцию, которая считает, сколько раз буква входит в предложение. Пример ее работы: ```php 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≠=P6qFPx6oG4$xBodc4gx5HBz*T7(w0EZ5yW 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'got', mysubstr('got', 3)); - $this->assertEquals('go', mysubstr('got', 2)); - $this->assertEquals('g', mysubstr('got', 1)); - } -} diff --git a/modules/50-loops/28-build-strings/description.es.yml b/modules/50-loops/28-build-strings/description.es.yml deleted file mode 100644 index 6db91722..00000000 --- a/modules/50-loops/28-build-strings/description.es.yml +++ /dev/null @@ -1,65 +0,0 @@ ---- - -name: Formación de cadenas en bucles -theory: | - Otro uso de los bucles es la formación de cadenas. Este tipo de tarea es común en la programación web. Se reduce a una simple agregación utilizando interpolación o concatenación. - - Hay una tarea muy popular en las entrevistas: **invertir una cadena**. Se puede resolver de muchas formas diferentes, pero el enfoque más básico es recorrerla carácter por carácter. - - Veamos un ejemplo de cómo funciona esta función: - - ```php - assertEquals('-----', buildProgressBar(0, 5)); + $this->assertEquals('###--', buildProgressBar(3, 5)); + $this->assertEquals('#####', buildProgressBar(5, 5)); + } +} diff --git a/modules/50-loops/30-syntax-sugar/description.es.yml b/modules/50-loops/30-syntactic-sugar/description.es.yml similarity index 100% rename from modules/50-loops/30-syntax-sugar/description.es.yml rename to modules/50-loops/30-syntactic-sugar/description.es.yml diff --git a/modules/50-loops/30-syntax-sugar/en/EXERCISE.md b/modules/50-loops/30-syntactic-sugar/en/EXERCISE.md similarity index 100% rename from modules/50-loops/30-syntax-sugar/en/EXERCISE.md rename to modules/50-loops/30-syntactic-sugar/en/EXERCISE.md diff --git a/modules/50-loops/30-syntax-sugar/en/README.md b/modules/50-loops/30-syntactic-sugar/en/README.md similarity index 100% rename from modules/50-loops/30-syntax-sugar/en/README.md rename to modules/50-loops/30-syntactic-sugar/en/README.md diff --git a/modules/50-loops/30-syntax-sugar/en/data.yml b/modules/50-loops/30-syntactic-sugar/en/data.yml similarity index 100% rename from modules/50-loops/30-syntax-sugar/en/data.yml rename to modules/50-loops/30-syntactic-sugar/en/data.yml diff --git a/modules/50-loops/30-syntax-sugar/es/EXERCISE.md b/modules/50-loops/30-syntactic-sugar/es/EXERCISE.md similarity index 100% rename from modules/50-loops/30-syntax-sugar/es/EXERCISE.md rename to modules/50-loops/30-syntactic-sugar/es/EXERCISE.md diff --git a/modules/50-loops/30-syntax-sugar/es/README.md b/modules/50-loops/30-syntactic-sugar/es/README.md similarity index 100% rename from modules/50-loops/30-syntax-sugar/es/README.md rename to modules/50-loops/30-syntactic-sugar/es/README.md diff --git a/modules/50-loops/30-syntax-sugar/es/data.yml b/modules/50-loops/30-syntactic-sugar/es/data.yml similarity index 100% rename from modules/50-loops/30-syntax-sugar/es/data.yml rename to modules/50-loops/30-syntactic-sugar/es/data.yml diff --git a/modules/50-loops/30-syntactic-sugar/index.php b/modules/50-loops/30-syntactic-sugar/index.php new file mode 100644 index 00000000..bcce92f9 --- /dev/null +++ b/modules/50-loops/30-syntactic-sugar/index.php @@ -0,0 +1,22 @@ + 15 +``` + +Без сокращений тело цикла было бы длиннее: + +```php +assertEquals('f look back am lost', $result1); - - $result2 = filterString('zz zorro', 'z'); - $this->assertEquals(' orro', $result2); - } -} diff --git a/modules/50-loops/30-syntax-sugar/index.php b/modules/50-loops/30-syntax-sugar/index.php deleted file mode 100644 index 7063b878..00000000 --- a/modules/50-loops/30-syntax-sugar/index.php +++ /dev/null @@ -1,22 +0,0 @@ -assertTrue(hasChar('Hexlet', 'H')); - $this->assertFalse(hasChar('Hexlet', 'h')); - $this->assertTrue(hasChar('Awesomeness', 'm')); - $this->assertFalse(hasChar('Awesomeness', 'd')); - } -} diff --git a/modules/50-loops/55-return-from-loop/index.php b/modules/50-loops/55-return-from-loop/index.php deleted file mode 100644 index 6f27833a..00000000 --- a/modules/50-loops/55-return-from-loop/index.php +++ /dev/null @@ -1,21 +0,0 @@ -assertTrue(hasAtSymbol('support@example.com')); + $this->assertFalse(hasAtSymbol('wrong-email')); + $this->assertTrue(hasAtSymbol('@admin')); + $this->assertTrue(hasAtSymbol('admin@')); + } +} diff --git a/modules/50-loops/55-return-from-loop/description.es.yml b/modules/50-loops/55-return-from-loops/description.es.yml similarity index 100% rename from modules/50-loops/55-return-from-loop/description.es.yml rename to modules/50-loops/55-return-from-loops/description.es.yml diff --git a/modules/50-loops/55-return-from-loop/en/EXERCISE.md b/modules/50-loops/55-return-from-loops/en/EXERCISE.md similarity index 100% rename from modules/50-loops/55-return-from-loop/en/EXERCISE.md rename to modules/50-loops/55-return-from-loops/en/EXERCISE.md diff --git a/modules/50-loops/55-return-from-loop/en/README.md b/modules/50-loops/55-return-from-loops/en/README.md similarity index 100% rename from modules/50-loops/55-return-from-loop/en/README.md rename to modules/50-loops/55-return-from-loops/en/README.md diff --git a/modules/50-loops/55-return-from-loop/en/data.yml b/modules/50-loops/55-return-from-loops/en/data.yml similarity index 100% rename from modules/50-loops/55-return-from-loop/en/data.yml rename to modules/50-loops/55-return-from-loops/en/data.yml diff --git a/modules/50-loops/55-return-from-loop/es/EXERCISE.md b/modules/50-loops/55-return-from-loops/es/EXERCISE.md similarity index 100% rename from modules/50-loops/55-return-from-loop/es/EXERCISE.md rename to modules/50-loops/55-return-from-loops/es/EXERCISE.md diff --git a/modules/50-loops/55-return-from-loop/es/README.md b/modules/50-loops/55-return-from-loops/es/README.md similarity index 100% rename from modules/50-loops/55-return-from-loop/es/README.md rename to modules/50-loops/55-return-from-loops/es/README.md diff --git a/modules/50-loops/55-return-from-loop/es/data.yml b/modules/50-loops/55-return-from-loops/es/data.yml similarity index 100% rename from modules/50-loops/55-return-from-loop/es/data.yml rename to modules/50-loops/55-return-from-loops/es/data.yml diff --git a/modules/50-loops/55-return-from-loops/index.php b/modules/50-loops/55-return-from-loops/index.php new file mode 100644 index 00000000..d8f02810 --- /dev/null +++ b/modules/50-loops/55-return-from-loops/index.php @@ -0,0 +1,19 @@ + bool(false) +var_dump(isPrime(2)); // => bool(true) +var_dump(isPrime(3)); // => bool(true) +var_dump(isPrime(4)); // => bool(false) +``` + +*Если быть честными до конца, то для решения задачи хватит проверки чисел до значения квадратного корня `$number`, но в нашем случае важно сосредоточиться на понимании работы с условиями внутри цикла.* + +```text +while (...) { + if (условие) { + return значение; ← выход из функции (и из цикла) + } + ... +} +───────────────────────── +Без return цикл продолжается до конца ``` Алгоритм построен таким образом, что если во время последовательного деления на числа до `x / 2` находится хоть одно, которое делит без остатка, то переданный аргумент — не простое число, а значит дальнейшие вычисления не имеют смысла. В этом месте стоит возврат `false`. diff --git a/modules/50-loops/55-return-from-loop/ru/data.yml b/modules/50-loops/55-return-from-loops/ru/data.yml similarity index 100% rename from modules/50-loops/55-return-from-loop/ru/data.yml rename to modules/50-loops/55-return-from-loops/ru/data.yml diff --git a/modules/50-loops/70-for/SolutionTest.php b/modules/50-loops/70-for/SolutionTest.php index fff2a459..04b71433 100644 --- a/modules/50-loops/70-for/SolutionTest.php +++ b/modules/50-loops/70-for/SolutionTest.php @@ -10,8 +10,9 @@ public function test() { require 'index.php'; - $this->assertEquals(1, sumOfSeries(1, 1)); - $this->assertEquals(3, sumOfSeries(1, 2)); - $this->assertEquals(24, sumOfSeries(7, 9)); + $this->assertEquals('my_photo.png', normalizeFilename('my photo.png')); + $this->assertEquals('final_report.pdf', normalizeFilename('final report.pdf')); + $this->assertEquals('already_ready.txt', normalizeFilename('already_ready.txt')); + $this->assertEquals('two__spaces.txt', normalizeFilename('two spaces.txt')); } } diff --git a/modules/50-loops/70-for/index.php b/modules/50-loops/70-for/index.php index 50eafea6..2890e4e3 100644 --- a/modules/50-loops/70-for/index.php +++ b/modules/50-loops/70-for/index.php @@ -3,20 +3,20 @@ namespace HexletBasics\Loops\ForLoop; // BEGIN -function sumOfSeries($start, $finish) +function normalizeFilename(string $filename): string { - /* - * Note: we create a new variable here, - * rather than use the argument as a counter. - * Counter will be changing as the function works, - * and changing arguments is considered harmful. - */ + $result = ''; - $sum = 0; - for ($i = $start; $i <= $finish; $i++) { - $sum += $i; + for ($i = 0; $i < strlen($filename); $i += 1) { + $currentChar = $filename[$i]; + + if ($currentChar === ' ') { + $result .= '_'; + } else { + $result .= $currentChar; + } } - return $sum; + return $result; } // END diff --git a/modules/50-loops/70-for/ru/EXERCISE.md b/modules/50-loops/70-for/ru/EXERCISE.md index 36ffaad0..2ccb6c43 100644 --- a/modules/50-loops/70-for/ru/EXERCISE.md +++ b/modules/50-loops/70-for/ru/EXERCISE.md @@ -1,20 +1,12 @@ -Реализуйте функцию `sumOfSeries()`, которая считает сумму [ряда целых чисел](https://ru.wikipedia.org/wiki/Числовой_ряд). Ряд задаётся двумя числами — начальным и конечным. +Реализуйте функцию `normalizeFilename()`, которая подготавливает имя файла для сохранения. Функция принимает строку и возвращает новую строку, где все пробелы заменены на символ `_`. -Функция принимает два аргумента-числа и возвращает сумму ряда. Например, для аргументов `4` и `7` сумма будет `4 + 5 + 6 + 7 = 22`. +Пример вызова: ```php !og ``` Этот код можно прочитать так: > Цикл с индексом `$i` повторяется, пока соблюдается условие `$i < strlen($str)`, и после каждого шага `$i` увеличивается на 1 -Посмотрим, что находится в круглых скобках: +Разберем подробно, как отрабатывает цикл в примере выше на каждом шаге итераций: -1. Начальное значение счетчика — этот код выполняется ровно один раз перед первой итерацией -2. Предикат (условие повторения циклов) — выполняется на каждой итерации, как и в `while` -3. Описание изменения счетчика — этот код выполняется в конце каждой итерации +```text +reverseString('go!') -В остальном принцип работы точно такой же, как у цикла `while`. +до цикла: result = '' + +1 итерация: currentChar = 'g' +result = currentChar . result + = 'g' . '' + = 'g' + +2 итерация: currentChar = 'o' +result = currentChar . result + = 'o' . 'g' + = 'og' + +3 итерация: currentChar = '!' +result = currentChar . result + = '!' . 'og' + = '!og' +``` + +Теперь посчитаем количество упоминаний символа в строке без учета регистра: + +```php +assertEquals('1', fizzbuzz(1)); + $this->assertEquals('1 2 Fizz', fizzbuzz(3)); + $this->assertEquals('1 2 Fizz 4 Buzz', fizzbuzz(5)); + $this->assertEquals('1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz', fizzbuzz(15)); + } +} diff --git a/modules/50-loops/80-for-in-range/description.es.yml b/modules/50-loops/80-for-in-range/description.es.yml new file mode 100644 index 00000000..984b7f24 --- /dev/null +++ b/modules/50-loops/80-for-in-range/description.es.yml @@ -0,0 +1,111 @@ +--- + +name: Bucle foreach y función range +theory: | + Imagina que tenemos una serie de números del 0 al 9. Queremos sumar estos números. Podríamos hacerlo así: + + ```php + 45 + ``` + + Podemos reescribir este código usando el bucle `foreach` y la función `range()`: + + ```php + 45 + ``` + + La función `range()` crea una secuencia de números dentro de un rango determinado. La llamada `range(0, 9)` devuelve un conjunto de números del 0 al 9. El bucle `foreach` recorre este conjunto: en cada iteración escribe el siguiente número en la variable indicada después de la palabra clave `as` y ejecuta el cuerpo del bucle. + + No se necesita ningún contador. El bucle `foreach` sabe por sí mismo cuándo detenerse: cuando se acaban los números del conjunto. Por eso aquí es imposible olvidarse de cambiar el contador y obtener un bucle infinito. + + La función `range()` admite varias formas de llamada. La forma `range(start, end)` crea una secuencia desde `start` hasta `end`. Ten en cuenta que en PHP el valor final está **incluido** en el rango — en muchos otros lenguajes no es así. La forma `range(start, end, step)` crea una secuencia con el paso `step`. + + Las variantes de `range()` se ven así: + + ```text + range(1, 5) → 1, 2, 3, 4, 5 + range(0, 3) → 0, 1, 2, 3 + range(0, 10, 2) → 0, 2, 4, 6, 8, 10 + └── ambos extremos incluidos + ``` + + El ejemplo de la suma lo vimos arriba. Veamos otro: imprimir los números del 1 al 3: + + ```php + 1 + // => 2 + // => 3 + ``` + + Ahora intentemos mostrar los números en orden inverso. Si el inicio del rango es mayor que el final, `range()` construye por sí mismo una secuencia descendente: + + ```php + 3 + // => 2 + // => 1 + ``` + + La estructura `foreach` con la función `range()` es la forma más corta de recorrer un rango de números. Cuando se necesita control total sobre el contador, por ejemplo para cambiarlo según una regla compleja, los bucles `for` y `while` acuden al rescate. + +instructions: | + FizzBuzz es una de las tareas de entrevista más famosas para programadores principiantes. Se utiliza para comprobar la habilidad de trabajar con bucles y condiciones. Implementa una función `fizzbuzz()` que devuelva una cadena con los números del 1 a `$n`. + + Las reglas: + + - si un número es divisible por 3, se sustituye por la palabra `Fizz`, + - si un número es divisible por 5 — por la palabra `Buzz`, + - si es divisible por 3 y por 5 a la vez — por la palabra `FizzBuzz`. + + Todos los elementos deben unirse con un espacio. + + Esta tarea aparece a menudo en entrevistas de programación, por lo que es útil saber resolverla. + + Ejemplo de llamada de la función: + + ```php + 45 +``` + +We can rewrite this code using the `foreach` loop and the `range()` function: + +```php + 45 +``` + +The `range()` function creates a sequence of numbers within a specific range. The call `range(0, 9)` returns a set of numbers from 0 to 9. The `foreach` loop iterates over this set: on each iteration, it writes the next number into the variable specified after the `as` keyword and executes the loop body. + +No counter is needed. The `foreach` loop knows when to stop by itself — when the numbers in the set run out. So it is impossible to forget to change the counter and get an infinite loop here. + +The `range()` function supports several call variants. The form `range(start, end)` creates a sequence from `start` to `end`. Note that in PHP the end value is **included** in the range — in many other languages it is not. The form `range(start, end, step)` creates a sequence with the step `step`. + +The `range()` variants look like this: + +```text +range(1, 5) → 1, 2, 3, 4, 5 +range(0, 3) → 0, 1, 2, 3 +range(0, 10, 2) → 0, 2, 4, 6, 8, 10 + └── both ends are included +``` + +We covered the sum example above. Let's look at another one — printing the numbers from 1 to 3: + +```php + 1 +// => 2 +// => 3 +``` + +Now let's try to print the numbers in reverse order. If the start of the range is greater than the end, `range()` builds a descending sequence on its own: + +```php + 3 +// => 2 +// => 1 +``` + +The `foreach` construct with the `range()` function is the shortest way to walk over a range of numbers. When full control over the counter is needed, for example changing it by a complex rule, the `for` and `while` loops come to the rescue. diff --git a/modules/50-loops/80-for-in-range/en/data.yml b/modules/50-loops/80-for-in-range/en/data.yml new file mode 100644 index 00000000..779c31ac --- /dev/null +++ b/modules/50-loops/80-for-in-range/en/data.yml @@ -0,0 +1,5 @@ +--- +name: Foreach loop and range function +tips: + - | + [range](https://www.php.net/manual/en/function.range.php) diff --git a/modules/50-loops/80-for-in-range/es/EXERCISE.md b/modules/50-loops/80-for-in-range/es/EXERCISE.md new file mode 100644 index 00000000..8c836617 --- /dev/null +++ b/modules/50-loops/80-for-in-range/es/EXERCISE.md @@ -0,0 +1,28 @@ + +FizzBuzz es una de las tareas de entrevista más famosas para programadores principiantes. Se utiliza para comprobar la habilidad de trabajar con bucles y condiciones. Implementa una función `fizzbuzz()` que devuelva una cadena con los números del 1 a `$n`. + +Las reglas: + +- si un número es divisible por 3, se sustituye por la palabra `Fizz`, +- si un número es divisible por 5 — por la palabra `Buzz`, +- si es divisible por 3 y por 5 a la vez — por la palabra `FizzBuzz`. + +Todos los elementos deben unirse con un espacio. + +Esta tarea aparece a menudo en entrevistas de programación, por lo que es útil saber resolverla. + +Ejemplo de llamada de la función: + +```php + 45 +``` + +Podemos reescribir este código usando el bucle `foreach` y la función `range()`: + +```php + 45 +``` + +La función `range()` crea una secuencia de números dentro de un rango determinado. La llamada `range(0, 9)` devuelve un conjunto de números del 0 al 9. El bucle `foreach` recorre este conjunto: en cada iteración escribe el siguiente número en la variable indicada después de la palabra clave `as` y ejecuta el cuerpo del bucle. + +No se necesita ningún contador. El bucle `foreach` sabe por sí mismo cuándo detenerse: cuando se acaban los números del conjunto. Por eso aquí es imposible olvidarse de cambiar el contador y obtener un bucle infinito. + +La función `range()` admite varias formas de llamada. La forma `range(start, end)` crea una secuencia desde `start` hasta `end`. Ten en cuenta que en PHP el valor final está **incluido** en el rango — en muchos otros lenguajes no es así. La forma `range(start, end, step)` crea una secuencia con el paso `step`. + +Las variantes de `range()` se ven así: + +```text +range(1, 5) → 1, 2, 3, 4, 5 +range(0, 3) → 0, 1, 2, 3 +range(0, 10, 2) → 0, 2, 4, 6, 8, 10 + └── ambos extremos incluidos +``` + +El ejemplo de la suma lo vimos arriba. Veamos otro: imprimir los números del 1 al 3: + +```php + 1 +// => 2 +// => 3 +``` + +Ahora intentemos mostrar los números en orden inverso. Si el inicio del rango es mayor que el final, `range()` construye por sí mismo una secuencia descendente: + +```php + 3 +// => 2 +// => 1 +``` + +La estructura `foreach` con la función `range()` es la forma más corta de recorrer un rango de números. Cuando se necesita control total sobre el contador, por ejemplo para cambiarlo según una regla compleja, los bucles `for` y `while` acuden al rescate. diff --git a/modules/50-loops/80-for-in-range/es/data.yml b/modules/50-loops/80-for-in-range/es/data.yml new file mode 100644 index 00000000..e358111d --- /dev/null +++ b/modules/50-loops/80-for-in-range/es/data.yml @@ -0,0 +1,5 @@ +--- +name: Bucle foreach y función range +tips: + - | + [range](https://www.php.net/manual/es/function.range.php) diff --git a/modules/50-loops/80-for-in-range/index.php b/modules/50-loops/80-for-in-range/index.php new file mode 100644 index 00000000..154e24e0 --- /dev/null +++ b/modules/50-loops/80-for-in-range/index.php @@ -0,0 +1,30 @@ + 45 +``` + +Такой код мы можем переписать с помощью цикла `foreach` и функции `range()`: + +```php + 45 +``` + +Функция `range()` создает последовательность чисел внутри определенного диапазона. Вызов `range(0, 9)` возвращает набор чисел от 0 до 9. А цикл `foreach` перебирает этот набор: на каждой итерации он записывает очередное число в переменную, указанную после ключевого слова `as`, и выполняет тело цикла. + +Счетчик при этом не нужен. Цикл `foreach` сам знает, когда нужно остановиться — когда числа в наборе закончатся. Поэтому забыть изменить счетчик и получить бесконечный цикл здесь невозможно. + +Функция `range()` поддерживает несколько вариантов вызова. Форма `range(start, end)` создает последовательность от `start` до `end`. Обратите внимание: в PHP конечное значение **входит** в диапазон — во многих других языках это не так. Форма `range(start, end, step)` создает последовательность с шагом `step`. + +Наглядно варианты `range()` выглядят так: + +```text +range(1, 5) → 1, 2, 3, 4, 5 +range(0, 3) → 0, 1, 2, 3 +range(0, 10, 2) → 0, 2, 4, 6, 8, 10 + └── обе границы включены +``` + +Пример с суммой мы рассмотрели выше. Рассмотрим другой — распечатаем на экран числа от 1 до 3: + +```php + 1 +// => 2 +// => 3 +``` + +Теперь попробуем вывести числа в обратном порядке. Если начало диапазона больше конца, `range()` сам построит убывающую последовательность: + +```php + 3 +// => 2 +// => 1 +``` + +Конструкция `foreach` с функцией `range()` — самый короткий способ пройти по диапазону чисел. Когда же нужен полный контроль над счетчиком, например изменение по сложному правилу, на помощь приходят циклы `for` и `while`. diff --git a/modules/50-loops/80-for-in-range/ru/data.yml b/modules/50-loops/80-for-in-range/ru/data.yml new file mode 100644 index 00000000..5bfd10a0 --- /dev/null +++ b/modules/50-loops/80-for-in-range/ru/data.yml @@ -0,0 +1,6 @@ +--- +name: Цикл foreach и функция range +tips: + - | + [range](https://www.php.net/manual/ru/function.range.php) +definitions: [] diff --git a/modules/50-loops/90-debug/Makefile b/modules/50-loops/90-debug/Makefile new file mode 100644 index 00000000..d0d0a48c --- /dev/null +++ b/modules/50-loops/90-debug/Makefile @@ -0,0 +1,2 @@ +test: + @ test.sh diff --git a/modules/50-loops/90-debug/SolutionTest.php b/modules/50-loops/90-debug/SolutionTest.php new file mode 100644 index 00000000..9b5c05c1 --- /dev/null +++ b/modules/50-loops/90-debug/SolutionTest.php @@ -0,0 +1,20 @@ +assertEquals('a3bc4', compress('aaabcccc')); + $this->assertEquals('abcd', compress('abcd')); + $this->assertEquals('a2b2a2', compress('aabbaa')); + $this->assertEquals('a', compress('a')); + $this->assertEquals('', compress('')); + $this->assertEquals('z3', compress('zzz')); + } +} diff --git a/modules/50-loops/90-debug/description.es.yml b/modules/50-loops/90-debug/description.es.yml new file mode 100644 index 00000000..e795ae89 --- /dev/null +++ b/modules/50-loops/90-debug/description.es.yml @@ -0,0 +1,153 @@ +--- + +name: Depuración +theory: | + Incluso los desarrolladores más experimentados rara vez escriben código que funcione perfectamente a la primera. Cuanto más experimentado es un desarrollador, con más confianza lo **depura**, es decir, analiza los errores y los corrige. + + La habilidad de depurar no aparece por sí sola. Hay que desarrollarla, y cuanto antes mejor. A lo largo del aprendizaje realizarás tareas y practicarás, y con el tiempo el análisis de errores se convertirá en un hábito. + + ## Cómo encontrar un error en el código + + Depurar a base de prueba y error lleva mucho tiempo. Es mucho más productivo entender primero qué fue exactamente lo que salió mal y luego eliminar la causa. Todo trabajo con errores comienza con la comprensión. + + En primer lugar, estudia el **mensaje de error**. PHP siempre indica en él el archivo y la línea donde surgió el problema. Por ejemplo: + + ```bash + Error: Call to undefined function create() in /code/users.php:5 + ``` + + El mensaje dice que la función `create()` no está definida. Este error suele significar una errata en el nombre. Si tu inglés todavía no es muy bueno, un traductor te ayudará. + + Junto con el mensaje, PHP muestra la **pila de llamadas** (stack trace). Contiene la lista de todas las llamadas a funciones desde el inicio del programa hasta el lugar del error. En ella se ve qué funciones se ejecutaron con éxito y dónde surgieron los problemas. Cada entrada indica el archivo, la línea y la función en ejecución. + + Imagina que escribiste código en el archivo `users.php`: la función `main()` llama a la función `create()`, y la propia llamada a `main()` está en la octava línea. La salida completa del error se verá así: + + ```bash + PHP Fatal error: Uncaught Error: Call to undefined function create() in /code/users.php:5 + Stack trace: + #0 /code/users.php(8): main() + #1 {main} + thrown in /code/users.php on line 5 + ``` + + Toda la cadena de eventos se ve de inmediato. El programa arrancó (`{main}`), llegó con éxito a `main()` en la octava línea y aquí se topó con un error de nombre en la quinta. + + ## Tipos de errores + + Los errores más comprensibles en PHP se llaman **errores de sintaxis**. Surgen cuando el código está mal formado, por ejemplo por una comilla equivocada o un paréntesis omitido. En la salida siempre aparece `Parse error:`. + + Veamos un ejemplo. Aquí hay un error de sintaxis porque la comilla de apertura `"` no coincide con la de cierre `'`: + + ```bash + PHP Parse error: Unclosed '(' on line 3 in /code/users.php on line 4 + ``` + + El intérprete ni siquiera empieza a ejecutar un programa así: no puede analizarlo. + + Los más difíciles de corregir son los **errores de programación**. Aquí entran la llamada a una función inexistente, el uso de una variable no declarada o el paso de argumentos de tipo incorrecto. Normalmente surgen en un lugar distinto al de la causa real, lo que complica el diagnóstico. + + Contra los que más cuesta luchar es contra los **errores lógicos**. El programa funciona sin fallos, pero produce un resultado incorrecto con algunos datos de entrada. No hay ningún mensaje de error, solo una salida inesperada. Por ejemplo, una función debe calcular la suma, pero calcula la diferencia: + + ```php + new iteration !!!! + // => 3 + // => 3 + // => new iteration !!!! + // => 4 + // => 7 + ``` + + La salida muestra que hay una iteración menos de las necesarias. El cinco (`$finish`) no entró en la suma. En la condición está `$n < $finish` en lugar de `$n <= $finish`. Hay que sustituir el signo `<` por `<=`. + + Los desarrolladores principiantes a menudo se disgustan por los errores y se consideran descuidados. Todos cometemos errores, tanto los juniors como los seniors. La diferencia está en con cuánta confianza los encuentras. + + Los principiantes piensan que un buen desarrollador mira el código y entiende de inmediato qué está mal. En la práctica esto rara vez funciona. Un fragmento de código sin contexto dice poco. **Si quieres pedir consejo a un desarrollador experimentado, muéstrale primero el mensaje de error.** + +instructions: | + Implementa una función `compress()` que comprima una cadena con el método RLE (Run-Length Encoding). + + El algoritmo: si un carácter se repite varias veces seguidas, se sustituye por el carácter y el número de repeticiones. Los caracteres únicos se escriben sin cifra. + + Ejemplos: + + ```php + new iteration !!!! +// => 3 +// => 3 +// => new iteration !!!! +// => 4 +// => 7 +``` + +The output shows that there is one iteration fewer than needed. The five (`$finish`) did not make it into the addition. The condition uses `$n < $finish` instead of `$n <= $finish`. The `<` sign needs to be replaced with `<=`. + +Beginner developers often get upset about errors and consider themselves careless. Everyone makes mistakes, both juniors and seniors. The difference is how confidently you find them. + +Beginners think that a good developer looks at code and immediately understands what is wrong. This rarely works in practice. A code fragment without context says little. **If you want to ask an experienced developer for advice, show them the error message first.** diff --git a/modules/50-loops/90-debug/en/data.yml b/modules/50-loops/90-debug/en/data.yml new file mode 100644 index 00000000..02c70e9e --- /dev/null +++ b/modules/50-loops/90-debug/en/data.yml @@ -0,0 +1,3 @@ +--- +name: Debugging +tips: [] diff --git a/modules/50-loops/90-debug/es/EXERCISE.md b/modules/50-loops/90-debug/es/EXERCISE.md new file mode 100644 index 00000000..e0c6567e --- /dev/null +++ b/modules/50-loops/90-debug/es/EXERCISE.md @@ -0,0 +1,23 @@ + +Implementa una función `compress()` que comprima una cadena con el método RLE (Run-Length Encoding). + +El algoritmo: si un carácter se repite varias veces seguidas, se sustituye por el carácter y el número de repeticiones. Los caracteres únicos se escriben sin cifra. + +Ejemplos: + +```php + new iteration !!!! +// => 3 +// => 3 +// => new iteration !!!! +// => 4 +// => 7 +``` + +La salida muestra que hay una iteración menos de las necesarias. El cinco (`$finish`) no entró en la suma. En la condición está `$n < $finish` en lugar de `$n <= $finish`. Hay que sustituir el signo `<` por `<=`. + +Los desarrolladores principiantes a menudo se disgustan por los errores y se consideran descuidados. Todos cometemos errores, tanto los juniors como los seniors. La diferencia está en con cuánta confianza los encuentras. + +Los principiantes piensan que un buen desarrollador mira el código y entiende de inmediato qué está mal. En la práctica esto rara vez funciona. Un fragmento de código sin contexto dice poco. **Si quieres pedir consejo a un desarrollador experimentado, muéstrale primero el mensaje de error.** diff --git a/modules/50-loops/90-debug/es/data.yml b/modules/50-loops/90-debug/es/data.yml new file mode 100644 index 00000000..090be8be --- /dev/null +++ b/modules/50-loops/90-debug/es/data.yml @@ -0,0 +1,3 @@ +--- +name: Depuración +tips: [] diff --git a/modules/50-loops/90-debug/index.php b/modules/50-loops/90-debug/index.php new file mode 100644 index 00000000..dd334e80 --- /dev/null +++ b/modules/50-loops/90-debug/index.php @@ -0,0 +1,34 @@ + 1) { + $result .= $count; + } + $count = 1; + } + } + + $result .= $string[-1]; + if ($count > 1) { + $result .= $count; + } + + return $result; +} +// END diff --git a/modules/50-loops/90-debug/ru/EXERCISE.md b/modules/50-loops/90-debug/ru/EXERCISE.md new file mode 100644 index 00000000..4fc41b3f --- /dev/null +++ b/modules/50-loops/90-debug/ru/EXERCISE.md @@ -0,0 +1,23 @@ + +Реализуйте функцию `compress()`, которая сжимает строку методом RLE (Run-Length Encoding). + +Алгоритм: если символ повторяется несколько раз подряд, он заменяется на символ и количество повторений. Одиночные символы записываются без цифры. + +Примеры: + +```php + new iteration !!!! +// => 3 +// => 3 +// => new iteration !!!! +// => 4 +// => 7 +``` + +Вывод показывает, что итераций на одну меньше, чем нужно. Пятерка (`$finish`) в сложение не попала. В условии стоит `$n < $finish` вместо `$n <= $finish`. Нужно заменить знак `<` на `<=`. + +Начинающие разработчики часто расстраиваются из-за ошибок и считают себя невнимательными. Ошибки есть у всех, и у джунов, и у сеньоров. Разница в том, насколько уверенно ты их находишь. + +Начинающие думают, что хороший разработчик смотрит на код и сразу понимает, что не так. Это редко работает на практике. Фрагмент кода без контекста мало что говорит. **Если хотите попросить совет у опытного разработчика, первым делом покажите сообщение об ошибке.** diff --git a/modules/50-loops/90-debug/ru/data.yml b/modules/50-loops/90-debug/ru/data.yml new file mode 100644 index 00000000..32222bd2 --- /dev/null +++ b/modules/50-loops/90-debug/ru/data.yml @@ -0,0 +1,4 @@ +--- +name: Отладка +tips: [] +definitions: [] From 3f90c9e0e5e5561a5ba12892ca13a7514ca97768 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 5 Jun 2026 20:32:42 +0500 Subject: [PATCH 11/29] =?UTF-8?q?feat(33-data-types):=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20Python?= =?UTF-8?q?=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - переименован модуль 27-data-types → 33-data-types (slug по Python) - 40-primitive-data-types: теория до паритета, задание выровнено с Python - 50-data-types-weak-typing: паритет с 50-strong-typing с разворотом под слабую типизацию PHP (slug сохранен) - новый урок 52-data-types-immutability на семантике значений (strtoupper) - rename 55-type-conversion → 55-data-types-casting + паритет теории - 45-tuples не переносится: кортежей в PHP нет Co-Authored-By: Claude Opus 4.8 (1M context) --- .../40-primitive-data-types/index.php | 5 - .../40-primitive-data-types/ru/EXERCISE.md | 1 - .../40-primitive-data-types/ru/README.md | 40 ------- .../50-data-types-weak-typing/ru/EXERCISE.md | 1 - .../50-data-types-weak-typing/ru/README.md | 19 ---- .../50-data-types-weak-typing/ru/data.yml | 3 - .../55-type-conversion/index.php | 5 - .../55-type-conversion/ru/EXERCISE.md | 1 - .../55-type-conversion/ru/README.md | 27 ----- .../55-type-conversion/ru/data.yml | 4 - .../40-primitive-data-types/Makefile | 0 .../40-primitive-data-types/SolutionTest.php | 8 +- .../description.es.yml | 0 .../40-primitive-data-types/en/EXERCISE.md | 0 .../40-primitive-data-types/en/README.md | 0 .../40-primitive-data-types/en/data.yml | 0 .../40-primitive-data-types/es/EXERCISE.md | 0 .../40-primitive-data-types/es/README.md | 0 .../40-primitive-data-types/es/data.yml | 0 .../40-primitive-data-types/index.php | 15 +++ .../40-primitive-data-types/ru/EXERCISE.md | 22 ++++ .../40-primitive-data-types/ru/README.md | 105 ++++++++++++++++++ .../40-primitive-data-types/ru/data.yml | 2 +- .../50-data-types-weak-typing/Makefile | 0 .../SolutionTest.php | 0 .../description.es.yml | 0 .../50-data-types-weak-typing/en/EXERCISE.md | 0 .../50-data-types-weak-typing/en/README.md | 0 .../50-data-types-weak-typing/en/data.yml | 0 .../50-data-types-weak-typing/es/EXERCISE.md | 0 .../50-data-types-weak-typing/es/README.md | 0 .../50-data-types-weak-typing/es/data.yml | 0 .../50-data-types-weak-typing/index.php | 0 .../50-data-types-weak-typing/ru/EXERCISE.md | 3 + .../50-data-types-weak-typing/ru/README.md | 64 +++++++++++ .../50-data-types-weak-typing/ru/data.yml | 5 + .../52-data-types-immutability/Makefile | 2 + .../SolutionTest.php | 17 +++ .../description.es.yml | 47 ++++++++ .../52-data-types-immutability/en/EXERCISE.md | 9 ++ .../52-data-types-immutability/en/README.md | 23 ++++ .../52-data-types-immutability/en/data.yml | 5 + .../52-data-types-immutability/es/EXERCISE.md | 9 ++ .../52-data-types-immutability/es/README.md | 23 ++++ .../52-data-types-immutability/es/data.yml | 9 ++ .../52-data-types-immutability/index.php | 9 ++ .../52-data-types-immutability/ru/EXERCISE.md | 9 ++ .../52-data-types-immutability/ru/README.md | 76 +++++++++++++ .../52-data-types-immutability/ru/data.yml | 9 ++ .../55-data-types-casting}/Makefile | 0 .../55-data-types-casting}/SolutionTest.php | 4 +- .../55-data-types-casting}/description.es.yml | 0 .../55-data-types-casting}/en/EXERCISE.md | 0 .../55-data-types-casting}/en/README.md | 0 .../55-data-types-casting}/en/data.yml | 0 .../55-data-types-casting}/es/EXERCISE.md | 0 .../55-data-types-casting}/es/README.md | 0 .../55-data-types-casting}/es/data.yml | 0 .../55-data-types-casting/index.php | 9 ++ .../55-data-types-casting/ru/EXERCISE.md | 17 +++ .../55-data-types-casting/ru/README.md | 81 ++++++++++++++ .../55-data-types-casting/ru/data.yml | 6 + .../description.en.yml | 0 .../description.es.yml | 0 .../description.ru.yml | 0 65 files changed, 584 insertions(+), 110 deletions(-) delete mode 100644 modules/27-data-types/40-primitive-data-types/index.php delete mode 100644 modules/27-data-types/40-primitive-data-types/ru/EXERCISE.md delete mode 100644 modules/27-data-types/40-primitive-data-types/ru/README.md delete mode 100644 modules/27-data-types/50-data-types-weak-typing/ru/EXERCISE.md delete mode 100644 modules/27-data-types/50-data-types-weak-typing/ru/README.md delete mode 100644 modules/27-data-types/50-data-types-weak-typing/ru/data.yml delete mode 100644 modules/27-data-types/55-type-conversion/index.php delete mode 100644 modules/27-data-types/55-type-conversion/ru/EXERCISE.md delete mode 100644 modules/27-data-types/55-type-conversion/ru/README.md delete mode 100644 modules/27-data-types/55-type-conversion/ru/data.yml rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/Makefile (100%) rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/SolutionTest.php (77%) rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/description.es.yml (100%) rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/en/EXERCISE.md (100%) rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/en/README.md (100%) rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/en/data.yml (100%) rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/es/EXERCISE.md (100%) rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/es/README.md (100%) rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/es/data.yml (100%) create mode 100644 modules/33-data-types/40-primitive-data-types/index.php create mode 100644 modules/33-data-types/40-primitive-data-types/ru/EXERCISE.md create mode 100644 modules/33-data-types/40-primitive-data-types/ru/README.md rename modules/{27-data-types => 33-data-types}/40-primitive-data-types/ru/data.yml (92%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/Makefile (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/SolutionTest.php (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/description.es.yml (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/en/EXERCISE.md (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/en/README.md (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/en/data.yml (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/es/EXERCISE.md (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/es/README.md (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/es/data.yml (100%) rename modules/{27-data-types => 33-data-types}/50-data-types-weak-typing/index.php (100%) create mode 100644 modules/33-data-types/50-data-types-weak-typing/ru/EXERCISE.md create mode 100644 modules/33-data-types/50-data-types-weak-typing/ru/README.md create mode 100644 modules/33-data-types/50-data-types-weak-typing/ru/data.yml create mode 100644 modules/33-data-types/52-data-types-immutability/Makefile create mode 100644 modules/33-data-types/52-data-types-immutability/SolutionTest.php create mode 100644 modules/33-data-types/52-data-types-immutability/description.es.yml create mode 100644 modules/33-data-types/52-data-types-immutability/en/EXERCISE.md create mode 100644 modules/33-data-types/52-data-types-immutability/en/README.md create mode 100644 modules/33-data-types/52-data-types-immutability/en/data.yml create mode 100644 modules/33-data-types/52-data-types-immutability/es/EXERCISE.md create mode 100644 modules/33-data-types/52-data-types-immutability/es/README.md create mode 100644 modules/33-data-types/52-data-types-immutability/es/data.yml create mode 100644 modules/33-data-types/52-data-types-immutability/index.php create mode 100644 modules/33-data-types/52-data-types-immutability/ru/EXERCISE.md create mode 100644 modules/33-data-types/52-data-types-immutability/ru/README.md create mode 100644 modules/33-data-types/52-data-types-immutability/ru/data.yml rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/Makefile (100%) rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/SolutionTest.php (74%) rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/description.es.yml (100%) rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/en/EXERCISE.md (100%) rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/en/README.md (100%) rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/en/data.yml (100%) rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/es/EXERCISE.md (100%) rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/es/README.md (100%) rename modules/{27-data-types/55-type-conversion => 33-data-types/55-data-types-casting}/es/data.yml (100%) create mode 100644 modules/33-data-types/55-data-types-casting/index.php create mode 100644 modules/33-data-types/55-data-types-casting/ru/EXERCISE.md create mode 100644 modules/33-data-types/55-data-types-casting/ru/README.md create mode 100644 modules/33-data-types/55-data-types-casting/ru/data.yml rename modules/{27-data-types => 33-data-types}/description.en.yml (100%) rename modules/{27-data-types => 33-data-types}/description.es.yml (100%) rename modules/{27-data-types => 33-data-types}/description.ru.yml (100%) diff --git a/modules/27-data-types/40-primitive-data-types/index.php b/modules/27-data-types/40-primitive-data-types/index.php deleted file mode 100644 index 482c3c63..00000000 --- a/modules/27-data-types/40-primitive-data-types/index.php +++ /dev/null @@ -1,5 +0,0 @@ - 8 -``` - -`'7'` — это строка, а не число, при этом интерпретатор PHP выдал ответ `8`, как если бы мы складывали два числа. Когда PHP видит несоответствие типов, он сам пытается преобразовать информацию. В данном случае он преобразовал строку `'7'` в число `7`, а потом сложил `1` и `7`. - -Не все языки так делают. PHP — это язык со **слабой типизацией**. Он знает о существовании разных типов, но относится к их использованию не строго. Он пытается преобразовывать информацию, когда это кажется разумным. - -В языках со **строгой типизацией** сложить число со строкой не получится. - -PHP был создан для интернета, а в интернете вся информация — это строки. Даже когда мы вводим на сайте номер телефона или год рождения, на сервер эта информация поступает не как числа, а как строки. Поэтому авторы языка решили, что автоматически преобразовывать типы — правильно и удобно. - -Такое автоматическое неявное преобразование типов с одной стороны и правда удобно. Но на практике это свойство языка создает множество ошибок и проблем, которые трудно найти. Код может иногда работать, а иногда не работать. Это зависит от того, «повезло» ли в конкретном случае с автоматическим преобразованием. Программист это заметит не сразу. - -В дальнейших заданиях мы будем встречаться с таким поведением не раз. Часто будет возникать вопрос «почему мой код работает не так, как я ожидаю?». diff --git a/modules/27-data-types/50-data-types-weak-typing/ru/data.yml b/modules/27-data-types/50-data-types-weak-typing/ru/data.yml deleted file mode 100644 index 9253e728..00000000 --- a/modules/27-data-types/50-data-types-weak-typing/ru/data.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -name: Слабая типизация -tips: [] diff --git a/modules/27-data-types/55-type-conversion/index.php b/modules/27-data-types/55-type-conversion/index.php deleted file mode 100644 index 009febdb..00000000 --- a/modules/27-data-types/55-type-conversion/index.php +++ /dev/null @@ -1,5 +0,0 @@ - 'Это 5' -``` - -Явное преобразование типа работает так: перед значением в скобках указывается желаемый тип. В результате значение справа преобразуется в значение другого типа, указанного слева в скобках. На текущий момент мы знакомы только с двумя типами, но преобразование работает для любого типа. - -В более сложных ситуациях при использовании функций, которые будем проходить позже, встречаются множественные преобразования: `(string) (5 + ((int) '4'))`. Порядок вычисления этого выражения следующий: - -```php -expectOutputString($expected); require 'index.php'; } diff --git a/modules/27-data-types/40-primitive-data-types/description.es.yml b/modules/33-data-types/40-primitive-data-types/description.es.yml similarity index 100% rename from modules/27-data-types/40-primitive-data-types/description.es.yml rename to modules/33-data-types/40-primitive-data-types/description.es.yml diff --git a/modules/27-data-types/40-primitive-data-types/en/EXERCISE.md b/modules/33-data-types/40-primitive-data-types/en/EXERCISE.md similarity index 100% rename from modules/27-data-types/40-primitive-data-types/en/EXERCISE.md rename to modules/33-data-types/40-primitive-data-types/en/EXERCISE.md diff --git a/modules/27-data-types/40-primitive-data-types/en/README.md b/modules/33-data-types/40-primitive-data-types/en/README.md similarity index 100% rename from modules/27-data-types/40-primitive-data-types/en/README.md rename to modules/33-data-types/40-primitive-data-types/en/README.md diff --git a/modules/27-data-types/40-primitive-data-types/en/data.yml b/modules/33-data-types/40-primitive-data-types/en/data.yml similarity index 100% rename from modules/27-data-types/40-primitive-data-types/en/data.yml rename to modules/33-data-types/40-primitive-data-types/en/data.yml diff --git a/modules/27-data-types/40-primitive-data-types/es/EXERCISE.md b/modules/33-data-types/40-primitive-data-types/es/EXERCISE.md similarity index 100% rename from modules/27-data-types/40-primitive-data-types/es/EXERCISE.md rename to modules/33-data-types/40-primitive-data-types/es/EXERCISE.md diff --git a/modules/27-data-types/40-primitive-data-types/es/README.md b/modules/33-data-types/40-primitive-data-types/es/README.md similarity index 100% rename from modules/27-data-types/40-primitive-data-types/es/README.md rename to modules/33-data-types/40-primitive-data-types/es/README.md diff --git a/modules/27-data-types/40-primitive-data-types/es/data.yml b/modules/33-data-types/40-primitive-data-types/es/data.yml similarity index 100% rename from modules/27-data-types/40-primitive-data-types/es/data.yml rename to modules/33-data-types/40-primitive-data-types/es/data.yml diff --git a/modules/33-data-types/40-primitive-data-types/index.php b/modules/33-data-types/40-primitive-data-types/index.php new file mode 100644 index 00000000..ff0e42f5 --- /dev/null +++ b/modules/33-data-types/40-primitive-data-types/index.php @@ -0,0 +1,15 @@ + 5 +print_r(-5); // => -5 +``` + +Пример вывода строки: + +```php + 5 +print_r('-5'); // => -5 +``` + +На экране результат выглядит одинаково, но внутри программы это совершенно разные вещи: + +| Значение | Тип данных | +|----------|---------------------| +| `5` | `int` (целое число) | +| `'5'` | `string` (строка) | + +Число `5` и строка `'5'` — разные значения, и операции с ними работают по-разному. Правда, при несоответствии типов PHP часто пытается сам преобразовать один тип в другой. Насколько это удобно и чем опасно — разберем чуть позже в этом модуле. + +## Целые и рациональные числа + +PHP различает два вида чисел: + +- `int` обозначает целые числа: -3, 0, 7, 100000 +- `float` обозначает вещественные (рациональные) числа: 1.0, -3.14, 2.718 + +Такое разделение связано с особенностями устройства компьютеров — мы говорили об этом в уроке про числа с плавающей точкой. + +Пример: + +```php + 10.234 +print_r(-0.4); // => -0.4 +``` + +В них можно записывать дробные значения и использовать их в вычислениях: + +```php + 4.7 +print_r(5.0 / 2.0); // => 2.5 +print_r(2.75 - 0.5); // => 2.25 +``` + +## Примитивные типы + +Типы вроде: + +- string (строка), +- int (целое число), +- float (рациональное число) + +называются примитивными: они встроены прямо в сам язык PHP. + +```text +Примитивные типы PHP +├── int : целые числа (7, -3, 0) +├── float : дробные числа (3.14, -0.5) +├── string : строки ('hello') +└── bool : логический тип (true, false) +``` + +Кроме строк и чисел, в PHP есть булев тип `bool` со значениями `true` и `false`, а также специальное значение `null`. Подробнее мы столкнемся с ними в будущем. + +Существуют и составные типы: массивы, объекты и другие. С ними мы познакомимся позже. Более того, в PHP можно создавать и свои собственные типы (например, классы), но для начала важно хорошо разобраться с примитивами. + +## Строки и строчки + +По-английски строки в программировании называются **strings**, а строчки текстовых файлов — **lines**. В русском языке может быть путаница, поэтому во всех уроках мы будем говорить «строка» для обозначения типа данных «строка», и «строчка» — для lines в файлах. diff --git a/modules/27-data-types/40-primitive-data-types/ru/data.yml b/modules/33-data-types/40-primitive-data-types/ru/data.yml similarity index 92% rename from modules/27-data-types/40-primitive-data-types/ru/data.yml rename to modules/33-data-types/40-primitive-data-types/ru/data.yml index 6fba9029..f67d8a68 100644 --- a/modules/27-data-types/40-primitive-data-types/ru/data.yml +++ b/modules/33-data-types/40-primitive-data-types/ru/data.yml @@ -4,7 +4,7 @@ tips: - > [Литерал](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D0%BB_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)) - | - [Статья о дробных числах](https://habrahabr.ru/post/112953/) + [Статья о дробных числах](https://habr.com/ru/articles/112953/) definitions: - name: Тип данных description: >- diff --git a/modules/27-data-types/50-data-types-weak-typing/Makefile b/modules/33-data-types/50-data-types-weak-typing/Makefile similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/Makefile rename to modules/33-data-types/50-data-types-weak-typing/Makefile diff --git a/modules/27-data-types/50-data-types-weak-typing/SolutionTest.php b/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/SolutionTest.php rename to modules/33-data-types/50-data-types-weak-typing/SolutionTest.php diff --git a/modules/27-data-types/50-data-types-weak-typing/description.es.yml b/modules/33-data-types/50-data-types-weak-typing/description.es.yml similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/description.es.yml rename to modules/33-data-types/50-data-types-weak-typing/description.es.yml diff --git a/modules/27-data-types/50-data-types-weak-typing/en/EXERCISE.md b/modules/33-data-types/50-data-types-weak-typing/en/EXERCISE.md similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/en/EXERCISE.md rename to modules/33-data-types/50-data-types-weak-typing/en/EXERCISE.md diff --git a/modules/27-data-types/50-data-types-weak-typing/en/README.md b/modules/33-data-types/50-data-types-weak-typing/en/README.md similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/en/README.md rename to modules/33-data-types/50-data-types-weak-typing/en/README.md diff --git a/modules/27-data-types/50-data-types-weak-typing/en/data.yml b/modules/33-data-types/50-data-types-weak-typing/en/data.yml similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/en/data.yml rename to modules/33-data-types/50-data-types-weak-typing/en/data.yml diff --git a/modules/27-data-types/50-data-types-weak-typing/es/EXERCISE.md b/modules/33-data-types/50-data-types-weak-typing/es/EXERCISE.md similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/es/EXERCISE.md rename to modules/33-data-types/50-data-types-weak-typing/es/EXERCISE.md diff --git a/modules/27-data-types/50-data-types-weak-typing/es/README.md b/modules/33-data-types/50-data-types-weak-typing/es/README.md similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/es/README.md rename to modules/33-data-types/50-data-types-weak-typing/es/README.md diff --git a/modules/27-data-types/50-data-types-weak-typing/es/data.yml b/modules/33-data-types/50-data-types-weak-typing/es/data.yml similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/es/data.yml rename to modules/33-data-types/50-data-types-weak-typing/es/data.yml diff --git a/modules/27-data-types/50-data-types-weak-typing/index.php b/modules/33-data-types/50-data-types-weak-typing/index.php similarity index 100% rename from modules/27-data-types/50-data-types-weak-typing/index.php rename to modules/33-data-types/50-data-types-weak-typing/index.php diff --git a/modules/33-data-types/50-data-types-weak-typing/ru/EXERCISE.md b/modules/33-data-types/50-data-types-weak-typing/ru/EXERCISE.md new file mode 100644 index 00000000..c676b967 --- /dev/null +++ b/modules/33-data-types/50-data-types-weak-typing/ru/EXERCISE.md @@ -0,0 +1,3 @@ +В игре два игрока. Первый набрал `7` очков, второй потерял очки: выражение `(-8 - -2)` описывает его результат. Посчитайте разницу и выведите на экран: `7 - (-8 - -2)`. + +Попробуйте сделать число 7 не числом, а строкой: `'7' - (-8 - -2)`. Сработает ли такой код? Поэкспериментируйте с другими числами тоже. diff --git a/modules/33-data-types/50-data-types-weak-typing/ru/README.md b/modules/33-data-types/50-data-types-weak-typing/ru/README.md new file mode 100644 index 00000000..f4e8c3ff --- /dev/null +++ b/modules/33-data-types/50-data-types-weak-typing/ru/README.md @@ -0,0 +1,64 @@ +Нам известно про два разных типа данных: числа и строки. Мы могли складывать числа, потому что операция сложения — это операция для типа «числа». А что, если применить эту операцию к числу и строке? + +```php + 8 +``` + +`'7'` — это строка, а не число, при этом интерпретатор PHP выдал ответ `8`, как если бы мы складывали два числа. Когда PHP видит несоответствие типов, он сам пытается преобразовать информацию. В данном случае он преобразовал строку `'7'` в число `7`, а потом сложил `1` и `7`. + +## Слабая типизация + +Не все языки так делают. PHP — это язык со **слабой типизацией**. Он знает о существовании разных типов (числа, строки и другие), но относится к их использованию не строго и пытается преобразовывать данные, когда это кажется ему разумным. + +Обратите внимание: оператор `+` в PHP всегда означает арифметику, а для соединения строк есть отдельный оператор — конкатенация `.`. Поэтому в выражении `1 + '7'` PHP превращает строку в число, а в выражении `1 . '7'` — наоборот, число в строку: + +```php + 8 +print_r(1 . '7'); // => 17 +``` + +```text +1 + '7' → 8 (строка превратилась в число, сложение) +'7' - 1 → 6 (строка превратилась в число, вычитание) +1 . '7' → '17' (число превратилось в строку, конкатенация) +``` + +Граница дозволенного у PHP все же есть. Если строку никак нельзя понять как число, современный PHP остановит программу с ошибкой: + +```php +expectOutputString($expected); + require 'index.php'; + } +} diff --git a/modules/33-data-types/52-data-types-immutability/description.es.yml b/modules/33-data-types/52-data-types-immutability/description.es.yml new file mode 100644 index 00000000..db49f53f --- /dev/null +++ b/modules/33-data-types/52-data-types-immutability/description.es.yml @@ -0,0 +1,47 @@ +--- + +name: | + Inmutabilidad de los tipos primitivos + +theory: | + ¿Qué sucede cuando «cambiamos» una cadena de texto en PHP? Las funciones integradas como `strtoupper()` no modifican la cadena original, sino que devuelven una nueva: + + ```php + ALEXANDER + print_r($firstName); // => Alexander + ``` + + Esto se debe a la inmutabilidad de los valores primitivos en PHP: una cadena de texto no puede ser cambiada después de su creación. La inmutabilidad de los tipos primitivos es importante por varias razones, siendo la principal el rendimiento. + + Pero a veces necesitamos cambiar una cadena de texto. Para eso existen las variables: + + ```php + ALEXANDER + ``` + + Hay una gran diferencia entre *cambiar el valor de una variable* y *cambiar el valor en sí*. No se puede cambiar un valor primitivo en PHP, pero se puede reemplazar el valor de una variable sin problemas. + +instructions: | + En los tres nombres de los participantes se esconde una palabra secreta. Componla y muéstrala en pantalla con los caracteres en el siguiente orden: + + 1. El segundo carácter de la primera cadena + 2. El tercer carácter de la tercera cadena + 3. El tercer carácter de la segunda cadena + 4. El séptimo carácter de la segunda cadena + 5. El quinto carácter de la segunda cadena + + Intenta usar interpolación: dentro de las llaves puedes colocar no solo variables enteras, sino también caracteres individuales usando corchetes. + +tips: [] + +definitions: + - name: Inmutabilidad + description: | + estado en el que un objeto o variable no puede ser cambiado después de su creación diff --git a/modules/33-data-types/52-data-types-immutability/en/EXERCISE.md b/modules/33-data-types/52-data-types-immutability/en/EXERCISE.md new file mode 100644 index 00000000..d4d54717 --- /dev/null +++ b/modules/33-data-types/52-data-types-immutability/en/EXERCISE.md @@ -0,0 +1,9 @@ +A secret word is hidden in the three participants' names. Build it and print it out from the characters in this order: + +1. The second character of the first string +2. The third character of the third string +3. The third character of the second string +4. The seventh character of the second string +5. The fifth character of the second string + +Try using interpolation: inside curly brackets you can place not only whole variables, but also individual characters using square brackets. diff --git a/modules/33-data-types/52-data-types-immutability/en/README.md b/modules/33-data-types/52-data-types-immutability/en/README.md new file mode 100644 index 00000000..1f98f652 --- /dev/null +++ b/modules/33-data-types/52-data-types-immutability/en/README.md @@ -0,0 +1,23 @@ +What happens when we "change" a string in PHP? Built-in functions like `strtoupper()` do not modify the original string — they return a new one: + +```php + ALEXANDER +print_r($firstName); // => Alexander +``` + +This happens because of the immutability of primitive values in PHP: a string itself cannot be changed after creation. The immutability of primitive types is important for many reasons. The key reason is performance. + +But sometimes we need to change a string. That's what variables are for: + +```php + ALEXANDER +``` + +There is a big difference between *changing the value of a variable* and *changing the value itself*. You can't change primitive values in PHP, but you can replace the value of a variable without any problem. diff --git a/modules/33-data-types/52-data-types-immutability/en/data.yml b/modules/33-data-types/52-data-types-immutability/en/data.yml new file mode 100644 index 00000000..e02b5da5 --- /dev/null +++ b/modules/33-data-types/52-data-types-immutability/en/data.yml @@ -0,0 +1,5 @@ +--- +name: | + Primitive data types immutability +tips: [] +definitions: [] diff --git a/modules/33-data-types/52-data-types-immutability/es/EXERCISE.md b/modules/33-data-types/52-data-types-immutability/es/EXERCISE.md new file mode 100644 index 00000000..616f33ac --- /dev/null +++ b/modules/33-data-types/52-data-types-immutability/es/EXERCISE.md @@ -0,0 +1,9 @@ +En los tres nombres de los participantes se esconde una palabra secreta. Componla y muéstrala en pantalla con los caracteres en el siguiente orden: + +1. El segundo carácter de la primera cadena +2. El tercer carácter de la tercera cadena +3. El tercer carácter de la segunda cadena +4. El séptimo carácter de la segunda cadena +5. El quinto carácter de la segunda cadena + +Intenta usar interpolación: dentro de las llaves puedes colocar no solo variables enteras, sino también caracteres individuales usando corchetes. diff --git a/modules/33-data-types/52-data-types-immutability/es/README.md b/modules/33-data-types/52-data-types-immutability/es/README.md new file mode 100644 index 00000000..83ad6cab --- /dev/null +++ b/modules/33-data-types/52-data-types-immutability/es/README.md @@ -0,0 +1,23 @@ +¿Qué sucede cuando «cambiamos» una cadena de texto en PHP? Las funciones integradas como `strtoupper()` no modifican la cadena original, sino que devuelven una nueva: + +```php + ALEXANDER +print_r($firstName); // => Alexander +``` + +Esto se debe a la inmutabilidad de los valores primitivos en PHP: una cadena de texto no puede ser cambiada después de su creación. La inmutabilidad de los tipos primitivos es importante por varias razones, siendo la principal el rendimiento. + +Pero a veces necesitamos cambiar una cadena de texto. Para eso existen las variables: + +```php + ALEXANDER +``` + +Hay una gran diferencia entre *cambiar el valor de una variable* y *cambiar el valor en sí*. No se puede cambiar un valor primitivo en PHP, pero se puede reemplazar el valor de una variable sin problemas. diff --git a/modules/33-data-types/52-data-types-immutability/es/data.yml b/modules/33-data-types/52-data-types-immutability/es/data.yml new file mode 100644 index 00000000..708e320a --- /dev/null +++ b/modules/33-data-types/52-data-types-immutability/es/data.yml @@ -0,0 +1,9 @@ +--- +name: | + Inmutabilidad de los tipos primitivos +tips: [] +definitions: + - name: Inmutabilidad + description: > + estado en el que un objeto o variable no puede ser cambiado después de su + creación diff --git a/modules/33-data-types/52-data-types-immutability/index.php b/modules/33-data-types/52-data-types-immutability/index.php new file mode 100644 index 00000000..2b36e502 --- /dev/null +++ b/modules/33-data-types/52-data-types-immutability/index.php @@ -0,0 +1,9 @@ + ALEXANDER +``` + +Может показаться, что функция изменила нашу строку. Проверим: + +```php + Alexander +``` + +Переменная осталась прежней. Функция `strtoupper()` не меняет исходную строку — она возвращает **новую** строку, составленную из больших букв. Так в PHP работают все функции для работы со строками: само значение после создания изменить нельзя. Программисты говорят, что такие значения **неизменяемые** (или иммутабельные). + +## Почему значения неизменяемые? + +Примитивные значения в PHP (строки, числа, логические значения) ведут себя как значения в математике: число `5` нельзя «отредактировать», можно только получить из него новое число. Это дает важные преимущества: + +- Безопасность: значения не изменятся случайно +- Производительность: с неизменяемыми значениями интерпретатору проще работать +- Предсказуемость: меньше неожиданных эффектов при передаче данных в функции + +## А как тогда изменить строку? + +Если нужно «изменить» строку, создается новая строка и сохраняется в ту же переменную: + +```php + ALEXANDER +``` + +Переменная `$firstName` теперь просто хранит другую строку. Происходит замена значения переменной, а сама строка `'Alexander'` остается нетронутой. + +```text +$firstName = 'Alexander' + +strtoupper($firstName) → 'ALEXANDER' ← создана новая строка +$firstName → 'Alexander' ← исходная не изменилась + +$firstName = strtoupper($firstName) +└──────────────┬───────────────────┘ + в переменной теперь новая строка +``` + +Важно различать две вещи: *изменение значения переменной* и *изменение самого значения*. Значение переменной можно заменить без проблем, а вот само значение — строку, число — изменить нельзя. + +## Новая переменная или та же? + +Переиспользовать переменную стоит только тогда, когда речь идет об одной и той же сущности. Если пользователь ввел новое имя, это уже другая сущность, и лучше создать отдельную переменную: + +```php + + состояние, при котором объект, переменная не могут быть изменены после + создания diff --git a/modules/27-data-types/55-type-conversion/Makefile b/modules/33-data-types/55-data-types-casting/Makefile similarity index 100% rename from modules/27-data-types/55-type-conversion/Makefile rename to modules/33-data-types/55-data-types-casting/Makefile diff --git a/modules/27-data-types/55-type-conversion/SolutionTest.php b/modules/33-data-types/55-data-types-casting/SolutionTest.php similarity index 74% rename from modules/27-data-types/55-type-conversion/SolutionTest.php rename to modules/33-data-types/55-data-types-casting/SolutionTest.php index 2344e7ed..a9c3d5d9 100644 --- a/modules/27-data-types/55-type-conversion/SolutionTest.php +++ b/modules/33-data-types/55-data-types-casting/SolutionTest.php @@ -1,6 +1,6 @@ expectOutputString($expected); require 'index.php'; } diff --git a/modules/27-data-types/55-type-conversion/description.es.yml b/modules/33-data-types/55-data-types-casting/description.es.yml similarity index 100% rename from modules/27-data-types/55-type-conversion/description.es.yml rename to modules/33-data-types/55-data-types-casting/description.es.yml diff --git a/modules/27-data-types/55-type-conversion/en/EXERCISE.md b/modules/33-data-types/55-data-types-casting/en/EXERCISE.md similarity index 100% rename from modules/27-data-types/55-type-conversion/en/EXERCISE.md rename to modules/33-data-types/55-data-types-casting/en/EXERCISE.md diff --git a/modules/27-data-types/55-type-conversion/en/README.md b/modules/33-data-types/55-data-types-casting/en/README.md similarity index 100% rename from modules/27-data-types/55-type-conversion/en/README.md rename to modules/33-data-types/55-data-types-casting/en/README.md diff --git a/modules/27-data-types/55-type-conversion/en/data.yml b/modules/33-data-types/55-data-types-casting/en/data.yml similarity index 100% rename from modules/27-data-types/55-type-conversion/en/data.yml rename to modules/33-data-types/55-data-types-casting/en/data.yml diff --git a/modules/27-data-types/55-type-conversion/es/EXERCISE.md b/modules/33-data-types/55-data-types-casting/es/EXERCISE.md similarity index 100% rename from modules/27-data-types/55-type-conversion/es/EXERCISE.md rename to modules/33-data-types/55-data-types-casting/es/EXERCISE.md diff --git a/modules/27-data-types/55-type-conversion/es/README.md b/modules/33-data-types/55-data-types-casting/es/README.md similarity index 100% rename from modules/27-data-types/55-type-conversion/es/README.md rename to modules/33-data-types/55-data-types-casting/es/README.md diff --git a/modules/27-data-types/55-type-conversion/es/data.yml b/modules/33-data-types/55-data-types-casting/es/data.yml similarity index 100% rename from modules/27-data-types/55-type-conversion/es/data.yml rename to modules/33-data-types/55-data-types-casting/es/data.yml diff --git a/modules/33-data-types/55-data-types-casting/index.php b/modules/33-data-types/55-data-types-casting/index.php new file mode 100644 index 00000000..41b8bd35 --- /dev/null +++ b/modules/33-data-types/55-data-types-casting/index.php @@ -0,0 +1,9 @@ + 350 +``` + +Оператор `(int)` получает строку и превращает ее в целое число. + +```php + 0 + +print_r((int) '10'); // => 10 +print_r((int) 3.5); // => 3 (дробная часть отбрасывается) +``` + +```text +'123' ──(int)──→ 123 ──(float)──→ 123.0 + │ + (string) + ↓ + '123' +``` + +## Преобразование в строку с помощью (string) + +Если нужно превратить число в строку, используйте оператор `(string)`: + +```php + '10' +print_r((string) 3.5); // => '3.5' +``` + +Это полезно, например, при формировании текстов, сообщений и вывода: + +```php + Age: 42 +``` + +## Преобразование в число с плавающей точкой с помощью (float) + +Если нужно число с десятичной точкой, используйте `(float)`: + +```php + 2.7 +``` + +Выражение `(float) 5` тоже сработает: получится дробное число `5.0`, хотя `print_r()` выведет его без дробной части — как `5`. + +## Множественные преобразования + +Приведение типа можно использовать и внутри составных выражений. В более сложных ситуациях встречаются множественные преобразования: `(string) (5 + ((int) '4'))`. Порядок вычисления этого выражения следующий: + +```php + Date: Fri, 5 Jun 2026 22:42:53 +0500 Subject: [PATCH 12/29] =?UTF-8?q?feat(45-logic):=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=B7=20Python?= =?UTF-8?q?=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 10-bool-type: теория доведена до паритета с Python, введен var_dump() для вывода bool, добавлены строгие операторы ===/!==, тема предикатов влита из удаляемого 15-predicates - delete 15-predicates: тема влита в 10-bool-type (как в Python) - add 15-bool-strings: сравнение строк, ord(), strlen(), str_starts_with/str_ends_with/str_contains (RU + en/es-выжимка) - 20-logic-combine-expressions: паритет с Python, добавлен пример isFirstLetterAnA и иллюстрация even-or-odd.jpg - 25-logical-operators: паритет с Python (isCorrectPassword, hasDiscount, isGoodApartment, таблицы истинности); 29-logical-operators-2 удален (его тема покрыта расширенной теорией, разбор isLeapYear — это решение задания 25) - 28-logical-negation: паритет с Python (приоритет !, canDrive, законы де Моргана) - delete 70-logic-weak-typing: слабая типизация покрыта 33-data-types - add 90-logical-expressions: falsy/truthy в PHP, операторы &&/|| всегда возвращают bool (отличие от Python/JS), нестрогое сравнение, «ошибка выбора»; задание isFalsy перенесено из 70-logic-weak-typing - решения index.php обновлены с объявлениями типов (введены в 40-define-functions); удален неиспользуемый ассет lannisters.jpg Co-Authored-By: Claude Opus 4.8 (1M context) --- modules/45-logic/10-bool-type/index.php | 2 +- modules/45-logic/10-bool-type/ru/README.md | 88 +++++++++----- modules/45-logic/10-bool-type/ru/data.yml | 10 +- .../Makefile | 0 .../45-logic/15-bool-strings/SolutionTest.php | 17 +++ .../15-bool-strings/description.es.yml | 49 ++++++++ .../45-logic/15-bool-strings/en/EXERCISE.md | 10 ++ modules/45-logic/15-bool-strings/en/README.md | 29 +++++ modules/45-logic/15-bool-strings/en/data.yml | 5 + .../45-logic/15-bool-strings/es/EXERCISE.md | 10 ++ modules/45-logic/15-bool-strings/es/README.md | 29 +++++ modules/45-logic/15-bool-strings/es/data.yml | 5 + modules/45-logic/15-bool-strings/index.php | 10 ++ .../45-logic/15-bool-strings/ru/EXERCISE.md | 10 ++ modules/45-logic/15-bool-strings/ru/README.md | 70 ++++++++++++ modules/45-logic/15-bool-strings/ru/data.yml | 5 + .../45-logic/15-predicates/SolutionTest.php | 17 --- .../45-logic/15-predicates/description.es.yml | 45 -------- modules/45-logic/15-predicates/en/EXERCISE.md | 9 -- modules/45-logic/15-predicates/en/README.md | 47 -------- modules/45-logic/15-predicates/en/data.yml | 11 -- modules/45-logic/15-predicates/es/EXERCISE.md | 9 -- modules/45-logic/15-predicates/es/README.md | 22 ---- modules/45-logic/15-predicates/es/data.yml | 10 -- modules/45-logic/15-predicates/index.php | 10 -- modules/45-logic/15-predicates/ru/EXERCISE.md | 9 -- modules/45-logic/15-predicates/ru/README.md | 22 ---- modules/45-logic/15-predicates/ru/data.yml | 9 -- .../20-logic-combine-expressions/index.php | 2 +- .../20-logic-combine-expressions/ru/README.md | 50 ++++---- .../ru/assets/even-or-odd.jpg | Bin 0 -> 20255 bytes .../20-logic-combine-expressions/ru/data.yml | 8 ++ .../assets/lannisters.jpg | Bin 199372 -> 0 bytes .../45-logic/25-logical-operators/index.php | 6 +- .../25-logical-operators/ru/README.md | 108 +++++++++++++----- .../45-logic/25-logical-operators/ru/data.yml | 4 +- .../45-logic/28-logical-negation/index.php | 6 +- .../28-logical-negation/ru/EXERCISE.md | 4 +- .../45-logic/28-logical-negation/ru/README.md | 105 +++++++++++++++-- .../45-logic/28-logical-negation/ru/data.yml | 5 + .../29-logical-operators-2/SolutionTest.php | 20 ---- .../29-logical-operators-2/description.es.yml | 49 -------- .../29-logical-operators-2/en/EXERCISE.md | 17 --- .../29-logical-operators-2/en/README.md | 26 ----- .../29-logical-operators-2/en/data.yml | 2 - .../29-logical-operators-2/es/EXERCISE.md | 17 --- .../29-logical-operators-2/es/README.md | 26 ----- .../29-logical-operators-2/es/data.yml | 2 - .../45-logic/29-logical-operators-2/index.php | 10 -- .../29-logical-operators-2/ru/EXERCISE.md | 17 --- .../29-logical-operators-2/ru/README.md | 26 ----- .../29-logical-operators-2/ru/data.yml | 2 - .../45-logic/70-logic-weak-typing/Makefile | 2 - .../70-logic-weak-typing/description.es.yml | 75 ------------ .../70-logic-weak-typing/en/EXERCISE.md | 11 -- .../70-logic-weak-typing/en/README.md | 98 ---------------- .../45-logic/70-logic-weak-typing/en/data.yml | 5 - .../70-logic-weak-typing/es/EXERCISE.md | 11 -- .../70-logic-weak-typing/es/README.md | 54 --------- .../45-logic/70-logic-weak-typing/es/data.yml | 5 - .../45-logic/70-logic-weak-typing/index.php | 10 -- .../70-logic-weak-typing/ru/EXERCISE.md | 11 -- .../70-logic-weak-typing/ru/README.md | 54 --------- .../45-logic/70-logic-weak-typing/ru/data.yml | 5 - .../Makefile | 0 .../SolutionTest.php | 4 +- .../90-logical-expressions/description.es.yml | 57 +++++++++ .../90-logical-expressions/en/EXERCISE.md | 10 ++ .../90-logical-expressions/en/README.md | 37 ++++++ .../90-logical-expressions/en/data.yml | 5 + .../90-logical-expressions/es/EXERCISE.md | 10 ++ .../90-logical-expressions/es/README.md | 37 ++++++ .../90-logical-expressions/es/data.yml | 5 + .../45-logic/90-logical-expressions/index.php | 10 ++ .../90-logical-expressions/ru/EXERCISE.md | 10 ++ .../90-logical-expressions/ru/README.md | 89 +++++++++++++++ .../90-logical-expressions/ru/data.yml | 5 + 77 files changed, 828 insertions(+), 873 deletions(-) rename modules/45-logic/{15-predicates => 15-bool-strings}/Makefile (100%) create mode 100644 modules/45-logic/15-bool-strings/SolutionTest.php create mode 100644 modules/45-logic/15-bool-strings/description.es.yml create mode 100644 modules/45-logic/15-bool-strings/en/EXERCISE.md create mode 100644 modules/45-logic/15-bool-strings/en/README.md create mode 100644 modules/45-logic/15-bool-strings/en/data.yml create mode 100644 modules/45-logic/15-bool-strings/es/EXERCISE.md create mode 100644 modules/45-logic/15-bool-strings/es/README.md create mode 100644 modules/45-logic/15-bool-strings/es/data.yml create mode 100644 modules/45-logic/15-bool-strings/index.php create mode 100644 modules/45-logic/15-bool-strings/ru/EXERCISE.md create mode 100644 modules/45-logic/15-bool-strings/ru/README.md create mode 100644 modules/45-logic/15-bool-strings/ru/data.yml delete mode 100644 modules/45-logic/15-predicates/SolutionTest.php delete mode 100644 modules/45-logic/15-predicates/description.es.yml delete mode 100644 modules/45-logic/15-predicates/en/EXERCISE.md delete mode 100644 modules/45-logic/15-predicates/en/README.md delete mode 100644 modules/45-logic/15-predicates/en/data.yml delete mode 100644 modules/45-logic/15-predicates/es/EXERCISE.md delete mode 100644 modules/45-logic/15-predicates/es/README.md delete mode 100644 modules/45-logic/15-predicates/es/data.yml delete mode 100644 modules/45-logic/15-predicates/index.php delete mode 100644 modules/45-logic/15-predicates/ru/EXERCISE.md delete mode 100644 modules/45-logic/15-predicates/ru/README.md delete mode 100644 modules/45-logic/15-predicates/ru/data.yml create mode 100644 modules/45-logic/20-logic-combine-expressions/ru/assets/even-or-odd.jpg delete mode 100644 modules/45-logic/25-logical-operators/assets/lannisters.jpg delete mode 100644 modules/45-logic/29-logical-operators-2/SolutionTest.php delete mode 100644 modules/45-logic/29-logical-operators-2/description.es.yml delete mode 100644 modules/45-logic/29-logical-operators-2/en/EXERCISE.md delete mode 100644 modules/45-logic/29-logical-operators-2/en/README.md delete mode 100644 modules/45-logic/29-logical-operators-2/en/data.yml delete mode 100644 modules/45-logic/29-logical-operators-2/es/EXERCISE.md delete mode 100644 modules/45-logic/29-logical-operators-2/es/README.md delete mode 100644 modules/45-logic/29-logical-operators-2/es/data.yml delete mode 100644 modules/45-logic/29-logical-operators-2/index.php delete mode 100644 modules/45-logic/29-logical-operators-2/ru/EXERCISE.md delete mode 100644 modules/45-logic/29-logical-operators-2/ru/README.md delete mode 100644 modules/45-logic/29-logical-operators-2/ru/data.yml delete mode 100644 modules/45-logic/70-logic-weak-typing/Makefile delete mode 100644 modules/45-logic/70-logic-weak-typing/description.es.yml delete mode 100644 modules/45-logic/70-logic-weak-typing/en/EXERCISE.md delete mode 100644 modules/45-logic/70-logic-weak-typing/en/README.md delete mode 100644 modules/45-logic/70-logic-weak-typing/en/data.yml delete mode 100644 modules/45-logic/70-logic-weak-typing/es/EXERCISE.md delete mode 100644 modules/45-logic/70-logic-weak-typing/es/README.md delete mode 100644 modules/45-logic/70-logic-weak-typing/es/data.yml delete mode 100644 modules/45-logic/70-logic-weak-typing/index.php delete mode 100644 modules/45-logic/70-logic-weak-typing/ru/EXERCISE.md delete mode 100644 modules/45-logic/70-logic-weak-typing/ru/README.md delete mode 100644 modules/45-logic/70-logic-weak-typing/ru/data.yml rename modules/45-logic/{29-logical-operators-2 => 90-logical-expressions}/Makefile (100%) rename modules/45-logic/{70-logic-weak-typing => 90-logical-expressions}/SolutionTest.php (74%) create mode 100644 modules/45-logic/90-logical-expressions/description.es.yml create mode 100644 modules/45-logic/90-logical-expressions/en/EXERCISE.md create mode 100644 modules/45-logic/90-logical-expressions/en/README.md create mode 100644 modules/45-logic/90-logical-expressions/en/data.yml create mode 100644 modules/45-logic/90-logical-expressions/es/EXERCISE.md create mode 100644 modules/45-logic/90-logical-expressions/es/README.md create mode 100644 modules/45-logic/90-logical-expressions/es/data.yml create mode 100644 modules/45-logic/90-logical-expressions/index.php create mode 100644 modules/45-logic/90-logical-expressions/ru/EXERCISE.md create mode 100644 modules/45-logic/90-logical-expressions/ru/README.md create mode 100644 modules/45-logic/90-logical-expressions/ru/data.yml diff --git a/modules/45-logic/10-bool-type/index.php b/modules/45-logic/10-bool-type/index.php index 89077b5c..f8642f5f 100644 --- a/modules/45-logic/10-bool-type/index.php +++ b/modules/45-logic/10-bool-type/index.php @@ -3,7 +3,7 @@ namespace HexletBasics\Logic\BoolType; // BEGIN -function isPensioner($age) +function isPensioner(int $age): bool { return $age >= 60; } diff --git a/modules/45-logic/10-bool-type/ru/README.md b/modules/45-logic/10-bool-type/ru/README.md index 3b74a07f..835792b1 100644 --- a/modules/45-logic/10-bool-type/ru/README.md +++ b/modules/45-logic/10-bool-type/ru/README.md @@ -1,51 +1,87 @@ -Кроме арифметических операций в математике есть операции сравнения, например, `5 > 4` или `3 < 1`. Они есть и в программировании. Допустим, когда мы заходим на сайт, введенные логин и пароль сравниваются с теми, какие есть в базе. Если они есть, нас пускают внутрь — аутентифицируют. В этом уроке разберем операции сравнения. +Кроме арифметических операций в математике есть операции сравнения, например, `5 > 4` или `3 < 1`. Они есть и в программировании. Сравнения часто применяются в реальных задачах, связанных с числами. Например, когда мы оформляем покупку в интернет-магазине, система проверяет: хватает ли у пользователя денег на счете, чтобы оплатить товар. Если сумма на счете больше или равна цене товара, заказ подтверждается. При нехватке средств появляется соответствующее сообщение. -Языки программирования адаптировали все математические операции сравнения в неизменном виде, кроме операторов равенства и неравенства. В математике для этого используется обычное равно `=`, но в программировании такое встречается редко. +## Сравнение в программировании -Во многих языках символ `=` используется, чтобы присвоить переменным значения. Поэтому в php сравнивают с помощью `==`. +Начнем с примера, в котором сравнивается два числа: -Список операций сравнения: +```php + 4); // => bool(true) +var_dump(4 > 4); // => bool(false) +``` + +Результатом сравнения является значение типа `bool`. У этого типа есть всего два возможных варианта `true` и `false`. Это специальные значения языка. Их можно использовать напрямую: + +```php + bool(true) +var_dump(false); // => bool(false) +``` + +Обратите внимание на новую функцию `var_dump()`. Привычная нам `print_r()` плохо подходит для вывода логических значений: `true` она печатает как `1`, а `false` — как пустую строку. Функция `var_dump()` выводит и тип, и значение, поэтому для значений типа `bool` используют ее. -* `<` — меньше -* `<=` — меньше или равно -* `>` — больше -* `>=` — больше или равно -* `==` — равно -* `!=` — не равно +На практике значения `true` и `false` редко используют напрямую, но на их основе строится логика поведения программы. Мы с этим сталкиваемся буквально каждый день, когда вводим пинкоды и пароли, когда выполняем какие-то действия, результатом которых могут быть разные варианты. Все эти варианты прописаны внутри программы в виде условных выражений. Программа рассуждает примерно так: *если так-то делай раз, если по-другому, то делай два*. +В PHP доступны следующие операции сравнения: -Эти операции применяются не только к числам. Например, с помощью оператора равенства можно сравнить строки: `password == text` — это сравнение идентичности строк, которые записаны в разных переменных. +* `<` и `<=` обозначают «меньше» и «меньше или равно» +* `>` и `>=` обозначают «больше» и «больше или равно» +* `==` и `!=` обозначают «равно» и «не равно» +* `===` и `!==` обозначают «строго равно» и «строго не равно» -## Логический тип +Языки программирования адаптировали все математические операции сравнения в неизменном виде, кроме операторов равенства и неравенства. В математике для этого используется обычное равно `=`, но в программировании символ `=`, чаще всего, используется, чтобы присвоить переменным значения. Поэтому в PHP сравнивают с помощью `==` и `===`. -Логическая операция типа `5 > 4` или `password == text` — это выражение. Его результат — специальное значение `True` («истина») или `False` («ложь»). Это новый для нас тип данных — `bool`: +Чем различаются эти два оператора? Вспомните урок про слабую типизацию: PHP пытается автоматически преобразовывать типы. Оператор `==` сравнивает значения после такого преобразования, поэтому, например, `0 == '0'` оказывается истиной. Оператор `===` сравнивает строго, без преобразования: значения равны, только если совпадают и тип, и само значение. Неявные преобразования приводят к трудноуловимым ошибкам, поэтому в PHP принято использовать строгие операторы `===` и `!==` — так мы и будем делать в этом курсе. + +Несколько примеров: ```php 4; -print_r($result); // => true -print_r('one' !== 'one'); // => false +var_dump(5 >= 3); // => bool(true) +var_dump(7 < 0); // => bool(false) +var_dump(5 > 5); // => bool(false) +var_dump(5 >= 5); // => bool(true) +var_dump(2 === 5); // => bool(false) +var_dump(2 !== 5); // => bool(true) ``` -Он содержит всего лишь два этих значения. Наряду со строками (string) и целыми и рациональными числами, булев тип (bool) — это один из примитивных типов данных в PHP. +Когда в сравнении используют конкретные значения, то эта операция кажется бессмысленной, мы и так знаем ее результат сравнения и он всегда один и тот же, потому что если 3 больше 2, то это не меняется. Но все меняется, когда значения могут меняться. Попробуем написать простую функцию, которая принимает на вход возраст ребенка и определяет, младенец ли он. Младенцами считаются дети до двух лет (два не включается). + +```php + bool(false) +var_dump(isInfant(2)); // => bool(false) +var_dump(isInfant(1)); // => bool(true) +var_dump(isInfant(0)); // => bool(true) +``` -Попробуем написать простую функцию, которая принимает на вход возраст ребенка и определяет, младенец ли он. Младенцами считаются дети до года. +Когда функции возвращают результат сравнения, они обычно отвечают на вопрос «да» или «нет». Такие функции называют **предикатами**. Их легко узнать по тому, что они возвращают логическое значение `true` или `false`. Часто в их названии есть вопрос или утверждение, которое можно проверить. В PHP предикаты, как правило, начинаются с префикса `is`, `has` или `can`, но не ограничены этими словами. Примеры: -Любая операция — это выражение, поэтому единственной строчкой функции пишем «вернуть то значение, которое получится в результате сравнения `age < 1`». В зависимости от того, какой аргумент пришел, сравнение будет истинным (`True`) или ложным (`False`), а `return` вернет этот результат: +* `isInfant()` — «младенец ли?» +* `hasChildren()` — «есть ли дети?» +* `isEmpty()` — «пустой ли?» +* `hasErrors()` — «есть ли ошибки?» + +Вот функция, проверяющая, является ли число отрицательным: ```php bool(false) -var_dump(isInfant(0.5)); // => bool(true) - +var_dump(isNegative(-5)); // => bool(true) +var_dump(isNegative(7)); // => bool(false) ``` diff --git a/modules/45-logic/10-bool-type/ru/data.yml b/modules/45-logic/10-bool-type/ru/data.yml index f5764e1b..61fc5342 100644 --- a/modules/45-logic/10-bool-type/ru/data.yml +++ b/modules/45-logic/10-bool-type/ru/data.yml @@ -1,5 +1,13 @@ --- name: Логический тип +tips: + - | + [Тип bool в PHP](https://www.php.net/manual/ru/language.types.boolean.php) + - > + [Именование в + программировании](https://ru.hexlet.io/blog/posts/naming-in-programming?utm_source=code-basics&utm_medium=referral&utm_campaign=blog&utm_content=lesson) definitions: - name: Логический тип (bool) - description: 'тип данных с двумя возможными значениями: true (истина) и false (ложь).' + description: 'тип данных с двумя возможными значениями: `true` (истина) и `false` (ложь).' + - name: Предикат + description: выражение, отвечающее на вопрос «да» или «нет» с помощью типа bool. diff --git a/modules/45-logic/15-predicates/Makefile b/modules/45-logic/15-bool-strings/Makefile similarity index 100% rename from modules/45-logic/15-predicates/Makefile rename to modules/45-logic/15-bool-strings/Makefile diff --git a/modules/45-logic/15-bool-strings/SolutionTest.php b/modules/45-logic/15-bool-strings/SolutionTest.php new file mode 100644 index 00000000..dc0debd4 --- /dev/null +++ b/modules/45-logic/15-bool-strings/SolutionTest.php @@ -0,0 +1,17 @@ +assertFalse(isLongWord('apple')); + $this->assertTrue(isLongWord('banana')); + $this->assertTrue(isLongWord('pineapple')); + } +} diff --git a/modules/45-logic/15-bool-strings/description.es.yml b/modules/45-logic/15-bool-strings/description.es.yml new file mode 100644 index 00000000..87d1bea6 --- /dev/null +++ b/modules/45-logic/15-bool-strings/description.es.yml @@ -0,0 +1,49 @@ +--- + +name: Comparación de cadenas +theory: | + Las operaciones de comparación funcionan tanto con números como con cadenas. En PHP las cadenas se comparan lexicográficamente: carácter por carácter, de izquierda a derecha, según los códigos de los caracteres. + + ```php + bool(true) + var_dump('cat' > 'dog'); // => bool(false) + ``` + + Aquí `'apple' < 'banana'` porque el código de `a` (97) es menor que el código de `b` (98). El código de un carácter se puede consultar con la función `ord()`. La comparación distingue entre mayúsculas y minúsculas: el código de `'Z'` (90) es menor que el de `'a'` (97). + + Las comparaciones son expresiones, por lo que se pueden combinar con otras expresiones, por ejemplo con la función `strlen()`, que devuelve la longitud de una cadena: + + ```php + 3); // => bool(true) + var_dump(strlen('hi') > 3); // => bool(false) + ``` + + PHP también tiene muchas funciones predicado integradas para cadenas, por ejemplo: + + ```php + bool(true) + var_dump(str_ends_with('hello', 'lo')); // => bool(true) + var_dump(str_contains('hello', 'ell')); // => bool(true) + ``` + +instructions: | + Al registrarse en un sitio web, el programa comprueba que la contraseña sea lo suficientemente larga: más de 5 caracteres. Escribe una función `isLongWord()` que devuelva `true` si la longitud de la palabra dada es mayor que 5 caracteres, y `false` en caso contrario. + + Ejemplo: + + ```php + bool(false) + var_dump(isLongWord('banana')); // => bool(true) + ``` + +tips: + - | + [Operadores de comparación en PHP](https://www.php.net/manual/es/language.operators.comparison.php) diff --git a/modules/45-logic/15-bool-strings/en/EXERCISE.md b/modules/45-logic/15-bool-strings/en/EXERCISE.md new file mode 100644 index 00000000..f3f3414d --- /dev/null +++ b/modules/45-logic/15-bool-strings/en/EXERCISE.md @@ -0,0 +1,10 @@ +When registering on a website, the program checks that the password is long enough — more than 5 characters. Write a function `isLongWord()` that returns `true` if the length of the given word is more than 5 characters, and `false` otherwise. + +Example: + +```php + bool(false) +var_dump(isLongWord('banana')); // => bool(true) +``` diff --git a/modules/45-logic/15-bool-strings/en/README.md b/modules/45-logic/15-bool-strings/en/README.md new file mode 100644 index 00000000..331c8bd5 --- /dev/null +++ b/modules/45-logic/15-bool-strings/en/README.md @@ -0,0 +1,29 @@ +Comparison operations work with strings as well as numbers. In PHP, strings are compared lexicographically: character by character, left to right, using character codes. + +```php + bool(true) +var_dump('cat' > 'dog'); // => bool(false) +``` + +Here `'apple' < 'banana'` because the code of `a` (97) is less than the code of `b` (98). You can check a character code with the `ord()` function. The comparison is case-sensitive: the code of `'Z'` (90) is less than the code of `'a'` (97). + +Comparisons are expressions, so you can combine them with other expressions, for example with the `strlen()` function that returns the length of a string: + +```php + 3); // => bool(true) +var_dump(strlen('hi') > 3); // => bool(false) +``` + +PHP also has many built-in predicate functions for strings, for example: + +```php + bool(true) +var_dump(str_ends_with('hello', 'lo')); // => bool(true) +var_dump(str_contains('hello', 'ell')); // => bool(true) +``` diff --git a/modules/45-logic/15-bool-strings/en/data.yml b/modules/45-logic/15-bool-strings/en/data.yml new file mode 100644 index 00000000..15841c55 --- /dev/null +++ b/modules/45-logic/15-bool-strings/en/data.yml @@ -0,0 +1,5 @@ +--- +name: Comparing strings +tips: + - | + [Comparison operators in PHP](https://www.php.net/manual/en/language.operators.comparison.php) diff --git a/modules/45-logic/15-bool-strings/es/EXERCISE.md b/modules/45-logic/15-bool-strings/es/EXERCISE.md new file mode 100644 index 00000000..a24be8f4 --- /dev/null +++ b/modules/45-logic/15-bool-strings/es/EXERCISE.md @@ -0,0 +1,10 @@ +Al registrarse en un sitio web, el programa comprueba que la contraseña sea lo suficientemente larga: más de 5 caracteres. Escribe una función `isLongWord()` que devuelva `true` si la longitud de la palabra dada es mayor que 5 caracteres, y `false` en caso contrario. + +Ejemplo: + +```php + bool(false) +var_dump(isLongWord('banana')); // => bool(true) +``` diff --git a/modules/45-logic/15-bool-strings/es/README.md b/modules/45-logic/15-bool-strings/es/README.md new file mode 100644 index 00000000..ba3af525 --- /dev/null +++ b/modules/45-logic/15-bool-strings/es/README.md @@ -0,0 +1,29 @@ +Las operaciones de comparación funcionan tanto con números como con cadenas. En PHP las cadenas se comparan lexicográficamente: carácter por carácter, de izquierda a derecha, según los códigos de los caracteres. + +```php + bool(true) +var_dump('cat' > 'dog'); // => bool(false) +``` + +Aquí `'apple' < 'banana'` porque el código de `a` (97) es menor que el código de `b` (98). El código de un carácter se puede consultar con la función `ord()`. La comparación distingue entre mayúsculas y minúsculas: el código de `'Z'` (90) es menor que el de `'a'` (97). + +Las comparaciones son expresiones, por lo que se pueden combinar con otras expresiones, por ejemplo con la función `strlen()`, que devuelve la longitud de una cadena: + +```php + 3); // => bool(true) +var_dump(strlen('hi') > 3); // => bool(false) +``` + +PHP también tiene muchas funciones predicado integradas para cadenas, por ejemplo: + +```php + bool(true) +var_dump(str_ends_with('hello', 'lo')); // => bool(true) +var_dump(str_contains('hello', 'ell')); // => bool(true) +``` diff --git a/modules/45-logic/15-bool-strings/es/data.yml b/modules/45-logic/15-bool-strings/es/data.yml new file mode 100644 index 00000000..fd59b4fa --- /dev/null +++ b/modules/45-logic/15-bool-strings/es/data.yml @@ -0,0 +1,5 @@ +--- +name: Comparación de cadenas +tips: + - | + [Operadores de comparación en PHP](https://www.php.net/manual/es/language.operators.comparison.php) diff --git a/modules/45-logic/15-bool-strings/index.php b/modules/45-logic/15-bool-strings/index.php new file mode 100644 index 00000000..d0fca7f2 --- /dev/null +++ b/modules/45-logic/15-bool-strings/index.php @@ -0,0 +1,10 @@ + 5; +} +// END diff --git a/modules/45-logic/15-bool-strings/ru/EXERCISE.md b/modules/45-logic/15-bool-strings/ru/EXERCISE.md new file mode 100644 index 00000000..3180190a --- /dev/null +++ b/modules/45-logic/15-bool-strings/ru/EXERCISE.md @@ -0,0 +1,10 @@ +При регистрации на сайте программа проверяет, что пароль достаточно длинный — больше 5 символов. Напишите функцию `isLongWord()`, которая возвращает `true`, если длина переданного слова больше 5 символов, и `false` в противном случае. + +Пример работы: + +```php + bool(false) +var_dump(isLongWord('banana')); // => bool(true) +``` diff --git a/modules/45-logic/15-bool-strings/ru/README.md b/modules/45-logic/15-bool-strings/ru/README.md new file mode 100644 index 00000000..38877ddc --- /dev/null +++ b/modules/45-logic/15-bool-strings/ru/README.md @@ -0,0 +1,70 @@ +Операции сравнения работают с числами и со строками. В PHP строки сравниваются лексикографически: посимвольно слева направо по числовым кодам символов. + +```php + bool(true) +var_dump('cat' > 'dog'); // => bool(false) +var_dump('abc' === 'abc'); // => bool(true) +var_dump('hello' !== 'world'); // => bool(true) +``` + +Здесь `'apple' < 'banana'`, потому что код `a` (97) меньше кода `b` (98), и именно первый символ решает исход сравнения. Код символа можно посмотреть с помощью функции `ord()`: + +```php + 97 +print_r(ord('b')); // => 98 +``` + +Сравнение чувствительно к регистру: код `'Z'` (90) меньше кода `'a'` (97). Пример сравнения, где первые буквы разного регистра: + +```php + bool(true) — 'Z'(90) < 'a'(97) +var_dump('apple' < 'Banana'); // => bool(false) — 'a'(97) > 'B'(66) +var_dump('Apple' < 'apple'); // => bool(true) — 'A'(65) < 'a'(97) +``` + +Напишем функцию, которая проверяет, начинается ли слово с заданной буквы. Для этого возьмем первый символ строки и сравним его с нужной буквой: + +```php + bool(true) +var_dump(startsWithLetter('banana', 'a')); // => bool(false) +``` + +Операции сравнения представляют собой такие же выражения, как и арифметические. В них можно подставлять готовые значения и другие выражения, как в примере выше: `$word[0]`. Например, вместо числа можно использовать результат работы функции `strlen()`, которая возвращает длину строки: + +```php + 3); // => bool(true), потому что strlen('apple') — это 5 +var_dump(strlen('hi') > 3); // => bool(false), потому что strlen('hi') — это 2 +``` + +В примере выше сначала выполняется функция `strlen('apple')`, результатом будет число `5`. Потом это число сравнивается с `3`. Другими словами, сначала считаются аргументы выражения (например, длина строки), а потом выполняется операция сравнения. + +Так можно комбинировать разные операции, получая более сложные проверки. + +## Полезные предикаты + +В PHP есть много встроенных функций-предикатов для работы со строками. Они возвращают `true` или `false` и помогают проверять разные свойства строки. Ниже приведены самые часто используемые: + +```php + bool(true) — строка начинается с 'he' +var_dump(str_ends_with('hello', 'lo')); // => bool(true) — строка заканчивается на 'lo' +var_dump(str_contains('hello', 'ell')); // => bool(true) — строка содержит 'ell' +``` + +Такие функции позволяют проверять строки на нужные условия прямо в коде, без написания дополнительных функций. diff --git a/modules/45-logic/15-bool-strings/ru/data.yml b/modules/45-logic/15-bool-strings/ru/data.yml new file mode 100644 index 00000000..6124b194 --- /dev/null +++ b/modules/45-logic/15-bool-strings/ru/data.yml @@ -0,0 +1,5 @@ +--- +name: Сравнение строк +tips: + - | + [Операторы сравнения в PHP](https://www.php.net/manual/ru/language.operators.comparison.php) diff --git a/modules/45-logic/15-predicates/SolutionTest.php b/modules/45-logic/15-predicates/SolutionTest.php deleted file mode 100644 index 032dbf69..00000000 --- a/modules/45-logic/15-predicates/SolutionTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertFalse(isMister('8234782')); - $this->assertFalse(isMister('Joker')); - $this->assertTrue(isMister('Mister')); - } -} diff --git a/modules/45-logic/15-predicates/description.es.yml b/modules/45-logic/15-predicates/description.es.yml deleted file mode 100644 index fa0a0558..00000000 --- a/modules/45-logic/15-predicates/description.es.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- - -name: Predicados -theory: | - - Recordemos la función `isInfant()` del tema anterior: - - ```php - - [Naming in - programming](https://hexlet.io/blog/posts/code-complete-naming-in-programming) -definitions: - - name: A predicate - description: >- - is an expression that answers a yes or no question using the bool data - type. diff --git a/modules/45-logic/15-predicates/es/EXERCISE.md b/modules/45-logic/15-predicates/es/EXERCISE.md deleted file mode 100644 index 2be62fa3..00000000 --- a/modules/45-logic/15-predicates/es/EXERCISE.md +++ /dev/null @@ -1,9 +0,0 @@ - -Escribe una función `isMister()` que tome una cadena de texto y verifique si es la palabra `'Mister'`. - -```php -- - una expresión que responde a una pregunta "sí" o "no" utilizando el tipo - bool. diff --git a/modules/45-logic/15-predicates/index.php b/modules/45-logic/15-predicates/index.php deleted file mode 100644 index 042c3da1..00000000 --- a/modules/45-logic/15-predicates/index.php +++ /dev/null @@ -1,10 +0,0 @@ - - [Именование в - программировании](https://ru.hexlet.io/blog/posts/naming-in-programming?utm_source=code-basics&utm_medium=referral&utm_campaign=blog&utm_content=lesson) -definitions: - - name: Предикат - description: выражение, отвечающее на вопрос «да» или «нет» с помощью типа bool. diff --git a/modules/45-logic/20-logic-combine-expressions/index.php b/modules/45-logic/20-logic-combine-expressions/index.php index ba0434ee..3311690e 100644 --- a/modules/45-logic/20-logic-combine-expressions/index.php +++ b/modules/45-logic/20-logic-combine-expressions/index.php @@ -3,7 +3,7 @@ namespace HexletBasics\Logic\CombineExpressions; // BEGIN -function isInternationalPhone($phone) +function isInternationalPhone(string $phone): bool { return $phone[0] === '+'; } diff --git a/modules/45-logic/20-logic-combine-expressions/ru/README.md b/modules/45-logic/20-logic-combine-expressions/ru/README.md index f6e77052..4c04af53 100644 --- a/modules/45-logic/20-logic-combine-expressions/ru/README.md +++ b/modules/45-logic/20-logic-combine-expressions/ru/README.md @@ -1,52 +1,58 @@ -**Логические операции** — это выражения, значит, их можно комбинировать с другими выражениями. Например, мы хотим проверить четность числа — кратность двум. В программировании используют такой подход: проверяют остаток от деления на два: +**Логические операции** являются выражениями, поэтому их можно комбинировать с другими выражениями. Например, мы хотим проверить четность числа, то есть его кратность двум. В программировании для этого проверяют остаток от деления на два. Если остаток равен `0`, число четное. Если остаток не равен `0`, число нечетное. -* если остаток `0` — число четное -* если остаток не `0` — число нечетное +![even-or-odd](./assets/even-or-odd.jpg) -Остаток от деления — простая, но важная концепция в арифметике, алгебре, в теории чисел и криптографии. Нужно разделить число на несколько равных групп, и если в конце что-то останется — это остаток от деления. +Остаток от деления является простой, но важной концепцией в арифметике, алгебре, в теории чисел и криптографии. Нужно разделить число на несколько равных групп, и если в конце что-то останется, это и есть остаток от деления. Делим конфеты поровну между людьми: -* 7 конфет, 2 человека: 2 x 3 + остаток 1 — 7 не кратно 2 -* 21 конфету, 3 человека: 3 x 7 + остаток 0 — 21 кратно 3 -* 19 конфет, 5 человек: 5 x 3 + остаток 4 — 19 не кратно 5 +* 7 конфет, 2 человека: 2 x 3 + остаток 1 (7 не кратно 2) +* 21 конфету, 3 человека: 3 x 7 + остаток 0 (21 кратно 3) +* 19 конфет, 5 человек: 5 x 3 + остаток 4 (19 не кратно 5) -Оператор `%` вычисляет **остаток от деления**: +Оператор `%` вычисляет остаток от деления: * `7 % 2` → `1` * `21 % 3` → `0` * `19 % 5` → `4` -С помощью него напишем функцию проверки четности: +Скомбинируем в одном выражении логический оператор «проверка равенства» `===` и арифметический оператор `%` и напишем функцию проверки четности: ```php bool(true) +var_dump(isEven(3)); // => bool(false) ``` -В одном выражении мы скомбинировали логический оператор проверки равенства `===` и арифметический оператор `%`. +Приоритет арифметических операций выше логических. Значит, сначала вычисляется арифметическое выражение `$number % 2`, а затем результат сравнивается с нулем и возвращается результат проверки равенства. -Приоритет арифметических операций выше логических. Значит, сначала вычисляется арифметическое выражение `$number % 2`, затем результат участвует в логическом сравнении. +Теперь напишем функцию, которая принимает строку и проверяет, начинается ли эта строка с латинской буквы `a`. -Это можно расшифровать так: +Алгоритм: ->«Вычислить остаток от деления числа `$number` на 2 и сравнить, равен ли остаток нулю; затем вернуть результат проверки равенства»* - ---- - -*Напомним об извлечении символов из строки с помощью квадратных скобок:* +1. Получим и запишем в переменную первый символ из строки-аргумента +2. Сравним, равен ли символ латинской букве `a` +3. Вернем результат ```php bool(false) +var_dump(isFirstLetterAnA('apple')); // => bool(true) ``` + +Чтобы было понятно, что тут происходит, попробуйте проговорить происходящее аналогично тому, как мы расшифровывали процесс в примере с `isEven()`. + +Теперь вы знаете, что операции сравнения применяются в программировании наравне с арифметическими. Но помните, что равенство обозначается `===`. Так вы не спутаете эту операцию с присваиванием значения переменной. diff --git a/modules/45-logic/20-logic-combine-expressions/ru/assets/even-or-odd.jpg b/modules/45-logic/20-logic-combine-expressions/ru/assets/even-or-odd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c3197c818855b86ebc625db0be4b19824793637 GIT binary patch literal 20255 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%0AFRAprrvMM_J+ec z3)P9^v9yXiLuPT~WU27#cnnX-lf=sidBKD3?J|?t`;*(gP8frF+)Enb!;07xkZ)we&nRSFr z`K0gh3_zwmRp+hIBtD8;$)p?GTy8o%v9Qe|DyIJ2FRx?Tlznzlwr397y_sA@Z<#}O zy<$t?RhQMV)-u#}o%P%cu#QlRv)XnM?1W5tx$&6Q`{Y=#0-CIUW)qvUpbL?zZmg6w z2HnG=Wb3jLif67p!ei*bGPIAk)TYqJ`3BuuFJN6h8Ju;wbhzTYZ-1Y%_asJ ziEk?DmQ`2xRh_O@-PbiHkRm1C!`Y?7^oYu5z=p1*9b-YbL~mgro&$chK#@}}xTE(f z%mBkL54e}KneGh64`U5Q`nu?SZ6m3b3(!hFTLU zIHaFk^HlRxb5^tv`*T)Avv*d{L?Q)7u1^@ys&suvJuE-oBSQv8%HtcHjTi$`2LTL> zH_3&F*Tu>eYLK@wOIIseCQlr@wc5F$I5r7&tM}=YcCZ!3*}U(iMP(FdAK>ybL?Dn& zr#rEA^`je7DnFLkGp22~wVp0N0y+T4g!Bp8f-as8%@smp3H!(qJ|74^;HXfYPI1rGD&`9*d4 z4*|vDDYd%lh7pT2Dhue={L{1d$106)mAzLZ;~z=84AhN%XtQ%={>Y#c>Lc})=`AMGtQ+?3`k0FoxA1Jd z1Rm^P#%lh1qn}Llu*o+NUfcI3=Op6rM;@_S&>N2Ab~!6rY91!5^8gl$vA1$%zT+T< z6tKQmHn(uGGQy?FZsm!k_lO|H`dTehSd<$G z=uxa|@Y%^t@8T>4}DR=V?xw(-t4v)&Il*FA)F&0RsX91_TEH z00000000330{{dO1rQ-YU=kA|F;RgsfT6Jz6(ez=u)+V@00;pC0RcY%`D>nLh-5Bl zbqPy(R8C!TMmpRm2RQy5U~i7J8{}+!`pj&06^^qT;;~$7mstb0Xdbv5X0!6JmUFns zQ&QSZ7Z+T0pr~}YocQ<(g31_2gmLxfv{Fj)Hv!lj{c7(`Nk?iv2k2;mrw6RGyD$fQ z{@Y)?l3a*Uv0s!sd{TWX&e!nBQ#qraRjXT!3D@7OZQ}1`RP~?$7#mGHE$c{wBpiQ~ zH7kgS?~{S{sHIs@Ivxgy$i-v4upzk*w^-OWX5|et1sOCdJ6NNT$fJp=<5?qRYSEaK zW%N5s`c`e9Prq2k#vdM1V4RR5Qmg%x5*IUaV+iLzXqCTbN<-d7e9J^8kV& z&#bhov5w`vsfIxmbb@$>#XY2UDkVN6nu1|E2Lh& + последовательность действий над данными, приводящая к каком-то результату, + который можно использовать. diff --git a/modules/45-logic/25-logical-operators/assets/lannisters.jpg b/modules/45-logic/25-logical-operators/assets/lannisters.jpg deleted file mode 100644 index feeac49e84221e4a7cb0372a11379ee5beacf661..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199372 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 x <= 20`, где `x` — это длина конкретного пароля. Но в PHP такой трюк не пройдет. +> Пароль длиннее 8 символов **И** пароль содержит хотя бы одну заглавную букву -Нам придется сделать два отдельных логических выражения и соединить их специальным оператором «И»: +Вот функция, которая принимает пароль и говорит, соответствует ли он условиям (`true`) или не соответствует (`false`): ```php = 8 && $length <= 20) && hasSpecialChars($password); + return $length > 8 && hasCapitalLetter($password); +} + +var_dump(isCorrectPassword('Qwerty')); // => bool(false) +var_dump(isCorrectPassword('Qwerty1234')); // => bool(true) +var_dump(isCorrectPassword('qwerty1234')); // => bool(false) +``` + +Оператор `&&` означает «И». В математической логике это называют конъюнкцией. Все выражение считается истинным, если истинен каждый **операнд**, то есть каждое из составных выражений. Иными словами, `&&` означает «и то, и другое». Приоритет этого оператора ниже, чем приоритет операторов сравнения. Поэтому выражение `hasCapitalLetter($password) && $length > 8` тоже правильно отрабатывает без скобок. + +Кроме `&&` часто используется оператор `||`, обозначающий «ИЛИ» (дизъюнкция). Он означает «или то, или другое, или оба». Выражение `$a || $b` считается истинным, если хотя бы один из операндов истинен или когда оба операнда истинны. В другом случае выражение ложное. + +```php + bool(true) (младше 18) +var_dump(hasDiscount(25, true)); // => bool(true) (студент) +var_dump(hasDiscount(15, true)); // => bool(true) (оба условия) +var_dump(hasDiscount(25, false)); // => bool(false) +``` + +Операторы можно комбинировать в любом количестве и в любой последовательности. Если в коде одновременно встречаются `&&` и `||`, то приоритет лучше задавать скобками. Ниже пример расширенной функции, которая определяет корректность пароля: + +```php + 8 && hasCapitalLetter($password)) && hasSpecialChars($password); +} ``` -Оператор `&&` означает «И» — в математической логике это называют **конъюнкцией**. Все выражение считается истинным только в том случае, когда истинен каждый операнд — каждое из составных выражений. Иными словами, `&&` означает «и то, и другое». Приоритет этого оператора ниже, чем приоритет операторов сравнения, поэтому выражение отрабатывает правильно без скобок. +Теперь представим, что мы хотим купить квартиру, которая удовлетворяет таким условиям: площадь от 100 квадратных метров и больше на любой улице **ИЛИ** площадь от 80 квадратных метров и больше, но на центральной улице `Main Street`. -Кроме `&&`, часто используется оператор `||` — «ИЛИ» (**дизъюнкция**). Он означает «или то, или другое, или оба». Операторы можно комбинировать в любом количестве и любой последовательности, но когда одновременно встречаются `&&` и `||`, то приоритет лучше задавать скобками. +Напишем функцию, которая проверит квартиру. Она принимает два аргумента: площадь (число) и название улицы (строку): + +```php += 100 || ($area >= 80 && $street === 'Main Street'); +} + +var_dump(isGoodApartment(91, 'Queens Street')); // => bool(false) +var_dump(isGoodApartment(78, 'Queens Street')); // => bool(false) +var_dump(isGoodApartment(70, 'Main Street')); // => bool(false) + +var_dump(isGoodApartment(120, 'Queens Street')); // => bool(true) +var_dump(isGoodApartment(120, 'Main Street')); // => bool(true) +var_dump(isGoodApartment(80, 'Main Street')); // => bool(true) +``` -Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже увидите **таблицы истинности** — по ним можно определить, каким будет результат, если применить оператора: +Область математики, в которой изучаются логические операторы, называется булевой алгеброй. **Таблицы истинности** показывают, каким будет результат при применении каждого оператора. -### И `&&` +#### И `&&` | A | B | A `&&` B | | ----- | ----- | -------- | -| TRUE | TRUE | **TRUE** | -| TRUE | FALSE | FALSE | -| FALSE | TRUE | FALSE | -| FALSE | FALSE | FALSE | +| true | true | **true** | +| true | false | false | +| false | true | false | +| false | false | false | -### ИЛИ `||` +#### ИЛИ `||` | A | B | A `‖` B | | ----- | ----- | -------- | -| TRUE | TRUE | **TRUE** | -| TRUE | FALSE | **TRUE** | -| FALSE | TRUE | **TRUE** | -| FALSE | FALSE | FALSE | +| true | true | **true** | +| true | false | **true** | +| false | true | **true** | +| false | false | false | diff --git a/modules/45-logic/25-logical-operators/ru/data.yml b/modules/45-logic/25-logical-operators/ru/data.yml index efa8ff0b..c4ee669a 100644 --- a/modules/45-logic/25-logical-operators/ru/data.yml +++ b/modules/45-logic/25-logical-operators/ru/data.yml @@ -4,9 +4,9 @@ tips: - | [Булева алгебра](https://ru.wikipedia.org/wiki/Булева_алгебра) - | - [Конъюнкция](https://ru.wikipedia.org/wiki/Конъюнкция) + [Логическое «И»](https://ru.wikipedia.org/wiki/Конъюнкция) - | - [Дизъюнкция](https://ru.wikipedia.org/wiki/Дизъюнкция) + [Логическое «ИЛИ»](https://ru.wikipedia.org/wiki/Дизъюнкция) definitions: - name: Логические операторы description: >- diff --git a/modules/45-logic/28-logical-negation/index.php b/modules/45-logic/28-logical-negation/index.php index 91ca0da0..83c55578 100644 --- a/modules/45-logic/28-logical-negation/index.php +++ b/modules/45-logic/28-logical-negation/index.php @@ -2,16 +2,14 @@ namespace HexletBasics\Logic\LogicalNegation; -use function HexletBasics\Functions\mb_strrev; - // BEGIN -function isPalindrome($word) +function isPalindrome(string $word): bool { $lowerWord = strtolower($word); return $lowerWord === strrev($lowerWord); } -function isNotPalindrome($word) +function isNotPalindrome(string $word): bool { return !isPalindrome($word); } diff --git a/modules/45-logic/28-logical-negation/ru/EXERCISE.md b/modules/45-logic/28-logical-negation/ru/EXERCISE.md index 3cdfab51..b3b7da4e 100644 --- a/modules/45-logic/28-logical-negation/ru/EXERCISE.md +++ b/modules/45-logic/28-logical-negation/ru/EXERCISE.md @@ -1,7 +1,7 @@ -В этом уроке вам нужно будет реализовать две функции `isPalindrome()` и `isNotPalindrome()` +В игре со словами участники проверяют, является ли слово палиндромом. Реализуйте две функции `isPalindrome()` и `isNotPalindrome()`, принимающие строку на вход -1. Функция `isPalindrome()` определяет, является ли слово палиндромом или нет. Палиндром это слово, которое читается одинаково в обоих направлениях. +1. Функция `isPalindrome()` определяет, является ли слово палиндромом или нет. Палиндром — это слово, которое читается одинаково в обоих направлениях. ```php bool(true) +var_dump(!isEven(10)); // => bool(false) +``` + +В примере выше мы добавили `!` слева от вызова функции и получили обратное действие. + +Отрицание позволяет выражать задуманные правила в коде без написания новых функций. Если написать `!!isEven(10)`, то код сработает даже в таком случае: + +```php + bool(true) +``` + +В логике двойное отрицание равносильно отсутствию отрицания: + +```php + bool(true) +var_dump(!!isEven(11)); // => bool(false) +``` + +`!` можно комбинировать с `&&` и `||`. Среди логических операторов у него наивысший приоритет, поэтому он применяется первым: + +```php + false || true => true +!true && false; // (!true) && false => false && false => false +``` + +Скобки меняют порядок вычисления: + +```php + false +!(true && false); // !false => true +``` + +Практический пример — функция проверяет, может ли водитель сесть за руль: нужны права и трезвость: + +```php + bool(true) (есть права, трезвый) +var_dump(canDrive(true, true)); // => bool(false) (есть права, но пьяный) +var_dump(canDrive(false, false)); // => bool(false) (нет прав) +``` + +Теперь вы знаете, что означают операторы **И**, **ИЛИ** и `!`. С их помощью вы сможете задавать составные условия из двух и более логических выражений. + +## Законы де Моргана + +При работе со сложными логическими выражениями бывает нужно их инвертировать или переписать в эквивалентную форму, которую легче читать. Для этого существуют **законы де Моргана** — два правила, которые описывают, как отрицание распределяется по составному выражению: + +```text +!(A && B) эквивалентно !A || !B +!(A || B) эквивалентно !A && !B +``` + +Первый закон: отрицание конъюнкции равно дизъюнкции отрицаний. Проверим: + +```php + true +!true || !false; // false || true => true +``` + +Второй закон: отрицание дизъюнкции равно конъюнкции отрицаний: + +```php + false +!true && !false; // false && true => false ``` -Мы просто добавили `!` слева от вызова функции и получили обратное действие. Отрицание — мощный инструмент, который позволяет лаконично выражать задуманные правила в коде без необходимости писать новые функции. +На практике законы де Моргана помогают упрощать условия. Например, вместо `!($isAdmin || $isModerator)` можно написать `!$isAdmin && !$isModerator` — читается как «не администратор и не модератор». diff --git a/modules/45-logic/28-logical-negation/ru/data.yml b/modules/45-logic/28-logical-negation/ru/data.yml index dd24f7f1..b8232201 100644 --- a/modules/45-logic/28-logical-negation/ru/data.yml +++ b/modules/45-logic/28-logical-negation/ru/data.yml @@ -3,3 +3,8 @@ name: Отрицание tips: - | [Законы Де Моргана](https://ru.wikipedia.org/wiki/Законы_де_Моргана) +definitions: + - name: Отрицание + description: > + логическая операция, которая меняет логическое значение на + противоположное. diff --git a/modules/45-logic/29-logical-operators-2/SolutionTest.php b/modules/45-logic/29-logical-operators-2/SolutionTest.php deleted file mode 100644 index 892e568b..00000000 --- a/modules/45-logic/29-logical-operators-2/SolutionTest.php +++ /dev/null @@ -1,20 +0,0 @@ -assertTrue(isNeutralSoldier('yellow', 'black')); - $this->assertFalse(isNeutralSoldier('red', 'yellow')); - $this->assertFalse(isNeutralSoldier('red', 'red')); - $this->assertFalse(isNeutralSoldier('red', 'black')); - $this->assertFalse(isNeutralSoldier('yellow', 'red')); - $this->assertTrue(isNeutralSoldier('black', 'black')); - } -} diff --git a/modules/45-logic/29-logical-operators-2/description.es.yml b/modules/45-logic/29-logical-operators-2/description.es.yml deleted file mode 100644 index 08f7c1c8..00000000 --- a/modules/45-logic/29-logical-operators-2/description.es.yml +++ /dev/null @@ -1,49 +0,0 @@ ---- - -name: Operadores lógicos 2 -theory: | - - Los operadores lógicos son un tema importante, por lo que es necesario reforzarlo con un ejemplo y un ejercicio adicional. - - Intentemos implementar una función que verifique si un año es bisiesto. Un año es bisiesto si es divisible por 400 o si es divisible por 4 y no es divisible por 100. Como puedes ver, toda la lógica necesaria ya está definida, solo falta trasladarla al código: - - ```php - 1 - print_r(false); // => (se muestra una cadena vacía en la pantalla) - print_r(0 || 1); // => 1 - ``` - - El operador **OR** solo funciona con el tipo *bool*, pero se le dan los números `1` y `0`: - - 1. `0` se convierte en `false` y `1` se convierte en `true` - 2. El resultado de `false || true` es `true` - 3. Ahora `print_r()` recibe `true`, pero solo funciona con cadenas - 4. `true` se convierte en `1` - 5. Y se muestra `1` en la pantalla - - Aquí es importante destacar la diferencia entre los operadores `===` y `==`. La diferencia radica en la conversión de tipos. - - La cadena vacía y `false` son valores diferentes, por lo que el operador `===` dice "¡Falso! ¡No son iguales!". - - Pero el operador `==` convierte los tipos. Desde su punto de vista, la cadena vacía y `false` son iguales. Esta conversión es implícita, por lo que se recomienda evitar los operadores `==` y `!=` siempre que sea posible: - - ```php - false - var_dump('' == false); // => true - ``` - - Recordemos la operación de negación. Con una doble negación `!!`, el valor final es igual al valor inicial: - - ```php - false - var_dump(!!$respuesta); // => true - ``` - - Aquí también se producen conversiones de tipo adicionales. Por lo tanto, el resultado de una doble negación siempre será de tipo _bool_. Se utiliza este truco para cambiar el tipo de datos. - - En diferentes lenguajes de programación, hay diferentes reglas de conversión. Algunos lenguajes no realizan conversiones de tipos por sí mismos. - -instructions: | - - Escribe una función `isFalsy()` que verifique si el valor pasado se interpreta como falso en PHP. Para realizar esta verificación, deberás comparar `false` con el valor pasado utilizando `==`. - - ```php - false -var_dump('' == false); // => true -``` - -An empty string and `false` are different values, so the `===` operator says "false! they're not equal! - -But the `==` operator converts types, making an empty string and `false` equivalent from its point of view. This conversion is implicit, so avoid the `==` and `!=` operators whenever possible. - ---- - -Remember the negation operator: - -```php - false -``` - -When you use double negation `!!` the result value is equal to the initial value: - -```php - true -``` - -However, this is where type conversions also take place. Therefore, the result of a double negation will always be a _bool_. This trick is used to change the data type. - ---- - -Different programming languages have different transformation rules. Some languages don't convert types themselves at all. Many features of PHP aren't really the best, but this is the historical legacy of the language. If it were created from scratch today, many of the rules and nuances would probably be quite different. diff --git a/modules/45-logic/70-logic-weak-typing/en/data.yml b/modules/45-logic/70-logic-weak-typing/en/data.yml deleted file mode 100644 index 4cce6ac6..00000000 --- a/modules/45-logic/70-logic-weak-typing/en/data.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -name: Weak Typing - 2 -tips: - - | - [Booleans](https://www.php.net/manual/en/language.types.boolean.php) diff --git a/modules/45-logic/70-logic-weak-typing/es/EXERCISE.md b/modules/45-logic/70-logic-weak-typing/es/EXERCISE.md deleted file mode 100644 index 6b622f37..00000000 --- a/modules/45-logic/70-logic-weak-typing/es/EXERCISE.md +++ /dev/null @@ -1,11 +0,0 @@ - -Escribe una función `isFalsy()` que verifique si el valor pasado se interpreta como falso en PHP. Para realizar esta verificación, deberás comparar `false` con el valor pasado utilizando `==`. - -```php - 1 -print_r(false); // => (se muestra una cadena vacía en la pantalla) -print_r(0 || 1); // => 1 -``` - -El operador **OR** solo funciona con el tipo *bool*, pero se le dan los números `1` y `0`: - -1. `0` se convierte en `false` y `1` se convierte en `true` -2. El resultado de `false || true` es `true` -3. Ahora `print_r()` recibe `true`, pero solo funciona con cadenas -4. `true` se convierte en `1` -5. Y se muestra `1` en la pantalla - -Aquí es importante destacar la diferencia entre los operadores `===` y `==`. La diferencia radica en la conversión de tipos. - -La cadena vacía y `false` son valores diferentes, por lo que el operador `===` dice "¡Falso! ¡No son iguales!". - -Pero el operador `==` convierte los tipos. Desde su punto de vista, la cadena vacía y `false` son iguales. Esta conversión es implícita, por lo que se recomienda evitar los operadores `==` y `!=` siempre que sea posible: - -```php - false -var_dump('' == false); // => true -``` - -Recordemos la operación de negación. Con una doble negación `!!`, el valor final es igual al valor inicial: - -```php - false -var_dump(!!$respuesta); // => true -``` - -Aquí también se producen conversiones de tipo adicionales. Por lo tanto, el resultado de una doble negación siempre será de tipo _bool_. Se utiliza este truco para cambiar el tipo de datos. - -En diferentes lenguajes de programación, hay diferentes reglas de conversión. Algunos lenguajes no realizan conversiones de tipos por sí mismos. diff --git a/modules/45-logic/70-logic-weak-typing/es/data.yml b/modules/45-logic/70-logic-weak-typing/es/data.yml deleted file mode 100644 index e6788258..00000000 --- a/modules/45-logic/70-logic-weak-typing/es/data.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -name: Tipado débil - 2 -tips: - - | - [Booleanos](https://php.net/manual/es/language.types.boolean.php) diff --git a/modules/45-logic/70-logic-weak-typing/index.php b/modules/45-logic/70-logic-weak-typing/index.php deleted file mode 100644 index 0e6f104f..00000000 --- a/modules/45-logic/70-logic-weak-typing/index.php +++ /dev/null @@ -1,10 +0,0 @@ - 1 -print_r(false); // => (на экран выводится пустая строка) -print_r(0 || 1); // => 1 -``` - -Оператор **ИЛИ** работает только с типом *bool*, но ему даны числа `1` и `0`: - -1. `0` преобразуется в `false`, а `1` преобразуется в `true` -2. Результат `false || true` — это `true` -3. Теперь `print_r()` получает `true`, но он работает только со строками -4. `true` преобразуется в `1` -5. И на экран выводится `1` - -Здесь важно отметить также отличие операторов `===` и `==`. Оно как раз заключается в преобразовании типов. - -Пустая строка и `false` — это разные значения, поэтому оператор `===` говорит «Ложь! Они не равны!». - -Но оператор `==` преобразует типы. С его точки зрения, пустая строка и `false` равны. Это преобразование неявное, поэтому по возможности избегайте операторов `==` и `!=`: - -```php - false -var_dump('' == false); // => true -``` - -Вспомним операцию отрицания. При двойном отрицании `!!` итоговое значение равно начальному: - -```php - false -var_dump(!!$answer); // => true -``` - -Здесь также дополнительно происходят преобразования типа. Поэтому результатом двойного отрицания всегда будет _bool_. Этим приемом пользуются, чтобы поменять тип данных. - -В разных языках программирования разные правила преобразований. Некоторые языки вообще не преобразовывают типы сами. diff --git a/modules/45-logic/70-logic-weak-typing/ru/data.yml b/modules/45-logic/70-logic-weak-typing/ru/data.yml deleted file mode 100644 index ace54acc..00000000 --- a/modules/45-logic/70-logic-weak-typing/ru/data.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -name: Слабая типизация - 2 -tips: - - | - [Booleans](https://php.net/manual/ru/language.types.boolean.php) diff --git a/modules/45-logic/29-logical-operators-2/Makefile b/modules/45-logic/90-logical-expressions/Makefile similarity index 100% rename from modules/45-logic/29-logical-operators-2/Makefile rename to modules/45-logic/90-logical-expressions/Makefile diff --git a/modules/45-logic/70-logic-weak-typing/SolutionTest.php b/modules/45-logic/90-logical-expressions/SolutionTest.php similarity index 74% rename from modules/45-logic/70-logic-weak-typing/SolutionTest.php rename to modules/45-logic/90-logical-expressions/SolutionTest.php index 7d20184d..687134a2 100644 --- a/modules/45-logic/70-logic-weak-typing/SolutionTest.php +++ b/modules/45-logic/90-logical-expressions/SolutionTest.php @@ -1,6 +1,6 @@ assertFalse(isFalsy(' ')); $this->assertTrue(isFalsy(null)); $this->assertTrue(isFalsy(false)); + $this->assertTrue(isFalsy('0')); $this->assertFalse(isFalsy(true)); $this->assertFalse(isFalsy(3)); + $this->assertFalse(isFalsy('help')); } } diff --git a/modules/45-logic/90-logical-expressions/description.es.yml b/modules/45-logic/90-logical-expressions/description.es.yml new file mode 100644 index 00000000..ddff25ca --- /dev/null +++ b/modules/45-logic/90-logical-expressions/description.es.yml @@ -0,0 +1,57 @@ +--- + +name: Resultado de expresiones lógicas +theory: | + En las expresiones lógicas se pueden usar no solo valores de tipo `bool`. Cuando un valor entra en un contexto lógico, PHP lo convierte en `true` o `false`. + + Hay un conjunto fijo de valores **falsy**: `false`, `0` (y `0.0`), la cadena vacía `''`, la cadena `'0'` y `null`. Todo lo demás es **truthy**. Se puede comprobar con la doble negación `!!`, que convierte cualquier valor a `bool`: + + ```php + bool(true) + var_dump(!!''); // => bool(false) + var_dump(!!'0'); // => bool(false) — una particularidad de PHP + ``` + + A diferencia de muchos lenguajes donde `&&` y `||` devuelven uno de sus operandos, en PHP los operadores lógicos siempre devuelven un `bool`: + + ```php + bool(true) + var_dump(0 || 1); // => bool(true) + ``` + + La conversión de tipos también ocurre con la comparación no estricta. El operador `==` convierte los operandos antes de comparar, por lo que una cadena vacía es igual a `false` desde su punto de vista. Esta conversión es implícita, así que evita `==` y `!=` siempre que sea posible: + + ```php + bool(false) + var_dump('' == false); // => bool(true) + ``` + + Un error común de principiante es escribir `$value === ('first' || 'second')`. Primero se evalúan los paréntesis: ambas cadenas son truthy, el resultado es `true`, y toda la expresión se convierte en `$value === true` — siempre falsa para cadenas. La comprobación correcta es: + + ```php + bool(true) +var_dump(!!''); // => bool(false) +var_dump(!!'0'); // => bool(false) — a PHP peculiarity +``` + +Unlike many languages where `&&` and `||` return one of their operands, in PHP logical operators always return a `bool`: + +```php + bool(true) +var_dump(0 || 1); // => bool(true) +``` + +Type conversion also happens with loose comparison. The `==` operator converts operands before comparing, so an empty string equals `false` from its point of view. This conversion is implicit, so avoid `==` and `!=` whenever possible: + +```php + bool(false) +var_dump('' == false); // => bool(true) +``` + +A common beginner mistake is writing `$value === ('first' || 'second')`. The parentheses evaluate first: both strings are truthy, so the result is `true`, and the whole expression becomes `$value === true` — always false for strings. The correct check is: + +```php + bool(true) +var_dump(!!''); // => bool(false) +var_dump(!!'0'); // => bool(false) — una particularidad de PHP +``` + +A diferencia de muchos lenguajes donde `&&` y `||` devuelven uno de sus operandos, en PHP los operadores lógicos siempre devuelven un `bool`: + +```php + bool(true) +var_dump(0 || 1); // => bool(true) +``` + +La conversión de tipos también ocurre con la comparación no estricta. El operador `==` convierte los operandos antes de comparar, por lo que una cadena vacía es igual a `false` desde su punto de vista. Esta conversión es implícita, así que evita `==` y `!=` siempre que sea posible: + +```php + bool(false) +var_dump('' == false); // => bool(true) +``` + +Un error común de principiante es escribir `$value === ('first' || 'second')`. Primero se evalúan los paréntesis: ambas cadenas son truthy, el resultado es `true`, y toda la expresión se convierte en `$value === true` — siempre falsa para cadenas. La comprobación correcta es: + +```php + bool(true) — непустая строка — truthy +var_dump(!!''); // => bool(false) — пустая строка — falsy +var_dump(!!0); // => bool(false) — ноль — falsy +var_dump(!!-3.5); // => bool(true) — ненулевое число — truthy +var_dump(!!'0'); // => bool(false) — строка '0' — falsy, особенность PHP +``` + +Этим приемом пользуются, чтобы явно поменять тип данных: результатом двойного отрицания всегда будет значение типа `bool`. + +## Как работают логические выражения + +В некоторых языках операторы «И» и «ИЛИ» возвращают один из своих операндов, поэтому результатом может быть строка или число. PHP устроен иначе: логические операторы `&&` и `||` всегда возвращают значение типа `bool` — `true` или `false`: + +```php + bool(true) — оба операнда truthy +var_dump('' && 'world'); // => bool(false) — первый операнд falsy +var_dump(0 || 1); // => bool(true) — второй операнд truthy +var_dump('' || 0); // => bool(false) — оба операнда falsy +``` + +Порядок вычисления зависит от приоритета операторов: + +```text +Приоритет (от высокого к низкому): + + () скобки + ↓ + ! отрицание + ↓ + && логическое И + ↓ + || логическое ИЛИ +``` + +## Нестрогое сравнение + +Преобразование типов происходит и при нестрогом сравнении. Вспомните операторы `==` и `!=` из урока про логический тип: они сравнивают значения, предварительно преобразовав типы. Поэтому, с точки зрения `==`, пустая строка и `false` равны: + +```php + bool(false) +var_dump('' == false); // => bool(true) +``` + +Пустая строка и `false` — это разные значения, поэтому строгий оператор `===` говорит «Ложь! Они не равны!». Но оператор `==` преобразует операнды и считает их равными. Это преобразование неявное, поэтому по возможности избегайте операторов `==` и `!=`. + +## Ошибка выбора + +Представим задачу, в которой нужно проверить, что значение равно либо одному, либо другому. Например, переменная `$value` должна содержать одно из двух значений: `'first'` или `'second'`. Начинающие разработчики иногда записывают это выражение так: + +```php + Date: Thu, 11 Jun 2026 17:09:03 +0500 Subject: [PATCH 13/29] =?UTF-8?q?feat(33-data-types):=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D1=81=20=D0=B8=D0=BB=D0=BB=D1=8E=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20number-as-string=20=D0=B8?= =?UTF-8?q?=D0=B7=20Python=20=D0=B2=2055-data-types-casting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .../55-data-types-casting/ru/README.md | 2 ++ .../ru/assets/number-as-string.png | Bin 0 -> 28492 bytes 2 files changed, 2 insertions(+) create mode 100644 modules/33-data-types/55-data-types-casting/ru/assets/number-as-string.png diff --git a/modules/33-data-types/55-data-types-casting/ru/README.md b/modules/33-data-types/55-data-types-casting/ru/README.md index b2427da0..6125767c 100644 --- a/modules/33-data-types/55-data-types-casting/ru/README.md +++ b/modules/33-data-types/55-data-types-casting/ru/README.md @@ -1,5 +1,7 @@ В реальных программах часто возникает ситуация, когда данные одного типа нужно превратить в другой. Это особенно актуально, например, при обработке ввода пользователя или данных из веб-форм. Там все приходит в виде строк, даже если вы ввели число. +![Преобразование типов в PHP](./assets/number-as-string.png) + PHP умеет преобразовывать типы автоматически — мы видели это в уроке про слабую типизацию. Но полагаться на неявные преобразования опасно. Когда вы точно знаете, какой тип хотите получить, лучше преобразовать значение **явно**. Для этого в PHP есть специальный синтаксис: перед значением в скобках указывается желаемый тип. Такая операция называется приведением типа (type casting). Явный код понятнее и предсказуемее. ## Преобразование строки в число diff --git a/modules/33-data-types/55-data-types-casting/ru/assets/number-as-string.png b/modules/33-data-types/55-data-types-casting/ru/assets/number-as-string.png new file mode 100644 index 0000000000000000000000000000000000000000..76d69af36a4877b1d36d37dafc35f2dd446d9b0e GIT binary patch literal 28492 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 literal 0 HcmV?d00001 From 1cf5d515cea944b2b56bf5ec9b8ea68efaa136f0 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Thu, 11 Jun 2026 17:10:39 +0500 Subject: [PATCH 14/29] =?UTF-8?q?feat(30-variables):=20=D0=B2=D1=8B=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BD=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=20Python=20=E2=80=94=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=2024-magic-constants,=20=D0=B8=D0=BB=D0=BB=D1=8E?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20naming,=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=20=D0=B4=D0=B8=D0=B0=D0=B3=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=BC=D1=8B=20=D0=BA=D0=BE=D0=BD=D0=BA=D0=B0=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - delete 24-magic-constants (вердикт второго прохода: в Python темы нет) - 13-variables-naming: перенос языконезависимой иллюстрации naming.png из Python - 18-variable-concatenation: в текстовой диаграмме оператор + заменен на . - variable-definition.png НЕ перенесена: на ней питоновский синтаксис без $ Co-Authored-By: Claude Fable 5 --- .../13-variables-naming/ru/README.md | 2 ++ .../13-variables-naming/ru/assets/naming.png | Bin 0 -> 40783 bytes .../18-variable-concatenation/ru/README.md | 2 +- .../30-variables/24-magic-constants/Makefile | 2 -- .../24-magic-constants/SolutionTest.php | 16 ---------- .../24-magic-constants/description.es.yml | 28 ------------------ .../24-magic-constants/en/EXERCISE.md | 2 -- .../24-magic-constants/en/README.md | 12 -------- .../24-magic-constants/en/data.yml | 11 ------- .../24-magic-constants/es/EXERCISE.md | 2 -- .../24-magic-constants/es/README.md | 12 -------- .../24-magic-constants/es/data.yml | 11 ------- .../30-variables/24-magic-constants/index.php | 5 ---- .../24-magic-constants/ru/EXERCISE.md | 2 -- .../24-magic-constants/ru/README.md | 12 -------- .../24-magic-constants/ru/data.yml | 11 ------- 16 files changed, 3 insertions(+), 127 deletions(-) create mode 100644 modules/30-variables/13-variables-naming/ru/assets/naming.png delete mode 100644 modules/30-variables/24-magic-constants/Makefile delete mode 100644 modules/30-variables/24-magic-constants/SolutionTest.php delete mode 100644 modules/30-variables/24-magic-constants/description.es.yml delete mode 100644 modules/30-variables/24-magic-constants/en/EXERCISE.md delete mode 100644 modules/30-variables/24-magic-constants/en/README.md delete mode 100644 modules/30-variables/24-magic-constants/en/data.yml delete mode 100644 modules/30-variables/24-magic-constants/es/EXERCISE.md delete mode 100644 modules/30-variables/24-magic-constants/es/README.md delete mode 100644 modules/30-variables/24-magic-constants/es/data.yml delete mode 100644 modules/30-variables/24-magic-constants/index.php delete mode 100644 modules/30-variables/24-magic-constants/ru/EXERCISE.md delete mode 100644 modules/30-variables/24-magic-constants/ru/README.md delete mode 100644 modules/30-variables/24-magic-constants/ru/data.yml diff --git a/modules/30-variables/13-variables-naming/ru/README.md b/modules/30-variables/13-variables-naming/ru/README.md index 77bbf870..c175296b 100644 --- a/modules/30-variables/13-variables-naming/ru/README.md +++ b/modules/30-variables/13-variables-naming/ru/README.md @@ -19,6 +19,8 @@ $ddr = "New York"; Что это за переменные? Что в них хранится? Чтобы это понять, нужно читать весь остальной код и догадываться по контексту. +![Именование](./assets/naming.png) + Компьютеру все равно, как называется переменная. Для него `$x`, `$abc`, `$message` или `$elephantInTheRoom` являются просто метками для хранения данных. Людям важно другое. Программисты читают код гораздо чаще, чем пишут. Поэтому имена переменных являются важной частью общения через код. ## Хорошие примеры diff --git a/modules/30-variables/13-variables-naming/ru/assets/naming.png b/modules/30-variables/13-variables-naming/ru/assets/naming.png new file mode 100644 index 0000000000000000000000000000000000000000..a1380ac909801e5484360925cc4892ba2d9c0762 GIT binary patch literal 40783 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 z zcWdO=EOZ(?$+`T!2xNBKTfN5EWEnrOch8)ASuA|@+KVu8E|&E>Z@rSURXEj3`lB@N zC^?#$R|gkAJ6eS*4VKuwsQ(fgXm`%<>G=j?VZp&v)w4@RV{Q3bn^M43$zF6h)5Ryh ze6;0s1yy1ud#I(e+v53eg5tG^MQ(?(0heQp)$fPc7&j`16H+*^6dwid_^gic!Rg)V zh;=OuQTt|%ns=fEx5jLVW?dKUSskU0-`j{Bd&^BNHg<7SD|qQ!$pb9CafVRy?TP1K zJ{OiR3P4_3*7nn!+%{yjpuq)&y9HGyw{2=oQ1R8zGd5Q8H0%`uGp;w;rSBHFP=q7{ zu4z5SB;|OU%xIOwUeEy^fDm1N%(*9;Z#&etR-U#9e+lfYq);0oD<7SA<2lY@ih40# z%w{q&p)aldJ|TpJRN3dk2v;YU4Q_|tg}zo_6`L|4ozo^anx9tH{F=2L4jUS~Yl4DY z`;f#Nrl&k&<-Z~~_YCX_Xx!lW_PWL;{Cuv8&#Q8}ZQyGNq$vXJ6!7>8bW9+Y1#{mz zN%uNt;>i=saM|Y3%V>Tx$+QA6pBeJAlhwRPWl4U$*+h8C_Ipv##ef}%ErLnC=T^X+ z!@MLLq;uZLR8l@(P*bBF;WGZJ>Imfh zz@uNy4iE^09ho=O)Hu3SUhbrmYUJSh6U7UGT*_Jn4srrJ`#wQ4szg8w1>+;-qozf)iGZG9?ierF-8oZ WMsBfIj#2#n88Agy!K*G`yZ1k^atDe4 literal 0 HcmV?d00001 diff --git a/modules/30-variables/18-variable-concatenation/ru/README.md b/modules/30-variables/18-variable-concatenation/ru/README.md index 9e895c68..20288da1 100644 --- a/modules/30-variables/18-variable-concatenation/ru/README.md +++ b/modules/30-variables/18-variable-concatenation/ru/README.md @@ -49,7 +49,7 @@ print_r($full); // => Kings road $first = 'Kings' $last = 'road' -$first + ' ' + $last +$first . ' ' . $last └─┬──┘ └──┬─┘ 'Kings' . ' ' . 'road' └─────────┬────────────┘ diff --git a/modules/30-variables/24-magic-constants/Makefile b/modules/30-variables/24-magic-constants/Makefile deleted file mode 100644 index d0d0a48c..00000000 --- a/modules/30-variables/24-magic-constants/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -test: - @ test.sh diff --git a/modules/30-variables/24-magic-constants/SolutionTest.php b/modules/30-variables/24-magic-constants/SolutionTest.php deleted file mode 100644 index 827c5480..00000000 --- a/modules/30-variables/24-magic-constants/SolutionTest.php +++ /dev/null @@ -1,16 +0,0 @@ -expectOutputString(__DIR__); - require 'index.php'; - } -} diff --git a/modules/30-variables/24-magic-constants/description.es.yml b/modules/30-variables/24-magic-constants/description.es.yml deleted file mode 100644 index e11a3ca9..00000000 --- a/modules/30-variables/24-magic-constants/description.es.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- - -name: Constantes mágicas -theory: | - - Además de las constantes normales, en PHP existe un grupo separado llamado **constantes mágicas**. Sus diferencias son las siguientes: - - * No se pueden definir constantes mágicas por uno mismo, solo se pueden utilizar las existentes. - * Las constantes mágicas comienzan y terminan con los caracteres `__` (dos guiones bajos). - * La magia radica en que estas constantes tienen el mismo valor solo dentro de una parte específica del programa. - - El último punto puede parecer extraño. ¿Cómo pueden ser constantes si su valor cambia? Para ser honestos, no son muy constantes, pero sus cambios están claramente regulados y en la práctica no causan problemas. Algunos ejemplos de estas constantes son: - - * `__LINE__` - contiene la línea actual del archivo en el que se utiliza - * `__FILE__` - la ruta al archivo actual - * `__DIR__` - la ruta al directorio en el que se encuentra el archivo actual - -instructions: | - - Muestra en pantalla la ruta al directorio actual utilizando una constante mágica. - -tips: - - | - [Constantes mágicas](https://php.net/manual/es/language.constants.predefined.php) - -definitions: - - name: Constante mágica - description: una constante especial disponible en PHP; tiene diferentes valores en diferentes contextos. diff --git a/modules/30-variables/24-magic-constants/en/EXERCISE.md b/modules/30-variables/24-magic-constants/en/EXERCISE.md deleted file mode 100644 index 82b21470..00000000 --- a/modules/30-variables/24-magic-constants/en/EXERCISE.md +++ /dev/null @@ -1,2 +0,0 @@ - -Output the path to the current directory using a magic constant. diff --git a/modules/30-variables/24-magic-constants/en/README.md b/modules/30-variables/24-magic-constants/en/README.md deleted file mode 100644 index 6e68dd1d..00000000 --- a/modules/30-variables/24-magic-constants/en/README.md +++ /dev/null @@ -1,12 +0,0 @@ - -In addition to the usual constants, PHP has a separate group of **magic constants**. The differences are as follows: - -* You can't define magic constants yourself, you can only use existing ones. -* Magic constants begin and end with `__` (two underscores). -* The magic is that the constants have the same value only within a certain part of the program. - -This last point may seem strange. What kind of constants are they if their value changes? To put it bluntly, they're not very constant, but their changes are clearly regulated and in practice don't cause problems. Such constants include, for example, the following: - -* `__LINE__` — contains the current line of the file it's used in -* `__FILE__` — path to the current file -* `__DIR__` — the path to the directory where the current file is located diff --git a/modules/30-variables/24-magic-constants/en/data.yml b/modules/30-variables/24-magic-constants/en/data.yml deleted file mode 100644 index 6a4fd466..00000000 --- a/modules/30-variables/24-magic-constants/en/data.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Magic constants -tips: - - > - [Magic - constants](https://www.php.net/manual/en/language.constants.predefined.php) -definitions: - - name: A magic constant - description: >- - is a special constant available in PHP; it contains different values in - different contexts. diff --git a/modules/30-variables/24-magic-constants/es/EXERCISE.md b/modules/30-variables/24-magic-constants/es/EXERCISE.md deleted file mode 100644 index ec09bb2c..00000000 --- a/modules/30-variables/24-magic-constants/es/EXERCISE.md +++ /dev/null @@ -1,2 +0,0 @@ - -Muestra en pantalla la ruta al directorio actual utilizando una constante mágica. diff --git a/modules/30-variables/24-magic-constants/es/README.md b/modules/30-variables/24-magic-constants/es/README.md deleted file mode 100644 index 57e77e65..00000000 --- a/modules/30-variables/24-magic-constants/es/README.md +++ /dev/null @@ -1,12 +0,0 @@ - -Además de las constantes normales, en PHP existe un grupo separado llamado **constantes mágicas**. Sus diferencias son las siguientes: - -* No se pueden definir constantes mágicas por uno mismo, solo se pueden utilizar las existentes. -* Las constantes mágicas comienzan y terminan con los caracteres `__` (dos guiones bajos). -* La magia radica en que estas constantes tienen el mismo valor solo dentro de una parte específica del programa. - -El último punto puede parecer extraño. ¿Cómo pueden ser constantes si su valor cambia? Para ser honestos, no son muy constantes, pero sus cambios están claramente regulados y en la práctica no causan problemas. Algunos ejemplos de estas constantes son: - -* `__LINE__` - contiene la línea actual del archivo en el que se utiliza -* `__FILE__` - la ruta al archivo actual -* `__DIR__` - la ruta al directorio en el que se encuentra el archivo actual diff --git a/modules/30-variables/24-magic-constants/es/data.yml b/modules/30-variables/24-magic-constants/es/data.yml deleted file mode 100644 index 94a0ad1c..00000000 --- a/modules/30-variables/24-magic-constants/es/data.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Constantes mágicas -tips: - - > - [Constantes - mágicas](https://php.net/manual/es/language.constants.predefined.php) -definitions: - - name: Constante mágica - description: >- - una constante especial disponible en PHP; tiene diferentes valores en - diferentes contextos. diff --git a/modules/30-variables/24-magic-constants/index.php b/modules/30-variables/24-magic-constants/index.php deleted file mode 100644 index 8aa42cf9..00000000 --- a/modules/30-variables/24-magic-constants/index.php +++ /dev/null @@ -1,5 +0,0 @@ - - [Магические - константы](https://php.net/manual/ru/language.constants.predefined.php) -definitions: - - name: Магическая константа - description: >- - специальная константа, доступная в PHP; содержит разное значение в разных - контекстах. From 669bf851c5deea936ec8591356dab6d443659566 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Thu, 11 Jun 2026 17:11:46 +0500 Subject: [PATCH 15/29] =?UTF-8?q?feat(20-arithmetics):=20=D0=B2=D1=8B?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BD=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=20Python=20=E2=80=94=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=2045-linting=20=D0=B8=20intdiv=20=D0=B2=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 45-linting: задание в питоновском формате — исправить пробелы в готовом кривом коде коллеги (PSR-12), а не написать с нуля; эталон и тест не меняются - 20-basic: в таблицу операций добавлено целочисленное деление intdiv() (зеркало строки про // в Python) Co-Authored-By: Claude Fable 5 --- modules/20-arithmetics/20-basic/ru/README.md | 1 + modules/20-arithmetics/45-linting/ru/EXERCISE.md | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/20-arithmetics/20-basic/ru/README.md b/modules/20-arithmetics/20-basic/ru/README.md index c21594f5..88e49203 100644 --- a/modules/20-arithmetics/20-basic/ru/README.md +++ b/modules/20-arithmetics/20-basic/ru/README.md @@ -65,6 +65,7 @@ PHP поддерживает все привычные операции + нес | Умножение | `*` | `4 * 3` | `12` | | Деление | `/` | `8 / 2` | `4` | | Возведение в степень | `**` | `3 ** 2` | `9` | +| Целочисленное деление | `intdiv()` | `intdiv(7, 3)` | `2` | | Остаток от деления | `%` | `7 % 3` | `1` | Эти знаки операций называют операторами. Вот как можно вывести результат деления и возведения в степень: diff --git a/modules/20-arithmetics/45-linting/ru/EXERCISE.md b/modules/20-arithmetics/45-linting/ru/EXERCISE.md index 953edd5c..aff6d004 100644 --- a/modules/20-arithmetics/45-linting/ru/EXERCISE.md +++ b/modules/20-arithmetics/45-linting/ru/EXERCISE.md @@ -1 +1,9 @@ -Выведите на экран результат следующего вычисления: «разница между пятью в квадрате и произведением трёх и семи». Напишите код так, чтобы каждый оператор отделялся от операндов пробелами. +Вы получили код от коллеги — он работает правильно, но нарушает стандарт оформления PSR-12. Исправьте пробелы вокруг операторов, не меняя логику: + +```php + Date: Thu, 11 Jun 2026 17:12:31 +0500 Subject: [PATCH 16/29] =?UTF-8?q?feat(35-calling-functions):=20=D0=B2?= =?UTF-8?q?=D1=8B=D1=80=D0=B0=D0=B2=D0=BD=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=20Python=20=E2=80=94=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20900-stdlib=20=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BA=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20270-determin?= =?UTF-8?q?istic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - delete 900-stdlib (вердикт второго прохода: в Python урока нет) - 270-deterministic: убраны разделы «побочные эффекты» и «чистые функции» — в Python их нет, текст приведен к структуре эталона Co-Authored-By: Claude Fable 5 --- .../270-deterministic/ru/README.md | 20 ----------- .../35-calling-functions/900-stdlib/Makefile | 2 -- .../900-stdlib/SolutionTest.php | 17 ---------- .../900-stdlib/description.es.yml | 33 ------------------- .../900-stdlib/en/EXERCISE.md | 4 --- .../900-stdlib/en/README.md | 12 ------- .../900-stdlib/en/data.yml | 9 ----- .../900-stdlib/es/EXERCISE.md | 4 --- .../900-stdlib/es/README.md | 15 --------- .../900-stdlib/es/data.yml | 11 ------- .../35-calling-functions/900-stdlib/index.php | 7 ---- .../900-stdlib/ru/EXERCISE.md | 4 --- .../900-stdlib/ru/README.md | 15 --------- .../900-stdlib/ru/data.yml | 10 ------ 14 files changed, 163 deletions(-) delete mode 100644 modules/35-calling-functions/900-stdlib/Makefile delete mode 100644 modules/35-calling-functions/900-stdlib/SolutionTest.php delete mode 100644 modules/35-calling-functions/900-stdlib/description.es.yml delete mode 100644 modules/35-calling-functions/900-stdlib/en/EXERCISE.md delete mode 100644 modules/35-calling-functions/900-stdlib/en/README.md delete mode 100644 modules/35-calling-functions/900-stdlib/en/data.yml delete mode 100644 modules/35-calling-functions/900-stdlib/es/EXERCISE.md delete mode 100644 modules/35-calling-functions/900-stdlib/es/README.md delete mode 100644 modules/35-calling-functions/900-stdlib/es/data.yml delete mode 100644 modules/35-calling-functions/900-stdlib/index.php delete mode 100644 modules/35-calling-functions/900-stdlib/ru/EXERCISE.md delete mode 100644 modules/35-calling-functions/900-stdlib/ru/README.md delete mode 100644 modules/35-calling-functions/900-stdlib/ru/data.yml diff --git a/modules/35-calling-functions/270-deterministic/ru/README.md b/modules/35-calling-functions/270-deterministic/ru/README.md index 16c71451..957bb5ac 100644 --- a/modules/35-calling-functions/270-deterministic/ru/README.md +++ b/modules/35-calling-functions/270-deterministic/ru/README.md @@ -45,23 +45,3 @@ strlen('abc') → всегда 3 rand() → 142503087 - недетерминированные функции сложнее проверять, потому что результат меняется. Поэтому там, где это возможно, лучше стремиться к тому, чтобы функция была детерминированной. - -## Что такое побочные эффекты - -`print_r()` — это тоже функция. Она принимает на вход данные любого типа и выводит их на экран. При этом что бы она ни возвращала, это значение не используется. - -`print_r()` выводит что-то на экран, но это не возврат значения. Это действие, которое выполняет функция. Вывод на экран и возврат значения из функции — разные и независимые операции. - -С точки зрения программы вывод на экран — это **побочный эффект**. Побочным эффектом называют операции, при которых происходит взаимодействие с внешним окружением (средой выполнения). К таким операциям относятся любые сетевые взаимодействия, вывод информации на экран, печать на принтере, взаимодействие с файловой системой — чтение и запись файлов. - -Побочные эффекты — один из основных источников проблем и ошибок в программных системах. Код с побочными эффектами сложен в тестировании и ненадежен. При этом без побочных эффектов программирование не имеет смысла. Без них было бы невозможно получить результат работы программы, например, записать в базу, вывести на экран, отправить по сети и так далее. - -## Что такое чистые функции - -Когда функция детерминированная и не имеет побочных эффектов, ее называют **чистой** функцией. Такие функции: - -* Проще читать, отлаживать и тестировать -* Не зависят от порядка, в котором они вызываются -* Просто запустить параллельно - -Вопрос для самопроверки. Можно ли определить наличие побочных эффектов внутри функции, опираясь только на ее возврат? diff --git a/modules/35-calling-functions/900-stdlib/Makefile b/modules/35-calling-functions/900-stdlib/Makefile deleted file mode 100644 index d0d0a48c..00000000 --- a/modules/35-calling-functions/900-stdlib/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -test: - @ test.sh diff --git a/modules/35-calling-functions/900-stdlib/SolutionTest.php b/modules/35-calling-functions/900-stdlib/SolutionTest.php deleted file mode 100644 index fe540095..00000000 --- a/modules/35-calling-functions/900-stdlib/SolutionTest.php +++ /dev/null @@ -1,17 +0,0 @@ -expectOutputString($expected); - require 'index.php'; - } -} diff --git a/modules/35-calling-functions/900-stdlib/description.es.yml b/modules/35-calling-functions/900-stdlib/description.es.yml deleted file mode 100644 index e52fda2c..00000000 --- a/modules/35-calling-functions/900-stdlib/description.es.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- - -name: Biblioteca estándar -theory: | - PHP viene con un conjunto de funciones útiles. Juntas, forman la **biblioteca estándar**. Por lo general, incluye miles de funciones que no se pueden aprender todas, ni es necesario hacerlo. En esta lección, daremos recomendaciones sobre cómo trabajar con nuevas funciones. - - Se supone que cualquier programador sabe dónde buscar la documentación y tiene una idea aproximada de lo que quiere lograr. Por lo tanto, programar sin internet es extremadamente difícil. - - A menudo, los principiantes no saben a dónde ir ni qué buscar. Estos conocimientos y habilidades se adquieren con la experiencia. Durante el aprendizaje y el trabajo, se familiarizan con funciones más interesantes que resuelven sus problemas de una manera más conveniente. Así es como enriquecen su arsenal. - - Aquí hay algunos consejos sobre cómo aprender sobre nuevas funciones: - - * Siempre es necesario tener en cuenta el tipo de datos con el que se está trabajando. Las funciones necesarias se pueden encontrar en la sección correspondiente de la documentación. Por ejemplo, para trabajar con cadenas, es necesario estudiar las funciones de cadenas. - * De vez en cuando, es necesario abrir la sección de funciones estándar relacionadas con el tema que se está estudiando. Es necesario estudiarlas, sus firmas y formas de uso. - * Es necesario leer el código de otras personas con frecuencia, especialmente el código de bibliotecas que utilizamos. Siempre está disponible en GitHub. - - Otra característica de las funciones de PHP de la biblioteca estándar es que están disponibles globalmente. Se pueden llamar en cualquier parte del programa. Sin embargo, esto no se aplica a las funciones escritas por uno mismo. - - La mayoría de las funciones de la biblioteca estándar se centran en funcionalidades o tipos de datos específicos. Por ejemplo, hay un gran conjunto de funciones para el manejo de cadenas, números, etc. Algunas de ellas las veremos durante el proceso de aprendizaje. - -instructions: | - - La función `gettype()` permite determinar el tipo de argumento pasado. El nombre del tipo se devuelve como una cadena. Por ejemplo, llamar a `gettype(10)` devolverá la cadena `"integer"` (integer - número entero). - - Muestra en pantalla el tipo de valor de la variable `$motto`. - -tips: - - | - [Descripción de las funciones de cadenas](https://www.php.net/manual/es/ref.strings.php) - -definitions: - - name: Biblioteca estándar - description: conjunto de funciones útiles que se incluyen en el lenguaje de programación. diff --git a/modules/35-calling-functions/900-stdlib/en/EXERCISE.md b/modules/35-calling-functions/900-stdlib/en/EXERCISE.md deleted file mode 100644 index 92e043bd..00000000 --- a/modules/35-calling-functions/900-stdlib/en/EXERCISE.md +++ /dev/null @@ -1,4 +0,0 @@ - -The `gettype()` function allows you to determine the type of the argument being passed. The name of the type is returned as a string. For example, a call to `gettype(10)` will return the string `"integer"`. - -Print the type of the value of the variable `$motto`. diff --git a/modules/35-calling-functions/900-stdlib/en/README.md b/modules/35-calling-functions/900-stdlib/en/README.md deleted file mode 100644 index 09159d8e..00000000 --- a/modules/35-calling-functions/900-stdlib/en/README.md +++ /dev/null @@ -1,12 +0,0 @@ - -PHP, like any other language, comes with a set of useful features. Altogether, they make up the so-called **standard library**. It usually contains thousands of functions you can't remember, and that you don't have to. It's assumed that any programmer knows where to look for their documentation and has a rough idea of what they want to achieve. And the rest is a matter of technique. Programming without the Internet is extremely difficult. - -To newcomers, it often looks like this: "Go I know not whither and fetch I know not what". In other words, most people have no idea how to learn about these functions when they don't know anything at all. Oddly enough, there's no way to know everything you need to know once and for all. As you grow as a developer, you'll learn all the exciting features that can solve your problems more elegantly, thus expanding your toolbox. - -Here are some tips to learn about new features: - -* Always keep track of what you're working with at the moment (the data type). You'll almost always find the function you need in the corresponding section of the documentation, e.g. you have to study string functions to work with strings. -* Open the standard functions section of the topic you are studying every now and then and just run through them,, learning the signatures and ways to use them. -* Read other people's code more often, especially code from the libraries you're using. It's all available on GitHub. - -Another feature of PHP functions from the Standard Library is that they're *available globally*. In other words, you can call them anywhere in your program (this doesn't work with functions you've written yourself). Most standard library functions are centered around some functionality or some type of data. For example, there's a large block of functions for processing strings, working with numbers, and so on. We'll go over some of them as you continue to study. diff --git a/modules/35-calling-functions/900-stdlib/en/data.yml b/modules/35-calling-functions/900-stdlib/en/data.yml deleted file mode 100644 index c10fba7c..00000000 --- a/modules/35-calling-functions/900-stdlib/en/data.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: Standard Library -tips: - - > - [Description of string - functions](https://www.php.net/manual/en/ref.strings.php) -definitions: - - name: Standard Library - description: a set of useful features included with the programming language. diff --git a/modules/35-calling-functions/900-stdlib/es/EXERCISE.md b/modules/35-calling-functions/900-stdlib/es/EXERCISE.md deleted file mode 100644 index b5e6ec4a..00000000 --- a/modules/35-calling-functions/900-stdlib/es/EXERCISE.md +++ /dev/null @@ -1,4 +0,0 @@ - -La función `gettype()` permite determinar el tipo de argumento pasado. El nombre del tipo se devuelve como una cadena. Por ejemplo, llamar a `gettype(10)` devolverá la cadena `"integer"` (integer - número entero). - -Muestra en pantalla el tipo de valor de la variable `$motto`. diff --git a/modules/35-calling-functions/900-stdlib/es/README.md b/modules/35-calling-functions/900-stdlib/es/README.md deleted file mode 100644 index dd84490c..00000000 --- a/modules/35-calling-functions/900-stdlib/es/README.md +++ /dev/null @@ -1,15 +0,0 @@ -PHP viene con un conjunto de funciones útiles. Juntas, forman la **biblioteca estándar**. Por lo general, incluye miles de funciones que no se pueden aprender todas, ni es necesario hacerlo. En esta lección, daremos recomendaciones sobre cómo trabajar con nuevas funciones. - -Se supone que cualquier programador sabe dónde buscar la documentación y tiene una idea aproximada de lo que quiere lograr. Por lo tanto, programar sin internet es extremadamente difícil. - -A menudo, los principiantes no saben a dónde ir ni qué buscar. Estos conocimientos y habilidades se adquieren con la experiencia. Durante el aprendizaje y el trabajo, se familiarizan con funciones más interesantes que resuelven sus problemas de una manera más conveniente. Así es como enriquecen su arsenal. - -Aquí hay algunos consejos sobre cómo aprender sobre nuevas funciones: - -* Siempre es necesario tener en cuenta el tipo de datos con el que se está trabajando. Las funciones necesarias se pueden encontrar en la sección correspondiente de la documentación. Por ejemplo, para trabajar con cadenas, es necesario estudiar las funciones de cadenas. -* De vez en cuando, es necesario abrir la sección de funciones estándar relacionadas con el tema que se está estudiando. Es necesario estudiarlas, sus firmas y formas de uso. -* Es necesario leer el código de otras personas con frecuencia, especialmente el código de bibliotecas que utilizamos. Siempre está disponible en GitHub. - -Otra característica de las funciones de PHP de la biblioteca estándar es que están disponibles globalmente. Se pueden llamar en cualquier parte del programa. Sin embargo, esto no se aplica a las funciones escritas por uno mismo. - -La mayoría de las funciones de la biblioteca estándar se centran en funcionalidades o tipos de datos específicos. Por ejemplo, hay un gran conjunto de funciones para el manejo de cadenas, números, etc. Algunas de ellas las veremos durante el proceso de aprendizaje. diff --git a/modules/35-calling-functions/900-stdlib/es/data.yml b/modules/35-calling-functions/900-stdlib/es/data.yml deleted file mode 100644 index 339745b2..00000000 --- a/modules/35-calling-functions/900-stdlib/es/data.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Biblioteca estándar -tips: - - > - [Descripción de las funciones de - cadenas](https://www.php.net/manual/es/ref.strings.php) -definitions: - - name: Biblioteca estándar - description: >- - conjunto de funciones útiles que se incluyen en el lenguaje de - programación. diff --git a/modules/35-calling-functions/900-stdlib/index.php b/modules/35-calling-functions/900-stdlib/index.php deleted file mode 100644 index fdaf42e5..00000000 --- a/modules/35-calling-functions/900-stdlib/index.php +++ /dev/null @@ -1,7 +0,0 @@ -- - набор полезных функций, входящий в комплект поставки языка - программирования. From 75062bd31a1ec005beef5321b850476e6fce75eb Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Thu, 11 Jun 2026 17:14:01 +0500 Subject: [PATCH 17/29] =?UTF-8?q?feat(10-basics):=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D1=83=D0=BC=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=83=D1=80=D0=BE=D0=BA=D0=BE=D0=B2=20=D0=BF=D0=BE=20Python=20?= =?UTF-8?q?=D0=B8=20TODO-=D1=81=D1=8E=D0=B6=D0=B5=D1=82=20=D0=B2=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=BF=D1=80=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - префиксы по эталону: 20-tags -> 15-tags, 30-comments -> 20-comments, 40-instructions -> 30-instructions, 45-testing -> 40-testing (slug-части и namespace не меняются) - 20-comments: задание заменено на питоновский TODO-сюжет (EXERCISE, эталон, тест проверяет содержимое файла); en/es EXERCISE устарели — на фазу перевода - блок echo в 10-hello-world сохранен (PHP-специфика); errors-python.png не переносится (скриншот с Python-кодом) Co-Authored-By: Claude Fable 5 --- modules/10-basics/{20-tags => 15-tags}/Makefile | 0 .../{20-tags => 15-tags}/SolutionTest.php | 0 .../{20-tags => 15-tags}/description.es.yml | 0 .../{20-tags => 15-tags}/en/EXERCISE.md | 0 .../10-basics/{20-tags => 15-tags}/en/README.md | 0 .../10-basics/{20-tags => 15-tags}/en/data.yml | 0 .../{20-tags => 15-tags}/es/EXERCISE.md | 0 .../10-basics/{20-tags => 15-tags}/es/README.md | 0 .../10-basics/{20-tags => 15-tags}/es/data.yml | 0 modules/10-basics/{20-tags => 15-tags}/index.php | 0 .../{20-tags => 15-tags}/ru/EXERCISE.md | 0 .../10-basics/{20-tags => 15-tags}/ru/README.md | 0 .../10-basics/{20-tags => 15-tags}/ru/data.yml | 0 .../{30-comments => 20-comments}/Makefile | 0 modules/10-basics/20-comments/SolutionTest.php | 16 ++++++++++++++++ .../description.es.yml | 0 .../{30-comments => 20-comments}/en/EXERCISE.md | 0 .../{30-comments => 20-comments}/en/README.md | 0 .../{30-comments => 20-comments}/en/data.yml | 0 .../{30-comments => 20-comments}/es/EXERCISE.md | 0 .../{30-comments => 20-comments}/es/README.md | 0 .../{30-comments => 20-comments}/es/data.yml | 0 modules/10-basics/20-comments/index.php | 3 +++ modules/10-basics/20-comments/ru/EXERCISE.md | 9 +++++++++ .../{30-comments => 20-comments}/ru/README.md | 0 .../{30-comments => 20-comments}/ru/data.yml | 0 modules/10-basics/30-comments/SolutionTest.php | 15 --------------- modules/10-basics/30-comments/index.php | 3 --- modules/10-basics/30-comments/ru/EXERCISE.md | 1 - .../Makefile | 0 .../SolutionTest.php | 0 .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../index.php | 0 .../ru/EXERCISE.md | 0 .../ru/README.md | 0 .../ru/data.yml | 0 .../{45-testing => 40-testing}/Makefile | 0 .../{45-testing => 40-testing}/SolutionTest.php | 0 .../description.es.yml | 0 .../{45-testing => 40-testing}/en/EXERCISE.md | 0 .../{45-testing => 40-testing}/en/README.md | 0 .../{45-testing => 40-testing}/en/data.yml | 0 .../{45-testing => 40-testing}/es/EXERCISE.md | 0 .../{45-testing => 40-testing}/es/README.md | 0 .../{45-testing => 40-testing}/es/data.yml | 0 .../{45-testing => 40-testing}/index.php | 0 .../{45-testing => 40-testing}/ru/EXERCISE.md | 0 .../{45-testing => 40-testing}/ru/README.md | 0 .../{45-testing => 40-testing}/ru/data.yml | 0 55 files changed, 28 insertions(+), 19 deletions(-) rename modules/10-basics/{20-tags => 15-tags}/Makefile (100%) rename modules/10-basics/{20-tags => 15-tags}/SolutionTest.php (100%) rename modules/10-basics/{20-tags => 15-tags}/description.es.yml (100%) rename modules/10-basics/{20-tags => 15-tags}/en/EXERCISE.md (100%) rename modules/10-basics/{20-tags => 15-tags}/en/README.md (100%) rename modules/10-basics/{20-tags => 15-tags}/en/data.yml (100%) rename modules/10-basics/{20-tags => 15-tags}/es/EXERCISE.md (100%) rename modules/10-basics/{20-tags => 15-tags}/es/README.md (100%) rename modules/10-basics/{20-tags => 15-tags}/es/data.yml (100%) rename modules/10-basics/{20-tags => 15-tags}/index.php (100%) rename modules/10-basics/{20-tags => 15-tags}/ru/EXERCISE.md (100%) rename modules/10-basics/{20-tags => 15-tags}/ru/README.md (100%) rename modules/10-basics/{20-tags => 15-tags}/ru/data.yml (100%) rename modules/10-basics/{30-comments => 20-comments}/Makefile (100%) create mode 100644 modules/10-basics/20-comments/SolutionTest.php rename modules/10-basics/{30-comments => 20-comments}/description.es.yml (100%) rename modules/10-basics/{30-comments => 20-comments}/en/EXERCISE.md (100%) rename modules/10-basics/{30-comments => 20-comments}/en/README.md (100%) rename modules/10-basics/{30-comments => 20-comments}/en/data.yml (100%) rename modules/10-basics/{30-comments => 20-comments}/es/EXERCISE.md (100%) rename modules/10-basics/{30-comments => 20-comments}/es/README.md (100%) rename modules/10-basics/{30-comments => 20-comments}/es/data.yml (100%) create mode 100644 modules/10-basics/20-comments/index.php create mode 100644 modules/10-basics/20-comments/ru/EXERCISE.md rename modules/10-basics/{30-comments => 20-comments}/ru/README.md (100%) rename modules/10-basics/{30-comments => 20-comments}/ru/data.yml (100%) delete mode 100644 modules/10-basics/30-comments/SolutionTest.php delete mode 100644 modules/10-basics/30-comments/index.php delete mode 100644 modules/10-basics/30-comments/ru/EXERCISE.md rename modules/10-basics/{40-instructions => 30-instructions}/Makefile (100%) rename modules/10-basics/{40-instructions => 30-instructions}/SolutionTest.php (100%) rename modules/10-basics/{40-instructions => 30-instructions}/description.es.yml (100%) rename modules/10-basics/{40-instructions => 30-instructions}/en/EXERCISE.md (100%) rename modules/10-basics/{40-instructions => 30-instructions}/en/README.md (100%) rename modules/10-basics/{40-instructions => 30-instructions}/en/data.yml (100%) rename modules/10-basics/{40-instructions => 30-instructions}/es/EXERCISE.md (100%) rename modules/10-basics/{40-instructions => 30-instructions}/es/README.md (100%) rename modules/10-basics/{40-instructions => 30-instructions}/es/data.yml (100%) rename modules/10-basics/{40-instructions => 30-instructions}/index.php (100%) rename modules/10-basics/{40-instructions => 30-instructions}/ru/EXERCISE.md (100%) rename modules/10-basics/{40-instructions => 30-instructions}/ru/README.md (100%) rename modules/10-basics/{40-instructions => 30-instructions}/ru/data.yml (100%) rename modules/10-basics/{45-testing => 40-testing}/Makefile (100%) rename modules/10-basics/{45-testing => 40-testing}/SolutionTest.php (100%) rename modules/10-basics/{45-testing => 40-testing}/description.es.yml (100%) rename modules/10-basics/{45-testing => 40-testing}/en/EXERCISE.md (100%) rename modules/10-basics/{45-testing => 40-testing}/en/README.md (100%) rename modules/10-basics/{45-testing => 40-testing}/en/data.yml (100%) rename modules/10-basics/{45-testing => 40-testing}/es/EXERCISE.md (100%) rename modules/10-basics/{45-testing => 40-testing}/es/README.md (100%) rename modules/10-basics/{45-testing => 40-testing}/es/data.yml (100%) rename modules/10-basics/{45-testing => 40-testing}/index.php (100%) rename modules/10-basics/{45-testing => 40-testing}/ru/EXERCISE.md (100%) rename modules/10-basics/{45-testing => 40-testing}/ru/README.md (100%) rename modules/10-basics/{45-testing => 40-testing}/ru/data.yml (100%) diff --git a/modules/10-basics/20-tags/Makefile b/modules/10-basics/15-tags/Makefile similarity index 100% rename from modules/10-basics/20-tags/Makefile rename to modules/10-basics/15-tags/Makefile diff --git a/modules/10-basics/20-tags/SolutionTest.php b/modules/10-basics/15-tags/SolutionTest.php similarity index 100% rename from modules/10-basics/20-tags/SolutionTest.php rename to modules/10-basics/15-tags/SolutionTest.php diff --git a/modules/10-basics/20-tags/description.es.yml b/modules/10-basics/15-tags/description.es.yml similarity index 100% rename from modules/10-basics/20-tags/description.es.yml rename to modules/10-basics/15-tags/description.es.yml diff --git a/modules/10-basics/20-tags/en/EXERCISE.md b/modules/10-basics/15-tags/en/EXERCISE.md similarity index 100% rename from modules/10-basics/20-tags/en/EXERCISE.md rename to modules/10-basics/15-tags/en/EXERCISE.md diff --git a/modules/10-basics/20-tags/en/README.md b/modules/10-basics/15-tags/en/README.md similarity index 100% rename from modules/10-basics/20-tags/en/README.md rename to modules/10-basics/15-tags/en/README.md diff --git a/modules/10-basics/20-tags/en/data.yml b/modules/10-basics/15-tags/en/data.yml similarity index 100% rename from modules/10-basics/20-tags/en/data.yml rename to modules/10-basics/15-tags/en/data.yml diff --git a/modules/10-basics/20-tags/es/EXERCISE.md b/modules/10-basics/15-tags/es/EXERCISE.md similarity index 100% rename from modules/10-basics/20-tags/es/EXERCISE.md rename to modules/10-basics/15-tags/es/EXERCISE.md diff --git a/modules/10-basics/20-tags/es/README.md b/modules/10-basics/15-tags/es/README.md similarity index 100% rename from modules/10-basics/20-tags/es/README.md rename to modules/10-basics/15-tags/es/README.md diff --git a/modules/10-basics/20-tags/es/data.yml b/modules/10-basics/15-tags/es/data.yml similarity index 100% rename from modules/10-basics/20-tags/es/data.yml rename to modules/10-basics/15-tags/es/data.yml diff --git a/modules/10-basics/20-tags/index.php b/modules/10-basics/15-tags/index.php similarity index 100% rename from modules/10-basics/20-tags/index.php rename to modules/10-basics/15-tags/index.php diff --git a/modules/10-basics/20-tags/ru/EXERCISE.md b/modules/10-basics/15-tags/ru/EXERCISE.md similarity index 100% rename from modules/10-basics/20-tags/ru/EXERCISE.md rename to modules/10-basics/15-tags/ru/EXERCISE.md diff --git a/modules/10-basics/20-tags/ru/README.md b/modules/10-basics/15-tags/ru/README.md similarity index 100% rename from modules/10-basics/20-tags/ru/README.md rename to modules/10-basics/15-tags/ru/README.md diff --git a/modules/10-basics/20-tags/ru/data.yml b/modules/10-basics/15-tags/ru/data.yml similarity index 100% rename from modules/10-basics/20-tags/ru/data.yml rename to modules/10-basics/15-tags/ru/data.yml diff --git a/modules/10-basics/30-comments/Makefile b/modules/10-basics/20-comments/Makefile similarity index 100% rename from modules/10-basics/30-comments/Makefile rename to modules/10-basics/20-comments/Makefile diff --git a/modules/10-basics/20-comments/SolutionTest.php b/modules/10-basics/20-comments/SolutionTest.php new file mode 100644 index 00000000..0fa8b589 --- /dev/null +++ b/modules/10-basics/20-comments/SolutionTest.php @@ -0,0 +1,16 @@ +expectOutputString(''); + require 'index.php'; + $content = file_get_contents('index.php'); + $this->assertStringContainsString('// TODO: добавить функцию приветствия', $content); + } +} diff --git a/modules/10-basics/30-comments/description.es.yml b/modules/10-basics/20-comments/description.es.yml similarity index 100% rename from modules/10-basics/30-comments/description.es.yml rename to modules/10-basics/20-comments/description.es.yml diff --git a/modules/10-basics/30-comments/en/EXERCISE.md b/modules/10-basics/20-comments/en/EXERCISE.md similarity index 100% rename from modules/10-basics/30-comments/en/EXERCISE.md rename to modules/10-basics/20-comments/en/EXERCISE.md diff --git a/modules/10-basics/30-comments/en/README.md b/modules/10-basics/20-comments/en/README.md similarity index 100% rename from modules/10-basics/30-comments/en/README.md rename to modules/10-basics/20-comments/en/README.md diff --git a/modules/10-basics/30-comments/en/data.yml b/modules/10-basics/20-comments/en/data.yml similarity index 100% rename from modules/10-basics/30-comments/en/data.yml rename to modules/10-basics/20-comments/en/data.yml diff --git a/modules/10-basics/30-comments/es/EXERCISE.md b/modules/10-basics/20-comments/es/EXERCISE.md similarity index 100% rename from modules/10-basics/30-comments/es/EXERCISE.md rename to modules/10-basics/20-comments/es/EXERCISE.md diff --git a/modules/10-basics/30-comments/es/README.md b/modules/10-basics/20-comments/es/README.md similarity index 100% rename from modules/10-basics/30-comments/es/README.md rename to modules/10-basics/20-comments/es/README.md diff --git a/modules/10-basics/30-comments/es/data.yml b/modules/10-basics/20-comments/es/data.yml similarity index 100% rename from modules/10-basics/30-comments/es/data.yml rename to modules/10-basics/20-comments/es/data.yml diff --git a/modules/10-basics/20-comments/index.php b/modules/10-basics/20-comments/index.php new file mode 100644 index 00000000..ba5d44e4 --- /dev/null +++ b/modules/10-basics/20-comments/index.php @@ -0,0 +1,3 @@ +expectOutputString($expected); - require 'index.php'; - } -} diff --git a/modules/10-basics/30-comments/index.php b/modules/10-basics/30-comments/index.php deleted file mode 100644 index d2b98262..00000000 --- a/modules/10-basics/30-comments/index.php +++ /dev/null @@ -1,3 +0,0 @@ - Date: Thu, 11 Jun 2026 17:16:51 +0500 Subject: [PATCH 18/29] =?UTF-8?q?feat(48-conditionals):=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20match/switch=20=D0=BF=D0=BE=20?= =?UTF-8?q?Python=20=D0=B8=20=D0=B4=D0=BE=D0=B2=D0=BE=D0=B4=D0=BA=D0=B0=20?= =?UTF-8?q?60-ternary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - рокировка префиксов: 70-match -> 65-match (позиция Python), 65-switch -> 70-switch - вступления переписаны под новый порядок: match вводится самостоятельно (по питоновскому тексту), switch подается как доисторический аналог match с блоком сравнения в конце - 60-ternary-operator: вводный блок сжат до питоновской структуры (оговорка про выражение сохранена компактно); EXERCISE уже был выровнен Co-Authored-By: Claude Fable 5 --- .../48-conditionals/60-ternary-operator/ru/README.md | 6 +----- .../48-conditionals/{65-switch => 65-match}/Makefile | 0 .../{70-match => 65-match}/SolutionTest.php | 0 .../{70-match => 65-match}/description.es.yml | 0 .../{70-match => 65-match}/en/EXERCISE.md | 0 .../{70-match => 65-match}/en/README.md | 0 .../48-conditionals/{70-match => 65-match}/en/data.yml | 0 .../{70-match => 65-match}/es/EXERCISE.md | 0 .../{70-match => 65-match}/es/README.md | 0 .../48-conditionals/{70-match => 65-match}/es/data.yml | 0 .../48-conditionals/{70-match => 65-match}/index.php | 0 .../{70-match => 65-match}/ru/EXERCISE.md | 0 .../{70-match => 65-match}/ru/README.md | 10 +++++----- .../48-conditionals/{70-match => 65-match}/ru/data.yml | 0 .../48-conditionals/{70-match => 70-switch}/Makefile | 0 .../{65-switch => 70-switch}/SolutionTest.php | 0 .../{65-switch => 70-switch}/description.es.yml | 0 .../{65-switch => 70-switch}/en/EXERCISE.md | 0 .../{65-switch => 70-switch}/en/README.md | 0 .../{65-switch => 70-switch}/en/data.yml | 0 .../{65-switch => 70-switch}/es/EXERCISE.md | 0 .../{65-switch => 70-switch}/es/README.md | 0 .../{65-switch => 70-switch}/es/data.yml | 0 .../48-conditionals/{65-switch => 70-switch}/index.php | 0 .../{65-switch => 70-switch}/ru/EXERCISE.md | 0 .../{65-switch => 70-switch}/ru/README.md | 10 +++++++++- .../{65-switch => 70-switch}/ru/data.yml | 0 27 files changed, 15 insertions(+), 11 deletions(-) rename modules/48-conditionals/{65-switch => 65-match}/Makefile (100%) rename modules/48-conditionals/{70-match => 65-match}/SolutionTest.php (100%) rename modules/48-conditionals/{70-match => 65-match}/description.es.yml (100%) rename modules/48-conditionals/{70-match => 65-match}/en/EXERCISE.md (100%) rename modules/48-conditionals/{70-match => 65-match}/en/README.md (100%) rename modules/48-conditionals/{70-match => 65-match}/en/data.yml (100%) rename modules/48-conditionals/{70-match => 65-match}/es/EXERCISE.md (100%) rename modules/48-conditionals/{70-match => 65-match}/es/README.md (100%) rename modules/48-conditionals/{70-match => 65-match}/es/data.yml (100%) rename modules/48-conditionals/{70-match => 65-match}/index.php (100%) rename modules/48-conditionals/{70-match => 65-match}/ru/EXERCISE.md (100%) rename modules/48-conditionals/{70-match => 65-match}/ru/README.md (74%) rename modules/48-conditionals/{70-match => 65-match}/ru/data.yml (100%) rename modules/48-conditionals/{70-match => 70-switch}/Makefile (100%) rename modules/48-conditionals/{65-switch => 70-switch}/SolutionTest.php (100%) rename modules/48-conditionals/{65-switch => 70-switch}/description.es.yml (100%) rename modules/48-conditionals/{65-switch => 70-switch}/en/EXERCISE.md (100%) rename modules/48-conditionals/{65-switch => 70-switch}/en/README.md (100%) rename modules/48-conditionals/{65-switch => 70-switch}/en/data.yml (100%) rename modules/48-conditionals/{65-switch => 70-switch}/es/EXERCISE.md (100%) rename modules/48-conditionals/{65-switch => 70-switch}/es/README.md (100%) rename modules/48-conditionals/{65-switch => 70-switch}/es/data.yml (100%) rename modules/48-conditionals/{65-switch => 70-switch}/index.php (100%) rename modules/48-conditionals/{65-switch => 70-switch}/ru/EXERCISE.md (100%) rename modules/48-conditionals/{65-switch => 70-switch}/ru/README.md (79%) rename modules/48-conditionals/{65-switch => 70-switch}/ru/data.yml (100%) diff --git a/modules/48-conditionals/60-ternary-operator/ru/README.md b/modules/48-conditionals/60-ternary-operator/ru/README.md index 9e669928..29139f41 100644 --- a/modules/48-conditionals/60-ternary-operator/ru/README.md +++ b/modules/48-conditionals/60-ternary-operator/ru/README.md @@ -16,11 +16,7 @@ print_r(abs(10) . "\n"); // => 10 print_r(abs(-10) . "\n"); // => 10 ``` -Можно ли записать ее лаконичнее? Что-то вроде `return ОТВЕТ В ЗАВИСИМОСТИ ОТ УСЛОВИЯ`? Для этого справа от `return` должно быть выражение. Но есть проблема: `if` — это инструкция, а не выражение. - -В PHP существует конструкция, которая по своему действию аналогична конструкции *if-else*, но при этом является выражением. Она называется **тернарный оператор**, и именно его мы изучим в этом уроке. - -**Тернарный оператор** — единственный в своем роде оператор, требующий три операнда: +Но можно записать более лаконично. В PHP есть конструкция, которая работает как *if-else*, но при этом является выражением — ее результат можно сразу вернуть из функции. Она называется **тернарный оператор** и является единственным оператором в PHP, который требует три операнда: ```php ` указывается значение для сравнения, справа — выражение, которое станет результатом. Если одному результату соответствует несколько значений, они перечисляются через запятую: @@ -53,10 +53,10 @@ $type = match ($size) { }; ``` -Есть и другие отличия от `switch`: +Еще две важные детали: -* `match` сравнивает значения строго, как оператор `===`. А вот `switch` использует нестрогое сравнение `==`, при котором происходит автоматическое преобразование типов. -* Если ни одна ветка не совпала и `default` не указан, программа завершится с ошибкой `UnhandledMatchError`. `switch` в такой ситуации просто ничего не сделает. +* `match` сравнивает значения строго, как оператор `===` — автоматического преобразования типов не происходит. +* Если ни одна ветка не совпала и `default` не указан, программа завершится с ошибкой `UnhandledMatchError`. Часто результат `match` нужно вернуть из функции, которая его содержит. Для этого перед `match` ставится обычный `return`: diff --git a/modules/48-conditionals/70-match/ru/data.yml b/modules/48-conditionals/65-match/ru/data.yml similarity index 100% rename from modules/48-conditionals/70-match/ru/data.yml rename to modules/48-conditionals/65-match/ru/data.yml diff --git a/modules/48-conditionals/70-match/Makefile b/modules/48-conditionals/70-switch/Makefile similarity index 100% rename from modules/48-conditionals/70-match/Makefile rename to modules/48-conditionals/70-switch/Makefile diff --git a/modules/48-conditionals/65-switch/SolutionTest.php b/modules/48-conditionals/70-switch/SolutionTest.php similarity index 100% rename from modules/48-conditionals/65-switch/SolutionTest.php rename to modules/48-conditionals/70-switch/SolutionTest.php diff --git a/modules/48-conditionals/65-switch/description.es.yml b/modules/48-conditionals/70-switch/description.es.yml similarity index 100% rename from modules/48-conditionals/65-switch/description.es.yml rename to modules/48-conditionals/70-switch/description.es.yml diff --git a/modules/48-conditionals/65-switch/en/EXERCISE.md b/modules/48-conditionals/70-switch/en/EXERCISE.md similarity index 100% rename from modules/48-conditionals/65-switch/en/EXERCISE.md rename to modules/48-conditionals/70-switch/en/EXERCISE.md diff --git a/modules/48-conditionals/65-switch/en/README.md b/modules/48-conditionals/70-switch/en/README.md similarity index 100% rename from modules/48-conditionals/65-switch/en/README.md rename to modules/48-conditionals/70-switch/en/README.md diff --git a/modules/48-conditionals/65-switch/en/data.yml b/modules/48-conditionals/70-switch/en/data.yml similarity index 100% rename from modules/48-conditionals/65-switch/en/data.yml rename to modules/48-conditionals/70-switch/en/data.yml diff --git a/modules/48-conditionals/65-switch/es/EXERCISE.md b/modules/48-conditionals/70-switch/es/EXERCISE.md similarity index 100% rename from modules/48-conditionals/65-switch/es/EXERCISE.md rename to modules/48-conditionals/70-switch/es/EXERCISE.md diff --git a/modules/48-conditionals/65-switch/es/README.md b/modules/48-conditionals/70-switch/es/README.md similarity index 100% rename from modules/48-conditionals/65-switch/es/README.md rename to modules/48-conditionals/70-switch/es/README.md diff --git a/modules/48-conditionals/65-switch/es/data.yml b/modules/48-conditionals/70-switch/es/data.yml similarity index 100% rename from modules/48-conditionals/65-switch/es/data.yml rename to modules/48-conditionals/70-switch/es/data.yml diff --git a/modules/48-conditionals/65-switch/index.php b/modules/48-conditionals/70-switch/index.php similarity index 100% rename from modules/48-conditionals/65-switch/index.php rename to modules/48-conditionals/70-switch/index.php diff --git a/modules/48-conditionals/65-switch/ru/EXERCISE.md b/modules/48-conditionals/70-switch/ru/EXERCISE.md similarity index 100% rename from modules/48-conditionals/65-switch/ru/EXERCISE.md rename to modules/48-conditionals/70-switch/ru/EXERCISE.md diff --git a/modules/48-conditionals/65-switch/ru/README.md b/modules/48-conditionals/70-switch/ru/README.md similarity index 79% rename from modules/48-conditionals/65-switch/ru/README.md rename to modules/48-conditionals/70-switch/ru/README.md index 1202a054..5e2fa4d1 100644 --- a/modules/48-conditionals/65-switch/ru/README.md +++ b/modules/48-conditionals/70-switch/ru/README.md @@ -1,4 +1,4 @@ -Многие языки в дополнение к условной конструкции *if* включают в себя **switch**. В этом уроке мы познакомимся с ним. +Выражение `match` из прошлого урока появилось в PHP только в восьмой версии. До этого ту же задачу решала конструкция **switch** — она встречается во многих языках и в огромном количестве существующего PHP-кода, поэтому ее важно уметь читать. Это специализированная версия *if*, созданная для некоторых особых ситуаций. Например, ее имеет смысл использовать там, где есть цепочка *if else* с проверками на равенство. Например: @@ -104,3 +104,11 @@ function doSomethingGood($count) ``` Switch хоть и встречается в коде, но технически всегда можно обойтись без него. Ключевая польза при его использовании в том, что он лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. Хотя кода и стало физически больше, читать его легче, чем блоки с *elseif*. + +Напоследок сравним *switch* с `match` из прошлого урока: + +* `match` — выражение и вычисляется в значение, *switch* — инструкция: чтобы получить результат, нужна переменная или `return` внутри `case`. +* `match` сравнивает строго (`===`), *switch* использует нестрогое сравнение `==`, при котором происходит автоматическое преобразование типов. +* В `match` выполняется ровно одна ветка, в *switch* без `break` происходит «проваливание» в следующий `case`. + +В новом коде предпочитайте `match`, а *switch* пригодится при чтении и поддержке существующих программ. diff --git a/modules/48-conditionals/65-switch/ru/data.yml b/modules/48-conditionals/70-switch/ru/data.yml similarity index 100% rename from modules/48-conditionals/65-switch/ru/data.yml rename to modules/48-conditionals/70-switch/ru/data.yml From 3dbf43bfc54d95afc3e22b5e16d48d7aae6d7979 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Thu, 11 Jun 2026 17:17:41 +0500 Subject: [PATCH 19/29] =?UTF-8?q?feat(40-define-functions):=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20=D0=B8=20=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D1=8B=20=D1=83=D1=80=D0=BE=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D0=BE=20Python,=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20500-reading-documentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 200-return -> 150-return, 340-default-parameters -> 200-default-parameters: default-parameters теперь идет ПЕРЕД 250-named-arguments, как в Python — теория именованных аргументов опирается на значения по умолчанию - delete 500-reading-documentation (вердикт второго прохода: в Python урока нет) - удален неиспользуемый ассет func_return.png (нигде не упоминался) Co-Authored-By: Claude Fable 5 --- .../{200-return => 150-return}/Makefile | 0 .../SolutionTest.php | 0 .../description.es.yml | 0 .../{200-return => 150-return}/en/EXERCISE.md | 0 .../{200-return => 150-return}/en/README.md | 0 .../{200-return => 150-return}/en/data.yml | 0 .../{200-return => 150-return}/es/EXERCISE.md | 0 .../{200-return => 150-return}/es/README.md | 0 .../{200-return => 150-return}/es/data.yml | 0 .../{200-return => 150-return}/index.php | 0 .../{200-return => 150-return}/ru/EXERCISE.md | 0 .../{200-return => 150-return}/ru/README.md | 0 .../ru/assets/sum-php.jpg | Bin .../{200-return => 150-return}/ru/data.yml | 0 .../Makefile | 0 .../SolutionTest.php | 0 .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../index.php | 0 .../ru/EXERCISE.md | 0 .../ru/README.md | 0 .../ru/data.yml | 0 .../200-return/ru/assets/func_return.png | Bin 242211 -> 0 bytes .../500-reading-documentation/Makefile | 2 - .../SolutionTest.php | 18 ------ .../description.es.yml | 54 ------------------ .../500-reading-documentation/en/EXERCISE.md | 12 ---- .../500-reading-documentation/en/README.md | 25 -------- .../500-reading-documentation/en/data.yml | 7 --- .../500-reading-documentation/es/EXERCISE.md | 12 ---- .../500-reading-documentation/es/README.md | 28 --------- .../500-reading-documentation/es/data.yml | 9 --- .../500-reading-documentation/index.php | 10 ---- .../500-reading-documentation/ru/EXERCISE.md | 12 ---- .../500-reading-documentation/ru/README.md | 28 --------- .../500-reading-documentation/ru/data.yml | 9 --- 41 files changed, 226 deletions(-) rename modules/40-define-functions/{200-return => 150-return}/Makefile (100%) rename modules/40-define-functions/{200-return => 150-return}/SolutionTest.php (100%) rename modules/40-define-functions/{200-return => 150-return}/description.es.yml (100%) rename modules/40-define-functions/{200-return => 150-return}/en/EXERCISE.md (100%) rename modules/40-define-functions/{200-return => 150-return}/en/README.md (100%) rename modules/40-define-functions/{200-return => 150-return}/en/data.yml (100%) rename modules/40-define-functions/{200-return => 150-return}/es/EXERCISE.md (100%) rename modules/40-define-functions/{200-return => 150-return}/es/README.md (100%) rename modules/40-define-functions/{200-return => 150-return}/es/data.yml (100%) rename modules/40-define-functions/{200-return => 150-return}/index.php (100%) rename modules/40-define-functions/{200-return => 150-return}/ru/EXERCISE.md (100%) rename modules/40-define-functions/{200-return => 150-return}/ru/README.md (100%) rename modules/40-define-functions/{200-return => 150-return}/ru/assets/sum-php.jpg (100%) rename modules/40-define-functions/{200-return => 150-return}/ru/data.yml (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/Makefile (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/SolutionTest.php (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/description.es.yml (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/en/EXERCISE.md (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/en/README.md (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/en/data.yml (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/es/EXERCISE.md (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/es/README.md (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/es/data.yml (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/index.php (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/ru/EXERCISE.md (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/ru/README.md (100%) rename modules/40-define-functions/{340-default-parameters => 200-default-parameters}/ru/data.yml (100%) delete mode 100644 modules/40-define-functions/200-return/ru/assets/func_return.png delete mode 100644 modules/40-define-functions/500-reading-documentation/Makefile delete mode 100644 modules/40-define-functions/500-reading-documentation/SolutionTest.php delete mode 100644 modules/40-define-functions/500-reading-documentation/description.es.yml delete mode 100644 modules/40-define-functions/500-reading-documentation/en/EXERCISE.md delete mode 100644 modules/40-define-functions/500-reading-documentation/en/README.md delete mode 100644 modules/40-define-functions/500-reading-documentation/en/data.yml delete mode 100644 modules/40-define-functions/500-reading-documentation/es/EXERCISE.md delete mode 100644 modules/40-define-functions/500-reading-documentation/es/README.md delete mode 100644 modules/40-define-functions/500-reading-documentation/es/data.yml delete mode 100644 modules/40-define-functions/500-reading-documentation/index.php delete mode 100644 modules/40-define-functions/500-reading-documentation/ru/EXERCISE.md delete mode 100644 modules/40-define-functions/500-reading-documentation/ru/README.md delete mode 100644 modules/40-define-functions/500-reading-documentation/ru/data.yml diff --git a/modules/40-define-functions/200-return/Makefile b/modules/40-define-functions/150-return/Makefile similarity index 100% rename from modules/40-define-functions/200-return/Makefile rename to modules/40-define-functions/150-return/Makefile diff --git a/modules/40-define-functions/200-return/SolutionTest.php b/modules/40-define-functions/150-return/SolutionTest.php similarity index 100% rename from modules/40-define-functions/200-return/SolutionTest.php rename to modules/40-define-functions/150-return/SolutionTest.php diff --git a/modules/40-define-functions/200-return/description.es.yml b/modules/40-define-functions/150-return/description.es.yml similarity index 100% rename from modules/40-define-functions/200-return/description.es.yml rename to modules/40-define-functions/150-return/description.es.yml diff --git a/modules/40-define-functions/200-return/en/EXERCISE.md b/modules/40-define-functions/150-return/en/EXERCISE.md similarity index 100% rename from modules/40-define-functions/200-return/en/EXERCISE.md rename to modules/40-define-functions/150-return/en/EXERCISE.md diff --git a/modules/40-define-functions/200-return/en/README.md b/modules/40-define-functions/150-return/en/README.md similarity index 100% rename from modules/40-define-functions/200-return/en/README.md rename to modules/40-define-functions/150-return/en/README.md diff --git a/modules/40-define-functions/200-return/en/data.yml b/modules/40-define-functions/150-return/en/data.yml similarity index 100% rename from modules/40-define-functions/200-return/en/data.yml rename to modules/40-define-functions/150-return/en/data.yml diff --git a/modules/40-define-functions/200-return/es/EXERCISE.md b/modules/40-define-functions/150-return/es/EXERCISE.md similarity index 100% rename from modules/40-define-functions/200-return/es/EXERCISE.md rename to modules/40-define-functions/150-return/es/EXERCISE.md diff --git a/modules/40-define-functions/200-return/es/README.md b/modules/40-define-functions/150-return/es/README.md similarity index 100% rename from modules/40-define-functions/200-return/es/README.md rename to modules/40-define-functions/150-return/es/README.md diff --git a/modules/40-define-functions/200-return/es/data.yml b/modules/40-define-functions/150-return/es/data.yml similarity index 100% rename from modules/40-define-functions/200-return/es/data.yml rename to modules/40-define-functions/150-return/es/data.yml diff --git a/modules/40-define-functions/200-return/index.php b/modules/40-define-functions/150-return/index.php similarity index 100% rename from modules/40-define-functions/200-return/index.php rename to modules/40-define-functions/150-return/index.php diff --git a/modules/40-define-functions/200-return/ru/EXERCISE.md b/modules/40-define-functions/150-return/ru/EXERCISE.md similarity index 100% rename from modules/40-define-functions/200-return/ru/EXERCISE.md rename to modules/40-define-functions/150-return/ru/EXERCISE.md diff --git a/modules/40-define-functions/200-return/ru/README.md b/modules/40-define-functions/150-return/ru/README.md similarity index 100% rename from modules/40-define-functions/200-return/ru/README.md rename to modules/40-define-functions/150-return/ru/README.md diff --git a/modules/40-define-functions/200-return/ru/assets/sum-php.jpg b/modules/40-define-functions/150-return/ru/assets/sum-php.jpg similarity index 100% rename from modules/40-define-functions/200-return/ru/assets/sum-php.jpg rename to modules/40-define-functions/150-return/ru/assets/sum-php.jpg diff --git a/modules/40-define-functions/200-return/ru/data.yml b/modules/40-define-functions/150-return/ru/data.yml similarity index 100% rename from modules/40-define-functions/200-return/ru/data.yml rename to modules/40-define-functions/150-return/ru/data.yml diff --git a/modules/40-define-functions/340-default-parameters/Makefile b/modules/40-define-functions/200-default-parameters/Makefile similarity index 100% rename from modules/40-define-functions/340-default-parameters/Makefile rename to modules/40-define-functions/200-default-parameters/Makefile diff --git a/modules/40-define-functions/340-default-parameters/SolutionTest.php b/modules/40-define-functions/200-default-parameters/SolutionTest.php similarity index 100% rename from modules/40-define-functions/340-default-parameters/SolutionTest.php rename to modules/40-define-functions/200-default-parameters/SolutionTest.php diff --git a/modules/40-define-functions/340-default-parameters/description.es.yml b/modules/40-define-functions/200-default-parameters/description.es.yml similarity index 100% rename from modules/40-define-functions/340-default-parameters/description.es.yml rename to modules/40-define-functions/200-default-parameters/description.es.yml diff --git a/modules/40-define-functions/340-default-parameters/en/EXERCISE.md b/modules/40-define-functions/200-default-parameters/en/EXERCISE.md similarity index 100% rename from modules/40-define-functions/340-default-parameters/en/EXERCISE.md rename to modules/40-define-functions/200-default-parameters/en/EXERCISE.md diff --git a/modules/40-define-functions/340-default-parameters/en/README.md b/modules/40-define-functions/200-default-parameters/en/README.md similarity index 100% rename from modules/40-define-functions/340-default-parameters/en/README.md rename to modules/40-define-functions/200-default-parameters/en/README.md diff --git a/modules/40-define-functions/340-default-parameters/en/data.yml b/modules/40-define-functions/200-default-parameters/en/data.yml similarity index 100% rename from modules/40-define-functions/340-default-parameters/en/data.yml rename to modules/40-define-functions/200-default-parameters/en/data.yml diff --git a/modules/40-define-functions/340-default-parameters/es/EXERCISE.md b/modules/40-define-functions/200-default-parameters/es/EXERCISE.md similarity index 100% rename from modules/40-define-functions/340-default-parameters/es/EXERCISE.md rename to modules/40-define-functions/200-default-parameters/es/EXERCISE.md diff --git a/modules/40-define-functions/340-default-parameters/es/README.md b/modules/40-define-functions/200-default-parameters/es/README.md similarity index 100% rename from modules/40-define-functions/340-default-parameters/es/README.md rename to modules/40-define-functions/200-default-parameters/es/README.md diff --git a/modules/40-define-functions/340-default-parameters/es/data.yml b/modules/40-define-functions/200-default-parameters/es/data.yml similarity index 100% rename from modules/40-define-functions/340-default-parameters/es/data.yml rename to modules/40-define-functions/200-default-parameters/es/data.yml diff --git a/modules/40-define-functions/340-default-parameters/index.php b/modules/40-define-functions/200-default-parameters/index.php similarity index 100% rename from modules/40-define-functions/340-default-parameters/index.php rename to modules/40-define-functions/200-default-parameters/index.php diff --git a/modules/40-define-functions/340-default-parameters/ru/EXERCISE.md b/modules/40-define-functions/200-default-parameters/ru/EXERCISE.md similarity index 100% rename from modules/40-define-functions/340-default-parameters/ru/EXERCISE.md rename to modules/40-define-functions/200-default-parameters/ru/EXERCISE.md diff --git a/modules/40-define-functions/340-default-parameters/ru/README.md b/modules/40-define-functions/200-default-parameters/ru/README.md similarity index 100% rename from modules/40-define-functions/340-default-parameters/ru/README.md rename to modules/40-define-functions/200-default-parameters/ru/README.md diff --git a/modules/40-define-functions/340-default-parameters/ru/data.yml b/modules/40-define-functions/200-default-parameters/ru/data.yml similarity index 100% rename from modules/40-define-functions/340-default-parameters/ru/data.yml rename to modules/40-define-functions/200-default-parameters/ru/data.yml diff --git a/modules/40-define-functions/200-return/ru/assets/func_return.png b/modules/40-define-functions/200-return/ru/assets/func_return.png deleted file mode 100644 index c0f696db94b9e921ea4c5bba2848dc62ef8fb2a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242211 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

@<}j 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

y7t}xF2{WyZKwtA%Td+bu%D!R( zhYuLGgUZ0i@if1cEk7|b4(%oBL`egCLK+np{i1%g3tL;yWCc28omB5V!$$%R+q*m5 z0GTQvBOvWl&@T)XEv>ZF>;@j%s0g&`C0i5#ZC7Lt7cFCwDU@WIlaP^LYgz;eBi@EI z5=TM*o9iI_goZh83ut#uTn7g|4o>*a4<|RVU->`91q*5YGD)>6G%LzT9aUW{DfG*^ z8D0e(ZHSyYW(U7!=Sd0cPUgoLkw9+%Jorv~QKEnZ{2fsezeW+&$=0Ik--AZO5&THY z?MD9@>!ICn1&aWu=8em*t?0a4#ELiOqkb`a=+5MO+M|o${V8b~Ja8y`P&{?9zk}iv zVV4Z%d3z9Cat(FK`}Xuf;NxAvlz@_u;|{AwO>Ema-rF@7!w$XlW!LwttUER9MiF-` zqHqRqTP?8Gw{9q4TjUEGAkCEM6H!v?`SZ|A!l#`uNod~J|0`` ztdKB;W_g-z{@asVz(;(rp#eNME$99@;OuN9;N>wK8z!~z+Szd=^))!R5NE4M4^EJd zzl#eeh%Z`HX~42pO$p?Ug__R6RH-GvI&1Ehva&a-z>BROLkVs4wXgIBeFpUWAtf&^ z8ZQhP{jcO494K-{tuLPbm$lvHsMB%5pVdhDuwD_()j4B>iD|F?wzf1qG{r4TPzO3M zo|1@r9i0@Bj6Tj`e!bZ4Zg8_Qw_2-poo?reB&fpgJYfq`!tA4;eMUQyDxeufCDUfN zaq{U8o|xnOFXOosrMMTI9UZrL$W6+a^I2W!G*P^9P*mSrZv`SI`KvJ+J`5UqCaFFk zpzBUZmK-n4++OE_G4i)o`c%K+!jyx4g>vm^h)oXT6nF6h`5r{)kUGpVtD+tU?yGl( zPIg+izJAu6i;yG^$?jB@Zu{c%SsNhn8m>otu~7TM71t@g;^gHh)&}u!!`;xp^MRWc zC=A<>{Z&}rC$gd9u5bGp(y=dg0}H8w2prL_Am>N z3nS|KbQ2A8*B&}%JahR^O?zW$j*njZE=jwcv_D8Yw_e{+>B~Iu)fZyZ`XfB{XNRh8 z&wi-1A<6}09^bt~3WwqsOkaGgV`uujZJriB-*&e;{@FrFs7daDXSGSLruch2Pvu3r zNW<1pHrIK`6{{D$?Y4SWdW)d})R{}U`$E1=& zx~l@AO26BmaX=P*lr;V7Fwq@p;u1B3N>4 z?pUucsC2=?G%%J!50V+4h8@sW(VeXOaWYA@x@iJ0{8N`6MMx-ouQhKg$a{&Hp85%O z<_0`~WZiCXp6GC<5Xmc^-d%?ij=b9Q++Mw|)?e!~Xysns!_rL>G;Tg3iEEoLrI$KV zIp$*4sV33Ey&@1jGH1aNPajC(pRaxhbDR^cG^`QgPSi&Y_ot_PJzHLRdrLy^7b6JR zovPsPV}^-23AgPUbc_nMBrc2BtcqJ^k?m%7Z)=lGDt_@meWAar@{oGCI>Eg{IA#Fu zB%N~D0DnQ&L}ID-|BNYa_ucbxu|P_{1N%&NGmVL&Eiu)UTF~t~f-_Gv3e+y-sV?JQ zwtT3A{%t+Bw<-~iEu+|YRwFZ7^Y-6H$eKd=M8JEf6eiXAE=9-g+8>_g>q!xOv3^l>aGYJKXCgcWrPSz6VO29o$fZQ{K1YJ5u((_9+;RHelcF4ZTes{N2T4?V5_qmY z`!F$~xuKKSN-1slguI*UzbO8gLWWCYLUokFtcEggs+T^QECPR0CX%br7&9|b4sYwr z>E&8!iB5^D`Vu@V1GCn13$T-RKAbC(HoVle(UA8tFn+fAhh*T0XtJ+v$zib>rk;5~ zSU*|>H>7`aTZlF67P@%CW`t?XsKR?xt`x`ctz_|a3ti0!g~PH)W5Z%WCr@~!5ZpJS zuRmcjV)nM%WFX)P{I#6!`YTJ!nPXs~D##6TS)p8F2w-aR+ZliLuSqK0-Pw@J9`J_E z>S#ORNt@nDa#7%3H@1bGf$Drhi#dIPeONX3MLKu347^zXo;EIQire!Fch)(Leis8o z{B9&-R^a6EDCcGO*Lkjuk4gC{znvag>f@;Qcc&^*bU~s9s23neEcA+UR(k+_wd&p* z{=(SqkbXW?8~Y0z$sQIqg01rL4n&)AkRcfyTWzDO_%SXU9&FrKThsc>lqzU%dVRAt zp{UQ#R1->k*`M*_$$+BJ`#g`4@0K7*S2jyrIDiiWl6QTJO{Pu=(cLSm#O+6#_cqF1 zY*Gc-^=b`7(BCSi?{0cCN+EKJ3!9{n{B(yWzOMh(BRP7&@AI8ZguVWA%B)wPRI5y+|9!_hIkCyEBM1X=Va;%Nbm-Pw-bFlx9RGSaYDZ>w z29tV##0b^`VdHw6`~uwzuA~2Kf$y$T759{Er5lld*6du!>ztQ#{5EGQGN!7}DDsZw z(S9w5b%_fgFYnWqC;@wTsw#*yzLTO*4-S{FSRCkpYoMz%H4~8`scml1-8)h#YEQf zt59HyoBjY+@dVZ-+yWDn@qHNw^i{1l8}Ad%hVE5%)u2Vm5+Dz4>so@z-^MY8em3Fq z;5%|?6Pdkj1g!5bp#`+Wl4kEv_KOmywQ*_}OYm(rnl~9@Eyy@@3kHDq8KcZP^X1d% ze$H;HuGC3IayiI~>-(oV8{{%=uGfr@UOAkv<2FtG-3`CIy&Tf7GLbtIm3=(wz`kAH zOw`~F_H3AnH|_fvZYo!Y8Q}ZGl%zSbSw*@uxSSCFBLTq&c^c>n<8rzwm#TYsU?8v{ zoipPwdQ26Co)`bzW8P^w5aXZ5LE3%bV^Zl$W%mXBUViv-|9;2`Zr2%xZCAV(&HO!( z7qD0A7~)Mt&0SPWz$`*XezV>oGVG;#t%XN*uKo-cV%Vc=xxlJ#<^i4Hhe@`O+3DX7 z6it1T#D-^go47)%UIercaf`LF&<~{oT1lUWvEaol`fnAUieO}-$!n_Yv9ttt zLMar^=s}KjY{|8aQ`vCoPFA?h3<(3nI$0`u(4!+>68yY6DY@of3ul9_XXiDLZ$K_hO;XkTH?UZowvfky-r8hlNp5c5qEZ1}&_Vtx> z)rYHNS;15P6tMeLzH}#%|!i zcusKV9Sr;SvLT@2-SB&F>cQQHL%+f0U@zS60PnrUEhQJ8C~)5a2IM;c1Ab`%Z?H4U zT`>Wc1fJ;2q3fn!roAH(;EkVgF8kDhQZaP|ic7QN1Q~#s9m-t?MthIFtnr%Xtl6E2 ztZ7-8I8q)KD+B)l?$WEIJDVDz{VG+nL9^ut))OY~;BM*v_1)n!8bN|GLUL&Z&`lHA zEx(iKqb7=y`Nqe!a}Bs#PN-DF*t@GDC^=78`y14D@w5q3G@5S2GE$?=_eE|r%_4E& zfwoa2=~y$w1-G#7?+r*AGg4%vdBP@>L$>7ec!g8EqEh=Hkp$h}?Kennuo;ue0trQw z?R}I@$9~maf_W7K2YnR%fc4nr(1Gmkrg^V<|HCQRY{CysN1XkRH26jp9>uo9k!v97 zc`~nOd9L4f_f$RqAfu4=g7WJ*DA?x>%Vk=e2oRex&)r@xp#;ZiSp`AlW!9l}#6#VS zK+l2V(`#pMPJOzUF}S0EuJ3=5xN2)n1%Yr-~s%;qT_@tQG3(S-;mpnD7W_Y(1}Bj%FXjY z2QLI6{w4&@D4x8pEC9@hWNfm{KxXX?^+kSZvI*5|DSqIou}DrI=?gv_iiXlUGxzu~ zOTbY91G2W?hAZY`2M^I@bssuFz1HFNO3Z(0{+;+b{CDFOZ*KYme2Hh)+`COCR)MhR zNvz|~ei0K_{COUvR*f#icxPc2HD!v+?$U%`udD}gZl_6nv17mPiY)p07l3}?RGuci zCrRuT;1n-wgyH{ceKfro>XIsxoa=o2g>f%@*bbvJ2l>Q{{Emd$SYh#}07Fypebt@24#%+zI zjqc@I?^`pQhGm4kxD=PacUzVz2A+56clZg8S|TRR)r*)0Iq)wwf_~EPt5C+h(vGHb z7Fv0JSDrh>m)q<|4iuM;9K;o?ygO#P9n_rC$G5rWhW8y*?_t59MSbZ_7{WND(hg{L zVvk~=HnJ2Kd9h9U%%AXWMcHhPBQ=^2K?ojk(;$N@yjjO+o+{Q%os+*lBkd!E;la^D zYsyY0tlVc`Iqze?GA)9b@!$<4y=cx9B4;@OM15oWwWLD9Q<}o%N;xs>B2Yne>7e@E z<|*<*`MV}4sbbl+`yX#lpFE7hK729b;{F1$CkEE#LxBt^E8q{V3(pyFky^d?c7KFo zxsHK`M39)DY(c!=!tLj#FyT+~&M`rh$$1945L~!kLb4nnUL>-JvwX!Q(4n0c;=FMv zAU?tvuUiPqc~TYe6ka!lXCWLiXks!s`}|?m8(;l;^C}>Sw+KXv)4?Kd0Pfy?d(swn zj`kZauVBy%+1L3DjbPGoNPiLkJ6G#K5uB2(Ux`}cc>#-*;Z#z%xW82IZ#L}lBE0_A zAd4h8HE#TA`Yrv7Of+W+p{^h9OK$~dMk#1~JucDakxZ2NX>oE*VPpeV{6-O%=1SaT z1y9b%5XnH|A6#T3F`jiTXQ&FFsVmjA0S*omfKsXCVFwC68;u>Ux4@ivGSkSNUT%pYJ@BA?$@ClETJ(Y5eqXCaV@6Xp_7Kor5{*rodxaxj?}l8 zh{VFmo@G)t&?4=&MmdUmh0EwCa{4ADWi zX%a$2@=^UT)weDod%Xrk>T5XpX@T$1ZI{8GfVN%rL7yYZ<-ti*-)vkRVvUzo4y6{cs7&**V=mIbu_y?D!yr&(*2D)~ z_?uKuj`^M2F#U{*G|K^w#x5^Lpkp(6E184$d~%y9v(aXfd+ZgwkH8$n%+6W*3Cz|z z*$OWdi+G=RwoQ}OkOAA{sER8gRUxM)t7+1=Bywa!MdUj)t>c*;zFRGhY^)bOMePbZC&^HY&;wX-XBGQE#5&IXF57 z+i+NaDLG1`o;91gGtz*Y&82hE7$?fpkp@!EO*>|0{a8?%=Q^9{R8GP*Tz@(7C+gIk zwo$HDP3I@OfO4&kDF!VLy#IJnc9ufE#AY2ZAlgs#Z%n8YTFbk9<|tr7=cQjUN1uvu3?#gd1o7UZ^m*J^zwQ0AEdj5fg01>@f#*ABnzRheSKgKm`IStu)b^Z=!l2~geu~iNz;aM%- z+>r8_DrmPpfV$vw4nkN#XvgXED7cBg4>ePiHb51JUnLMK>}{@R?r>$?zTs=Agpq|c zGFj79)PwqFzA`~ZbG(CbI+9#h{F(9K)piF3GcPwNYN7QFt4J+-uXB#k;i+-K_?jJ? zaD`~DHg!n{*Jm+?f%pA7?L?(;&$0MemLet+80i3a=_#QSS3~h;4kTw72EIYJO!=e0VlbFn6R!N5BOD;jUr2EX)=6s2*Nq1{- z@B0N;_5ozW%{Z+#-$?6sILMTQ@glxj3Fk zD7Y~#v)xyB(HPD|fUeh0DAE4R{|F({Z{Uis{zbUltDpkI94KokMhGuan_rOZi#ctI z=E=*imyRB|cZ`>2HL0m0_K#d~Vop~V1(ku1%GVJ}00yiEj3%}y#;Pk!e3C}S6N~Eo zsxDl=JLXudf!JkLz z=uYB9H9+aR9l;kXV;O6PihrP<=S^Y`x7zo39^Y|3S#*{$|E-FPRi*k#D5g-}gPN6A5;Ku+<98Z3aUVe{| zy}<$93(-|V_m?jFqWQ^|dZ#Uoggb96kWX$<6wlP>;0KY1(FuB}Z z5seT@-mF`S$MsLSDt&3ICI=H(p}lo}YY|+ClvRF%W*f}uvgzgVk|oRGMr^ZwUHu>e7QauZNthNWcB%Ca8|u2ie~ z-ob=}J%4k3#j*5@e57lCa0UaDO0qC~)HGw_R;8xrD>lEyp92<#0Y_{b&94Jv0kmfJ zLSWtF^QJoGiL$o}qR#Ki#wmDA_l{#iq-vqVdB56*7=Kh^RijI_^^3j2)hPVSy~XfS znzt|jqoHN+$~&06!4Dxz+^+?`p6Ue7Nh5_FM^5`CR_A@&lMP?z^ypVJ*uuo{Xjpd^ z=(WmendX}1_Vp6-EPNJxT_@%9ID{}JJ0S!-&)pa0icrK25=j1LIscx3pcnjn$2Sq*BEPMso3!x$20dhvhr?IXT(M@%rZ6zaQ*|(CYrk4hH zr5ZU&&Yln#&9~a^Qk?oIt;m@C=lQGs`RvT|(*wFJvIWsT`aN2$tv0&JhpJ-YN4(BX z_p4{H4O%s55MG_!*CwcJ%tUwi%gTdW%gxv(Ky zQ8d6AP~V$U(=~up$ycdoIch)+55W=__3l0mTzaot`29L=-~RX&@CJmV8mEtUVDNB! zIyHq9OI_vzUR>NLp!3=QgTuv1YYOB2$Xd+6{nUH?_OFG0az>o`3INVGo) z3@gRx7lNTEo_q#z3hdPe;bDf0@&S{A5~T0R2ME^>2}?dRJ;&?VYUe|K^<*>?Px6sg zDJJE(X1L0DP{TLNr9^$7`rn2h68rKpm031abiZV_t+GtIxn75Ixj ze#4zUaRKF-)Ryyt-#||k^b`*ZRP3krVvHXKa-7HAesYd~`JHiID&^;NEFaygWTrf> zs)C&#-W zkOe)3?^91+M-$XGTRg(ss|;x;ocp!BdO3eir@BqRaLWCB`6jR0axM1W+qG>OGK)rb zMK%Wk!$AbBo;cEQ8RqD+6J)3L`qLy5$nDwAP!0}AS%MujEVlVF>1$MG&Q{mk3-OWjKAP6hVSnMT?l;06OrX|@P4c$;OI)i_-t%Y^2=FV8N z$AmI{9;y8KO8&GxbHOYaY;B%eJ?W*d97z$ku|DB=>ZW^dEa_35t#T=Gy_Xm!F(a-0 z1N`nA#pE|SCQ?xmZoiISyfe%%Q5s%-^1Q7E=x)Eb)DyzYEED8kg%kE;l8VO+!bRhw z9EPfzD!aHGJZCi?A*59!*2Az58oOzAU4@vY?NJ^va+#7k9_D|HKj;+O_`8_@35%gq zr=1Zmh}WSDbNin;+L*iH^~V;s&Zd&V(*E`S-@!`(G2xfmjOWv~VKg_x;<~z@$R2{W zy&HJy0CcK{L7t&6sb44u< z;_=;)%vh?_yCM{s{(aES+;%^HtopHKrN&ju^PxZh^1g&h!`IXfn<$lX0M2IxqO&r5 z?zlkIT-`DoM%&4q8#rTZ`moFV?4MwV3c{e9!p!T+Y->Fev!aK@&VMCJ*5QiCODSs% zBEEYzq&1rq`u!yPnN1F!8rrZTpuv&P_qVoqR2RI_R=gZnC?L7s_BVHnkaPbplPtj2 zo2#)sB?g+28t06plmxZ;o_TiSHHa&L{m%*ELSMVp9osc0+rL3CrQ`(BrKY!WzQMWI z6Et)aLcbd``;w?6KXkAU4-Ko~Qau_UZ36pYMvg~^`ZwcHxtGX?dK)Ou@*@;2(ax=) z65D)u+@m(@-}%2_VBTVZFb?`Rq9~zM3~%a5Ot~`gEm!N=V2G2UOb#pvqZd=n*)|*! zNmeW3)-$1XfEVX9*JwNWnx|UP?@G>g8ul0?&8Pjm0Wd73IIi3K?6UgwV?{Dg>RVXz zk5;{e$s~a&fh!W^Y(&-gz;U*TxaeUQ>e%{Xb5UGyA>mIl5h&np_LX_{5%tqUa$Ude zB^SMPUQkR*m?N1KnV4tQo-CJ?AjfNujWb_#-^+ebHMAj)RIk8>?3DJXyYUBMrT=lS zDd^#Vhl%97W$6S9U`Q1k@a;R5=~sy&5P9J9u8AVQFl_4N*-n@OSn8~JOCETqkyEJ| zv!f_dNk^_lV%42E09ZlcTECtx=BJmvJ5wpoOxCYWbOQ6~QP>w_?H+g15_RWGJxG}T z$6ws^C^5EdZEYCHr2QoPciedQU3QM6^(M0#>p8@^?I`sBKlJMlXcaYD^!@RKUcxm{ zs1T@UIY3DGBB{V^tP9pAA-ubjd?L$=Fd=wKa*%a^k&M;!+fi;Z5K4tT5Fw;7N%LUw z@-U}mE-v+LY}Z_G+!X+6B94g!)cNhVgWG|aL@U9T9bNfkrV95ahkt`u6<}s;bNZ?0 z9cDlUkCjjqUe>o7#ov(`?(%%Do&1JBn4#aL2GBE~-8${pHWB)H0=Pp&kP09X68@h! z5}CcOv}v}K2v`1RbFZ}$_E`8+u<V++Q48WceUZIjg4RLaylAW^_PiA3X}|Rn_=|vJ}VLm3D;L>|pkm#p$2q~8N zYy^r`nikiXEEuo##I}-`4W&tkkOoB8=ntq2|0MJxd{>>?n=0e=xIV%>lcX*|?4Io% zGAfTJWO6<)ceojz@p(%Tevc0Jr8sR7qP~DpxkeOPWe6xi0*$H7Wsc5FmT4OT# z+EvQeLv`&pe+l=)t}s2I$X5ryY0Dz?9JudkYY4p&%R$-P7tE^qDUOManS-gm=V|DpG99=M9u4`UBa-Emlbx7mlF&kR_||iCgko5-j9ojlgQiKz-y7w~Kbw?BeNM1662;6X(TO|`r7-nSkm8T;=XNtAVsQ?!=y!%mr1 zqVcH>L2nu$%y`<~THgtl$4nY-TaIeAl5h>I2mcoMuI*cd_lKk^JCFyVQtQrUYfG?Aco;}qo zwb7^_$Ae@SVOz4;=Vs^@k4ZpjWvTty3Ee#T(i@rP&r=gGQHe2)3Y}{8+V)TSDfU>( zmkHlHa)|Nq+3%9qn1IB`Z-!q=H*uoWKPFoYumP=p0P+6C76#W9jrrp$ROG{qWKOnR z_pZe_(SERZZM|xbsJM^O_>iyZ5=hFUw%2G{GnwrLHG2PCEk}TtNV5#OB$$gSy^gCx z6Sb;C_4p7N|K9P|bM@nROi8yD%iB`BF@%96lHe^#7VYVL!`;fkcc<3qjmP&;Q$Eew zq{eI%U7oBBh;Q+}VQdqo{;QYE>oNn=Wo7pg{8SDsHGt#js1i;m`eK?ZzM&c(sL_r> zl;XGkDqq5aH(m{Oey>R!U7;&aWmgb=A3=~N!!nTO%hV-&AY4^O{B4p}g1j|zobdO^ zpNed|H+DosV?xar@#MWC;d&HNSwO5$$?6(6p>_}Mj|WXe^Jn^$FLIP!coPi&o}HZf z!3LJ@GR4{#wh`u$Jj-7{;bpW0m*QfUR2m;pB7OXoxfrk`s}`C(d-BV!u~xw@KNi2{ zS2>l%)tk>YZ!0uj30`sQ0TP}``K-T6pGL2E@SKhYIa?1d>A-kv_gT|}AIn!OL}vniWL5Vy z<7n_27WHUFB#YD@MM;@(v%QO3q6~CcoajTZ{PFuCuE9T{}YP1|fEowRJ7cf;THkq-n z>Xfi@;Z6D)e=h^g0r!aE%5dZTyiq@_5I_;&k3w&8KJ*sX6`QgD-~vw_UPrq_Qiyb@ z>9@Dh$z2yJzY^apo_=lk?-C0_e-NBZVfhK9G1dpK>Gg<+`ISKGeYshbW+e&)4^T4Y zEAW09zhG^mBPtb7ZI7uAgh~)n)VS~FS3SyyoOXRx2c_u+M(7QukF8}-fC|D5U??5< z7rOuqp8m4%zs(gMVsWhE$2!mSU#eTS@sgT5slOLX(1cE!RuGm~r~&K8GXm4HqvQjj zLb`XlcOfM~zl}PUi`e;%HO3gwO5n>rIgf_%s-hiFVKy37;=mNHCpr6RI6lGEJ-NIu_bIArw|9nI%8<#p z&uc%tF!I2XrYBHgM!mpot+ZbfDxQo?b-;xOga6Fmg-GEhs2>J}|E~E$(;W$7D?n=& z^~KM2;>Rx}q17IIIn$XDGZb2`^yT6`?}Mg7W|f^aRAoK z?lOL;>$QD1tSxjzId9T7f{qFIe=z|k3=-=>LI}Bk38{qG_3>+H>doLrsDgHH@)yb? z1Q>Ud0JP*LtZa>yi471dT*Hk5L|NIdB-}Cm>*rEz*G^Fn(_O zJ*YZwPO7|O)MC~)BBHg6$}}pM{3R0UZFFYsXoXQ=(&shBU>|_T_j0a){1weJMXbrAY%ucjR3(!M>36 zb8S2OY;fFc1;#`s#w^!Z@|UkOc%db;EK(7tKRwtbiFxQ$BF9}j%Ok5C5b+-bDgS0m z8&hOtiHzhtF5Q}kXPA?mt)2cI1di-erE0_$aT;EoHvk{m{#%01pzKwpb*#e(m{dnY z?w(=v!};T0*1dD`22JlH#dLttrj;U~qj8-W?9Egxh!H&5qDRsh4ty)sq z+Y&2H;m`a7!k{jiSA_&&tARkwCn-WGDwEkUM9CJHvMGFcP0YyKbyfpBr|o;-eA1V- z+t8HlcC(jv?RDN*r9uM|S&3Z4U4JKM_1)%z(UFNN3c2Wex&NWK|J~^Lu6;-kfRx9K z56@LE(p1-9h1Xhl=d!W0_1oLwan==roOVk@{`Y*FI!a4~W+wOHgq5ah9w(H!>DU+t z%vS8cZN^t-cl-xK&Y=f?NMby3d^WiA`MlR2Q4x%Sa%3!24<%v`OC26_;9*pr`;8WT zg>c|1(lW?F7UWRjEt|P<4hzpb`Cj#?CUh*iZuM#!=Pu$Bu(9wAKpdTYHir~U+xF*( z7>q8k|LQIm$eTyz_3I%LKjEGan=6&|KeKP<-7MpJ3XM11YnCQq;8F#dO*5xL`#t+< zSwTEBltK&j(5o^dy=sBTum%O|3Ktt@!I+Pn5r|>yadnf!IS&@uUjcsvM;B5XZ9s!S z+gX*in;jK|k&esylN(1(o%SXEdR5GasuFbft<(wFf2WPkf4cnUM@w$qqif2Ywqp~?W*5B(p9g>L6^GSikh3WreB+qz}$>Hd}yh$ zj?$N1L!#pi?jv@ghB7&*C{F8rX+^|4TWDbRw+!w+?w&bEg+yJ+0l}i zz$)%sRr4{%l*+MnbJ%nv!oD5~YE0Ld*0PXPz};bL`mrhkE>hB&Gx{#HYrl?@n~7dUD}`(ZA>AAGh4-HD+Xt!!)zB5O?BWmy6DHpd zT)51h$biGN`*e6qv|x?cjf!Mc+ymrTjA{XnVG>{$Hlb&KRqjBkTVZqx4y!W=q90-7 zQ5v+{ixs>jVgD^Lx2} zns%)%^dLF0@cFf@#jbS;XCxc_0B6IW@)tWkD+5F%a=kFKh^p=5>|OL!>*Pid13!5XzJtS>*1L;Y*@w)VDjCL$GOP>^+6WEq2KyjE ztDX^P=u%~){U{&NSFc;K*!}t73c^8+h)kZ^G8FzExy=b*x$@}&F#_$V5fTsP)mAjr znR_*wpRN9{lv4g_!ZDvyzxhVh@qr{#gjjsaee3e{7~k{p&RWD2Tp(d04Bix?uiW<{ zk17IQ^uOQg_M5i9_{6k-ufR%J6xGt`#Du}z+e5s|hs2%fj?MLlW*NAnKR-M}UkJ{x@}QqX;yWlgykG9n zc8&~x97_CJ7%ljk918xT z$HQq0*7U{D(#rGlOB69jN5k|Vz4xWvWUpnnL^dDP5xJpae|JdY_*KBanfGHa!`Ik>!dxL=hdm%zfZOE-daNi9oCNH5(;+*iNvyZ3kh1Du(2=EQT(jPIQD&|*-hO=n8Y zW>&4|;r+1^CdVYnH|G+8gf&`VzA}(k6W>KplgNmen&&OjCmA?34~=;y6B-xFM-egf z-)Tg@jvA5hrGwJX*8lG3Y6=0C4~=;+*?Za`kD{??J-nNFOUg^vb%%x9)`Aj4Oz1#% z$j#OhMd(}k#v^5cS- zTy}iCKC4UnY7yQwCR*#e#b@}qx5m?Csel>}sS_t))h9tJj?rQ_ekZQyva$im_$Tw| zry4mEMl-h#YhF)>paahz&L657>+JuAzx~H@`pd0o*wb#BqgBrAxznzP@YVE{B&IKh z8ajc!_ndEKlCO>yJB{7+SPj-`^(>;Ft`%|dZ(8iNc(0&4GwRovSBb zu`YEQPv-mQRp5!;y8Ts3bOTqa4A46!QE*#4>z&beRQSUUfy*DIkc)L-ho${{9`p*dC9a5s&` z&B#LL%?~YkGth0EA)5HHZJzQzl+kuZQ3~Ruj241E$CR+?7TDuV7KK#@>W(u#Wl|%b zHoz~+`35OB9VZGkOY4~P;hcT*axY$TU@rAJ|MBqemwkK0OS6f8I{Gq>vT$yd=y<2o zG$pHW^71QZ4GS4vnVb9?;(r8C)+hK)4=*4;S_?TV#6dtH5Py*b=6zjvw`eynah$nd zeMSZmjSx-zIVp}9lFz`uSjyo$b`cdY@Cj?9#p^0dJHy@um2Qvf@+{E@};olc_QU88*k&m zujGZn1A$B>P0}YWKYP)YTMuy@*uBiWfv!`&XKwPY3j0wU)MM;_fZkrY2adcg09Z&} zqT_qVy{NC9-PtyfG?eTBaPVYzlg8R}Ssr!w#m*feWR()u5qhB2(V_9ePx&OpPYfN2 z4+7ykdIa`Re3L#Mffpz&)%q3cwj6Vdy#rV7OnL*qpIPqr(5{+ue~ zGh#bf2R45%SbQF{p{zzn25js6d8&Op&&%(j80#Y~^6WeM#DfX*4Bz5fwzlm_ z^oHTK^;1`~-Mj>W0{84xz0k>xu`P+EqEDQRrZ=2jD8DY=nLd$nEb6l0dwKft{(}br zkNp3X_sZm|CoCZldsYP;3UXmC%ybM?6SFZZxFC>tQQYLW6Z|>)KLoc{smMvSE>_|R z-03bofc!hlp@eC{jkNhT=#4*XMoP-HyylOLQFVzq+eJn_6%~2gUWYj&HDhD>N2lx(e3q)2ioUn#1fN8o0JShk9c#y@hIr-I;>!P7DN1mDP^npyS=2xDM=`>o zsyyot(Rtz2<$Iw>Rh)9XqCO`fPD@64}@RHzz& z*Ft>@o)?Wc4t!_AZM|9Z?&wM#Rl=IdC}imyZiG)D8&( zErMq(d2|pjKPY8fCj2Gsbdy^q97H_5<2;gh{`@_wLs4`#34@QAtHdc0q?~8Smvvws zPb*s|{+tysi`I`Tg%uWi%Td2y(BYKNX||(yGTFpQj(Y*)#c!=>_@M=HaI9DPw@I(K zS;C2e;8r%|wfyq97wS|<&X<0h`?aBgKcELmW{09G`a5FCTeKtA*?mi!B3DX)(#lFc z+s!M$ic+da6&2#_xqt30`TzFz$S8xnKB1gg%%d&Gv;I>so)hm^Sx@$!QEKjh)v)(4 z8J9eO0g#K*<+Z$mNuJMpN5V)|3&w?&!b>8eWx>YuSH84f7%L>QB0-X_%?k2(jh@#s zjxmP)pRqURj*!@0@1Eed6>XQLYF7S2c~W19X!9JWr?DK^Ey|-T^_*m~rsuOWNMU?| z`2B|!`n;BIZqHs{c>^BpY>RRO=5n0807t5JCRTA9@En)EV*Y1czDd{le}a{qYGA^c zpcA}_sma4$>Po)DmV0#{_r9Sib#fu*MV0Hk z`@OOvBnLqO{=?VyimQGmN#D!|M~%lNsYh^&qE3upSACU*jY9wcaXB^ZITUNL86BLpg*fIE>FKTjDwc0K=4)yCVJ$mSeka z&L3SIq>hK_|1<6K8&y@6U@RBCH(*Ug4!J)IVj#jT;Q&C<>B+pR_-V(pQFl4^NH2Vz z>ORAu5V8;d^z(TqAi(V$k)4P*Op&A^o37c4%hDc8_V*&=u*HyJ@g_~a zRXQKFs+_OSc}DKY$oyKB78Kp)jFh+w0#)8qoD!P3#Bs|Lc@G7k(S7K-W`i=qu-7~o zLZmm>d*gfu|5DJI=(qGKX4;TEfCfPOA^9zn3W@exR&ZKdR*x10e!>zS1MCfjEhFqY zweDjnI%D9)&qIx*ZWV9CWIx^!%$Ss3RwV$!k6-_nu`jI?nw4>nR11m`!FHl`-S!!F z#L8p&?E}W$F1pUl9s41C$~?CAuoa<}h3WdGs|Nnt>*jCY_CJ-YH&>s|)a<>!Vg@|X zNYSPhrKv^-KTQGrR(rp>u5(-ms7x%qJl-AyQ}@-&6;(i`+*tlRsmwGW#>QTlxtKoH zF{%nDrTf~$EWN7KqhN2{8}XUC@EQF1DwXnt&P&o53h)3>L)7zwjV8H zSn7)W^xorh(-s#M`#RW5X<8CcBb)O)W)=2&x@3>)d=&;lA$ymHzQ%@zvdbfcAW(BR zs$^nEPe0&&M3F*a@xfy#HGf0A(V*&IuZR~QQ|UMOl{#6M75LdCO6(JHz4ghL%B!7S zzUA$$-Giwsvya@`(m0@Yhp#*eHATUVY{(Dsz#i9V>*`e>1M&*sW%_4>lCe4x`@_R) zm4D`Be$HuTCnR*wLrpdCEpmieRj zK%Sq}zPdFSlbW_>5A4(U^jZ9bVkX1%cbD6TWeD)42Ct>W#ktJCsqHd5;8m0^$C^|5 z%-j%IpE={f9`Y{06M&aYT%PVk(;R}gT$UQ2&s?g$Cx3hLZ&F|hO0e)<-D$9n1?>xt zSH4VTi2a@W49zuOylH@8Gw4~oP@iARoc|$_=zsJ+^-WK`vfwiow741jfdY_KeC07| zv5lc`QC%L_b^7F}^70I*rfT?i&AXC7Wag&I|&Lm552a zH-S(ixAGZZ`_h&@|6}tIfO}bwqMEBXNI$E75tEa_7h6VgZtZV>2m$*Fi3 zOn_3@AT|MzvvV$|jzhdylI-$ds|<77SE=&!m}kA=SBc~3b!DcbY9tJWfCAqu{z;=& zYVOwmOQ+83Bj2xHUc;_og1KH=RsBL0=2?D`H6c<3yFS%sD(2^G8}NHqGuWVbB|rT> zc8EqJFF*?Q%xgQVHce2}qqZ>`V2?qsv+q2=OSCCB(xuH?_}wqw6=^{>;mVqZpdXBs zAW-h(Kba?gOn47y6SBJX2Y=OLhNE28+3LIR06cJ7#&kX1SuAK4t3FqC_&#)K(ohp9 zuppFpo{tS;N*wc$c8C$+DD6yLZxe*#mCRVrK-1X7iK?k+)RPyi`N}$XRfUjQ(zP{s z7TO??r68r|3x^f2>!6uydcZA|4N=S^*7~g}>_9}Yf(J}D{mCvG=DfFfo0vf`ylLz{ zP|H}$Nd2=xnd+{vN%tT!=q}}l-1;2oC}fl;Vz{NRw&T$=7G*Aq_i~N7U&gd#jTJXb z{dRL2UwiDiwf1qGk)E%K_w^;ZWm&v9=y6d|+%w}Vt_m&FeaEv%U(0s$ z4Fn=6`1nf*sG8IN+Lywi=I5`p65cgbaOlD>Ajs7x)I2I&_Q_0dWBudPLsDU`=jloP zPsw96`8wnk9DI}^`oK7cq<5u4j0+-{yS|Q5|0F-#tWTCTX(Lx&H#Ow!?859*)spm2 z=<3l8fvzh{=sBKD&J}5o14BvxSVLiypP*u60qE@oF$rfGFApWNqgD8;D|IXoncPKe zNridVL0*Y5kS6J~f4Uh=$TaLNn)w@rZFwqfJruNOF_e+p{1^f1%xQ!lU0q++x3Yg` zFL{sEJ+p4~@B{2HKxKKnS8D4r#jwkjC*v+D0CP_;R>kXeH($S^HgCOFPNwSP{ooW$ zCm>M46Z0im&$Nb~vSMt~p0%TWssKPZfG~Dr92>@)o;5ALkuAQ>cORK;eh@UEM;@RF z0{wQ(9~$<`EnyPs1KJRod>^3(jA$dF<{fhr{6mr%Turu2`n0njCj%x=-^}F)+B{^|jY`4EWo$z^!QrAVg`Db*HfmEr}0eMzyRV-tVS?Cm}7I?WP(8 zvQ_Cys(ZH7FG#sK`t1?Vi>zZx;nT!(&Y$|Gn{?CZD!=+MYYbiPmlBU+H4J;-&FVk* zmw2_TN(>5I(A=j5Jb2A2+D`!xi1Ohsh)=3lld|}$*FJuyaecydTc(|(m$e(#h!39p z6Hh`=PR+SjN7dBVgDp{rSk%jcwrleS_@Y?^z#*O9pOfC$O##e@n>oGKgjH#j#4&!P z1P=&AtI;ZAW!$qX$WRRk+O>A#{Z9;7*e~KAQVqbrUCSL&)?miEh=GJq^!{ZF19^Zx z2;^=REttV?TtP1I8$hPtkQZ|)CEQD>;4eoG0HzY@LEBi%Zmsz|8aBx#+PXp=v+FW` zWCJHLG3CapS=*#Drjpd-=ZEo^OIL>sA#JxnwgsdXTjh9@jn1d$Q>}Jut=PPlVp#xy z1H_(xiEzE{pS5jB7ASI7Qe~BZ#)J>G29Nyp1DaFhN9F z_v*?H3-pupjGWC-)Vq6tzz=}aUZt1mCG$gmc$;AKHk3~9u8&?(O<;ISeR9h|S>iwb zhG=rLlcyNZw*ZUv*5BBBPW@3U5FbTlnJ0P-+ zV}o)Yyo(XQZ=Tzu8TVrok2(411#SC>P3ZiZ#l+ZIa24^$*0_ES`K@Dsi^KPBlICgf zBU<)@Vmy!}UH>oBUGeuj&#;w&saNcuWSVh-g#LI^9#BD8i{neoD#^ARtIyVNM2E8K zK@6rf>e)YIt~SF>_a-g(rr#C?TuqmHv&^O*4kC44l1HfsA^*&3KRj&|eNo<%?E*jn zBe>VNXW`)^roX{SlC&H1{&W&8s~UPBthkJ$N3GPO#Lw8);C0GM&WQKXa!0*ae&uOQ zc#E_JE4=lPTnFLHYG4xZ`A2r*ExM^GTezPycIEc-+6Q^LC~20$8uK5t z?55l^v~RvWrBsR})HlhKbBdOJU1N{aWI$!B6f`ESoioqkJP@3jCgW|eoE9otYoGqm z(phG2$4Y_yBJPC{*L65`Fs$#N>>YiP=Tzl2G0a;O^Gx1UqCm=l3AC zYYL(KE>Bx&Wr?vL@O*RJBb=+$(O6Mvj98o~Ne)2Q73u{C|Jmi@tUpT#XQZK{zrP|u z4(cUUxvCrDJzbUpW*X~#%|=ma$5~9Jf8*{n{%&Wm8!#` z7VvN?yxT${{LUZp$dZeOv|Zc!Q_~@fP*S_w#?h{=nrhla%9S=UVC~_#N=jb0d_+Qv zimPEXUxZHbrO1@SSVJ(G5WWiw-Bq1t7R5PbpP zZlj4%m;KS-HTP!g#2)StMIL11gMJhGeBbh)Ux?^l5VrUz@UrGoFVh3qK0B0fSBi-h zSk=Rt*-gHdFKfHgc*jY?{!mL)XU9rNM5mBcF~E2Epd&1wG2(#n4(K;fo!M9hub)AL z7m%Yt$yxur;dg}n(^iV-$h$t*0n)i{TFwld+%u=POP?BZOs9@S-5ngKE>xc0B!U88 zTJ)&sXEr$r(Ha1n>olmdz-bgm4N+cQ#n70L)7)xffn2)=twfLW zjF+uETUe-W)ffyeZt6V{yJ7@W@Th}HQ#ANh3}#4nIabK$;lJ@AlSg5*U15sTwA5!tXevP)XTte)3jzjo{L>! zcRa8IR-dQeULzXz6i~yXg^?j*-EJE zGR<@g_Dz*leYAx~=SZYlD_NLGYT6;wf7-#_T4mz46a?aW3SB#;5`AmaQ|l1NVkW_H z_>O*dSF7S~)a7$dpQpXpAhMLqms==A=;h)LiF&qtUb5pNC_S%5Og zRQGR^`)tbhrXxS)iO0w$K~+14VNH!6b|e1sMQz0g0xcsgcu;3~M~LrJdViNGwIL0E z!H4NjUNeUNB~=cMfms12bnc9S21#(#1*et$TWSqzHq|e3`ljyRO3s#8pa}N!rVy*k1^<_4^C!d}u*vf*(MJv`)x`-N z+vpbMcl18#O=MqMIDLQ|IL_Ojh1)Cb>hZmvB4n&sEi$&8uZ@=a#7^yWIR?11ehPVs z2o1B1uUYY_R!C?b>zSUpS$ooh!0tCLy)$ihM-L>)g84L$`p``KiO-N<*>Lsk?XM3Q z=%4?`cDxhvAN-+w)%DYz)O;3VFb-wB%h0@zhc4Z4qNpfIw9Lep=gj?+f{Gi!B5 zJS)C_V-N_IML+WJ7ypIw;Xy1QbG+3wn^9iD!AUJ%(ultrRzJlCnI>V%#=A#S?~k-T z0ya^QFEa6<)`_5rR`EzqJsU8mzYASi?_mNmN;`ya6uA2{KF0@2#f--1q@7E*n?^@T z1>usYKOiUbR;R(9RuVe9XOX{+G2KD6j8_;;`Ha|!PE)lNkIWzRm%a+vFdi1V`2D-V zGr#4<{O1vd){z#igol#f+6TQ(nv1oDPv*Z7b}iw988PybR3c@Wzew)+xS*kA(gY>s zx4VCgWf=mV6lDI2nW=OyRhdC_S-uf%qkD9^TuIFwLiUz~+j|c_N`fkQ|&*#200rR9%R~$TrelcFk(#3>b^c`4N02&;GX(v> zUs4S>8gc~81&W8`#>}PCX0@p|Oxz#G_MJW6KwqzeDt|HV8?nW)Gv% zqixqc^Q|Gd^gz75*bvXmm>k}_6W$_>S-n)HWDbevR*M5#Go7%CUjI?}M^X_dv)&UT zdphFq%WmECQ>XENB@u6*Ef2MI+%`^HQhwvmGnUr5wt!GLr5d}E(E2A&dObiABXJ+y z7aXQZ5>D=@I{c+f@nAHG)TAqQDv_82SRW9X^?!LxSHq%36w%L~)SiybT#%GJRI-U{ zH$UKncT7Y8aumkMC9M8cLHzoU?C>@gTIfSQvB|Z|cN6h%t1VXZ#lRm#v%gB@{!g8w z*wO?ppD~rjsT2McGd+xt_zW<-*}1_diajbZ_UoP&U=p9ql}hUH76RrFO-xp)ue{ZY zw!!3FMEdSqelhNO_%+6@PHuTUr&8XsiL{}$Zt`s^4R5rBZ}(Y24{?c?i?DvrJExvr7#;#s|((iS;y75?^jfj;kl8xG5A+ zb6ejt_y&h4iWHzSEndH|$U^0UK5S+*Cdu$gTT;(%LHl$M)J@DD7iRu?3)lw>a@;M6 zAKAt+oxmOv9|KKS-3*PCG^Xy3iL_?4hq;yUw1jfelxES(2FZNwVLsLj%*8G%58xjs zQENA!)D(qitJV@M^#*y5H{1_sR*w<7JaBGV+qvkbZtlGouvkFbv|9WQ`^vzOrh<$* zP>IBG_JUL;@H3T00L5eS)S=*LeW)CXyExD;ggXZh$|q%v18t$pD|T635hI&k9a;Dy z6DTd()(IG@oaOlKGtA_06BU_sue?*MG)qwb!OYr0mn;ijMs@X-7tOJ*-@}iXHUJr@O!t6^D8Yq2Bt~`8} za%0p)ecPQPg~NCo653!_RxZfQBmxHBx%>>1Ztsg?A+|A!Hso&z_N+4-Eb}eG%31t% zHzRgDDG#rQC7S9b@yGyu{X&h$-X%v-^^t^D2pMuTP`MP@5!Jl)tXqS`#R8#ihGQ=B z;8WMu^9`J_Se|gAj|CS*u&%Amd+NGU6jWdWe4B&d8?=+e1^>I+BZ=;qifmQdI#|J1%mg|G1iM!#6LW758?OR?ODUD|X6e~x&jBB)o;L{Hq`^dj;4 zRX=U$&b#*4F!CpoP1IwL4CQ$rv~o`c#0f4}>IDCFQkIZ-9^$cYYPvb0?It)mmCJC> zA0`NFT?hqLyNR47J3W|+7}iFFGB58fJ$M}0(VTB%Nq`5Tx{saI{QE=my_6G+;(jCa zM_79l1VSZgjQ1j>ciH^LhfEpzB_n62NWG%Nk{o4QL;2z9{jM0qPXoE;$=`-Oj4ZcN z&Q+N@O^VEDTE(bIMJLIh9!|J#`2>xyf`D%oe0qL zb3IP_-;_j6+LoPqy4R|JOl#cD%G+k-ArwFlBSlH78+#wbTcCTyFi`-d7Nz&ez^j-< zRRJq35hTh4uSCv9&dltaE|@|W3zwECqn`7SmZFmyWFG-zGU0*lHP8KapznmUz-?<- z_?f7{=owB7js=2}79qIBO`>TKeog5P$1*2^l9ZIn5-=47M{tpaQaW8jTik9dN*nX` z+X_zb*qEDt>y6q=N;*MnD7UNV^=rED#T^VB%4-yB)MX2>S+JwzD)D&wm9Pj2*>c|c zVzKDHquEi-e6};SDlQaA`1s)&=II*RV#jZ!OjAtgP&Yk%9ROlAc(9OO-jP? zE_iRUl^|pg^~B@smylKbP?xcuUJY!0ZG>LJf3Q%4Z`0Pf{L9U|V}l^W=iTH{uQS8N zam|u4svScL^OV2@8PD0(mj{BFz^kO zwO$6%U1WqJU!R_?Y}Vw{@K^ixSV(;=JqbCJQtbQQCQ0j}NA~doqfvTza9EzMr1m~h z2Mdk^mR1T5^5BUGZp2WI{=r?Z?Z9$XNi?oy!VQyFZl5cYr}KI%>D(>YQ(|Mb&p2SX z%eVmz2A74^SoR%th6zrPh$ulaq-q(79FtBoT<1SK;wF7JWRs$;M zjb=(B;Y{h~n<}PJHKHha?DF11qd>^Dxf4&jrs-{Zm?JtY4`+|r^kFL{ow!)6B^>o*FPYIAJtA(S04)vHMicrL%O3XRsLHX=S;Q-xv4lxsV)zpd;gfWE(v z76bv!>C=@LlR#-E^uik399!DQ(sC)KH_8>G_mplZm)HZ%S$oHHK}Th_lMpDm7kg)E zIj?r0Dw8XRF*>4hzbqZ-m;z-QsHORqt;44Q^B;Zg(&4GUuryNcGPF?NLSR8!F`X_Y zNbO@~HJOv#QvDlqKjy=y;YVY-bzTP@e|IL~m}K=bR86^BUkGmUbhX2cZc7Eu=zdv1 zxbE&~kWUOl)1z1(-)>D3DDk3-uz?EskaEI;0%fdS-5JN%!@a;IR8oLIZ?`LNZINyw zIIkM2S+@D$jo* zC)C04=eS+r=(A>!FFueQ-BHx0^iLXut0%nUG3h1@cBwJv-=L4D=l>YuuhzD<1+M1# z^qZykzh*})Wel6xMY-7Gwe%6+*r;JFh9qaIpi=%%bOCajI(e40m zbnih;?F63)VA<5M8sY})T;W7G73e}`AxvQQswN7yYjYB0a!loL+hZ#1v5MH5nO96{ zz<)bO-U{TRJ4Le&h^lTF-+B&?HhlTY!2~`3)H*uDw{9LZl}Dc(xK)8JYTqGf*XFEE zjSwgfjw9nX;H?zqD>BuHGP-#5loY`(`8r*j;nTvEc;nLL_7zv1_jnj!b^ldRg!ugJ zK^L{rH`!2MJboK-L#}I*&2S0_e}Ms7o0!tJwt()4TpYUX5n&&%`E1~rF|A!r-k{4V z_-%5BfOEY=E=SlSs!$J7ge^(+3F3h*TO2Hj0PlA+O2J}q-Pr=oYZ~Lhw1n>1Ko8ak zZ7fM`@+!qe$CnB1+GX|(Lcy@zF`?wxYuu=$#i`O*T{0>Mh+j=*`{xAZOG~^c9&+yR zuf_X{cR$NVB|Rs6Gp1cut1yMv8W;}J!{8^ojdkmcMev5T&{Vl-Fmr;sFX|T@kV4(S5;~B>6(-wY~$BlQs zb_-H6q_mSL)R2s4KPr@|d?V^&io(o}%E5ngi-z*#FM1)G5jJrNKRQL)-+bLiA&8hi6bIpeYroKCgkr z5S-IWdznIa{D`-z+_a3{)#!x@IOt;1Z~)9E3#OmGIi0%HzFzPwev>sZkti~e;oNAP z{ed-%)VPJ{*Q+7LLH!WKLwM`|G^kls-rX&A-mUlwaT##%S?TfF2o;GmCwFyp)yAY% zz(av%6$;UVV8ottKz^#5z^FN(6m|d*H!FEXoV0`}3sAaH=4zE6&oJ$oM79lGshorDH1;Ebt8TR=CGBO^ezgTohlXDX-;P~M3hn>SAQHbOP=Iv_o}!T~ zz52rD%sPEfjjGjBKIq7eIE0BRgAKRZ_8CQttmP=7#s=i^(MBsB6PI1d6bSlhU*lz`LBbIdiMO=@6BG9fm} zaE)E6dSOQ2G^A#q(rYWIs*n^)se=1W}n%H$H!mW z5f_RJLxgHSLWOdnG;DIwEWPRGP5oUWl_io7_09#-iBet2$`O6hdXmY;`ua`sy1v-P zW*QF3p9tVxsWvXdU=AK@#8&^X%QI!XS(HLl5}MYsOy9zZ&D5CsQ@z@wA6BO2;@-pw z4+Y9uK-8~Rag*`1{9;s%y|phtTiuGB{TjGs;qvIO-FPFJ>2vEHT=(wsnC^t6Ec@l` zOk=k8-0|t5tND647oN#Tst+aBU} zT`TW{T{})t8So0m^Kxbqo14R7x{X`=X=zZG^f$o{#f3vMRvSvw7=dOHVlbY6jUbIB zl!OQuPT}=52vtQ&sg|U9g8Fw&@95Lbg!t|SzdNqB!K3O?7?pw^u_m0G{-!eg5&l=Lr z6ZB97U>B_V!GUyhO52STTH%dacmI!%h?g6MZgbN$wH)UC4dTRWjzu}I@7}I}c{L0> z_2-aP1Qu0-wf{@Ea<~%HkJT#(jc?6cRr=gbZ#ft&JZ5<$_QErXLdu^KI}F+ROGcu< ze<;2_PA{o#{Ky``q*Oa;P-d@zjVD>Y-N+^sYemcRfD97m)u7?1IoR7+t#n0O{U!2F zk?teJUA~A|-Eo_r8Y-?Iq} zE`@O;#Ub7A$)A$7v4s%o6khvpj5*cScaBc^HNInYI*gru&>7fz%1XC&=j+FX7p(XE z>!&sC?{gTL*088VutO@EPPZnz2iw z$UEd+usUMM@D>&0D{#enE{usVDU&xi81*i7snm`o;mDb?Ob943?$EQA2qA&{lK6z2B7ZY$fgq&6#OAbN3(b*D< z!Jwfb!g2Mdf(f0a0ZLyDl1~=TMJ0teC(6-v64Ot{=EF}gvA7ZF$XlYEmBdvWKvcMV zCAclK5Kc-}xOO-1d&=QUvItw~aM}A!InFDZu1Y_a__bHn-?hfra$*{ImtB`1rZBNq zfd}N@+icsbR!Yay%v`LxT-Wm(AJn%irH&tmfsf8{L=1KFGFb2TfG+f4&Bz3urzSGE zdho^YwZYfB7vJC{4V~2~+`R>-6<)L3I zTZqqAF@Hx{;-(~3!brRF1**WML3y@Kh$@cIIA zkd@?Eut?Tq2uynbrCXx(t>y`xI|-8Ju6apXfiRw)M*U}G*x~g~&q!D8yB|8BUJ-ie zXKX%e#&%@Ag%tW{4ye!r8?O=;GMQ8Z(d7&EXa3~ZZL$0W~{UO)KK z$a}gzX3Jam^KzqecfFUl<+$l`#P;~xeSC>ooh)-W2e5J8)BdeUDxUPcXpEAQ$+y2} z#z=9A_Ev>Egonbx1g1?Y zo}(d!*hZx<#wx!-d{<}cYODZGX!-@ZT$d(^;f-rkU#uQ%)d(bWbkuwarnKRFWkdop zsIpE9XMK72-ZPBVv~CjoP2cnsws!dD^m1}*=zr=rUEsf2^s*S*Qrz5=&$hiVNogE( zSdB_i@&`{Kq;6>g4vw<9cKztZtEq{D?gQ3p%g3brGQje>U8Cp?je(;;d$K#sqQ91c zLmpj9h5Z@s&L)Y_fc+s)HIJ#Rgv4Sq!-9X%5_hmXVBSPmoNI;egCW}r4;&}AgkK~q zni^lxyw)o>^1hpAmFz8F^JVlMhWXc_*>#^7R?^JE=E+}AUda@1JD1GYGLvC0+t zQo6@&JFd(yIXh|(T@8qg?Spu$Q;41}v;z_-5DYP;)uW=!ykkC1^GBUAxJv5?SbH*5Kn60M$-VX4fFq}0x_s(+< zIqT_(yK3_i?WcCHrAn!7I5=M7QPz>UvDu|&c$g-Po(P^)ARabX+6MVQPRa7wozBwq zC9*vEbY0rk@)_FltQW{+U=PwsHtffNv#eb9#`W2ZRm`Nx_m;Ccb*`2!^TCb#jg)OZ zi&HK3Y{KE8F(tDj`==+W`R_Z`MO+Bw?6Oi(CO!Zn<* zmq-hm*jW8oqY1)c&i)DF1!R|}SOlrT5Dm+O^Jk%&hp;%M*nHtgZ#^Tz25uBLdqGAj z30ZkPNKa@9Df`>sq*>$o`RBX2T9^A!fQGcL5>88H-1Sx1Xmi;7~SNTT+Z3qi`2cnG#KTuf0wnHR?TA| zq@@@jq{)@nl>6n4^9-SE*{Fo6e++MM!AN@;@bLnPc)r;pSKTjnxz7PH1U`4I*&}$d z$+YuQsOW2|MRsTvJRTZzt$!Xw2J6fc(#%EEJ`e44@ z6r{QlCR-6VyY@D$uD`|aW=yB@r_2P}e~}=YsFeH%8e@|D=u44PeBa~T9bb&K$_=aZ zQP7p+6<8efD(-6LM8mj}RSejy*ga!Tw%lPZ$*#Q68<;TBG83;eYnMOX>y+U!`{nAv zl7nXzU(l{%I(<-hlT$jzrpY75UE z4$szTe?itn)#P}~IQ%=9PWma^il}CbZeas~vwWlT6p{GYSPl45*!_K5;yAMDn7qrs zb*euRgBHb~P>%?6qqQ1iin1hg zKJFG=cx|6KPrG_x0+Y&-Ya4nQH>9A4Y7>oCA5iSCj4ydExs~|YjuLc2<>&o#YHmQfujBD|U`tQHklD>N9+wg(FWF)x#2?@ye(s1p-4dWug;i4!=cu zF6^mKZd2Xz@3xGHt*c=(x2SxSrezNS*>Ak!HzkmxP;ZyVFJueJijTji2+s=)R#cKH z;8fO}a5(c~I`V7vu}Qs4hdfFX*!KHX=z&Nv!dPt^ zhsbl(Jr1t@qcnPXiJ77FLVO$NGeitd@4~xDC44)zzfe-Lmp|YpYpDGZL0N81`bwd~ zbmAuj!>)8QNoR>yQfi}yHiB{HET0cigBT9FX(KF97 z)va&_P0KcW4}bnv&n*>BGLK2|ex*0U`E1+h51t*0dK{5b_hMU#N#|OgV?u2S26sp4 z)Ng@}Qt0M9Fsu9w4fJ{}5H~yuDHLRXIgF?7O;qS$jQps*Oyz@KeZ{81*7DE$3A$V_ zDI;CGa&=KHyVC>*Y}#2p4>OC8?>@$LkV#|OUhRE53sG}GLS|zQh)nO&tk~~sjAV-W zO-W=~^t`+mFX!nr$L0ilC#cti9zgAky^;-IUalGT2oTUWp$Q0t#$}vbxD{va+}P)Y z^NJ_nqMS=BY-9G$#|4t!6B>8H$uG1hd^V47s&`}0Q{#2k#g#P$*rO(a+CpBXF*Enx zCq+~y>+?RwXR3lG2Un8KYpX$YqW1e45J=Mudg(GEZhj@E_?k8IBqsr`(-juj%P%3# zESmhRWj03(8ILO@QEvmfb(G?*@b#t?o|p`LC80CYoo6!Gb^I1WzkO%g%{kG0vzOZl z#F~tP;aPSezt}eqKI0=PU~d*AMn31m3s(H`?4AQj+eaHhrbIPn2J*KJ(?&!GPetPR zzerM%;~w?NA?7%_l+sR&KVBO$6Zg7KQoi@|Bk|-{!-!q70zI`lTAqsY+Ha0^316kC zTdl|ea^gKjeh4VYz~g@7()NBmZRUE?){l8KXtu=%;?&ee@iqBwQIA5DkB4)>{wR9S zvL~J2f(NPj&a5h5M1qT#Vl>$EEUDi+bkGHvjO0<~eS+V2ll23hZYybRb(plIL$Z-~ z%N?)f4|-NrS-QPkTA}rY5Gk!Y(9ByUO}rdN;XokV6zlU+5&{k>d~f`fTTfCOLL5ys z5M{zVp73G2AN3fG_(1pdq_AC2s0)?yVw)R;WYB8j6^J+IlH}3VE`nLJ=*oNd#R@ca zO9OAq%cT+MCpS(_$-#~owP_O}J>w_0fKyQ>TRNZp$C#xhyqG6`Grr-kl8M7@Ll z#{CkuG9fjAu+K=Cmz&?pJ6}QTV}kRN^ZLDY#uxIs5j-xmy@^%?})3adgD^_~E45gTQtGo`**n(!z&W~cJ zB6D<8k#`2Po5bh7yJK}J^5Fq>;=iu3KlH$eq6sWFySS;r_cz(r%(>j8A!pVNl&g41 zI=PBDV%^m)MO30Fvp^8;qQlG8L{qGlTu4kwdFpk>4~MP_KdHAwm4pA1*+96qhl9kMiCYYqu{46 zUign>(f{?x9Ho@u;=)ELkK0xw(n}vgOP>8wVXS*YH#l!SZruYh8)kk}Cmrc@ z)F|^$ls=Actds6LWF_2giSbJLmv^)4j^QQ0GgP)&YNKkJRNE>-kFUC0Ixi5>XbK2u z3Qg)X@MdFoj6p-Wz5x}Ky0=%e~tiX9_RsH!x?VmC%Gd6rlD$9V4oomulpXVJ2nQw(I`;A-HxYV1 z3Js+lxSuH3N3BgdsvT^e$hy3gm{pS>2+;!YXNp$?oOwyE(of?!@A~C5 zU>}y*eb?{q)8DGA4sZ^zlYT=`U1(l{#IuKnw1Yi3;C-BdYE5Dj)=1x(Hh>a77^P zloe28LD1!2*kIB3FH}>wShuaG8_7{V-kO{8=*Iq{#?lN%Mw{nUkTP4CJo7j7w(d~a zw+JTAXAm;%fmT7kywaw6SAyV&9F>E)q4iiteP0BYaf?c|2ISyhzHr5}N4wTYmQIEy z)xvMHowh5}GY0tGOiv1CB=A)7BY_;GyoqWi1=}(^Q*d&6m#<4^ zbJ3v<`Xtm^tXCgodA2iu0csnC|4NgGENP7q@a{$4QTx8UnWO6---52sxG7tle8jdb z)+>qKtQghF{fdb-nF1Uidcj@7id8@m6lyZ54_zxeE8xXu>9H-5f_?nKEg@;g7x_+^ z4;Xk*mfQ;~lpVx~19RS~BCPkYpEVxkyV|VC*AXD!DI~w1R_wLt(H7lyFr?m|^ckqO z5Wo-0CnGZUrJ|s_PentsNE~F39h3iPMee zcYM9O0*|F@bXagxqF{!)6 zH!|XAbGS(bv8BLTy8~y+YsB065JVjN4_uqmXnuwF0vQonL{w$3E7H5z9lPXL?#fos z4iz%sErc2ZvB}!KFJe+*A6;n~C5y&TOs^3)z_{}&TI+CGI*2SYhT+})B)G|1TkV$S zP8E-gK6)Jy)1^o>*iHUOY_k48EL~+()ZN#mkw#)@7*b*g>F$sc0f8AhhE9?06zK-( z5)l|`=ne&j7KEWw0qGKue&_kG_ZwekvDWY2dt#q`_8!Z)bn2b!VyL#}w^vfvSHj~2 z&_Mheuom;Uug+2NNz~0#bXEX3W{UpK&>ZwUE9uaNW)E$#p7aUrsg_ifpkk+LJRVqW z3d6R_NEY5A&*#edBhG-v&6q{tAK&%|CX0&?4O<<_uK&wdt0J20k#zXy+2YIpl|k3fnaX}` z8D(Xo^7>pc?Y_={Z$E#{(ek=qv8_2u+`A=LA;ONJo$)A-jEOQs2rl=J@~eg)`(OYo zD80_poJ*4mV`3Yly{FOUCjO`D@1)6GagKxL?Du>@Z!|nJ5p@~ZR$S$lvGt{3r02Wn zuJp>aOE8Pk`{=L=qa;4Yv~B9#?KV%ZRIC1(RCYuy3&Pr9K^}Bxami!UCFtU@j`)t? z(`9C0=x3<+NxnK-m2prtUyncGYtRE3BBX%TvN(z5lL1lqeQ;YhwH6;t4?q$Kj4~KT zhd$@^C|I0mFwc!d%d)Kv6ET1LfE0WK+QKU755ZcD`g7`hC-yCra=_EIr7u1v=6u(7 z=!4pwZ_@bzC{ARq-lstfk;b)+QllNL`*Opr*!%_tGPyY8xJ!$j_zYY8fhy+kpzJ6G zz0nqUQxWeM(8@vfaH4z%S`X}ER>2na?>7Q*?%y~4$WVF2{{jl=y1z{>Iv#(7aSJH` zXd+`mva4@SOJx@SSDUVT-OLOpu=Vs*{#R?MI>#M3zS+YrkUr~aT(uyo>bVl<1SER5 zy06~%Ee(g9xDJcvv7}(Z*Ue?~(@2vX`qL!zg_rvB9g2IfO2Ns*)lr&ylvLiEeuF>M z^sHGsRMfl@@lVJY)y*T0Xie;`H3GdNRNHAA9bHQ|f_f=w*M@AlC5&O+Rxh>obA|20B|mEh8E zxEgW$GpsKyk0M@TKu(5Gic*>)A}$_^4v;syJM&+bSXx;%r2vXwizm}lYobL=jyk}a zDG%DmStc3uizN?2&){CrZaO&2@Ww*ysJ$rI3sPD z^V^M^(|&c1XMsm+(k!A&(tw$7M~N9 zf+1=0fqa~;p3gPBedM_U*Yo~i(OPS*EE-4-+`;Wf8q>1v7@&-YS8K7`ms&DH8yL5} zaS&7cEnD{bLxaZuHxTnbNl(@JpgKwp!JA5aE4kC~jTgd%?$<_<15Zj3hbYTtl0PQ( z`r%cb$|#FK_k07X1xynoj=>M|fnroY;>)#Ivl1=U8)&)53=*3bqU8-t)qH9`CZGF8 z-OB4)nOP5XepkJXuq|2mSS!RqA}r+u!EYDd2%GWZi#_FzG5{LTQMy3FGOe37=L-h_N@-tR;#VB{Kju}&apQ57=N3|z{VUA}Z9#-qYzoL&0 ziUNFsR5e`01l$55p0b+twGM~Ofd^TlR8_hAaeeUOg>^|pzznwcse{#UmW1Bq zrr&wjuj+<~#;i;pgWb2KZW`^0nNl{N?J-g5%Dg9|(N%>hVq3fg1nKIYu1krbz1*uJ zQ!4+W9liB-x#9Wtf_Y3z03aRN)UZj5Y3rqQ$N**FvIat&&RhRgY2F+WJRc&ntJ+Q1st%bj$9$TUzvdIx;p20-(qxI7DU+emkujLbC z!nBj~{O{8eOvaSNwVtEPyVc4KdmYIu%|~Z=505D~oLU#r=bTMmu`~5FUPV_bDKv?bQ|+0wSw`TD=W=1-Sk1j2 z>-~>_b%l2;#Jp&Jyt-OEHr)4IHo7l_DVBF8% zdq$f{D-|q1b^mga?nUB?Ft7b?0$!&@zA(Gc;O52r=dekBqVYCeGoZ0+`|m?Nqj-R! z&RC8}z0T{Y@8NjQWxn0(D|WDBd&ORy%nGqs`X4_#!6C2%XC)HM>LWXS(Pyx`tp~`J zFn4|@+0}-DG~>KYHkkS|Ty^yTGA!tDzul*A*S@Ffp3@x$7!c)C)CF+6Yq!He;TDd* zy!EK|Z8dXeDwt;FN3~iN>iFZ3^B=7uqT6rNDP|m83F-AVX|DoDw z>4!Ltf%ir;GixBz3%}`Tk#4XEr@+7FevG=b@p*d=Voa3%*}DzGO#>EGFGBEA5tt&< zNor~PC?d4_oMwxhW`+jX8E~d75*=+G%=H3UAbhGGclK0TvLZN-MmCts1wNbuW?9F{ zN1LwwB79b7H(-Df=|q`%yeJSm9bq;|o>*547}U6pw1L}fZfqrwBaRX&fdt)8Ls~)3 z-a;E+?6#G|Tr{-AX2TyC5o>K-ixYL17!aLbHA~hc2)$NG1Pk!M2b#)*hCs5|y-`9T zRCd^=^C*nK$0g|PKa+#(a&g6C<1pCJjACxs##~*o)vvhEq;eE~MC$RFgL+#=apHfD z5Z2LDQi8n1^myzzUa!wjR%D9xHNtc}!$=J2Bdp7(xu!i#D4FZA2-_O|1e}!;MAy0G zrAqmNd*5}F-AYF2MRaiBZY|T`AI`9j%kj?ES!gZX-PCPR?tAB&+0mrfc2j9X;IMH= zA~ipdh%EDWIrlemI*3o&Z3%1GyE+Q_PJw}=(EXRr+@=}!6{S4??R29L^#u2Y*| z1TOyfs{1LL?mo%FHk;c13E61{daQ2^)ye((BFAS>=t2lSxfek*!W?L2l=ZS)Mu%il zm)#P90((0E!VmZD|1wz+v?Aus85;(4A|DN+EdSWZY?Wc+61@^i1ZzBtPrMxvlmqe` zQV_iRs<0U$4Fp}Te0S;N(Z`zkfxcR%D5Vy2lR>G)j%u-OUr|)oX96`nw}R0Ia&a2=8_aCyFPNJ_p?_8ItKpYgGrir`F|c=h0BuCl?bOi2n_j$?7R zF&BlHv|J3?>;K34-JyrgEu{U;%&^TU-zV8u?HJCukvdfl-#dn9oCJ9lkV07DLft>= z`f8Ru|MJM!q5%n3@7u0g*G$}U%vy(t{AZts5J1KF3w+_8yocbh!`O3?1VBAzHa2u( z2>V878~7GY>Z%W(9bSKK&2_^348MY#^-ksHJlB4BYW!HH)?U%a)Xz>?e(FsxBXiGQ zzga(=1EK2suzYt>*sz2DdEO`&6lgvD7l!DofBl3vc;oZxFD^TIMsQkW2UHa&=^#g( zwR0+N<@rgEQA6rx$XPQ z-Q_1xsLv7pTGX#K5!-Vt`j$6EL7s-dv6nm~W+D^K>&E^AKF}lUx)$z-fDcO>1Y^OT zpzxu^H2nK#fgT6=};~30+Z#z=A<^%dw zj|OoOo|W%@7QhjcZk=w88C(C1`Vz`!^v_s0sx)n zg^{M8{3H+cUomRl4eme#i-1NiK~BJug<$Ger;tptK}CzAAYS$%A~-9K@-L~vHL*@X zx!o@Q$}Lg<@Ht zIB$TvNIRruNQQj#uX#9#9J?4?<@ZS71y!@R?-!Id?4hL~$g(XVtMGqmTrBY{>$8iG zC#b5k58m6;3@NK;6XEQu(%`=&dXtkK*MKPQHQWi+hyVH6d{JAI*XuG{RvB(q8iKjV zMYF0>9c5HY*4tzWHgt%2dUk)%tDq2icdh)CRH-R(*)|7qRl z4KGtG=$zmE`*C@^ZHF>mF6g%Y5A>Mxi8s3ai?aNRTtKs5-l|yEN$_mB3#~K+xK%2T zz?IBnO1AFBSCtBE4 z2*w#rdes{CYcIElaZ{2K>|S15~%#+t~|Pr9|(i&upj8!{Z7UeRm1gq_s{zSF<%~Qib3LRN2SEK zpIgY+jI5DA9ez3eO)~f}=Vc;Bm8Rd&u4{l6Dca&36OsfJ(%c9c|3V429j*rE3$CVC!S*$86CdNIIlSzN`xjXyq6x2r~sfwWC#`{Oho+uIKt#Pow5@sU8T7K%KXt zN?fL8Y;$FHc7Y5U@Sqmc_4-M#2KI306TTpyBj0-WugRfI)bqCh3#gDO6N>U_@5+8* z+Tr!G5ckRbOsaUU1Hfrq9Ck7^b2+6QN=p-~%NoOKkRanEJ{bgl8lJj&@DBscy3}r5 z%NyDd&t{+<+@zbNZz*md0Ck@RLFj|2jlKN`3J}!WXQVAzc=!z7zun7?;(Yr0rbu=# z^%4CVAWku&VU zp&;l_#U2!VD_=JK0|hI3cR6rzA*X9DO3zrS6EmNiykzBPpXL8zQZf6c_q|HpCY!qM z24bxtYqAc|YH)D+{Udmtm@C{2^bW%{tg*9jD*7EkT=Z6_H`;87K^H=c!GjW!X3Op= z$^fZNkvC*P1YB+|u@2uxH+&;g#1!0Oksu}lj*X4E!QnQmPxMreeJ^?W*TXEpv3R~K zfpo2PE#zfO)20nZ>fJJ={d`wW=`&i-^<76ZCia)<+&wDfoTn;WT@Bu5Z1^N3->KMK zCxwMcQ+nF|J#O&WTygJhpZBeLxV!E@$QNL)5a|TS9~z%t=&bigZhrR0?;S$?`IlF^ zjAIHQJ<^d22@FihWaW_p@Sr$qyrhGArQrR(EXrcAgVCik&`7)v3(`@aVhYw*1iJ_u zXLWdW2}_7Rd$88LC_;XQ=+pnq%mF+nKmN%h@wNt!Quqz zBzeyn_(>v4$E#^Q=a6l$4JCAtE7BJ64&h)!)H0@GKR=fHoI#z^`q%IEeM_UwxvKF7 z&otw(`%>3TV_Hj47?l(!dlto*xXZVFYzK@K(v3)Bcx<@Yyf#f42pt4|{@Hdd-1pG{ zDAlYZxIj_4=q?KS&OAaXSmI-|<^cqW984DmeKIwXdgm1LO_!x zORE10xlqQG;1fhi%LV>)9UAm>0Je*Q1evNY^AH#a()5S(+luQ)7XqsBaDp*oJ|IZ1 z-XbW3iOk4h8r%H45R?D4Wi?T((o#pk9B4D@Iv&}%JZcJ=)QA#8gPgG=FZQw{LT>|e>E{9P5*d1O%@#6 zrTP3LcJm-X3`%!1+*YAUPWboFY=a`>hQrpx>J@VG(vDhV0mF8T1}UyA9!|g>*!OE# zk_&5~JGzq$161PY*aSTP!y8PL(+7OU8{fb}L~N=H(-V~v(yXn9^)_m3=!^p7MK{2X z%tv6qI8UhUa1{cNP|Vu{zzHbpO34TgdG$nszZ=@-cD9nb=wU^^N`&5Vl}J1&`TkWF zhu?E^m6VJjF9@k&u2h>&1TIw0OoYzT>4w{pG9mBx{BsJr?ThUFk>p>Wb7aCmUqIyw z)~YkbpAMpc*viO6^}~SlOXDbyg;jF6GyZb5+*@h+%;R7M|3b zD;FKYS3~|o%F3{Pjoh(l(S*nSw^i&rpR%27yZ_D*n);iDcEtMDob=w&q8pylo8rTS z?4^04x_!5`sbhBOg-=rrJ3$*pl69XBqnDuf<)@kiav}ot+kDk@$GHaB-#!q2&qMzp z{AST-W1{=DcjCh)is{nbiXtnjH~3<~HFsaD%8R}f{j;>k@E3JYz$y*nWTaNSGWef3 z-|)^Kk1n1ixp_dZ-*ycsqbsKj;)l;Ax#Tc0?a|R~3i)ffzaNL~7lEf$_|wImml~>f z2yv?-ESN2w4UGksEVqd@X&=BYb{fFRFgL5zE3H!#8GC_=w+$d8I850^=Iu)^=2A@X zm8Cx;F>@i+rPH=*fYV#gps2vK0rJSLu$C|UJSnSPf+QE+dcW@1mSxo#zK@&s%jJpY zV-~WQp*=J@htok1(BS{b-j0M|TSDx4k+i;R)S;t#TPWJZ&k|mxpXAo}!PXB_FN$jnJX$|nT7c_O(IHK#qyJ;U?JIuz zohx-+K0{R)8TQH;Pcsy!P3-{yq@0dGg$b5VdI4-$1B2o4D(r&@&k zYwm;GhYm?$fg808Y57OV5~DxX=Y9Y_w_?|W{T;o~`7VK>M>fzS*{i1C$%gbsy#l@P zY!}0?cU#cXFBUTQh_j~5eMt6dbn$+SPrkx9FWm+h&-8p+y&HzJ z2QZE#(3}o_^~bRIJcC_z4gZbbmFMx&2raWqmy6+vq8zyRVt}XgTACu{Ovf)eHQF?DAbI2|FM|^8sm6^P_Z$=5XtY7e4*J~a2BKaxAG$lJShgNoGUYp!NL2g{iIJ&PwOQ|61z6at1_3eF6|rr53e(@n23@+eEXNx_VRu}EJ9EvAxc zvl-!8&}A9kDMOH%ZZwV*$~q)r9LXE?q_G6zrUdGw-pd4h4_0X5&>8O}Y zq>r{Ge$}~};5?1kblmQ(U4GkdN=)`xt|FvYY2f&7yjNP?PVA6@hVao&5@Zd}+=Q7W zlc1Ah6dJqDpoHizi}`wYc&|5Lx-jQ-kracE;RNtn`s(kdqnt<|)SpWRU6lwo)EB zzhJ&MrHW0Zs`JS3>mTSs=0{j2=?Q__ceK-!qENpLwKl777Y_MtUwdzMcPSlt!^SET zI4+-?c@V4^o!@+Y4xw+9rn}e~_fRl2hIs&@L{hw80RKgT_OP;=<|>?pVAvD1gO&Yb zJKi@YHU$Y0O5D0I$A*jqEFj3%2ZK#@@OzbH>+6L0uQ?QEffs2N3DytR*7N#q@(Oo$ zx{6?flPkQw(rB{2_@#yMj+R6cQW4DoToM0<%-TDVzmkE;6LU(H3`JmdKs>ucf5cJg?bmJ$?qa)_0Y9p+bh6 zHwVf*DDS!r$>`OR;*NzcG4~hSC@Mc}^8t{*R}W+STX z>Z$?+R4ACvDSy<5Jmi*Ygo<*vN%}YtAWFxwj&^80l}5#?pF#`bv-u?)hA68H4nv<4 z8VI9HdDX1?Hce=DzI5?0IW7sEx)PHUKSqZ*Uz{^-Z^y3aL1ql+eG<_YMJLh*>oP?A zZiXq^fX;C+sq?VZg)zleI7;@KQ=hCQ5^-e zWUPMoxlhFHG$eu+Vt|%qS-0*kcz*MJl7NetuQmM(E7$K-Xh>qw+*U{N`GajEnb$B4 z#PoVm7Dn`A@^xE3d$_q**d$sO#3l}syD*AK^I|HC7mRLz8OuA^z4-NPqY-qlU1-6|xxF;6! z^;poS4olEXw7);;(r8FDr37ApcARZax_OJcL)6|Eb`|y)%1y3|8?z>Xrq1D#-5>=N zS*O6fkdfc9p^CU>hRh~nA@{$V{(d;OO#T^9mWTvW9!bP0;MW}ByPn_luj3QG-mm@q zP}kIzhQj{F1-#FL@aB-p7Ht;o`0|2--|^(dV1g;KvHenwxJuz!ejRA*t2%or z-Acq9(7@Y@@p3ZBN)Nie_R_R>r_)?aS3h7j0LiP!@lGzQ^)+o#V1M@ zl76I_R1yxB7ocpnh6OR?0_~3rtPFGBskG-hsH0CJoCC_x>{SB$JlA zo9$u#p@hSt+&?yp0BwCfio-@Mh?w8Ol&U|?pq^+a0k0@?hxs*eV!=iYD>oI?OdlqX zOv9%DXtvjwWyDzbO1HKLUx4YcXZIyAOTa>dan`)KeL@=>)dRNT)+!CIbTNyjkj(nI z#&Rq;nPIlhNCs!%X5S|==>kofF{hZL=^7v7#Bh}F-eh=ZEsAyvT9x2`KxSI=c*ciD3N`1i#6oE_(uo15NE?XyXRq`d+pTPltwS$ zl!`{<%=Z;eh!8cn9#a<%=-Spt(O@fDDJk7BGIdt5N`pdfs0@~CggSwp-Sm8MW-z3qLE1BhBMEFf`ulL!&+7YR51I;u03SY;Y zlT~Nf_81uHVQLpEmv^Y*Pu3O^^xmSZ?b+n!N4Fz+Fi#`kO_mwZS7Dl8ZtY<;5vSkR z@AeHP!vkWD$4K@nrlIRSlR>zPt;D_ub*Qa` z$DJYz3WETbOa56kkq#ayDN{Gw0cn}b5{wx~aPjHKPb zN=O0&>UUfo=AzTl*)x@L1vYceSEdpi(_NVhcM(Fix$}1?1))IP#V$viG$NZ9({jXKMl*k&99{n)aI~)cElVqA7<#`bkQUkc6g{eK?LPmj)B}1C>`9gs~Kp< zR$Xn4t|^+>m^K2wN+(+Q5ZZaR-41~War9DuT01jM(0%*4=}$A(F=37a$KT|Z@a~M~ zEAHZkS;p5*XnG!wO!P(`j_|5ro2DONF22VN?KC}IzQeXm4~J3SbCjG z(wX%OV~*$wI;7q^_P?5T2yR$7Tf_7|3-l**kyBVe67t1VAkblz?(;* z=WN5H#+K|U+omY3IIKtzu#-2i^fy?85t8?z4|#OWeS34)+1p8D^$c;Y@D%wtCGFIF z{hHNDEdRgQ0i7_%LU*5CHFkyucIgRdQ&t81)07zcG9!zm*Xpx!~B-2IT~v%bDbJ;9At4a-})l< zwm{PMe4c9H+=4`q^$UKGoZl&XBJ)4@Ip1~EKGKC^fn<4CzzdypWJqB_N15;yz^HGA zo#3Mp4~bKwC+=CDdGle98zMf=hVwl+U7gM&_}x2Q3Y`k+b)F1hr<6TSoQsCyclZrC z`)IBj(gn`l08;@Vj5gxn+H~JB;E@5%k1D`wPfjFxi>)V&Y2f%JYJJq0CuZsk;mNB= zD&)c!N2~00uytdnaxIH7o#Me8SgDoK<#<9oQQc5mcs##ODu6(cR>7EN6944{ArQwk z^%!%}K1K}P#6S_u;}1<|Dbh;tvp$Q;y2Y+-vJj{Urzgm8PQTQ;r$zDQr~fObY9)j}vwXx8W4b+l(p3qyu!Iirg8T+spcEWnb)Inq?{oIN@8asp z5TV7{+mxT0!_ru!N_42?vy$$Ll8&elw1c@U&i>esJs6o@5UYbtd$kJe`PU@1!Pfn3 z%&-^kW2A;A>2_vMebwnPqR(n$IRpLA*!XB0Y1^HKLw=9^KA%e3-rA-Vx)s)XMO3A} z8MGkf|CQ5_5i=ZS+#`+oTq~*Bj^9`LC~B=h1bI+~=^ykm%r+CqlafjAYz%7|Twk#% z`BYEUUbPTP;e1{0{3y`UavI5)DonhDCBvl zKL+=lgj{ZyITcQhEwX(6)&9qsF!r@(Q%Zff z-(Tj6O~q?q{-t&)mIwO{b~X5d=m7FKgG?y+eHx|2(Q;%fGL4uys^8`SUOtP5s&gRq@HBU&8kKhT@V$@ZD`iv@XkL*jqV zAQR9niu_u_`J<|rJ}fdEW58RJbkt)bJ{3{Vh?xH#%^ZT;iFycitqAjx+cv7T4q%6u zS&sK{{KB;dPNeZKb5>4Pn+*SP+=t|G9weqwBFvZdz1(;%9D}`EzMFZB;=%``O-jH) z*l%_FTec!x5e)+AJFhBJFdwwAfrrm&po=-OUr_=)U;KhCY8Ro2))Q|nD@{0t^%TJk zAPUYi@26R-%Kqjbvg^4rNbSVS)9MOP(njk&<+|G^saEH)*^W6noOwyP(3Q;cbb{R^ z30a$e?=dCan5JXaQ-z(6F^&#)3OiAF!aM23)n(x57p%GQk6(R5ZU{+{Ql$NQ1YKt) zfo5@(h{vG6(SVVc`F*bw^}P+*{pb+ff$ zrWtj?KojP${Bw!ncsz@^|N8DTm0XW&rM@Eb z%uc5nRRGVRsdhBFcW2dOvLW8K(CW@i2jwGF4|Lz9{$Kxb-Tw33I{|^xi&-mfzcq;E}kmAVJQ(s0ZD z{=!!=u~e0AYZ?6g+f9hOyXyY7|CMIpnf&W{v{3j>umgr&*X#3fz-U8=nqG$R{pT-i zmb`yvD;fSOnRR(wMUGK1>E3lM;{pk-ZB5g!nFelet4%N}96s?wtL^I1GnuN`<`Y&4jw2%hVE-SEjG zuL9>b>~aMZY4jAoYW!h1=Am0%53Lo|LWhj&7SAaCi}B#4E*gQ>W&ELarA6r%u(N96 zSy$V6McSs9I*Y!7b^dAx$-GNuspec<$7L}cc`94fTr|mZ?}9g(G)B4clA->h&!U`M zd#vBMirM|mlhTY9;>m?V@9w^6VN(#9J97|bvzWBmmTM~sNC3jpWil9AQ`hAI|MV9* zmuwn`t$F1ygM`?sydjnqtWE zCWqGCHo1&1mMtC}um(z0Gp2YeL1p4x&T0-qoxUt}=7kD|xmFZ_5`krpsebYwlK0EQOD)Do_=UN zV?XLCPS3<8c*KofPH#5h%ZzWfozi?ljAW}_)$!2wdQe&Rrk0p;VU>@J2A|AGtVW$E zmOtG_eHu;Q(#A)acN-50)8zBM0fm0|4A>}M(5a($M~X|xN@67+=GD2pCxqL}Oqh?R z8pK-HEE1q1s?Wg>@pdRYo9~wBujHXzB67>-;T!&Ut3w!qF@x;76VMqt#zsmMb$N1j z?tV&klf$Cf>_!pCvMeq03YF^mi<}!WNDW1Nch4EAab~QmCTOR>$JFc=+G?&ohoZpm ze%7&*^`Q4;t(n?}po1^(9EZKB>I*IilOkw8;eRp+yy~Nvp!*3kE}Y!A4-_D09;p~Z zE;e(Zrn~SFbEo8=V&SFNtx64p_N{AtFDbj4yr3G&M;WI}f!VV9L6XTG!68pa)w`VO zHfFxz(x|0S%C2ZY^^&lSi<9yjC*{-F#IgGe{HS_9L`N#NQ=&DGnZA;P-A)^~z{Nr00tKf%bd%OI{Q;gBf?2 zWJ%8L$IMy|N>p*Kb;9IuA71#Hp9*SF>NMBC$C?)DGyo6euy3D%hr>v-YDOC1BORrO zd%QfeJ0ewqxFgG=IflC{gm3`MT?}8~2X}_hs~(OZRca4YCRnm1!~F(vCH6s;G(59p zF&@j$GO5n`TjPg}%^l;k4I#bi{VrS$lAtL65<@`YJ?<^1qTS<_YoO2Wx)2`v^S3lQ z$~J2!B?DsndJ)o1TT?Idl+daJ75bM+px${G5?1$rhCf*Q>j~ra%fl+<#)oeX_~qhm z3TX_UbJf7k(`At$%%9aKgBH2dNiPW2rdxYfJ2g80hRa*a0@kW*McGM$ozOxRs`44z zoSDr3{P=>Gip>e{?rauCH4i9l79sHCB>%))o z)^EL!Y$bNd%PORPtJt7$GnHs4*F$uc2B;<*G+xN+ul9L6_1FCqy#a%2P~g0fU`Z|& za=^OXK@=@>1>@wH9?8~_rIVyhaKF!_j|E3z_oMPYb4{Xu19fjSJLnMm%q|HLqe8Vl zm*cOs^njk#+P{8W;J#35xB~q>{5rQNqb~3&t}2JoV)tL6BcqDp88P?X${>~JpR*bH zs4jmUc9q%EmZ^yW-8X_n%p`Hx$*`Ye*pQM;E>zpko-&aq!^O_R$;;9v59GP7C_@J<+O+C$-B>RBtZ`4FS$?5suiNKgQxVZ|Fe+#bTaX(*JCRNWwCQVE3^Y# z9rif683TF=CreOcP^=|$NcA?30y?D`#Ss&k(^ zTGUgf6}P$Jr3-2L9Ts@-SE?9u~>Q{krxF zK;2Rth|Yc%_)711fA$n8-x8WfSfCCeSUKdygp{G?L~`V|G*HaJ^H96#Qh(E+e2&2F zqB=O>E$Z$}$#zfTvRz3L;@J8W=>5Z=9Ve!t8$3@{|M1+GVD60ct3pr`yi8hCS$0iY zpooYb1A11oCbVOS#2~CJmy^a2cO3cs%s=;W8l9B4R^vGR8=4xj&O(3ZB5VluK|msr zF_|SpJ5>C>pX8=Qurw=uy;(B`Kk31`l$yVAvS4ZTK@2rZXzRd4S)okG*vRa2md=<$u zll7%Qb^JkpV!s`L+WKrE9s*z>fnTb@Olvh*f&U&oQDkPm>-` z_=_sDy_#LBIFt-Zt$Kzx1Q62Q;W&LAh-^P=n6V!G*f~U^&Z`Seo?v8Um?h#NH4SMI zy=(MtbiGG0)+{y5EF>5j04ZjRt=+X1bgFD|RE(W2v_K^Lo&khc26FhGc52j_g*aT#_fB!gNe1ih32Hh7&j6T91 zIg#hsgL;GO55w>mLKgp=ChT8gq?19JrUUjK4p4&yZpTI{&3lcj&2m%56cs1Efce}x z9xtLBWf1&*>+ca~ZGB*MtzbeGCeB|gJnA~;i1nJ@rOc^C=!J$L!V=3t*)(f z(!!H1AGOqNu2X*tyP_YJ1HSFJKY|{+4u>PH{iDBb7Cd>0$1**B5q>R;2cf)g6RObJ zd?%s%>fHB6M31-$B;U9pb3*RN>yJA~Lc5@oP)h;MCEz))+|<~uak`*bPzZlK&f_lu zYk;cL`ul$FmGfc`(vEfL!aK$6G2ye5ms2Pio;Yv$D+8m9%X*kS=;+$Wrxdl)m?!p8 z-nJ<#2=(w@h@eJPbJpRCDsBuTH0T^G{w=RaIs%|WOcZxa{k4aAWgF3%!MWu)r8RoL za6b=JhKOKBm9Ow%!*dcNwgw&xQ|bG9GIQ`A52iU(9pToH=Mqzh z!s5b{d%TZu*^0yJ_VoN&jA3J7ib2L@!U_~p4_9sz_D>a?hMf04B{ds&)D)xir_2sV7RI@Fdc)l0nalijI%eJ znub%aHh3R`(8p94N*3i*Gx><+@Jm*4_$w9T&4Zcw7z|HOh1K{01 zvB2p@62I_I&r}{)xv$y%&$%YeWG=>^T}%!{Tk`n2sgwpv*oRo#s0f#9$e|hj;|T+P z+2HHN(YbIYRnK941*GJHW4)DO1jf5#(dhJ>@EbOJg@(|_w_rlrm zG41wGOM(oZw&MO-`$3ER)V^90`X7 z2~}}Zl)OG$#a;?kMfg&Yf+^lA5K>Xef1x&tk1dui1eg%@dgSHy2ez(m8w%VHmRFpt?{w*#^C13@WItAd+jF?e6uZ8vo0m&fs~~fB3l-QIrJ= zNvq~TlD!|#Cn|!chAMXpW1I4Ja#aY5Y{n7?;`H zClBblJ8EWV@ODCj&;G2T%Mn5GMMQ}Yv~dj-3utS84Yd8)d=-uNDRIuFE=v(8+AR>O z6`)SOF!{XuQa`rNZI4zAhL)mDQk6pu?p9K4b8K+CLN31__SH^Aw~~++4^&uBqA!s* z#2)Ox!PJFer{wUBag92yV@Lp;`;jy@L{RMvN(6VvSSd8q2pAP@dnO!+Gq-g(U&?7= z$keQ*<$lx~6fC35e~)8uZ4y>)tmXz9|_YO`CQN`GTe80da~{6bL7Ud#hT?F{-gGMRKcX z8P0S+k(n0XIyciUDMXfFv*quP6(UlJQu89XB!|tdWc>BGB7*blnPXMhvF*~VvYVd= z;-=q?-5%+0eXg}vWk-?e_k+8#T|B(bIH z9VT5*SIEY7#V+D)7=GZ*k561mw4xuYOWbNy@kETY+%D~nK_>cEX88{{E68Pxm3>>SqT@$6gB+@FL-%g_C#TbZcT$Ls0>MZ{C|AQ_y=Wpf+)G3IWbG=l z`J!hOa&T?gT#bNiM%e^j^`rFpnzN;JgWv#P#&YN%UO1j-_Q!DT%k_rhtH_lH42pg z54KwHJ+|&=^7wvSAC)rNPOYI&@22pYDxN-HCcg>VX8lo1BmI@hohrw?j(SP zAly*7HS1hPm0sb%aDqbHLx(FKgv|+Ae=}Bv;OJxWYC(msz@suAJ*dPB5;=rt)c&%K zS&ub9xW1vvK9vO15bv1l|9E=tcs883V^)RM-XoCxaWE9x#ym9|2uNf&ygj1Al&+V^t~k7 zx=ZcIPi?6a{jw0{GURY5cRFr9nVgVl_C4}myNf8b9`-g;>!)&&3J zCxdq29r5MS#!o3)a0mGOuIz)t4jsEn8-(Z5Fx`8tbM!jjb8{fUd zSJJk%ed^Ww%|P@{$$>*L$+!a}=g-IdrM^%E-LK;|2RLpgi6+o(7#gomye&0XRB+YG)E(KmnbrDP`b)%xm49wM+m( zlbu+6`1=0RfW3YcT5fjbZ#}C@4*_qyU*5pB7AyI>-Q4W4ALVi2qIRK=4ZKax{*bjK zC8W55#N~cjZVGxWtGy}Hq9a-00mk`f_4Y0Rg6*M%)_^YVGpg~FA1)~`UaWWhg3n(X z{3dnb3|&xRp6<)|k?zIF@Zw_ZMyzj5|9af{#KHRgsTTY$IT0?5uSPU3@kWL+xsm5l&^^A84x{oQ4{88+iAB1 zN8dKD2~1K+D8t_2zH4h~+xzYS$cH$VqC_10!(@|Yt<>JIEa~5q>ed4(VV!u~v-+Ib z^P)7^SWgvAeQIn;AO2g~g2&_F=&_>}!)7$hV=i7f9Mc&w5e%CcV12c1)bkYGCWn2L zcBnScu5Ue3K&Z<_=rzFkI?JAn2@2ekpDYO7svBfSXP9^56+!;^iL6QDE9*Eb?!ZJw z?FD&0v|jINclzH6mX02pQhT!8HzE$_?=C36t@DtK7t&!=Do6S6ogQq85-M6lv{9Ev zB0Z#i4IhXj+@JHd=MaoD9NLv_)Ep?XF%dKtn%wt>XH9C6df(~iYT?0_O zU??HY9(sh3R1`J2B^73B^+xX3<8c~j*8%)?2TvsNt!}u3G5lr+2X%*W1{-oL^zywX zaxF_kI;2=HDdb$PN#8-Fo%TRW+}}ycy@(vjiGL87<**}jxtigR&HN$)-RVV}w(1ob zz8dPM)fL;+L!_P|(~@HFG+sV$6n~w{$8WAhwtzPL^O>xK%vWP-gV+gctxU0eVOgWC zM5aHM?Ig>b^rU?RF}a?PT5b&ocl0VtkUpVNX)Pvw^7rp?6#Z!Ye&nS z63U!ya{B4}Mn(iR)?6#%fUijewQnjmUHgO3L7qihhtP zRK85QnW*?hp@6{5xZ_Li_}+S@FLslpx5s#%8a9g&djIz?lJ*d_`anp~`qihe=1w2q zdc;}W|I$&JeWyT&5qcg-!htCAC`#Pcv<>Ju&>&6z;&KxzZ=?(LR2f$_^hmp7p7qwt zIfYFd`8r@I{Y9RLHq_mPafu-hBP4)H{>zIH_XeA&fX;A^A|Cd*yZ4@yIwkLShxv1w zN}Tm<$JO0(zC7t~R&v>T6i(k@&l1Xy=0K1fKlxb;-}=*{+gO`BR&vtE;go)R^Dj1g zH=3lv?FN@!*MqXQ`SDpB*xfGdsXtuZf<5o?x0!01*JY*&sJrGFu-2)ELCy&hvpOG5 zI>Vuzkq0g*U#l&;LL-vp9IPFsHHaXO(7|Y8$cH953ETD0DHVRf@aLw-wm1GR#pACe zB2vrcOf>Lbz9K{$zALozSE^TJefbsj+n8mMG>>Y!LyPP)pY`927x%r6zi0jD>r;O! z9V2{_+MO)oj!t;O_?mHOaaoyZD2G;NKR=$Cm&=7I09f=du!TpV^3TIa0=u;5VPl1( zViZyN?9r@l0uR+Lcli{hix@EPcM*&t6c@zDnlC#9R?I4!K;}z%Pb|idtw_hX^vNxK z>Bi61lnqn}qRf!X>amC|$;RzNS8j?UU^f-;u3_%wsOW4)>) zbANn=M|}3dOQc)mkjg!JyPvPuQ9+Yw%+Ohysr65}?;xr3<2^MDT80T~w&r0WaJALs zST5BcmsI*;PFB#k@Fa(9nv}+X&m&!6MQmstO46Sc?cp~o(?nrG0FtiO{b4>pWNC--eL>Qxk7x)xokeROC=d!KI zmqvo`Ms>OLyhp(J$SAAf+0EL%(!UIp)6;Jy-md=gq77 zwJ(2^%cFM z%@|17L6VYuoR9Z>y{I_O0OAK8*D&TUA9_NS_$24s8f*ng*_`udE z#-Yvw51!F4*+E@G6Sp`f_wMQoHhN2HtPd}IwIrJE&vmhnPkcJY>tR*fC6Z@BYm^FYg; zs7JT_54uJDu@`0o^K8&9!9VYe<c`6*X5 z(WJg?Q%+-dSdbdY205p_^bC2?M6ej&AEouwRO`4iNvZ$fJxt(Lwfv|p%K{PBTU=C5 zCEbFV05rIfi1T1*`9VMZf+N>W(bH7_%y_Q@uM~prltGBAZ&F6#YuI0o$Qh|df}}UY zZ(7r5Z;G6Gf{~)MuUptJ3t=*#j^9V0h~}2@1%*WDV$fPBBG`-U@fQ*}`E%(}0-oqN z?v_^&R|Wz!AAe7#6#?$9zv?Oj?bloIjNQX*lWk`2fjp5l_x_IN9cJnMJ#U^cJWUCq z)KLV9u$oR|IL#+|N;C$%aR$*A+wRRV|GDTiPhhtLsTp~2+w^pZo!g+<$9=i+Xw&cV zO#$?o=CoRIrmtj~Ai4sKB@{pxGOT7t-dZi}u72iMEB)tZU&HNOffVbf@6B4*a!xf3 zrw!)?r-lsyy?#&1V$cPmH^IOXlSG(BI|%rbq#uSBBqX;kdhl!W171xEu+o-Q`;8p$ z324w_E|#+iW@vpU_;0*5?4?ts$1bTTVa2V9gZxp9pcnu|_I0{7C!2dw61igKGXbg0 zGZHjDfMscaIP%zf{SUC6kJzv29T?I6Y6Gk3fs52!6jK*pEPrZ!iD3xXY4-N4IyS~q zVOlCGDbV+ZHjBK~_3_u8*Gpd9?e`up4~6fwTcj zmE1-uAN}Ol$~P;C8q~%T>O`6cSl&8%C|i+6)J}l=@k97^73g`GyJr=>O7mU-3&Dm- z)mO!QYH`0Zk%oNcP_g}Iaz^snDG_j|n^YoD+#`)cv6cn?>5lIVV%C{Kb-&;sINHOkWd|3eo#c*Mw z*FjBp;p30dAJ~8x4FaeT)hJz77+j;0PZWO>?E+Rm*BgT0GV~I;YNx%xP?&-nR}TCPg^ALG*m=4dUw7=Avrl6T@9$N8I;a_ZFlN4J{{2OAWT7@e|i^kQh2aP(VpDO`g;JCUQLK;QGMe(3y)|x%oHSmJaMRV zTX2E}n^qO-u6bsNo{N?a!^D*;;O6P-G!$IDEeAbwjoyzT4esAkC!v(+aHjXL*#lUb zIvR+ttCx&_HVoR~ZiPeeNcU@_UrP$vKweu`cPk*0cS;M-8xKnk( z@D~lQ)cXg)tYLL^L>(ax+-ug0Xknx~WulDzi*v5Rs2kpN` zkbrSLeK9V1@u|$xL8VGk9Q23b*igHyUJCnIE0Fz_6{H?0!zOQKD&&ajRUz)-K{o9yEtXwS7bz-5Lx=w*wHAU{(3C9P=-&JPxY^;V>MC+hw1rf=3C`=-FRRb70N! zSTlT~8iOwbZtaAKBWk{zH1L*kod+R%7W+k9`ck{@Li`SjHYeYRK=uw;Sz+*$G2%8_ieLZis+ac z7vqp@t@=I5%_(Zi&1L+_b$UkhL#sywd2zx`51FzL(5n38-%NijbH}B9Q&#DA|2VqM19pS zLcS=tyy&BLPe>U2$rpo$pkJPZ5Ex_Ae&5|$W-(a$v&x5W>`9*s)JHIOvN z4I|(!0(63MZme7}*c0NDD2&8EW%;_ceY32IYonRqk#kaKdEqiJdb#~>3t>;UTFEl5 z(n`oRi!pL>Q^=w6E=GklO><{>xe)(k{fy`vX#W6geV?W^v;spXs1&UpKvHbRh2V`lUP(s-Z`-aGf0i`Abu+g1`hOrRf!cF(o|9+=L%W%xIMk^_} z>w?LU&wNg{P5iP02z^bY8T-UAVgv+;8g&Wgh~RR$0&@)|1G?#E>uKjtIWo|pwsJ2v zrNPf%EXkqvNy04#0hJFTD^IcndqMs_ab^uXPaDhpTh7>!Oc$7<2*MfH&|Qk zzTA2K!|P?K^gyOK_a$0}mn`Um)LfS6J97|{qo#P8eA)S~%m*^%&uH?YM)%1(b$ci8%sz2*7T$zE1Q#^KV2<09!_tq@!0(pku-1QpLwLJE~V2v<2Q>u zylfoPMk^`hhwx&5?~(}jJDZ)O(ZC;Q#_Z9&XfT~%cF`^{P2DDtT9B0p=9Ctv0Z~b) zK)t-Bok*D-S$u9KL@5C&JH)H4U3$s&RCT=p^kd9vZd3g9{cjrR5|CimH=J(9<~{BB zqAsAL{0RPfS|>3is)>+&bI!R@VR_QrO!LBZjaKSpigIwm#n>4E%SSj_lu3Hz;5;oJr6A;e&vgIaP*LExWT`??1s;*bvzTt z&~PzKH)S`}1a2>$OV_~uwTE`st+`U5K`1&|v;=1T4>v|EyViLlbC@yVvt3a1!$ONe z^$i2g@i`9?!u2>!c$>wnfoOr(vwGZy>(t(v%i%A#V0@7jFHkypo|P&6EqSAm3D1u& z?7tb%(gw{4e)Rflic)B-4~vxuhtTS&-lU536SDpBYt-dnQI_Pl4K| zoM9F7@VIi$!X;QilLOG1&@yWVOT<_ zcZfXJjf~NkBpDoL)5J?K3hnoAMVzFH%TI<|ImLBoQ%yG+?b5fQD@TENqKb#&(~Kk^ zD1Y*6ANn~fRsFci<;BR5gJAktxd|9Se+Osy$_EXVI_i40IABL~t*CRScbF=8GRiCGFI3V^Oico`vGQNzzErX6Dnq zZ1Wr-oqrFfGp8>{mx2yKG2s&$kShxQq}zBSQl^uAaL?&vzNkfZ3dtwfx~VA*6tWl@#QiXq z!-5^d2tr}H)r;rr^V*>N{#X!zT%)n4gjkij)!wip!{(M*B;Wn z9WmS7%|@I>?%W9V`6SWh{bbi?+)4z`ZFEXI`hZGL^9p z-F1WfDkm1?MT~aq$;g+g5#PDb7c2~%NAb60L);n-&fV*ih?fMlYE1H^Jao+oVJW3{ zLTlq=xfu@kKEGac9(oMi25$dM`qcfa_gU-MF)SKJ)bTv6rfYtC`uRf2`Nm|g!o&pm z&0f?j$@Xb9DN(}9`@Nk7;Qi7M-R8OOXua7>v3vt zzLBDLlXP=|I)iSAAes~s4AyvtQGl*YgJW18GQAQap$xN8k|sd9{4U@^s*6Pcmq`rE z`L-7(Wb%X6f8lTX`U*=1D^+gf258Zl3`KR_-W+l660E}TRF$;ZVtjSt#hbX&ty_KE z7wU=5@DE``-_1VvvMu7PB?Ad6NZKJc1oljP(T4RncFsO=I?kYO@~UW9(1CT2gI6#o}ze)^uD88`)lm6=1fNbu|I_j9|4XZIlfCm zid#(_7qFxK-tk66rK&o>9u`*9)~>Gw7Q=i)-wAgV``5!$+0EmhZg!iss-t+fLP)~z zm0tV?v#n|N5Ex}}D`=d;9)6h7v4!;)R zao8iDT{Z8%EN4W{gV#-t_)>x~aG`mh*?CwAL*vOodgQ@Ii2}S_<5N7d@0;15zal~e zWY0klJkH_0JhNc*&$&v$$jXkqExs_gGX5rR&|GscoUKC{UD8KN{G+y1wNvKhkHRwp zKKWAN^9`mBbSWG6lRKZOkgE5K1|BITHrO2)>bJxwKpK`bKf<_xht3K%IHMG&`^g*4 zFwMN5$S^V3na5M7-KHBQ7_J*`%Hd2u_-_WI`q8!BXq`l*LwtC~0Eyo&gGh-?fPdxi zE|r?kvJJR}$1Y27XEiA)q&kgB$`WE?UGr`3J^6m@X1o&{)GWTk6->!#`XPGr&mCDw z_mVdoCU-GYW}tdu*2TKbL~)D*Ne2a56dg>T7Gcqj!=TA7zVov_qpi(ce$Q zT&0gI7!i2SM41)%+0)D*OKI@w=d|+Z0p6USRp;6Ew6A-N>0lq#85~1m(0yfbk4bA8 zKnY3}s~eI3*en3}CrP<6T&xswMg}QHK&~mjWR!0gQ#@g#H6*Sgo~TzI`;5vBad2m7 zbD7)CoWMEm3B6Ne?d5maO5UCD@so**uZ^{SdDm7zUZZlDdpf@c&>>MSNfkng?5&=M z!!MH*w7qKOv21ICXXe&sY4j%?E?R`>`UwdJs~Rp|r`?xam??H3-iM0A-~3$h38|2J z_QLrDo@4kbI&kMCH z#mr_7f2aUR@Tbnlzzt2uQ0j=O>AIk)9!_3i%jF3Biki)e2=jp?-YhQ1e_vVc{d8$e zox1a$_pW{-?Dd;TcQsIPmGEX!%aW3(hpeNIX5WZ&goTa-K(f)QGOL1vOI%tKM34ZI zRes__92kiCB|OB^HEyGXdvzaE@U_5O;!*E!i|$UN>|hjkoz>5@xTauKB*-TvJ*BU( z0|dlK$){1_j?!gNV`X31r%YuEf)+j_y)XXi7))%H-c?T!qIOG|#+n!Li%KLn zF|U}29RFnJa(iVZS4@rdvis=ZCa%afQuoZm{&Hw*k)G4Uq`B^W>+j6k{-ygc##Ni$ zqNvixvCXCfi9(4s<+!Rmt577lVP>oTx=RC${h1ZvasGqTjk#Js;-i47s@kR7g(Um# zp8ZF8F;=3zT+~9~n0zB!mihF+!`&#NGY=gzgA7x~TRW{*!ygH8O%HqD5f7Fr#V39f zQB{(7&1m!mqLWBT8pdl?3^vfKLM;Mm5C`U2cAl`sz?2pVAOB98@7+He%@zUW71Z*78jWw}12 z#hIvmQU@08WRafLtb$L5e72+?Q`F_So^nIwT)hruEvkE%-=5zK;}-cMbTVoudVUoOR~NQYDWuN><}th{Jg~Q zn&4jg9b6l_w$J!05J5?rYXao)6YnU11`Ad9$UZl5vD!phPIyh5F1)y7#2~vEN6iqe z$bANJNUBQ1*aKX!^|sAl+TvDO31(AY|R84#plcqIkO==z((_(@$sQT2i@? zGgh&JxKSX?s?uahk72_p{w^|$`vYcEmmgHmB$^v?(5L+w)KIhZaRJNhBH@^WQBopk z7J0UPnk zJKq$>Z+dOv544`_(yxAH`Uk|U|I0egEInpqU9kj*FoJr?F@7ux`%bV5eZdfxze`?7!N>d92tLrK z)$l_$Vs5KHanWj(Z*CCw{Y&joX=EM4-{B|*R<2B#(G6&>Zzf3C9Nnl*m9M>vFC~FI zEH%G}&_|7z)x{%)PL8I~@v`Sy&6+q{0jAYFKg(*jZqAo6Ybye&Htmpf8}8mIGXMsy zGUsgKH!z>uldkW1h@=FDS9k$uXrUBur5j1KL%JA)tB%!cq@sHv zhLo8wApjk-{=GU^B_(cD95E@x=F8mem>(vF_wu6O*-2KDF*VC+GoP1LKe6ny?uty2^+3x;O^rmwE$%ssJ(r#@x zDYKV*b$_d>n-Q2bVFyitzQwrM{q`B37JR?suX0F9DxRVszz`?|`RO?|?CbGxAoB4V`4tWK3-N$YT$Czu@ApFwm+ z$u8wHTyRozFNj4*Q2h4eWMFn`AKDkhIAwT}5aGT(_xGYnD_%(LG8%*wf6n~!kO>Mp zQ{b?gFMzk<>|aU(`G4slFwur}d!FCUiD90aBV zeq-5Io-JSy9RF9ngE>1XExARAmgpt440pW~!h%*$6E`7LiZq2?o1|s?C~zJ{X_rPX2JY5h6xP?wM%obUMYi`ljMVl z#0U3+Zk7G8mNQF>hQ}_uX)}C+|G<4imAe?A$t}A@^QC%+MBFI)(D5R!Ea^^Yj{W5k z@J&*UMJc_-ba{p}{6_1!<`9F8(#+aFf>i?x>&|6=r^xkn-RziR5e$z5ZM+ZFdS~VwJ^u4qlSc*ob4Mv|;IZ92 zN&tPTrL8xCRkwbBUJ}4G3zrvi#2EiksOK^v?>B!*>Lh0n7g=-flEK6P0%P~ocY4sP zlSpF8jp-yNdS~!Yz@AgyfR+DuZ-X%Fr@MB~Cer1xW)>A-35Wszz^T}k&B!89A-(rQ z%%PfjGCbJS6_)U;Ff15jS9(GpF*eC8S`3o#q1US^J8bioa?dG?SBj*1<|Rr$wmtjL z#A0+kFiGZSCQoVw82a0o`|Ixl)RMYRy3z-}#$ZYfT~~$-MyJQ1BXUxwa8sO7Jj?Ky1H9C9zc(-x#eF>jE|#P$qE3>GaPRw;)wdlyWv1tVlzI}qa0)Y2%^}$cLin59~8^>%OWkVLvhAU1d-Tgzlx#VqT?>KM9MBEx>8JU%=WcQYp7k*Eg2R$v0+OpB{Vti&IZDP9*KxrMvX==N6t%+xC? z8j2t2BqIidkODRe5LbdmQ_srqg-#ljjC) zOLu5S+Je3Q|}cq+tIwA#aC&ANObmumcpspA|=fe zG(c&+ZuVGGB0ANoM0K1iTgQ|@R;Y#gmtCo0d^S-=8xFHKmOm}Uhkj;^;|9R{8JpswS)gf^stM%N zv#6hmc_;gy=vZ2VE_X~WUDb$8;JAL$f=;f}hLI(J$jH)X)*Io1&k2 z-`tsiIi|tlBx7RVe;L+!mKr=vR<5mQvU8|A_fk88zLg<9R5F~wzC03FUvq${^g5Is z9-rFew@fqGN}UvGGn0PAuQ)pKOIVY|fx2s#W52A|fi@Dy!Y12^6`PpqHnv8V+Ypqa z*h_G)FwC@sKrG2{sPRzJo2WU7zTY>hUGu~vD$zxlOMTy-hl z9$wByp~eaQcq9)RcZqQ}na$4=*oV(_K*+k^$i|>4`-^1pR29k*5u^sUQCa{_Do(IR zf{4$6&@!e|Bg zlmwE-`TzLoC}fR{DW~zT(ErzS6Hty>v6p((+gV5$pIF4|@d@xT4!MTky=3rbkiU-tWyya!(ZuQrh)d2I zQDIaL@`>pL(HLtuzUTm!u6I4kB1s|`f zl*Ooy*U8B8-{HhbRv%X0RY-C2Nj&e2o@hj-*ADy3iBHw69qjz5xqLMY+CUe53hlT_ z7#KMdnk1UnE0$oa6k{}VmRaKtcuf_q^o7B{%%pK<3>IA@QY%6KLjiS6?~M;Tk6CE~ z&{|*+(&6ZBtDHmb$*$njfccQYo0dvIa>>kGp5InR9?%9&rNaaGp+g}KD0|#7h~z?U zhBCICnQm|*OY|HB3sXK19g8zWzR9pMOYt;gpthjeucd<+fJ`b-HzubWAd3~Jg&3s* zBRPidSZyzF^&8R6lC72Bn>FIuCpJ$bTmK@C^=W$F1Wl-lF;PrU|6cl~Luvh&^)5yN zf5E%u5R0A%U>_lu4WfS90j?l zk>RPGW+bc)E)X^ehU;g>DLPJU4r+%R8)0c-++$MlfDDVpO^95E0GP}~Q%ev7ByxuH(O1Z-N+wN(? zChH<3(di=&7ja?QI3R??>Rnk- zVeqlfD{lz!St$mlRW^_)`I~&j%sxsUVIL5ZF?e^>?4x+uw_;M$-br$D!z$b1asmkd z+m1t)-v$R`3$ZgdM~)V^Bcl0lJfHsjF2Re%2=IB?s%(kd2I2yK1V5;2#=5n#{8Ray z76GiqHny{{c6uu-Ii>?EJ-l%&(`M%R42>Z=LWjuPPYatSZSw;Cc3fUaN@ky`UQ*Y% z-$biF^#70^^hY)XHA8aRYUrZ)VvqAPUI1f?W-i9*mCKISO+rViqdiVad<<($UNB4k z$j1o3633t!2N1v(Qf5#cK3D7kjGJdzYq&tO0-OGBb$tWVUtZU`M&3Y$nVc%Px8}ZVt-revLHX)-Z z|KsSy>*|2oBBr6Gy6b!M?j11F)qrQQ--n)o@%JtEsi)%NAI=dQIqrdO(Ayfh>IkO- z9I*Lts(fq>zm>W*u^V*We4sg`Cs1SNVV&41vh=|s7`}Nb*6UE#b?@uLn2NpzDaSM+ zIfiyLs2Ev=unVbb!BBHPs+UTUL-QLvLZYi>e)tu(GfEdkV(WdW(Q}D91Y&6qfN62N z`d`NUh;$p&He4>ZY`1`4#dnPVNeNgv$DAG55tS`DL})i79B-m)M6k<~lI^Nqgf}fv z$NI=k;!L^W)2D=WE*B?idEMsznngAFMKA(_AuivWSvZy39Fudx<`k@FgjRd;5A0BO2Ik+t^I@88j#H73-8_itV5Hql>{M1NR zZnkkC&!a3y=uW2XG@1op$I@lT{vpTA;y)9KdlOuol{2=#Esk#bw87yk(GP9`u(Yq| zant58v4jDY6>twaGN@UizEpW>MN|bgNLYB{{$X8J%uO_iED9WQ5(Zk`J-@_z4^6%M;pB`6g#nqN5L^Yr7%THba)mPHi9alSwfn7| ze+UX=YJ3645vI)82${xS{678LFTVTu;39I#3?gEDncS-D0#lO6YA#GS50DRY5T{+3 z=RESvyhOe%(wSD~G{4v1MoN^8o}{3X+;9Vv5=9vaFQPWk1DT#Z@U4dx-x3q2TmTb( zYRpl_*yy*a-x1$0Wr4q0v+^r=wQvpCeh^puc-?GAiH8`&fpF=W?d50VT> zIj7O%eCAz=80|ugi=x)p3Q`RoeP*f9FdD9RYqZJOavnhu4`JiMP|sOU&a}V;)&z7qGfL#bQ$9CDIqAd+_ezaK3+8c2DtQS?f0E zr{On`(JmT&JeZ%}Rfa7qI(XsB*KL>SW02Pg{HBtY}>igAJ-s2HiG9 zE`8{Ev_J96{_4o4yyt!z zVU-~$NM-;uj2D_LJudsM%iNmUZ(f2o6M@OF^e!omAWvVK39z{F?J7@ChA*i?@ex2%-idv z6WY)4g}@R1nm?-eTVVow$_1tLZ~mO8!hXOtEt=TMF$)B z$Y3r*=z=%PJG)eC5=Vje23w}amkG?)E1J6Rgs2$Ylmyy~V_x}WHeVnfqyM9jv@(|l zKcXL_U{EAB1vbf(@>gQuLOKEjhS3T}47;b!_u-;V(y#_GuYfa=fQ=)SFt@w#_CN~|l_#x=k;NpGl$ zyaB#N+c+Ui1OT|0Qa;yuTiKjte2vY^vh`E3Sa#oQAg^MPB+@3WI8EBrA|Edd@ia(IaIam|f5WhQdM`==u1g}BWOP=^EI*A97+nQWCR4uUo{CHCB%OQv{t6C z)cv^XoXoj?c>l18pYj@RVVq%m+~!GE+;xAaa+oW(wDGB8*%dUWD)n)WPUoNhwX9Yz zSg8|c)Bs*Vu{YU1+_Ho>2~hkGN)_K><{3yK{V!9O`NyI-FhGtIEj5YJaA(B{M-ECJ zHZbD(`foOFGgWiU%b_LH6_K-ah1Zk5XaTacCgY(J$>?kDH9I$RPt!=&`@k=~Vz#!= z<}Q%{!08DnRK!0D-{7t79P!@dXv0IyRr9yr-2M`EiRYF(8ah;@p@8V0mqxc%6%=E+ z1Z?7;{rV=j`qS8EION6-mC|sl@fE>pPi6nzw%$OCU-wV)YP!LSQxZO;!OyO6i>|}G zw?Op2f6|WHPs-Gn?L)39k#U>)3T;|C5r*=?^lQSt;ugen`W1Ycswr_6n{)l!{dOct zJ(2{E7~q;A!NdB)gXWFDoe}i-0q#19To0r+{O4w_pLzD&)u?K_|FD}j*RWjQsN$#C zwmOh7ae2R1z~mZ4+lkN>|EwKljmD-C3iy|CuM8+9p)9{g|%_N>sk)2M6NnG*R9?@>G_v-Mb~=$hpplg zt@rT5z1+r0aQ?m)(H+rNanb*N{L*wI2(z+`yQVH;>O;I2wBO}Q4wBB|SL#f!2Yr7{ z$3Ht*?M?l6%~x#dmJQ-OADlQTYrZC)9An<+oUhj;ez{H8?;_Nbd`;T?m_3tQc=?@A zXqN7@2ayu;`I+;rQr&n)w?JGd_wuD&m=PH`>QRqWmTB;t47Zrd{X*||iCa%eL3Pf2 z+7(OJve9;W&7TxtgzvZH`moCyFp3)jcX*g z_^n-^T~x3Ax46cC9?Vp1(Y#)CYi8xYA1ytTWxCb^ zC4pVM=-O*F;f5SOElbe(Z!I3yGBh3jPj;?He`Sv^SSkO==bC|b_YeIpsIM72(paDO zNY($p>1bTT1iMI$_Xb&vy*a(+A!6o`iVfVd|KFeWsVo#|msac*{g178wjnHU3+@9h z&2ChF#J}&FM8>iQubq4wEWw|8XB3c^qR{0pauOg@rjB*UNYwD1gH z>DXXUMp8h57L{RpI-g_+)XdVl4+yZBy6({ zJyByv0BGYg2wbV-$ev?4ylcEtq+)S-fg}VlwHJ%5pHzRLKue$j0C`gF!4&~!Xrv8v z4hAIvC|+BKUYn`?Jrf=@51u|s4NaOiV)}<}UK`Wp zEsS%EsgTx{u&+}crw|wKKP=aWQsq z?SIy=-7_qb?8+>{8k9M>^aO8HU(JBd_sz!miO?0tkA=6f%1qPVWgy3^zEhI0FAPl+ z{~7b)Fu2IIQKnmKQZWR2833<3rx+bh@%dl*2Y5sRp5RI8ATHHG# zuSB9{q_+*iHYKT{TX@LfLP!%KruxmAQ7#iKDeh6(q`Pq zwQzkLlkPt#djrrG2UkMOj)aZkm(kD{*6-gzvFf9Wh*?*M_Cyf=r+4twOyi0uKIPas zyj~o3(3f~4_=FLPoVD0Fr2H218rB==61=Q09gXSLvF}GOkK1^>|ALpjgTu%m+uM^50m-!rP;fR zY0gjh4!f)Rl5aNFfAX0yx8kkultTDN3)@h5jR{N_SX@$q7qYTuL{Q$zrvCRFG)S5j zuM$~A)swB5&e+t6aSobu;d#wpZr|P;NTB#?W+xjgO+modzLTqxEvXb|5 z&vK8NZ2h*IBQ3YxpOM`Oe{rA?-W~COl)YtGT|v(%3I&Q6DN@`WiWDgBQrz8P1I69l zi@UqKZQR|hI2(6&ch2tno%i1JpTdDr~4)N!oCjaa^Rd#CHppyAbIG_c+6CT(#calfIk ze7#?_y;S4qVFEu)66ET2M5{C&>YmBjz{KCiQEg}Mopq$f5p}I>u&{sf#cp$uzU}cL zueORlJ=w%m?K=e%mlCL=D3xVmdDZKajLmadfLV_^71Y-W z%lnAM&s0SjN?0Fz&)RiqRZz0d$&7{Wb!qz+3;WiilDesEk zInG5Wx4q9;xOcLeJ-^ah1B0Y{W@Zf8fgfW(fhXP$G zV3FF^CZ2Gd9;KR_w{w0j=F-s|x@n3sKE)+>gQ3TQj+z1ZRtpn32$M}v9L&Z=4m%Ba zEMtvAneO*0?$}rvYk%0PG*a0YrwaLre~6Y5aL;fCCEe0tTa(B5x~$1^g5rpHy`4Ks z=c7_knV)K|j2%{I*AXaO_C>|&glbv^eWbO zkvjbHIvbPdap7Jt(!XM3W8x_?f1Wf7eKqX6WNh~GVj-#Pv?#n8^pPOCYMyZ|ha&G4$$H5Y*}&-;xhS z8H`0Ydu`<&w(36)?==z~8W;l&uM@qzH74oNfvbezqA{^euZ05HHk)v*7`jydM-+&> z3BNT+jEOnRoN^@UVgKt#!t>o#l^ze&pxD)TIa0a>2Eh7105bGor&h9z$zJsT%90XZ zIT-_1_yau3^RreT@V}XTntJzHbcre@N6d+3^&5?zS3r63S#hy`2{njpOTzQ|T6LAa zUYB*X0pgTS6L`o|04#rU9@o2%h#|WapLtY~%SWRf*Gs~?+ZNN+m%Gr|d7s-j{N4#b zB56kQDTzWb)aH18vk(4)Gl@N(?UH43ezv&uO^x~qt~?*W8dmhKJLKCUueK?iFQCU< zia#79wMnGGd>&Ppgj@=17E* z7=9>hpC^^kB1*pVWy1Etpx@LK`055KATV+iki9{|GbJ9^BO>*)qLsmI#~Y#w3ZUqO z<#^B}65~)jRw%3emD1?o{aqnluvlWYl&yZhAmipf+#5Z+iQU97H@ z{+(vRD$V95UB-E)B?!|;{6W5sOkmff*wMkUoZ$iD9{rxS3t6W|s#Mpk#M+n)uh*yW zciSj9IkexB;$~6~J;AEtSds~$WIR=aX5uq}L!sgKAWh83_?xCet9dt;a34oznl&s+ zQ7xzmZR4tio;|UFBv&gE^Ra@115|h|^tuNonn^55L2UvOt0Mfgc~-k3jTh=ct!{eO zh)VoXU;$nFQagu()*Yy&rhcxz=xesbLR#s1MbQ)O#99Jlqwi6b0gl#qQhm^yNQx|% zl5LOO3sdYh`-1?04DUazD8vpv>i&=Y@Ie252ciOFk^jFdK*PcR=@AoY`LCZ4+g zlW)jL*#Q6DVGsJ(FX9S#NGK9iH~=JicVbN-xqzjiR+5!Qqw&~6XH?_#ca4?b$qYUR z)2r$wJVdD9#S7!s%k-S?j`+M`y1VYkzLEau2@>57mT&D7+$MT&NzXn~G-VSLT#hee4|; zU%giT;x#?<9}}oNJoK`@40##vw}GKx?lan;yf&JbdCu?`c~)Ef36R`6&9{r+x~cZF zvwNT6HNSfO;AA?ldnqY?^?s@8k~E4`EW7#eu+g~S|2*jSUh1IU1~dRXOCMM-4s{rx z&`aCVU-zBIhWEvfI~3X}ZCaYG#)J#UXFO#PWo$Y-crIK{!BR~oQPNkNSq5wHvkX8c zix+eJOf+=_@8*`NX-Zw1Sye#rRQ9N4x!7xyq_iu39+)(+a4lv9Y|_;^h<2Qrkg-doXb(Q^e?Q z&5hECwYV6uT?(wLQ*mUdsI=PH*lh>4Sa0?|rwz_mI#I~&ExaM0rjk;-(Ozt9uo@Zg zsfNL0>L2vmz*>N~Q~BVEnejkWJ$oi_SxR3>6%-uEex(fXY`HE^GNcb^rn)(eLer& z?P4xyt@g9M>ydr2o6q05zO91^uPN={KNcJ}ejj?)=Eg_ETs~L`q50L-Mv0EARo%7Q zmhLp{^C^Ao%O0I1b3y-<59}T4J4Qq%AS7_=0I^&e_EiPkU;K0y9x$rZaI||-8H4yK zm%Gva8We!wqvV=3SBRm?sOBnpKQttD^-}HCW(UFwiJ7m3b{YOt zvQ$Ov8VIiY-I1cWN&PvRa-lLGKitMTO{bI^m8OCG4ASNaiiC=2_aIXH`2>r?gn9C` zelX+eSuG=z79J_j%dBIP|B&d&8_q5N)xnbAPN8&Yc#PgY9E+|>`Bi!%1RvoiIzD=q zuGKNK{PzTMst|gE@PI&u{D?KFq;26_VRlRqG6ihp_8R@}xl-$!@c{Q5eix5>=D#wVZ~Qp!_RL}tuoK6H+R z?=hQr>h7%4mZCE=wB+bwAN^cop2fh+;9xuTnq$%baA;ZxAK7`9k};(+@nc>$(FaA= z)|t+v%u|k(WOj~ zSEdA3l{otOW11pp;3F~K)_GDms8SV((uO-@#^)sZe#YVh6eoN}_ysYB+Lu`0TK~5R zJ=H%^EKhAU;&`PvkAkv+K61CDB8CcwepEZ5G6lLO;kdu0{=_)0Ij_)I7eNE}h^Umh z0kvaWm^>U6(~qH#E$aLEu_-30hGb-5Q}gu5Oj|>T8O8`Li+Wu-U42ywy22>#&#vDX z+JTW}R0MR9{+AejtchWad%Sz}*Xs4<92k*8W)+sNYO+!ivf(BR-purO9WyHd8AKMl zCUcYCAL4gIIhS|pQi1iIqAe-EJDJp#}k@=X28~8VifJR*t>5@ zk*9u_;MYQ!$DY@%(Et6`_a(9v93~?>>4F9g6aGQD@6Z%jd-#7_k!=!p2|&g1r+bk{ zAyn_~2>+28*7ispFvNEkcA#9$Y2yDF9KBm4k=4#*-0d|9k(O~Cy*^8A>5E`jMnvC7 zE#lAbNdC=sCqi_8{1D7FOW+g{Wqz0F$EOuNy<5(NHp+0b;?^~LY(y$I6OROrOYgsL zlC*&W>s&cA9KM6ClZMv$SWF#yl3^g&DGq^Z!8K|E3+jW+hoJ|1dLa7Ktua>w**A#L z02*N58^j+r-tnH_kYivs8pMgXhmLd1{EZW|MiST!3SlUd+;~b{o}3L2{GYL!ncP5& zrqjajt?v7ACz0%9Yso_lZzdk=^HU>^>}->ZtPl{kf!i?zfF^SzX8P4qRy&@d;L!y$g$&%oot2L8K!xufZ_OQR)a;2O z$;I%?VdWT>LZe*qpo_i0c$#$KqU{_?^ZY4JmII9n$yEU$stIS0|I6mC=``>M+4`B2< zt7l@7fv1?B^_va{+8Pe?jpnP&VA73T)pFJZR6IvOgD#UgW~i(R$89}vJbzAN^Fl!U z3eIyefYq2VM+Y3_r9-%k>9!CbG|f?{bRtcVHAH4IxxWzsm9SubFw zIQec7i8bsTIqg3mjg_(XC>1>Y;!$WSK2aRf0I`83hCTRn4EtW=^1vt~u7E%Ev5Qa; z5tB#l0a2c~7dT8P9Y!cG?TBP?Y~pa<(`hEF!Bi9I>q@g}$OI1P*H78e=W-@QYI?g08~?cyX2`|k6r6tQp~B2U(A-Xx^8+lH z5Yu;)TDPzuYb?@?UgK)@eSrVz{rb64xrfmh_sV}~K4>Kb-7AL@;|ivn)&_vAQo|Uq=Qw<-<$3owu*n2&K1(W+; zvnj8UZY)gmW=z*Kq)0m3n^WDW{I<(H`@Nri0KvvciPPs9ECJ9*YD)96A{4{8upozh zLDeu|B#{&J281$M{7deWIscxII26LIaqzE0s*SBwfT zh+!us-iQ-HK#1t@l;d4#pODnla5K8)ZBa30238j!@r_a{C-@%QLw9!U)#bmjsmPzb8zkwSsegG z%;NVSEvI*E+Dd|UPT*CJf}eSE2OQ8Re7@bQGW6*4nRbnA?L~*^-YXgym@)t!_(44U z#j9z<>(UPc5dyqLBrg>CGyU^+U-|#ZSx6KOcNOkw@afh`cSl^-KY@wFf@=81Ks~_D z-lUt+QFjeciu=Lqj&;*rCxdm=^8QI#}JNki75MMmtfnTd# z82nG4s1nySYaS_TaXnlLzXG$(AiBj=V=_ z-u{pfAszVll4u*m-#)gysk}xC4``-{cr2?!PKU4|YGNB=E6)T2AHxKfx$d-j64i$v2W8WcYna=D2TNJPC^MlhD24$U^@|!d<3LZXMJjtZ$I@yMY}>m91btE#d^g$ zY6zNIa0B?k4hertm?~EOs1MtK4zqyM%DpLLrPJ4cWYUG)MDcjIUlu_fuzQum^1AeI z+=eNIgSpGi@z)fjc_d9)SU(+@Styc7Gf8*UikC^3S)Q2Udibpj@0(xzzjNRzW5K&V}eN_bdzMO<&|XGPGv-r>3+dUkktj zayyI;5cWc?IN}6WH(eLeI2+EggjGg5|4`#irQuKlLA`+{#dWel?(ySVD(sP9Y4fi* zCFX8TIrp@y9CHVRXZ;l5bbc9rdr*k1Da}^B=J|OUzc+eZoj)?y`OfFXcXM-|i_ZT7 z9#{#3-*tBowj6#VH7JKISwy2cq*ScC$Tp|3;?`oYruAzhONvi-QpD)<9f=j)6PkN?9>Md;PNK;GiU`y>V z7SlD#(k0r`b>WnmBR2XOVcX~^r=p(`JV+phV)z~bI1Ty9E)RuSemfbARZfF|dvpcf zBkyPa$aBFzv8Lr36y7-Cx!FBJ5rHmkj3OnU1*3boSO%GfqbgCs;TH%@jnGP%&p$mn zq%aM?0q*#sOV%`I5c5oh-DnyYxgGt zA^wLV^0An>0Gn_1SR%SsI&W3g2Pdi>^YYu^m?}h$xT<;dsiRs<fWCRXeU9FRa#2hRAB9&(*TYjt)H%+ zI?cdE@bTGj%c(jCYgxUe)D{C_Tldo(EJBL2lpcDWl|r+@h9MYDXwdgXbbfBVRef=d zdE6e|1``zvy@#+?A->L}^riZG*p1oza2lOvulj`PA+p1mXK<2RtF8okwd?t>1d4Zz zE8^DEH~uxbAN7j}36Jo|5D+E9?tG6r#6*4&Gl35r$TPq(4u7X8hk3B!0&4|Ak04ZlsS22J zr2$T0M)@22Mi$;6e9{Eo)IgX1r>mNVq#ieh|6pofUIbXyJ;ic0j};$KKd2!}L z>&O)QMsRa7Lj1D)$KIz90>Tl{SB|A!0=7iqfFxBLtw3)?2!RITi0lq_^pmD@M*t+t zL8~`mxV_Jp&04iVDj*e#oWglEhJcCXT$xdRAMaXW=vD0Vyhg$c6y#TsGz{p-e0wwM zf+&AgkH*)sq=G)VHH;uA$xz&)rAsYlphQ=k9elLJQvorC?Zsoo&OVaNGPk3!Zi$`a zZ&OnJBF!+E0--Z&bOPS{7zu9SR2|O ztk1V9b|0Sh*S#h^T-Ll6*3(gi0Q(a&+Pdq^EC7oO#wKPnVH!&92~UsZA%nPL_c(*hv~ZYVxgy+7@z#S z?YtFAD$ldsT>#=g#Pw8PF zpv?uL<+tpK^M^FtpzCRUF;y0lwp)`Pa@#K1|4ewTp!U#F9ZiJ+k8TM9X&~O<&;D8u z-OBCBseHf8>mLvU&m|ZQ{>a?f8g1c|GXrrTYD?+IRZ(?xNO^cbNXS?a;z7_gB*{nk zOq>Ha*WpbwD*XRFV@YtKeK?mv4== z$KeZ~QUgy%N4M9Tc!2?6^)B>>r@pDF_X{F7q%u8%OCT8d$xcW*+q$mxU!Y$0cZ^Z- zfC1flEbx1KEmt3-9yBaWH#VZ4pw$^$uBQNpV>f7$#w1W(eO03O!+hZ|>&} zC=arf5GM*cbr0*vYRAPMwV@Fj9z0Jz+Wn1)`Dp)JeulH2qjK<#Xek>^I2qm_>|B5h z#n>l_vQ*jyeK^s96cbZ81#aZWnLb8Q>aIUv?4~sTGE0+4fx|C>fzVuBOF0i^1rJ?R zG?27dKSafKJ5Wcfi?V1K_`=&M?GI#J@Wxxdh&61@j)6w1uG{PxV7(yKO@gjZh7B1T zH%J3f3H%%>Ss|B6Bs6wZ^bYn~;4w0}Cq8jxLJ|GAPGbV3yJZG|vbmO4e1Sm23G=xa zslf?TQ&af8#n=JeRxIG`O&z7*i*X>1M(?v7&>;262%Q$SxZ{O?ET-O$ex`P%&tEMG zoBriTL>Oy-zsT05CUutty~=yEokh-TI{FXB#I!ho%?AnlSzja8#5q3&C)yE!{GGEl z=|A9i>V8oAc}QD8POA=VuZ=8HO-J->JWsn~+8oB~VGgH64NM6C!N$(4JxwHOME#0S z@$le;xc4(ubolL+N$B|E#LD}O-@cWpZxd=zow*3PflY-;RN#-AP6s)d+*lq*YQvM? zCsU!TlFyp{1h3kdu~0H-reFLMLe`whN*I3#gdN4brkOQQOKH|~9!ss5z4Uw2qTF~W z^6Qf$=G<4xTDVxWEp_@`wuvr`w2B_GaBp>7ej(p3lvNm4=-gLx;F1)jg&#Rr|4duK4EM-&O`io+;>rXu1B6PoF)?b&Gm+}_c_(fXkOa|9zqZg>*@=9JX zl&Elj&#Pn|EP$qZJ0~zWpo$8|$m~zZ#*us(aW|%c*A}COj2#QS^eLK%twWT7*FFLz z3xRd(3;Voe9Dh@bSJuoIK9MtkZ9kDZg==}s!CALZ*UKE74G(!t)nkR|XlHy<(}H4z zJ(oYC!@Ow$x13S?V5-qKUY3!PdE5?@oDo6m91{cL(RYIW%~dVx#lj|T(W5n|+Z9Gs z*|7%e+;}0}`z|vLQWAR7OJfs2`@TN$nEu}K)(Ix5571?QN<~Ei|HC4X1QE9)Eum0R zGe=}#^AqVOps2;hm(gW$q1^$eX3HF!W zv=MR6l^=LeGjqCltf_2BQpmMjtn(e*zGd;PZKyu_hJMWs8lK5!*KFc7y_eSFyuC?G z!A7Q{1ThV;$|3lo;nEI ze}DO_{`$HKa=zQ6fueLQ5)#d^gi1om*qGugRRl%-2w$Kbd3XT7>4yd7QQevXA&8KokT+KpPxa! zL^%LxD*Z*=2FE|EL&3b;(|74p^LkW3T&EMvs&`MEDhalA-;C4o2tHpISb8knu<&$N zGyK9n-y7b9mOqnY` z(mm;?Q*fh?q4yGy*gcqgZ}2F(T`2t}ZDQ;g;Cx)9A=)Z_xxrb+aQS8$xw zrt;i*fZ_Z!7G6tIk9nPzd55BI`ElxPBo+<+QWS=vQ}F{n#5<*f+a{^CHNKG<^4Y?V zhu}2B3&YX#;ao2Av39|*8m<6qj#Wzf@O{sm>QmTZdX1E<)77Y9N8h0W+3jD+Exam6 zr=?q$L(xD-We!SG%8)~#%YlL?4EIwU#Q=As4XAMsN~rGjdW3344xit=UoO4tb742Y zOP`mTo)OJNZIVDE0dXpWd1B-a=Myyx4-0kenG|-qn?N2F9~9|F2b_Rs3!fAoiqK|+WPs*iQTt&}Z>HqLCK5><&QP?v3jUH3@lMId4# z=9Z{|N%*d1*gut#zCAZ$RPwd^((*H|wnNV=r{38LICh7kr`0w}61$g{F!-6eSD?mC z{k=~N9K)$qJN%m#r&-f=<=@R2_)vR>!`aWgt(I^BAKvo&JML8xSR|h7_|dh(RN>i+ zu~0SaGgft-526?<_`WS&q=7g=IB(WaQ1(E@PNwdB9fBnD<^a!6xj>2jo2wi(xE1P4@% zcLJREk#R&mu*(P1r6CQPfix}nfJc|HLNMmJ}jW3hk<8XxtH_H zQrh7iLLo&_>Tz3NSVO~y-(8R8XJ+zp#TVD7i{DFM=^BhsiH-}u#SfH zBli)94sK=Uh|7Ne#Sb%j%n%e*1M~=qH$Zkpr`ownAv!LG%Ov%ZBu~L5BlF%b806a) z!4jr;FHXi9AE;?pDw%P()*15V=$-$T^R{t{cp{HZkAKi)N5!4}i7OL8I z51pI0t+VoSwb^4%=FR!k>bO`v@B^G-dBR;g2qMB&incX$B7I}aYdk^NmKOb|=i}d| zzt-oeGjvqgyU?pZ_3wB#IX?CGsO(!`AIs7BC0YYqQ5+NzWwW0HUedS_Jvmf+yXbQjelX6?xn_)}dd0VPQ9-9~D@2ZHQF1GndSKe3}OZck}89xIV!fLBWg4 zMmz}u{IdPb`;i4jsL+9J3r~NG=o*~xts_}f)i#`VF9q9DK}}7x-QqVhj8lzos&{@`xmn-u6#fn3q|ZLv}s(=|Rd=9-^U6pK591f8fLt zJP)IiCMO)WJXZ;C5NsmDRJ?1-3jiTV%M-~pPcgYNF52m}y~BU4Bm3RXpp$tsJYC?p zNkn@dhZ08MR>zR%Q~>(ZSDx9yy5(v|OnksvwP?=3HTrjbB8@L01^CK!0E+U*Vq2i=*d-i1ijRFt zqM`4in2V&tpP?iOE0&1Rb4l%uiLl|MM9%OC;!xk|B|p?O@$d}A4gUuw4BxK4tEv|OfI$o2c5cuN|m zo}N$ySx6HOU~Re$zw~(oqSW%QhJU?O7cYN9)uCd)=?*t!eCCJ|@&(~|HM4|VuQaJF zOMl*mo6cNeIKWMj6#;AkUkg^)x73A}8(X_xJDM^(3f9$4!wvE9{3CSho&eB^!{%Vs zX8WB|$J^pPyw0Y;EKKj$`_F;e-6GRmM1Nq+B1ibVt>scT8Z1NpH$&GHWJsV9IsUM| z0zFDNvSfVX3N>vS8a$pZ$HwnIk8;%{E=C(;?Ho$SgT@!+@$DcqfSq zl1oJ&^Zp%HpGI0yNdKq`c9PEK$AMq!aRJ`r!^mxznnfg^yraiH`Oh|r{|ra-RJd!= z3bodfM1&jd?L%+3{yv~hX84P{_aS(=Pz_s`OV>99)|lF z!)m6y+zzr4+xcG2IUxhLwK9O;M^5XPrau8ipg1&}$Xkez;dySjbI7#mT2`sOCRK@K|k**d6kbKL}BxcDqSa?AcpF*h3mcIDA;fR-n z5OIE6Wtiq$Ih|wBPhx+7LdAE=)YKoFvj@%7(`h))LPrN7&Pr+$d2G)T1Hs$b*!W>M zUvPPXD$9odm!RIc=;gK2(U;#~ev;2dk6qia)m7hm^`e&zGmU%<+WjGhW?d?=w|FfHCvge0f+Np z$8WI|@%@8w$@K0tY?d}(c@EKn5(Lvm25L@-Nz+q7AwdFH^SO@-34iS$*a|AJ;1D+8X=d-Swhm_;3oSem%7$ z70INp=c#ZNXJ9~dG#K!jHjBMdyAW-7b|fFBF|-6A^~hpjGv>%?aisIG&1Ki7wkhw5 z^tS)O>?X|d%4#H}cq4nrb}=!&@96OPT)rY>J<;y z66%Dcc$;pZXQyhRUdsz{L?I<;1?n-15McgW9@>Rg+gG|Ux||*~k0hyXF5DmP{r*S411fR*-?4nLNY|fMV*jG8v;#8N(?=AZS*jG;XYn2ERUPgoog!!X`~=hQGHYT>Q4I31K<5+VboCF*j<&UoyVPI7 zaU?r}SMh7)tUGJTS5O07Qa1c*n3SdbGe4R@-y{QN`K^R{8oY(hey-huNUXg!cwLrv z-_PGJu;>cLKel`x6&4`y+<`_JPxz!rFik8eglt3rLTQ^MH z47M>a$C`uO-2~;?9`!b&{GJewUt-o$9p&s%Peb!ND@m>i2EW_R#>&Ze%2Y1EC<%=N zY81OQiurWaF~vmU=V(%nSzjQ?#Hz-cR3CLk7{JFC+C~o14){P8JIfDpT`Y@s5A7VJ z(G?hB0ClPNl=vgJz1u0k8p49Dm~)UapVL{_6BcUwjex3%1U7T50M%C-=#Ocij!#!( z;fx`E-VpSyMF<%uJ~ZfW?4KjevhF_PSeIn7%ij~`%7NJFTJq1IS50kd8o1GyoD`+M zyIjqR^fJp77M_{+rYR9ik=8#c=L?TBx3C28S(#)CQh^h~--XI~BJDrc@xK|Fne*r> z@)z=^5@K;2m6I=L_ffX_@TSr3XTh7Hrn2b(lDx0Nf3lZ9P&H3G@CfJL<9yk?`O-1+ z_adSpp~;*fePnXvDSPAfd0f2e*_08FWGP>~y1Jui$FUiqf`SfGX-4=E$o4l++Q=S-+wtfareUmSx3Gzn!>-I$sxQOm zUt;&#sp9wkoi2^7nU;_0N`f8>pd>vCYAB4>UO$asM(?Ra9C3jsVw>zRc;QQ~)4!g0 zTaJVnv+ZYidQygL8|b))ENiY)Yc8l2exW}yU*}T4PpSl@52yF4e3d_`o`iSwZ2TR^ z^L!X^B<)dou$VouO@f8{^8+_*M5CpBv%Ty5aOCFF^Cp!2aSGZT83C8Hc(JnS{i0<% z^>uo{=g`1E?6cLTf)Myh`JD}@Te}yp!vLQZ;u&cU_R*fVEGa37nECbh`!yOdhvzvd zRX+{ZgUCj&!>LEUs`n)o6_D$FK7HwVgcoqp zxddxfu0bEaV9I9oS)~e_hXL)o!v4|~#|Y5+O?m_?2Wv1h5$P7k=lTwLbcOq78KIi; zAQV!DV`TDnHx%r;Q*-l7gV_B>tX>+7njj{NzL-RlJa$@*URW4_I<^a&xIfN)lKll9 zGFD&2R{?wA`5W=lCZ_lM(?!_Z9!R_EARcAaN6x-{t(-0KQf1n?+D5Oo12l45uviS@ z40-gU1$-(>t)Oh$jM|8tsYbqj&?^#^hw?z34YHP0EVpcMk(YyAAvAYF*M zFp)@l^CkDj)gtN{=d`lhh6kgLoD=#4qa4qB$v~ong~Cx4u1`mr9ep^Pi6~)<3~s$;b?Veit+6 znG^SIYKDjW(yxK==Sy>5WSzl=ocHx{LH_61imok;Wu5kL`3eSc*W`m>k8jYPQ*G-b z4H4M2S2uA5~GzV+<0m*w)}#B}@WUpDST z44QV6fmxs$^U(5zNrCS(ww%FL8fogIry0kC+6cKZ^sa zz3%8vj#MB~OO`bsH(@_hQF3t`-#t+r>3!M`?$d&rRc8)be0n{w{uLWkobB#OvNVd; zJF|pCe?3e#wEf3UgJ?GQd+O*Ik>cx6sReQH_OjEi?%*q1pIXy=%~!P8}WgVKFGKow9m8NnEqb<2auK1}rd z^lh!OwsVqpSLApG4)>GD;4+lJCr_@w21U@Z!$m)>UMpsR&1a3(;#)l~jBTf0dwxe+ z)=xwZ^B8wd7-tNcE?En$H@onE9o&K=m6lM|9M#;|opW>c$jH;|U`BfffXIb|VBa*%uIRicU-7#5@)3-!>Dq`6*Yk~$Yt z4kz2Nx3R812NcC)OxYqy@>G1ev1|U8rg>#FLx-b8R~yUucJ?9+VZ_96IdWLL58fVx zU(R=r+@ep{7+(QYe)N4kYXiNb+1)bAS%I^N2@)ivolVRBe%jm?d?zab9m5#+p-Oe3 zw&(!^gUsQwPnW4KD2flM!HOC93g_DhnPjfq4Zh1?SW3R-QSBbzE2~3yxjdp`&>7Ml zeohczQW-aC6MZDyo1i|ydQ+-Gzf3);zHxKb?$sMvRoe5jz<-CMFArMA?cY4R{b0ws zY`+?u@~t7{lU5o+r>?PG5Um-ZDSZioB&o~H0w3`w>jDW2ZD?v7yW%9bV{{Z@ z^@2*Ag!&~ya9WC;#@??1zG&o4=+Jzj-^l`T_Btbi@b@{`V89;Ea^JaYiSl?YR9fL9 zq1PA0*ZyS2<;|rkDdBcJGDQB($t~sz`0KKQ_FD=<#)P?QL#}y>76dDIiEr~xXJ$_E zI6A*lci@EXpBhQ75H00wrUoh1sJ-A*iTmwG2_#vw>}9&y1YcL&xYc=^SqArOwJy(& z_Q2K~h-i$<`pZ7>#n~#2rrh#B<`XT2;vySk6HFXA=!FxcD>ZEwGEP4hlC7UTqfEKl zp&5=0CV6t)lF;Q3S&-@mcGv(cybr5&oI~!673aC!Ut@ISAgw3|A~&;!qWNcJo)ZF- zpJ7V)5bI`^v1nvSPcLx_;fbJeRO&gK@f z-wQ2&t?29xQOLSNaHSAjX&NoR%W8!fJ!1(8$LD_Q> zD}A5N%#AbdA*~SS*xYZYL&+Xal=cpH;*`wBEfJpAU3XYT4`1cHd&Jm~x$c}@TV^x) zIV>+;`(1|LS9y?D==PH_tMQiz`q&>=wlV;aHo76MdwYx2h6qrlU8-=g{kh(k!vs*BdK96I=2kp^<2p z#MoZc>BI)Wyt3$;>m{~U&cNEW+;v4u-yf~DYd6qAS@uhzUHC>{+<_ z?`I7gqXiXsMpAO}4kRc5i@WE)z5f&O%k>FC)Tx|Yr0H=Ca++rRwZC7eW#iSxm4%XJ zjeLJdFNW|2C0nAf8@iel5LDH&Z@wRg8LnpXcM!%p-QX7db&e-5Eq@jkX90ekJDW)d zt?72B#|1)qWT#0e9-9F8+?m%be{zD2w6dM4GW*qZsRjkiS1J+o+l=gaUs70XdCBiF z)n;M-pJZ8rKeM$+CJi6&MBUZN6h@_p9j;lF;M2)a!A@s)vC!j&|7P`F_c@h&t`MF6 zAy8%HJNc|8krY#f@>seG57@UXrDCRb|Mp~c8(pxnV_GfgqK%uO(h@U!T14>`$~k(n zoXm^=fJ2he(755K@d`uv&X;ZAR}np&$vxn9(;h4qmH42xJWZyk!9V2PR*dv&b8?ED zYK8$8v@NaY>c1F#Bh{Hrg1(kB?9dMI_i3Kk^y904_?6K)5&Rf8{t*KszAb55JvLyM z4^LZNf*|qD;-xCHf*cj!rEO_d@-g=Fclw}AGylnHq^z6pS=0F`_cnfE>N1De!)T}q z!Q*e*KcrnLk*DOS$>89d$3gagO`Hl?#sW}QxgGal#6HXAZ>S|Z{JHUoCbXrVUfanl z!Ct~u?3qI(KDJsFe$=RRlc4oCCm7R1j>PL(2}2bQjcyXjk?ecdU3IwcFX@R&{Tb5%2ZoC!|1ZOs;-}b_ZKj(95gM6 z@2A$K##x?Y^{>Y&%LnuYoGUW|!9H1{nL``5l3I;>F|6E7_h6ZkI0zBh&My|U+y{1e=;@m|;)vWt2+^+*MEO~ns{;)lY z$Tmjbh*k7Fp4BjWQix;&U9lgU~2awfGF| zhehwFM_IsYK14|f*X;LFUwRS>135|V8cE^rk~~oyxBi&G12NK^O+kVP_k3avi|LJE z>n0_ME|os7snYc3&8sHD5BNjK6g3cL7!3q1sol~OsTz(Wr&=RB!`JM20&S0Fnw%@n90`~uOt@%}Ithi=x>>NnI% zjU)K(n)tx$>i)g)4f*rMP)dbfA4EJ3%qaSe`D>kBk=Xt%YSJ??D3uQ7rf(g&oWnO0 zn7B@gFOJE7@+f~n{}!!66igS+{Gm1CCbp(els6rZ_>ynvd zYLSollRgLyH%kW|NUyB-MHK0UwT<@t*Yg?-xm+08Bx{m^3}z9A&6I;FDOBzc-CbfDr)fX07?5_mqWWq-gh{& zm}#1gXJL*#-pV^MwNz$me zHIRZhn}~)|_3` zFqfh)uYr?{V;OlH9msD(8UbH%uWo`Vy(Isofx?|3Wn)#@rJ`tyl;7|R3si2rE;*40 z%ak#*oa(f0ZF-2K)<;;$T5sl*>B3>iYmNkJzW~24!$vhE)UZrTZGT+!8R0t*)`B#y zd=M{8AC#~Ru2ev?G;jC|DU~0xvdiE&{F8J=Wfz<>8fyNueOwQnoMF{hWO1psEQRxo zg}PDR+Y;d;y8j-sLt?Ch$5PRAM)!;c(}}|v^;5T#Kb>XdV@lhp{xWvQCI^rDhj8LB z_)n9?HI6lY>bEH{7DIM863aKjIm8uHpY49~!VN=LPH62=n>%JPnS}6P{*Gz-{%k!U zc#)pw{qQ15KeUBMGnJ$4;#ESmWY0v1vqB$VvCtJ&FJhUQ1d|~fj#wR?b3sD|El=h@ znjLh|A?f_|io|9D&j~0QZ{E3+T8g0G zCBg^LJQ`s?Q>C`E#Q%+w#R9?ba^@1pGgrZ~dbEEx?usE!{FR3A09|bmjA)YvSX{A8 zi>qd!pdr4>ENFfRuDtvpRZU2d>SV$C>-6KWs5M23PZms(GeJN6#a6A z5+f2sgTHvmNgjBTh0J)MGMo542qBmALse45EF>*HYdG&Z*m&36Rm>%Fv~#J!LMc7v z2z74}`|pJ7Oa83$m+JWz;A25Rdjjf}nXi7@hG+Hb0_Gc6Bf7*LRuF5YmVrde zgf>qkG$rA`SciZm#Bq}}I~df~=7Moh>ucrpaRaxhueG0HHGXEYE!Jgfy6-XiK^?B* z__Mh4yarFI7*vbnaDE$0>LccoGW=lXoSMtP_A@R%g4XaTKavzbp90rpoEs^9JUWWc zbv*ykO|9~?T`=>D?|hd5Y192j-oMgTVX`g+RV;3ySVFPfXkt*>9uqp%_Tz9l8nEP8Xz=OHkQTN9~*oXwMdq~1}XltSyB ze*6CC&!jn~Gy%`0pmMx2xK^IJE##;S*4dUFRH38YUX^j7U?|u#Em>`q@R#7KD3NHd z$Ciw!#n0D?7bfGVCH$97`{jFP_w>sQB}EjY-(_m>xhPB!NB7u-ea$;^1vh#3C11ii zNIw?DAx`~p-66301?p*tcGf+FCoH(^-IL6s4QD(;TVQx&8c4xiXYR~Squa!U8`oBJ z#njF9htD4T$fjsPxN8S^Eor5;KqZlBxL`OUsRQiJ{EUIlu5$}Xf z;fYGIUR#AwHw?D2SJ*%?RS%tE;YR(C&_|xQnX9i@*=q=ic3C$|bYE~)d*&c~i7eAb zx#PLSId=XXAS@oB2!x+&)$K0lNiOiVn{Pz@ALipOGYrp$|kc(8&HYuZ0Dma_xBV@q|&i zOCqP^T?|dq_z{-A_3wI(3m?2;j2$iPVjZT#XkAm6QjcI_Rz1F|)<;V{N*9bCkV#G4 z?VlpiX(`%J9=h#Pz;-I+axHubtWD9rr}z`^-iiHpJHBG|ig-k2EA- z=^xr_FDH&6G|B4$qyvSgNQkPKaihe@JcTD&1*sy5%u)_OaRv=@aZ$C*iBo(ll>!T_ zAx!`e;Vq$H^LLc+BcuY*XgC5T4N!r!>%CzMQG1h( zPYDEi_(PX;B7`jRSt#fnQXdDlO6N@xbTZRWw`wWruXC75exHy!GKg? z1csv3xu2l$L0~B(M(>iK6VKu-sV)ehBo!!u2B9o4c1OA|ZTo*sS5Smn`o`HP9hWfwZ`S76MqqnQQ@skV5hs}^Ob9LI+!d)IgJ=gmG#69q!46;Qx zBroTQC`g%1%j(VV;OjmAB;d6tLv*0xzq*Lwq!z{mY7pEDcs@@2ZdiRy4EA5geWbec z1)`OYlyfQnr}t3&&XpyIO5Y7qN$?jKCork9!f_X#(x1KHpKXw0WlHwfD}&=iiwS5b zXXhJ2Zd?9OT+x9_|Fi{vsfKj@GV%8O~8fdwW%KZ#nM*WoX5n>A5 zZn&4l`?uSXy|>PvRTE7Tre3(FT(+f^)q|v$AO5NNtpAp(-*O4ktH7(xQ$fu;T%Vnu zUQa$gIc04)UCy#p9MG4)i9~@?y+a%rYYIW|DkN6ZuVf__b}I!=B_AK15tEQSc7pib zeZB3Iax>{^rpb8!Id-*f@s`~WH z@K-CS9Y95KWcK?v?MY+M+uNCw2x-@~OJD*k1Z{+VR~JCh+Z$1Md?y#V?Da>sO@}~3 z)h$*gKmdY(>ow}JvEVx~PD|WSC^jM%B232v*=w^A-8Mqj6~Pa#1YpRb=?~wWx^TlzgaL0Hprg>Rt$lf~jRhPYn#`sfCs z3zJezKoETpeb2L@e@8@ES~%V133VSE$eVLHj_p7Fvl8(O)pOO1D(Rg9^J<0)67~5l z{bl$6|1u6Umt9tDj6_{ptfxbaYy@3ABD@ZBifs-l2YiR$7>ZH3N0jn$h?Byb^ zZRWaO%0~Ck##lU1_mKbU1*xT9TOk~s{hT)Te}jT$?i^dsgj%dY$-P3~cAnyzi+OQR z-YxN2*g*cr%!d_2bjOD1&ak$FODj!D4hk^6W-4M z=M!CD&$6a)g!=RAEH;hWq-$SYP%=9v(b7m!{1Y?;>lOxdXfSeoLOnZ5FMkmkwgBb# zbh;emtN#7)XsEBxdu$Jh2go8TLmV_TxVHmg%KoG03Y7Uebf>qE53!-wsAK4(tzzi6 zT2frdqCvhdKx#9Aga`JI6Y3g5*3GrGN^Aso0Xi2@P(6b0Q9 zf|f393*Wf^lbv(|ETvE1E2=uc$RyaD#tWsQC=jUZ!K>C@TKLvG?XcVzD_W}WaO^QL zH0e<>hJ{vOpfpFVS&syFg4w`&!RS(Z6fi^$1G@%Kvs>!mMI`Y|*K52Dk1eAQIC}1T zr+4o5A#l(Ccc*op*LkHXJvO4p-4$*Vyc`m4t`_C9sKNW|A9RqFe0=GsqT1@0+m55#HSSIBqmRQzQ1TLq6&v4CyI-w~om`X+ht_1Tjv<^Fu}cahE_ zf4HDufRvP{duPzv`0R!Ld6N5;&G)BUgkEX4urX8B8Eh6Rld$FrEtu;C&QaXI0wS9)nvQ#e&Ldw6_~61xV7pvODcUn7G@# zY^N(e1syz~Calz&w{uy$g*Go|FQ%!fdEo3#CXxtyKTL`2__L{7vsGh(fN;fuI2j(b z-AY*C2@?HuR^8O)R`b`EAarru%^i=Y8~L3VC=GgSBOzA!KexyU?;SqUyHYw}^Es) zUmXPk)v0(Qp{w?D-%FMp$+{QuaiQV{(Qhu*uAOXU^%>2DxUf3)TqLo27Z>86G!pw` z2dbHx);IEN4$XdiJ4;*Vm`G&hQD7(_JPch*nD`+K^9&06RLEChj5Y1Wk%xY|dv}^W zIZ7%!B6;6!B)}SZANIO+Fu5mD!)}2}z-=;ihygyWHV`2zR?5rv+b-{#fBn3#VRg%3 zi^cNOW&6R@p|(Z`fj&LKjyoY1ugPhim=XaHuyObOtKVNQbLph+XtH4Xu2+hDk)RME z#0Q+Kc-#WZQ7dj)H8uXlJ$<-E&$Cq-Ni;HEgjzP|EyF8M1^T1{N`?txk5zur_|p1} z#Xe^NWs3|JLuTf$P~n!GW)qwfiA-!eo@yVi*{uB`C8#>k*o;39LQYh9cLY0hI9(5;Eo^kuZ#~)I;Kux_(j~d1Y9f$Jtae+g% zca3uxeYI85F0+_}n{j?)q8Kr;t6w!{re?W=`~9{Iij7my2ny1f5s%k(vZ^{i$6|xo zVSLzve_d2jMfNdp=kR&qGGpyy3}QuVF=fPRbZO${^;sbFZ0q-jBAoY_incvLRR#;- z+J4}5%Puy(b<4l4w^EADL~V>Se}%t~Jzwqg*zqMDJV!cE;rd<6wr#!J)OGsSXq~9J zFUZX7z$G!)B%yEpC2yu?YbE0QhuJ#+DDJ9YW6SDrH1fSdU_s`P(+Jy@ z*PR>l3oczSzHJhg$vW3WVsUAA`3T;O#n_OSBF|7nFWE`GHWJH@!Nc>1fN7FW?>DJ8 z`>F0XH>;6WyHn$^9E?C_>z+*WTJO^r4<>Htcq&qfFzZl+n9-Mt9~yl&HetWQIM&E- z`+_lNsbZjYQqQ|oEyZRZVR@m@4f4OKh2Su~#dG6QX6NKs+{2Eg`17AW_b3rnD7ok& zy5Bh{r=>4eSSntKem_#zd-C7u|7bk-s`w>W<-y-Tq(yBI+A!5V3NL~bZyh#i`u&#rb#J!GL2oj)CE_ZMkb|0;EDBMhKeo{yH9-mlV&WL; z@o+&SmqQX218i*s9_*;PL*Axw;|tJAp5K44a{B{3JIFIlpy>!6z;Zb*z?*hCI-2cZ z-x)qb8g?U(Ee1*nNWy#wlp!F-f{A^NyDJFbC?*s2j4FiLdD;CnVN?~ifvFUs!S6>a zn<}5PgMR=ivL7;pOgUN*yOZGB$%_sBfeE-|CggQ2_VC159RhUyfSzR!4;!mWvyXDf z2|coDEpmt|eU6XY&WxSjOV!=j4t%jBczf=TFOd5j$z^}(ZfQ;LMnc&Pizqxj6k~`x za`x&ZCZ}yjL^;aL;cV2FE3VyNh*`4P7b={bIac-}Mj0FW!;KP$TnPpkdIYd4V3=;e zKcIv4xN{2~BBj4kQH$MP>JbS`in7h(!rOUqxe}QYse7tZJ(|vxASXA&s8jyvrl8PH zer8aLxiKBOG@LT1-&L+X>EsYlI}}0BO8mK06t2*_pSX0-+KhNl&3jj8HP#Z96qzP; zD|+Yi3l1(4mV#n-u$#$FMB}-;b|_s>Qj&vj2hmg~OG?TEcW10F^oP=04w824#C{A( zd@;X#!?Kx3@IvJVDDOeyK;115wMV1-9^;uKhX@$+Gw4sf_EOE;pDr2C2?jhY%Aq6V zTDiFEzTq8uzq=$FL_e6$gTcpTRRq|~67r0T&o@Cm)l$p|fJRw_X9M`2f+RDlhQ3)kH0l+`*Dje4PS3X|EP{$r36sYHW20+O!|)$PJF#gvEJ!F7o1kM4YUcB+&i5+vulu6+gt6L^&%m@zbAy6nm zO&iJ|ITEcpaaj-$Vyz+plrXeDpK}d5^@WjKawB6z<}X!Ke%v1ol3hq3sPjEyn4_Bh zf~!_;Q#vdCsCa<~tc&~P%{tiiJ2$@W52E7|HqX--bZ4KJ3sxBe2+SARQh5_DsKZzHRFYp9FVvgmz0Uf%TSbHR z@(0vBtb#6b3fPf3iuui_0b}1fXYfyMLRd<)G_OP(5-zP?&RA^^o4GZOeuW}l2R?SX zH=ep0wD7y8bv1&ZUuCENXpaaihgryvT#>bZ;gC>u&df^at+)kmh7fjG9o>c<2s2uX zASY#}vMy1?2<^F?hGk2xf<9UcSMyulJM*R_9z?M&QRVLxl8)gxcUG)3(GMEh`Drxt z$>u9ReVbPDd#&MCA5Do=yvw`Mr+dmagsPTcwl~q(J>Rhv3{I|DYZ+uB;ulUcLKlLB z(Vvdwlnc}0F8SFaEJ|2tWssW;%JH_kC1pa_f=sk6G9dgYk=gh^-*!XsUuj@O6)1q1 zN?PoysXMR@<*umb5yB4osH3w*rJBke7c@%Q{j9uaB0TKDVJMUyYn?1}OQs!B=WquT zxpj91DF$W|h{8x_oSUxFg2;iajBP!ssDSXl`jIlGlN~NStBhSQ0mljmIn@(E z_TG#hTGH6quzZe*#Ry7vB`C@{JFKZ#E>$J8`+V8X?(!NzRDk_(YjG*hz@Fj(wLU&W zzr=5^Ipmx%)-z65o&4`&sTtGI)R3YKwa|L22|d}q=}olztc~%&ok`IVwXzvleC#7> z{MOdsrc5rs!QJ7V@RPzo)ONq}2ZUtT%4HW6?1)t7hdYA*ZMacGR`6jP3K=o(pIQXC ztT{MrErb$b+*5PPx3kT1s!_tb@kCM*#KD!D<@~w{hZ3s9pQdprH#xu_6s!p7(;wxQ z*-r{2PzD-_%Z-%IY2ZXHOECc9A(yOC6>yL1_11V#dW>Js;wd-(%A}}i3v3@bXH%jI zF`X)(e#(Yz=wv%$`eR_+mE1+H7$vnWuUxR+QH2~x6M@gLwEZRiuwcSSIecT}dJ)gM z1url*$qzYD7;q^Pr7xven_k*pPRVYZ!TxEx4?d&BMK``G>r>dBThw ztvn>3;IaE*#FlR4FEPC>LVjlcMtJ!GgoNUmOz00M>gGENH8TcWSm{G-0d|3j6qXV- zMkusI2qwAaIz#a<>=DKMaCLD6avcO!F}*NCz1`wei4V0p2;{J;5SR$5q^C1ll5dS(qb~U zI9XtsY3)T@2;q1|TV0v_+yYuyx$UnBI;dcC{dM&;_09TE)^vx*_+UN4{JEX!<;sq{&ELH$wAhcba8Q|k|P zJ-<|cAxiF5`=1F|6M9T+%PRp@FAy|vCCMM(aKLzUZ>v1>BggkrpS8sh)j==)g#nk$ zdr$+F-m}LiBRSAGfS(>z3n^wKEOz1u<{;-e4kEPqxJ&pb{G|64mv>>_87_4UF(Y}a z@wz}mT#=7uqr`0QW3dS{ceQ^>C6^1n*BjPpBP9b%hMigLb?X*|{5)k%a=sc*KeaY= zpQfg$+>`_^%j16IO$n)~Z#OS14NVM8zGw3p*YfK<2adu$TW{Two~W}zC*ux@b)8WdlB{$s|~KF>Mh1=k1wa;oj_V%8JQ!0o(C=bNAB z1v7tT(H~{on@s+inZ)7G{-|DXIy3rqI~2wR4&U_)<&aW97S;$D_bw@<1z zovr;Lw|Rq6uM73tu+e-77~wLOZEM6yw_#b6Z&LbG?80Pmcr{KI_^9C4a9Y=x7KT|` zCGe$?Ec0k@vW}DAUhw=dB~i2#M9p9L1!L}L;HLgEB8QP~N72L$PGo;l^x5Kx!|c#B zJQ<&8?M3_Q8IpH+)#n-o`_%RD()6(~{HEhG^m~9b-9~`d${qX!XIH7|D4%gdp!i`j zaL^#|WIuh_nPxev?rTFJC5ua+687$G89F|T-Udq{ykbVA`Ea+zI%KFoWZ0}KR zJQ~kB^_4!30URpWEAP}DbU4Q4xqN;Y}v9^t=l7l%)3SIHIzZHV*}BS6Zg z&W6|45-A*weMVxCIMFx!4eRd!;5?s!eLp53&12EMaXWoU>b5+Hxt#+8>bq>7%MGEZ z^hriIE2w;DDB(Ns{!Db+?-!5ZKMVa^HoGA$5UmezVWuRldq+d zBZ55xU4kCz1xwt`yuTpJDoFgh{_V7-$}nB{_JA%zBbGv}NjwoeOqcuXmGV>Ds12aQ z5`T0LGx^Vg#Et+kx0(3|8Z)b2mk4Bi3)#AEud=z?>h#TWut51D*JHENCv-E=d;~4) z*w&b2>eEl_hZX+4ou#pfd`2-N#Q``kDHgNU7Fu1&Ixg~E(jqVx8ldvJ=~L0Ihn-N% zGGQ@+z`^inx2YlQ9Sa_73iei6C?@oe(x9l1a;@hU^{CJ0H!o~$CbqBbqOFgY2Ix+t z39`5`w>I=B9xbp0L>8VKXP+W>;*N-cltN#d8RcUo~PI@E4 zwZl^zqjZ0$dxb7hMJgIzJUA{DE=QrSkMzG41Md2;K|n7hb5qG#Wo0S(c2lJMNQxm7 z{@qZ(v7$!4jZHZ5gBw>O-S}w}4 z?4g!!5PaY*6unzZ)Q~1NUex^}5{i2enZD^X1mebr-F;Q~j$3&iGoe7}-9K=s5&xvC z^l0N!FhK3h#4Hlz`+`wgrd&LW%9}7P?@1 z7IGNX$aWC;IK97UymAEWt|K_mGinGN$duK;-$oub>Ix`Pykj&)Q%Tv-Yjo7Mk5IlL zM;q{G(-V!w?fj&AxBL0;Ao(Y8qb=uz^prrK4#9H6>AH_)wFbH(Gx&Kpp}(zv2HH)K z9B#ub-01s=K8&&P5Q#y@F`*`Gy-$hwc7ONc zuCEBKD@rA7&tq1hGMBgiYpLFExR}Bv?0Oy{B_ANZ<3;FLEA8^?=V+ zLgWr+&3=l16xCqPEp3kA*F}ycrk{$ zU)aMa~dA0T_3pur_)8ZNYXC9iNs z7sK4rc>5LV8sQ_9VemQWQic!e8+&V1)7>bb63rq_FFp=tlV&wfG=gn~=|uFnY42#f zPm_iH?;28K0R|ek5B#$}UWe2CeBTi(0KO0)@qb447;;hjO{X0PgIAlZ^f;oC^!otC z$%jJLcSat2d(tP?YJy?Do>yF%Xq5xl`bZ50`Zo{eiDS+PM&?kR_Fs*(el+}zSTMO1 zKf=y2>ZpvSzSD7?jwlL}vf7|kuu<{(O{0i=P4blV0CnDYSxHtv6K~GoVKBe2u_*E=_Q2;V0GJei)swmx)aE8MyoMcqo33I?&&KIBr2-UeF=__AB`*RZ_|Kq z6H*fLIBx7<6a#fJtfeb0Pa(A?-G-!4gmNuO7pgqR+Won0vQmbKhMSK1olDNP?LED3 z{aZ;)$P`+-7^8zkDu;7?Xe01Za5T}bp#w&x7N~345~nO2#Q2f}q*|UPB-0ushm4%xSZyk5rlNb1Ix&P*llov(JyBVcE^0tBEK)W{*ZJ5 zt@&OU)u=#!O_}?1dS3=c=ObCRJc%TJ8jdpx#bnhQdMA8Q--&N%RLs?JuMEBM@RWW1 zYNZ}6_HDrALX|r2&NK6qB{_k!r?}Xi91O_C!ZHA*hc0>3NJ9!+$VmITGh$ZT=jdZv zh*|@wswd>p25*5=bypcB? zoIUd@zhmg$_Vaz2hwnJ#MkTR!bK&4;dzeb@HZbQ9ok%Zvcnbiu3{am%yMOcZt3%ll zckTcn%u@W&ELEe^Wfxmu3;2YMk6(5WMlST+^HBv6cS$ATOinC(t=U_bfAhL9R~mPvw^9EoWyZ2^ zCMOwU>OV>qGwo`jb-aK)zcBADgvr}Y`&K(;D7bXcdr2F_bQ;0bQ-Xwns zk_B(ft0eMvu3un&idAMCD&iM%{zlJjo@lA{d3(;9uNw8e=<8NF7(I2%rU|fmz-oVp zsB03aO|E={WMSEObxJ@-1K%C=e$6mvZ^|93foqRF-kY58v=iWkb|bTI=)Y7Fq_Idn zv=;zULvG8EqT13foLnYPFPYe5esNce0NXRlCp(VQ+G!)(Ykf>t=#&b>{? z7@zeQ>N|gPPF-2z!88B#SUBRTMvfa)8(|w_6WR;H0KjAfL@Qolc@OkUhM$J*&p$uz zn;IMVzdq@!I{RRh9(RvhsxreUbl4A7v&n{kvG8K^`FugRyT-3UV@wDh95&VX^?50k z?{zDZcPtRj0{LP>`bKmuuQq3bo;bqzd#LX8b3e$Y22jdbbtLUg5>&Pe0Rx4+RE}Ego0f`c4r1gGyT)C6V|PrGi%q-+ z?JcA6L~rA6MYU5g3jf6GH9M}P>)zD=neWyV$M^!F>O zCyM%Z0qoU95T|v0YGhcwZ|9l1bG@gS$~kug?QxjoeVaT9263*EQlq0a7OdQ`Bf}8; zj_4INc+A?Yt)VWN_3y!G;}svjv$w3V+UMYV&wuqkz)b8T$ac-A9dN{$+IMNISb?Ej z^f+dM{8&l?(`E-ZxmmDam5tLoWjFZpbZ$}mY-A?TwpMrM{W8K78SI0~k`td^M0P~& zj583k{9e4Ny@4FS6T1-dLe#wTR4F5>gyS~M`uel{>sM^Fs+Ix=lh*>Ibl>L&!w-eY zI-uqcEjN4LE!AiV$BYm;#0bJKOg}5;(2IF?5m1wkv`%l65OMK-3%tvr-X-kE!e@v; zxzD_*c#1LE>a(#Uv7C*69df3?nW}ctK+1ZMfy-sKvc^B&O3=ny)vD{ixeuw) z&QY7|1=kPDr%LkdSYhF&u;`74gk}_L={em`$eIIhng70m>85LW@i8O6#kDgF>}ZPr z&d=8&#j^5Y)4#f5eb}3447MS)uD{q@LbfFi)+{}6w9ApnV@V?AYGOjt zwJ}{96O$Q_xucZ+P-nSR4!!Zg9cRCVB3BiPny&y3WBXeL?JpTG8Yfh)tkFK@{aoSp zEo~$K&e%GwD+_&-wpu|C0~wufWBR-AkpN-IWqLK#g3jAfxRtrNd5+=66gd2#X<%51 zt<*-?;WQa2NCKj*cZar6@WwBL@Ud=s#Cdz=vVO;Kj5mnh)`I+OwHk0){*eo2h8%(s0a4xj$5+RLXy>#jKl zzHoyr^Zn_9QudEBZK926Hnk|*Pf$utExK6zQu2fu-wqLluSG4HZ7Htgl_+>4>Wn*+ zp@nyTT^tn+Cy%)mO0QaB!$)vy!1S51N?;NonqaFyX%rOca}V6nW^evp)7hy`~4Jt#A;1cq8hZu8F4-kDGiEnYhC=`Ha|Rv+IcKpGki$@qFoH z1kgL&7hjqzuO5fbxxvon5P1l>U-LX+ad|#HpZsPWkw|HVXt3QVwlK?*bo(GhLWF7O zwb{D2CO_4>S8~&Fv2N*Ekh>O1tiWs&MZbJuY99^swC}pD%rGLVuTDdar^>Mf^Z}tI5vh818y>lN)4CuP^*q7Ha>S{r0eP??3jyPg21B_w%&x zf?)n~W=G%#a{3gP;QhCjc~es%-fR7@-=;scSHZ206}-qH&+glKiPc+C;KduB^*uyX zjU`j$UAN)@(?j?$&qE8(mQ1ej`uYL2k(={<&$)+lOd_Z<>q>n?NR=*{`Ct(+KBHb#(t|;(dYDPbSs2NNODVr2mH2%D604@GXhsbsFQhoK>I*+c_>e;R>b=wr4p_-c3!AL+!56!0U`}DG-pI)xex~k!AQSlqqB&%Qeld=#gCky`S2T(&XOy1B#TAaArEIdReJW45-%QWc4* z-|b9Zb#%^A!thUOlnF}Sjp*pUqxUkIeVQl4WVcNf6)+i^Dwn{I=MIGF;*M}dTv72} z_`)1*7SNsK)TaXWL*=T>p1QXAVAq!@^DpFxw2cjkTAqzt79zTeagn9wT`ZKChIFo> zbx&3m3LP~}F0TbHfbl8slcu?^F`cXc^ib3FiUB|lvl?~xKeL+Bw2Jg(`cw2yDK;|QIhot#&{^S+4Tv`IcP3F>h< z5(RQAfal3D7wuuZHm=hEhMYRiv`IMKYSIor*ybt*80jalEX`I2uL5LisLHFMEZx0y z9ptR^6N8SX$72Os(XMId5Jt|%K_W~*J%8BgsEEiw7=w<7T+JU48r+M-zF-rQaYE4N z&5+ytS1BxHD>bNbSL99(ty*=!Rq`ntie2!U- z@o9+$)dl&@zI5V*j~{wC+vh z7ZQRA(=@^BPTTj!D^LmCCY>$ri@K_4_h99!>SEAuIsuI2FLedZ0BSePt|DiTOy0GQ9RtI7MumUVE8DNI(qMCZ4U&^x{S$&7@eHC4FRwn21m{6u5H%TOy8jZbtHg7< zJ~@B#sFAoyvy%J2$4d*RjvY5hyN7G4|T?IbPovxxsk00NOFf|u$l;S6fL z*x1w}{&B_?vI=rd&}2d5ILu0@api|M;yb5AB0eEE?t-_>ARF!n}M!dgc zdZapF!A37OSZ_o}i?8Fk(R}WE?6tmSMVo|)%(xbU@Q{&%(<0dXqAP)pg>RaWM1M$z zcpD&qdnbp@iInai5h5gg{Yj>Yp-F5BGEImF-8QtH>aw1sa8|DgyL0PwbJjVsT^Z2%S)hSWEn zffM1id63hbG1q_NSx@tFPMVL6CT&H&yaoV2bRD=*oeY0w5VeVavWIZ)AozibId~_Z zDpRG*IQX9Z*&$VN>#wfazG_QLi05(F>2}6N-*XhcmHc-#Tp#|^7b?H&(~jj7O=Dws z+FemRRAC}Qxxli@$~#}>;cw#h_OWU~v;SqR$F91K55mcmF65nF{r`I1 z(~1ZoY75|M`z0@Q(T17hWW=-Rii`%3olh5zlcs#M}5Ra^Gtf@5hxOaTNX5X{4)54g^n`bp2`2!aXN4(dlE3R-zWf|bY~>o$DC#| zC&q{haj@eve|_Z=d#Ad&hyA1VP4u$i%!xA)y@A+WZd}|I&ru~IfH;; z;r3$sNFb(S?6uRqCqv!ABoEVnV&c1H*hrvqqTa{@4bA?61W5OXx`mM7a_XfmWU!}& zhH?s>$>f=PYM)W`k%^d5NgAc!tKLCd&_Dq|&Rd><3Gex=&_k}9mnPwI$v8o{7| z7^&3Day#?afaX12Sg(nuAGTF%5KqS89!_yuf$Fo3b-xZ)|A|LIT~DFR-Wh3lss7(O z|Fh`s^U$sS`_@~xApr}zMhe^iZ1uF@vBCeeRF4#}r@(MP007v7jADw;HpFYDf0jEbd_OoH9Z@L z;_ei8cXxMpcXxMpDekVtVR3ga6e#XaaVu`$w$FQg{MZZFGjozVnM`KSCijh0ECw3d z{@>v{l)jJisP5Q6Vmf~9Q>$|Q=HFmA%`loG5?J)ow#wMrsmZP1iEL7YVOwmOONvD( zQn++Hl1vu5OXGNWI8s(uJqzL)#mn6-o zY62atiPzWBQ1AXab9ztfT=?Z{0I3eT|0ln4M5X=xgj%9C5uYXMG9^;MLo?#02qjbh-D=o0#)3L zRUApIxM`0{fH#Z7G#e=UYGL*{Kk~9R7_#wh?mPU?ZOrTG+7mB{2K_<|;ojH{Y-dG0 z9_xw^z2tsW03G!Ac&7(P<^!R&1l(IoD~Bzyu8JPh<9%$VBCv>xiS%skKI4i5!jp$9 zRYx}ZS@ZC0Ym=83_RekF*5s|}-$hE}o#oQr@(d#*Z`HT=*8~0+<2J;+56)`;=EtUY zx^UUnb@Z5$PVaeZ;SVS!(C&$5Ld8M zfh&*m$VbQFe-q4w(6uLD0yJ}{3<5d$*#oZo1!_%NNZ04*$&SE*Hly=37q+1II4g-QP{kOH&>?olepkY$`JfH} zjikZs3lW93cLz2DUqLUUQ75*FM;4L)l_}!wi6rJE<%H_Wcm@8`sbl}J$BFB0#&f9I(&F{QU3HdB2N{0dSC zEExT0HLe#duV9osXJ-K?{%Z0|c%{$LaRVK1+7^W+IF!?StYwS3 zB^y=AYUurtkh|lV(b~qTdc*SbPc|T*XR8nc1BXQ4W(MJA>U$;FUv1ooeXXs3G%WjQ z5(BGp6X|ywmZ5WcfK0S-uv)z=RisVD&RO>D>mHBMM2h z{-(7d)csrhn@GRS58wdOXGdYCvg$bfvH+&lLk4BEX8Rr?H$w*Y1i);XKzj&CfH*$> zac5lLNU-{N0hAw@h*FtNah~5F`SO|vR{gs%0e$<&`Ni)xTl*N`{jeWsb{jNH%Klaj zlj@!)oTpKmM)U}Ha;Q9105f@s*7k5a$5~Eb0$Z5)KC;yV>|hpQ4AQ%mFiYQTKUZG6 zJUeJZAm%m;i;~Jjg%mexrNQ&M_7h2b{7Lby-xczf(Li8pnc6Us;Ai;&(fau}z~tY= zeKF*FHKea)+bB@tQ3G-~K#4VO_xKiH7ciA?AD6%fQsW)t-JiWVF3ZOO;c_!0MFiB} zIY~Yk8~r^BjN<~KDAZ|i>8c2}8Td5}M5}*=c8`cxPSx-M48$pk-Y`+0?nsw1IQD$s zD_Q+R{Vx^iD4rRm<8H$FyATlQLYNi_O2Sb@2AzZb_S-N$=AuwoMK|85%gYKbzB#Od~Vwg&)3|*7N=~foXka zs2vL&^y+9Vkb&9g{4fy6WythEV{z_o4jcpg2XF@rYFv&X7XWVAM(5-}b&bx|6Ay3w zd4UAqOH>mypFktU_3R-4hS>NXc&_f7Ci|)wA1)oz2DpOup9qNYd{>y*Z6?cbD>gjd{ z3PAK=lM?vQ`SMgF`JoF$^MM5@C9-b^@C^3%_Yt5?OzM~TlHOhZUF`DLEgLg{4*dV` zG6E3;G5Px{q<>ES@b?O#bBt$VT~^>s!v-cm@BHr-IE)r(5FPc4cWyG^bs9hvnpa}z z8D@^}Qqpek>)}lrGgjc7Fu|@R>kH?8I05?F)by;bxx=43HvT*fz1ObDovBZRejReF_DYYZ>aFT%FT4Nddxi~!czFeRrO89J zJSF*-vVLFW=Vh^&1zS{Zsn3f}IE6+WSH|;E<`8@_wA#(}_xDEkjqVA0XzuFTM7x63 zJpY+UFqNQjHF-ZCNGF75Z|@M+2B$KyV-#4CWSBL`j!$Od>%0C}`|Ihg4ncKwabONz zg<}gyRTJ}r$b?DWTJQ_rqm@-sQtrrdBvWQKWuufwV878WA%;!HWO){$a2kaUiJ_YQ z==u4>I$MIN!xL&F<38^heu(k-hrroo)6AM}{ngrg;zq8x86Au<_-J{YwS$e@(KJbz zSC5;3;}`+T6e1qa_s&k1&Ky1)U#5fiM;J5h0$0)K923 z1>cq8@VYBDHa*o|z08o#5Krjd_|sU}@4qjdKDY9UM4?c|E##!qR%A^WiNyqi1K6U! z48a)RT;XxlI3FSGv3h3X-rZt0iQ=XPDqS4^SQlFfrl6tg$okB%tuE;j4G2(Ba*&PD zG+~VH2}6DdU86-E+}o&Ra5}2pWnGtz`C?!wWW#41dA58SF*b%0vDfl(>W4c*;J~>- zL>=2zQk^kufa?2&*d+h@6ywQ_-Mr=ll`g zyR%dz>3KMce|a(v?eN=NYxo~1Dony*Vj?8tmMg}#Hxz@O$;{&g{Dd}VLtV|{CEtTw zLd>5#X5LCM_WE+U0#Z=}bFpISC3;%CsV%G=wSSSTrw>J+BDWgYm;Jm{rg^{5R}6`cosyP-O8-j0v+MvRo~FozOqW z@M4Y;7l%0C;<;P8PE3P*E+v`0D9&nlINw)Q9d|A#`}W|MTUJK?CIJD!7e4s$Q;WDW z{E3}70OrPOYknlj!1u<4{EI%9J7AAJrf2dWTwdcRsu(rNpwPQOZ{bwxf)3g4Sj~bW z6yz$Lzw`O^Qr)NAKgMP4uKoC0|4&bI^qO%b9cS^Eaz5`38DzQe#q?qX|J0;^u8%^C zFW?vSuCzmFxrN&+{3cU{)E9WRM7Wfn$6(6GTfnaa`oyQuiFW-P1E)fQnnwmXc&2TB~|+JNlA#5xoXxrOL* zSMFZJhD~O|Xc;gHJ0~jByCx?!DM?veN{3)2J%$RZO0iC9QZM)~It@cj-DN;5KF)Mg zcav~hqA>WHnRHL98O|Nu4@dp65xP7&h9MNRDO&sHX(_VSK689A^A?9u9LZZ*W&4&hG2EN76UA2__=Gj%H@(GlZj7yzyu8Pe{4SD|+XR1Nf`0OA zmOR|-GhY-+4*_u`{0(^oFiz$@Dq|O9)XLs4C?OEuO)y`GLmTLxJpx~SdyjJqt~NQE!mYky6LsSx-2YOS zr{DVnxxlr<7O4}f7DD2<-5;J8{q+C~e9S}6bMGJSVbSB)+IXgx^1IJdibN^90;U1`9i&n+1+ zz&$T3U%DbTS0Lf95-cj3@ZP4mENF@j5ZF4+Ch#<^6F+KCfl^U#U>vgNAVHc@~lF7)BJ3`r9*4+6(SJ z=nQad=50_Q*x3#32J!ZZ%&{1A&kjwZwAfno6y+x~TTjh=x0RS$yISRgYk=ZqVf*#) znO6RtaPUF;e6ypeqUItjE)MDA&nb4;AO*vmr|+tmp+C8`_z}z4%Sl!FQ7mzy`R3i% zD&Zc{y6pyH%JSMZ0;+FzGvQE>0H7r-(uL`qn-|Fd5i8vt)`>~KVeKvzlm%#k5aWi?BJb#(V2%zr$9oE1_BuP!Nf7V#L%QTxtp$ZEOU3@6W~Hj($G4 z+|)dl`yyQk#WZ-|jV@L<4azfXuOSoJ4wO$-B`q2;vZvHkH^sX)Xi%~Y_X>K1E#km? z9{u?;EkNNGs~oYNk^%*Q-m4+_Yh*1)MQF@J`H%N{%5+cD%a?CA?uF|ei^~MJCYaFa zFb(w?yo&yoz~*Ry{ahgrZjs6}h3&oip*=uPzrgt(A@s&xzKATx#09QISD9xtXb>xWTVh92h z5ZgcBu}Zs(pX(_hC`&dr7L;6Ts~&tX7E6;>onXGPJlssC#U{rZEzdBD7|7Al$(CW^ zyoW$ufg9`d`o2UmWri2kFm%O0ntfM*45g^ zmv4mIl!l;P3l#-5?6vk(PS`{SSxf0TK=*W~ijmLa$XcaMbXdW=MV+m<_PdhvUY}BZ zy!WtRFqBC!>rGDmGgdmscnfTxp4;2s&ZeIsuL6?{;XH?h zQFcTJX|_$8Hx#!e#D*)uo3c|wBJ1Jo_B8afK%@S$_n*N{C#Dh_d#Pg*u8-4=Uwlr< zwaaGIF4%nSJrevC7ww){B2P;u>;~H=d5?oRF zyII)nt4)@GOeI|}uL^I90l0o=BEH+?uvZO7tQ6>TNbl#-GgIlzPKOJdQb?}e6J|{v zBIegQ5N*WZTVrII(a0Tpj7}=-ymDBhGW8ADbKAgC!)D<5X_3%e_|KqQ@(@O_{K-ep zA@o#CELk@;0oU!a&SGR8d#sbtAh(Bi0y!33_y4T@1e zJH2{?L@2%)4j4GK5%mFk*yIa7nnLQzjf9_`PD#Ph1g2mr33?MH@_YPoy6$Re;}qU- zIgC0Ee0)Xu$^6q;V(x=PFqU#8!6efF7Dukb-d5oK%V5ACCb6ektaaG&#k5{GX9(1- zo?w}UBSUKyqUr$y4;(ny5I1d^CnMb4ynL4MLlByg#(+{(2VGc>Xv>G03kRU59mVss zV=`?dFt*_?HmqgaOc0$pmSPRbYvILViJ^01wTHH4N7=RW5LYlil_n%uq*TYv+v)J? z!FeP97zRUpj3zUZo0lR!QY}|FsuacCElH-yFqX}ri)jKMfCNyPhu(FK`+0vy`6&n; za|oXD_E4Mu^w>o7kr>^qjo%*ke56U*1MQ3PZ_ik@2r& zN+XAXa$)%BQ_xVe(a4%bN|YNM$Hcs3i)CS?E;csOCRFuHO+8P?6&D$83ar=3l7?@e z`s(i4a_0jJ7z;ExKPPATCNa26e4jv(o&cGmK$Hp%HJ1wk11!}<=BAJ(r^3Xc4J99D z&DJcuu*6%2{_Hdoduq@+oB<9Mtje`~p%P-9mYS)$(WSt}ef|7_t$Q9?UaarMKca8b-{Al7i7iy7jD>nBL{%8C zQ|u~32!{Q_fu;>UCQFn&kum|z9S@r-w77{q#Au!#-~!Z_G=&9xZC3y=+$>NG$0seU ziZ`;rQe|!qL%yY;X-Zx2=7mym%+P{wz0rHzMB{cNo%245B#deT~pb zU>N6L)ho)lPBF2Y2OJxFkrj!eejiPWC(JZo04c&sjS~#G>6%qYhC^F+9ryb=sB(Pl z2+w%l*$sa^iNw5tDzP5{Juw&FrFhonEt$m?jVIBMgC>;_nx762t6;*>$z6+T z)v)h|TmR((1wE&UVVxhA1ZI~JxnSTM?H)wmoD$mcXcx7bDxa7zQQe_7_V948r@ejr zULluPA=}e1CQ&Tv#OpNszjQ7lrx}EjC`?IE-RND4eB=7NNNyq{g@@prQea*obdo-R zvx)gG_6KMbIp7#R_q(`nuY%g>Yt<*PoCL@_TV*D%sAvdg4ILY23Yw0xiq9TwlFgZV z8B%{s&JOCikMr#4zuA(wT*4;AH~roFXNlN3;@qF>F?dcZj5qly?tUkm@N9A)cqnuV zgRqVr9gV7?!)>u&+;u~nT}6aD6K;U%T_eOscQp5L+;kGWshRt05-r6{QdijKbGtHS!(1WvWsv-* ze%zpp`_!MSD^>nYK+OrM;k?|HYn0vS#F1ABw7bVYkF^9dIFcLlL@R>OWZ)`KppABPf?ZO)aRw@u<{$iW#|Ovu z0U#7=enl^X=7Ss`T!X?Iza^4eOKcALj%88)qKX8`C&LMwgs&p?vh$%Yv8^A7YU?s8 zN=a~ltFpi>YBKFgX#a(Xo~p`L^KY0;AJh(RkibcTu9>5Qo`p}iH%$c=XirFlXv{zI z7I1xda>+hG1ve1kB{$?$B}uWw}U6fpG=VuK^?ymQE@vuWP1sg;q(*H z_*s~jiL!!Yh3O3kVR7NSk*AM)At|Mo8U;xESjZKezSHud_aXKii~Go`hR2k2b;Dy; zqe0`%K>ax#fwLqb$^?EXmi7w>?(b2oO$f^chqUgF^)}3LE!N>LezZyH$-ig{`_bKC z{Gi8Ouwh)Fwuh4WS(+osLDdts8Uo zoo9x*fuAD(ThrOxqat)d4`=nQyi1P}UxYAIJNSl<`*}ejib+6b_5={~#iHN8A%WTh zvuO?_{N7L&mKVe>a;ZQfTKEQvF`B@P1-`Il_>symos=z@Te%&&Zp5AbF>LgS3z<)` z0zCW9dgweqer(mrNTs;Z+%FX2%H^yGv#tguagtHu~xj zpl|gjJFAT2iEQ6v8BU9Z7(1z?i-y$0m4#O(=nzm8E3ILvvtg}|K$8(6q9borSuv2j zVc1k;7^_}^Pn*o{{C$72A7Pu;Io9@2cH5;F*iLgFW$s_cJ^F7QL+0~kbX`@s)MhlF zZYztdFzpvYZiBAAUcMfVFEjDP;m;hU`DxU{U&;}-=EOBy(M8SG*W5B)?=M<$9T8NI z#gSJmC0(sF#UTi#w_oig=_mJK^0rfeO+}k0^%!txfp6oDEeSy@_0QA&-naqirL{s( zEg3R3H~v9X8Ni*il-dvKSXDqCy}7xL(&Qw@l{T zlI4o|#9`T!3LWVGIlc_9uV^fkfZQIf3^H5<8dsX2KFbluHi%AJf&gAYg&t*UOH^ZF z`^iVp6o|&r{DXsy1^*m=yfdig&u&7D{c+=3Qt1g8#Kw$dyaX*m5b&M z9BeYtLQE~axqG6-uO}@}3227^vtBDc_}*uAvw>JP1IgztfpIasZRu%X_bF1hXB$k= zy^5pLbtzVr=P~|QzUd{T-(ouD{d}3f6@1-^gh@mYcYn7SjyMvQF6>D@MWzay^Oc8C zuvMCea=l>JoLR#FyYyxhfDcL9%6`?5y6a4c$9b{a)+1G4`Ut`hsWD{fI@1K zu{i2CtW5}UZq}Og2x}<;$UBBKd&cSvW7k`XN<&w#!wiYp7e`LI&hQc;lV5UlsMUNY zh%P#zRkS?#v6h^ZK4~BeSl)=RDd+1cgm*K!X_=C^;q8oudKnXZP+tF5c$)L+_Z|q{ z+m*nvH6|uo65d9?rVw6F#VZ043`(8t;WGQoO>K?&a(5Yj-nE$s=MlWKVbOEu*2YU<#8 zwr`Ok!mow0~rN>5bu{HRc6kZg~cb7IAHSFvY z+qn%0!?JdoS`W4?4Fz!H-p{Y^;1Yq+hbMC<_JY1zXi#NE;#CVZ2!1R3gQ`WCA^ znJ=hqX>@xR(1UAyVGl50gRflfL|ZoSe?1GYFYEbx@0XE5L5@snU*?q9mq0SY*LGNX zz8wm{^J)<6|N6oqEoJz*rirUNVtmB&QRk}WluT|LuZo%Hc94TzCeiNLN}C9RTt`|i zI6=Cu6^8&eqju=S6evt({gG9QXL}11&k!-BpUG(TCB~KmFJ&7R>$}QsDwXlfiI35S z2e;?RP|WtEev^U^S zSbAJkZfO}WE;CFx@-^~HCnGI1ZySH^GTW!E*)&A3828>brE-HAkTca(7p6^@$%(N7 zr?)O(Z0NyMW&VZU_$N!2qG-jQO}`h?1I&=L z`DZov2Z@5yz2qunCh=k()J$?yf@~YqVBI~8=Pc6RAaX$YfA9f zJDH>lA#B41>OlbCv*_L6WR;qSqA2Y?a_<+2o4%N}7$QixwG8yFn`psK?1|UdP;Lxu zY{|YIdPH7l9)`m4v`yvp`6>2|hO9#*N#&t~kad>LT-9%(+hScHq6yw7DxK zXR$do-l{=R>ZGn_2!#lareDK@IBz%0J(?<5_Fi)?AR}(m_znpsA-6FZy{$8m2Yf>M zEQpxr|3K+Yo7D|FF<2$x#FOfkML+iI2(<^rYU=8Cr|uKIq?Iod8Y zJy{Vl?QhaAl%PBsRT6EU6pYwC7?FzpGhiLK2pzGMfT_hW@)907qE=0sDlZHCGP@;~ zR^sqqHNa0V2Fue`RTJ!+*6bAp`qUnDfB^w-%mzLG45l97%>tSTv#grVK{?gA*Gysy zR0!$2sLI`%@u8VBh3d*ngYD=OThW48 z%_tjpqn<5D?cEh(pNK{@YyPetDRtAvy z(oY!Bx6G(o1D}d|pG|W%2%@RCsi%Sq94l|h=tRGj;Aa6^YddbGG$N!#?o}z9NRHXQ zBEtEQd<-D}=p(vqV+59+)Ih$ldNaKa@u|H9&i?dh$zA5tWBbuyz>VhDNK6pnY4y!5 zETw6Yio?t(;}h1$W7|pu1NFRrX*N>Cxek#?ru|_-!pk=oH#@9RPyX_GgEaV+Z}EBh zWiT-WQdrWRJBde77qf|*hkfxL1=JUhx8i1w=p);GH#JMWYB zw$JsRHI2NQZWo+7&+&WWG7uUsESMS4(dR7j&N7XTLCusO&tNS1bW5xK7{uZX2YOp zdg;pOPC>a=Ly?sCd&pzYLG#S}v}LcoYttP&7;ZXof_VG(4wLmd5Wr4-PWk2M?ieBc zTiW!G;Ng0BWmsN!GoQRK2su|5eC{>*e~5c`Hb{v(G&-yGII$#d-mm=5axQ>vKT=NA zm4`$=H~jA67jLT7#tun^(0=MAmUK+GrgzE?n&WPdkm41CbyTA+WuY)E?Ov`Xd)VAd z`GS}!@*hHEGRnXR7}-h@+BsI-lPM$qdA!uGg3W%gZR#aZX1;4UD~jK|U)F~u(Yqfn z)@dN~Wlt4g@t*xahS&LSl&f;{M`#p0=CHCX?-HPtr(4RCfOKQAs)}|Eo8Gbp1|VUl z1!wM^ph$Wo0F=?#7LD=g@PHJH2f9rYC7;#zl?z{;+>nLoKlSALKZc^1PsPdx1;onr zN_jE5es9KIY3-46mzbCzEl*6ocJ?lFc|DuqkqAFpIVle=Jya0*S`MPEn~kO^ZqLNY z?&?lGYM%i%n6JM)?SDEHIYEr6NA;^*%90+?CJk75mA6jUn)pc3O=&exH4{R=6$A&440zB$1TrVgbq z+F%j*HVgc*B2pGac0b~i)hP^Ix4e(XeK5~=uF;-H7>LBxia}2RKO&_`BCO3^a*eLTk;v#!FQgDZvgirL&o@jZ|@Wsc;3kFzA#-t8oIuyE!WhML!DmX8eUI zUliZl4(g}$DaM{)F{`R;SC?Q89;80yu{~uccT6N@o?E?k`uWcywMpFb*3E;qIv=l_ zafS&4ggO2*+$ie|TqP^NpVYYXfbv3f1A($q+tzEc=s5 z*KT@ZOMugMEj|E5)x#Lfgg5`7u87+DqE|(UlUb6qMLo&GxoRtr;#ZFVZ4$`Glz1xY zt*+}}^fT=bfk1_H2somh`>o$D#8lJeqUlU0D4^(a+SsL;8RAb`2_!b>$?u#(zY@mn zpCvIm#H&X^sb=*&Ho<=e!umWJ(hLk^jBZpM?LsWP&Fc*kkc5_Yl@<^WE$aC|MWw2l z*m%+dJt@d0^BV*NF7Y9>{g|*k(?hL15opbGMt!vle!Y(XGtGdTKeGQ)&eQ3m1@doW zG)B{#+=ObX!NJ27>3C(4K=7mn9$uQ zh1Dp3wB4^mDqds^om0HKLp<@Gg-R#X-^Pbr*{+b@rtKbxkFBw1iqM%osD-Wz8A@8a zJt{nNUp8VW*Hjg<``#z?`2d0eX4FxCX(T27A*VP(0mi33R>xQFI(rU$4#PLBt>5OQbfi-w} z4)xj6aCc|`DAkTs!1y+Ys=VwX9jV(67c6Wch`VP7PpS_ub=tzF8u=esRNZ>CA2!Nj zEY7(HB`F}u8hW6uFp27|Hm8n;{)gm6*ZL`oPs{X5?jnP>Xj*b#It>~!*$4MD4Fi}r zicZ7xz7@pb4!D0U(2F@NEs~g!%aiU|(T{^Dac)~Uz}in}u~l3IVXn~QxTB?ZepnUp z*xT$P_uYItE+ZNQ=FsqF7qRqM%;c!4+m+kS1CZO;F4d56KF-8;@C;OJ8U_g?tQ2dy zBx~V21uyDft8m9D#9ENz;4DD^b3B_Q`!q0#wMIOx3tUd$S>fL<>SE~xGDGpL{i$Y= zy86(=yXyKbZ7z$2vs>`>|Hxaw=geS8=z)m+Or37c<$*DP8y@>lW4E(2dF6^eVygDL z8GOnPFCmYwo%rIuD&uU$qUre3J#5PF3$&+(G-ysi*R|e54;^;KU?~JBy|X*kZY%)` zJuc(+#o|GmVEgYb`mcwn2=!WgJ(Bxo^$FrA%#3bHu5(aT8h7Egei^4A$^o;H0&L~* zHY(n0R3yBdmYJ*)A^~`iU+BPa(2H7sTDG%MH^56=jo`){a5v`#QfuDGrn0-|tCB`= zWVLC)m<9IIwiqRC15-*JnVC%extr&!z^%$I7{~b7OjL_X{Cd*C@(wSOik>Q3ZLIU( zhl`;q+G?yI)2M`{7Rwm;gBEZuB)VOWP|+APRglCMc1brSW@a(TKm8dK$B(Ae(dNaln6Rm09I>~O&bt;U(0w%Z(`y+r2d%qm$E5L(vaD<#KRjCRHsoa8eyWXw)zWE3SI}uAo11q# z@zCa`>4~6kpGaUSV9Ck(t~omvLQTW<2FqelFbQ_(QpT;P_^eVUL&LP%B-DO8m)*Cd z-ereI3wTLAN&}7*p;fE5wvT&U<>fl=5BX&VW^rxxBF&9t=ZTZ-7a1-vbCHPY@x8}l z3cxx5O^2IOiuNTPEit0U!AEJCqmFv1h(;?do(*xakx0>sd}JcoR`Y**;uuTXSVJ9J zp#tP-gQ=%@7=y#N1Blbip`>}JL!Rqh(2V2HH9o+AVmu8^e;)c(bzQq%G9f1{Z;o{* zj}Ql`S!`Se+lkn|Ldz(@mwDE($`mudM(~JRJuieq%xqp67 zzGdybe&6=v<9kPwH4|ATpa51od3y6Ph*}tL*USWCvYb%gBoq?wU#R5rq6$)~N0r-(x!z=&Pk`jB z4{8l;WMnxzE0Ip#J!e$o*$QfLJ0r4~8h3oy5+S`*b{7HWFl9hLH8 zkl`6xnRyESKYq%#U-4DGyXV4zcPp3{UQZ*)t z`DAtv#nF?81?C|0^&Lb!#<=Y^&MGB65;|jAm6O+M(FC{Uwvs6L?#HX4F347Efmm8A zuMN)7xQ&s|Bsr2$LZ!KgFbuhfV~0FW56}| z)m0Y2_jWMtNM|;t$0A`|hehO8%pZy!Rc>gg27T2qgZLzCmf|=G$NYR3K}YZ5*_)lS zceC*7yB;{G2$3D7C=!%)(1PL4$U3n)yRsoh)X%`nbmUd5?gUJ}GKWZh$1SjSU5AfU zgdxhv(9X@y&Tr}4;!F$E%Yto2nvO~o15;7PNgmr$#muI%%qYjS@k3$T{ zE*-O&enx;)Oc8H0`fef+Dks$40Ui4F$Mq#vyhn3XW={H${Kk}Ff&US;^KXczUkcoV zIUP}UD$tOF7(6`(LWfZ;zugL$25fS2fPraZmcvh8x2a z6gxOQ&22qR(jSW0=a%*jd)6a|;HkN6A6Yf65wc zsnrXKBb#L39K$`Ij`cZZ7o>Qz8!Id6*Bg>S+d{L{-?kX})EV0#SW{}Ga@FI~u+m6$ zd4T6t$mJ1#^UCE|Fl~yc;PJ`A`f4QnTeuv5-Zn|&k+T_hw>j|Y#@9vcKwsX-=-28i zxCnOGYq~a;X?DAFKFKGb&4{@b-j)7IfhDWxd8tg8h4_6@zlh&c{%L|V3I6o*vIB=V zICA_U&W*3Hs%aSwOUJSvhz{r}DyrkzFK<~R_Lt1zVu$t*p5n%PG&(U3_ob$w+b{7F zwLT6PB#Py2Bg>v~r1KKSa&h0t+mFG_K3;c|5kL=arRes^d=7+YvjB(DBb-yY5%C=f zZ%ux>^U3eXs9F!M2+p-g18Szy{n(jjEc9H+5j5N`xsnlE~VXUdAw zsFvwg!HX($oA-}w1LG^~5}<>nE#;91+*!V5x3XCoTglA=nvZZ{4^MCK|Ij^$ObIwd zSc##Ky_~TQ=;v$|VlOv?94!fb4IR!&%=tPG3BI@Y$PKQxn&X7Gu1(GKiIwPIjGQFv zF+CI=i)Qx8r0YN9(8l89QM6cc^L;PtHGYh|DXuy2P=V=-ep-WXzr8r$@l_SdhepxR z#$vC(45CX$*?r%5dTG+KmbY!IFCf4TBfQOK_pkrtaGHqLHOt$n&;O+fOq?K+5$hoS z(3FFyU~EU6B(kO@d}Cf^XA-9J{_X6p76Wb5s05CS(n@vPj@_pf`pXx6sN0-weK!>X8a4pc%I*qWGX35|Gi}&>Yskf{TF@&#eA*B;s;4a z;BEz6G1JzJ(rAbiQ|wPN2r3%6VrdwbiHm)ERU>Z&Q|!f!u9T&wb9ns|wCXG|*o~q++_kEG#TR~U1+-SgcMQr@v z-S?&tsfj~-bC_m4t$i3}c^#yNkwTivj_(**k|(EVE=jF}g+@h%X9|)x!a~^D_(wD> z{=E2+0=yTu|Bqhixj5HemL!zwOkc8E3X36?R3NdXQ1g1_km1ErI*qWc6X!cO|DsJq zxIh*}Pj=_&v2XBoAw>rr(XzTAZY;^4nx3eqREnr6J&wU&Udu=!G{rC+<*(JVgO@#I zuD?7;=PScz0#F)*14}>XhD+yrwDjx~FeAa}w)OiZn?hka`>Mg$&g$Rw)lIL|?LRd;Q$A;@(d;4kgTV8<)xCEosPzru1OTdO{#aK+)fEFW92{B-EI&R5Kc9FIuA_m)k_9p=c&?kp40LN?c!JF7nic$rESI|nomXMvEKi(ptx z`s*lpG|rBU|72n5DfyaW>fg|;7mXhXanL)jn?Pe!hmq_c?<3QVys9Eir$0lKJ{@J+ zw_vFG&e|}Gc6NYItrJ2tp92AS=U?tg%G*AQVb{m_8YKKC#AJ1UM7j{@0>|_eK@D?<#r6!!ys=!mk6@ee)U69RFe-WfR zZ}CbF+9s^V8iL@Xb<);;LhY7SFPC%;+{>V^br$N0QL~~BlGW@`8=1JO3_H_S6?ehZ zWvKjYw{ir7CpY1wj+|}Nd)Xa&kK;7RDiB(}t-Y-RYtfSM3xLn*Am^*wC0 z#qagwb=+8Y?N3AD1NVt+bVJ?C92FX%%^^|!_mZyTX%%67c&x@+2LX>40nB-2&UsZI zbRzUGn$g7)FvxD7m=ihi2{ee4{y22oB`jP4z>_F&`p6M zq53MUXC>h|CF>H(V(h9ZOM2V}gWLd-uvSE=V9-9#VSM?sqk-v7$+qqDeaS@FZK66J3`_hnwf z`ccGU3+V3%x?kM8q{AwAFMvu9-mJ`!YT3corOA5yn~vKE-qELgDo*8SK>y4`bHy=_ zYm*HCTwb{NRr6)(rR6{caa%FIUNuv^yt^uTE`F2PMUEXY;l_?)atHn)DoX5i7ath# zW=bf3VV6w=KhjjqyD0LqB`&(luPI^ZoWI(^m$=OzH^>*6hXpy6zyB!>e6XjQ}lhWz02@ml$B6i- zY2_~-z#o6Vfv4$Mu$?dcM^-T{gDF@aOC*1l4%qO0`?{qYRU@?sOs@VJx=R)hE!CX$ zACkb4XY%cWx4TI6JS(xl!l~z{(g1hHTB?UNZs6VzJUZs}h+#w;<9}9kekTeGiAv9j zdKhu&OdQ0F0Xs9aYMh7@D^k|YET$%aZEhf@*8@0>{*We6C1urp+I;Ls>f}yA%VlL| zy}}a6V8LR9_UF4}fcFhYv+e#ac;O>)50Jq^$$Jhdj5*P0@E|-5Ud|V{1on(+2)RSB z^bfmto2EU0E{BC&O+X2u8#36niqb`k`Y5PfS(Kge6IR+p{JJtVq66}jF*79ie{{Wd zSQOtEFuoul-6;~%-Hk{{BS<$3!qO>7$Wl^DH%KE$NXpVJAh483v$TW=EG=E{fS>RC zywC4>et!(?+`0Fhb5Gv6Gjk5RzBvRvFh~l93rz`&IHi)xyI~2Q#mxesHy4hNT+_;% zEtr1XNCSbcj%RXgI{o9F;~K(lzukO6SWs>c1TewL53c*%JLx5}Zr6sSi*j!AxA`ZJ zj04Mmq*q~-E{27BIOsaHtNq_h#gG^v2%-7U2>HHbzK!vL4Oi}6vo=F zK7Z)DRv6A{e+!8UZ^e|4!1~wx0jfcSO}kF-D$sYFxGiRIWPFU-%IaY4I<4$pJph>? zc{K{XkXK0H8#k&GRKkevy2}*HNvj&$Q~W!HBCOE$ihRWz-Udn@s97v_AW3tq9=w}7 zy>UU!Q72zfz=Jyl1LY^=rVl|Bv(F_!GHW@}6n_$&sfLK}K!QLets$7%jJQyK;B#z{ z=HkQ{6|Pl;x9N%HU23Yl)_<=g^j!0{v*Idq%#89lzR`r z$}eDhYvIV`Zp3^}3;2FoXROuJ>E8Fa`X}En{i1|AK<@xuReSS(!IGCHl{xL83Xwy5 zLLwQQUvTz>vZeZZuCi-r$>Vn(?PIa1MpDl*5Zh~p77|Dbz!*7`+H@Mk=+rs4HGpNN z=u+oV@3TO3qx-XVYVZ3_*tN~`V|@CP4`ua%v~Az+`+{EFU-AJmgfuXg0sJAH=kl(z z_~Y;n2FS$iwuuwZ%6zVk{{E7&o~=I4GrtpUKrWb-?cVm3nGLr0!1BIDlpmQ40PM2f zh1Um{1A~Lg(C^M$=RS)Uy>j|$k9JSY&l{Ihq39U@dl+o5>+*_`g?Cs@$EDnL6iEIN zOzv#MFlU|#=KwhV{lufW**FjAqnWdQo{`C6%&mEXy4(*Wq7cHBN1+U`Hy^%~P<4F~7zk9X`6eL-nO~bg<9-(12adbbqz*|& z=xW5Q?6mJbAbFWIRgVNKb>5h-MB)x-VpQAi0wXncw%Kr(Yuet)((O$ZDoAWN z1QUGnkNi2M-_;xH&i`>D8mVBzc$cgpV5TLBH1r*PQ2wcO>VsxNqKEQ5Og3)Huzl?2 zm)tdfzJ+*y$p2%mK0DA(jc>J`FY=FYFJBC5gaXSw?9V%od%%OO|4k{iuJgQNxO*J+ z&dz7?pUD#f+mp1}r5!vjzKXJ5mm3n`&(O~0!FV3KQdjlzYzx5CAo+&NCyBFg|!<_)5 zE4D&K5!Pgj~jMZ_^t5yh&xrulj=6CxED=rF>WW``H_L`e_V{hK(PJ;)gROMYsHJ7s#pJCqLNH$ z=v#m?RFLxCMS$<~#pw{)f8oK~kHOLLpQs*HEM0K*(BD~sovULfZ0^zhyzUheDD2Eq)ZOXQTK)TFi-S53 zhC9IUiV2H&|I507JFOsu2Yfx#dddx0#4U26P4&ABDaOy~I>H80CqK3bddpX~`b6Z; zSDj>`3-Vq`F`bLa0@0Z4UD32+aq%neNB-U*%(b6J%}4aXcmA3lSo<$H;ll15?>pT5 z92`Jt>lS(j!AAynks#tRsWo3T-gt$q7X-1bT?=HOAugLauYhhe01xa%d@8p_0&js# zIWH_oqI{oKa)y-0Z~;I=N;Y)#s3CnekTe0n8|B~o^(*8)(iouzz*y#mKqy>A?veIO zN_1d_S5HobVBR?{d&lNplDa!;jAnT&yOvff$=LwYXR6$rYfEyYgt{r|0|4k>J5Nh= z+=YSoLWDiA5^=QVr8WWuJqC>OzCYy8*~-Z!lL+TPyDQ#39uZhRuyBFjM+m-|o=Wo8 ziCy?CkWA-u#pMTiskA+eyGYVL)6$Y0+C`81Z5waA5=L#Nm!s@};+ufO7A7w*8JKOw zoo8|`*3jv<|E=aj+N(t>`qtM80Vfhu`Z&pe5nDQ5zI%F7iL|Z*XlzFe&Uq5In3cDv zao(eqm+r7;a0C+M#1~#}y!mSA8FL>bMebqZ&{$GrRTHiMObC^F?erarJL zgFWpy{&kglCuTqIm)lIy*%`+1!U^aAoDN)5?lUg+`$(Su5TSn$9zOP2*#IY2AEzA1 z-m_+SGRpyFzl*1$&;?W0>etm<*-HYz=zT(2U@;IBc(ANcaR=M0{qo(BNlTS>d>xPu z2w0AYa$<#QQ3km-&?N+$)_!ParDp$3?)<3GxHg7Q_w!>KCENK1nsAgSl;`k=Icgt! zB;Owey#JZK*qg#9qC$MXI-s{xNXULuChNro&j4g(co)Gzc|BhvKvS7h`M~SxzGQWCL#Ci6*+3Cj)&8FrC*kklH9Kq;KhF`eM%gK`CjcGf*1@%2~p0Mou>I zUZW&W3*g_Bp@L@OGW#0bi6yu3qMnjKyi?m=02!2CK!BpInNuwJY`EV74OAlNmPK9U zWlb*(GURJ<%BYh{?Mg5s+3Gct-XyB9>>yLh|7y@bCl^e){C0%HV|(Df*RWk(eCWhV_NmUaO|wFKo6mF0VsQPS@U<;wu)o6Y@z+#%LrP)Of%-^pts({ zj-D4$emrm&w*c_$PRpUE5KlfYJ1FRpIlP;X1@0mqu+2wBHflfyl96)hz`W(Mehajo zxZQSdwW>BCM$>?#z_bV)8pv%{@)Te#7Q~wz9(q^3DA`ul-(uqJ^ zjk(y9mx{ymOgHg{044ruynl<1$aV?5*023X`E+g=?^;q*7$(`%0AXDG$^{zI(Pm}?T2ZY>IPF2#ZY5t zkt%4(_B4JPJxdBzF#7CdR+L>yI*?fZX0MhM`)b$LcfH6Svo=C5{cWP_V%F*WY3qj6 zxTFU`_xwgUp&aIur?gLFrZ9l@4kHNy{w#xFA8a2n(aY3VzRK|T`Gq%uD4a=vZZ0FUQtzszd!-tsy)0Wy6=^$1F<0_DfK z<0?28Ow>fBA}V~e1-DO!Q6m)*Z=stk20sprV4l63N#nE}&Up{hOCWCUs&iZyG1fg%6D8a{AAW&zN?S^|az7@Xk4*>} z6j(vzS~hwi)^FsbZX6YDT&8D2wPI5%uXY$$4|VCbF4*27nw$!n^#|%498a-@TDQya zD@l6aj!7=UT{iy6FP$ZyCMN}!i%gePj-a@D(V3Tf6*NydPENV>lP~VO93<>Qyi^So z`*Jb7gSUCtAM~Zb8w&Z~7W_9R

uKpp3Sqp5;#LVI6bPDO*rIKL`h7-WvtH|ZzZhR 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%0DX#^I-fwI2;dkr!vS^WF$im?FX@Ea&%V9<)S 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 diff --git a/modules/40-define-functions/500-reading-documentation/Makefile b/modules/40-define-functions/500-reading-documentation/Makefile deleted file mode 100644 index d0d0a48c..00000000 --- a/modules/40-define-functions/500-reading-documentation/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -test: - @ test.sh diff --git a/modules/40-define-functions/500-reading-documentation/SolutionTest.php b/modules/40-define-functions/500-reading-documentation/SolutionTest.php deleted file mode 100644 index 4b6720a8..00000000 --- a/modules/40-define-functions/500-reading-documentation/SolutionTest.php +++ /dev/null @@ -1,18 +0,0 @@ -assertEquals(10.0, getAge(10)); - $this->assertEquals(9.0, getAge(9.1)); - $this->assertEquals(8.0, getAge(8.9)); - $this->assertEquals(8.0, getAge(8.5)); - } -} diff --git a/modules/40-define-functions/500-reading-documentation/description.es.yml b/modules/40-define-functions/500-reading-documentation/description.es.yml deleted file mode 100644 index efabd3db..00000000 --- a/modules/40-define-functions/500-reading-documentation/description.es.yml +++ /dev/null @@ -1,54 +0,0 @@ ---- - -name: Lectura de la documentación -theory: | - - Saber leer la documentación es una de las habilidades más importantes para cualquier desarrollador. - - _A pesar de que existe una traducción, recomiendo aprender a utilizar la documentación en inglés. Las bibliotecas que se utilizan en cientos de proyectos reales casi siempre tienen solo descripciones en inglés._ - - La sección principal a la que los programadores vuelven constantemente es el manual de funciones del lenguaje. En primer lugar, hay muchas funciones y es imposible recordar todo. En segundo lugar, en PHP el problema de la inconsistencia de los parámetros y los valores de retorno de las funciones es especialmente agudo. Por lo tanto, constantemente hay que recordar su orden. - - Para describir las funciones se utiliza una notación propia (su propia sintaxis). Se parece un poco a PHP, pero aún así es diferente, en otras palabras, no es código PHP, sino solo una descripción de la firma de la función. Veamos la función `round()`, que redondea un número: - - ``` - round(int|float $num, int $precision = 0, int $mode = PHP_ROUND_HALF_UP): float - ``` - - El propósito de este formato es mostrar de manera visual los tipos, la cantidad y los valores predeterminados de los parámetros de entrada, así como el tipo del parámetro de salida. Este último siempre se encuentra en la posición más a la derecha, justo después de los dos puntos. En este caso, el tipo de valor de retorno es `float`. - - La enumeración de los parámetros se realiza separándolos por comas entre paréntesis después del nombre de la función. Antes de cada nombre de parámetro se encuentra su tipo. Por ejemplo, el tipo del parámetro `$num` es `float`. El valor predeterminado se establece mediante una asignación, por ejemplo, `$precision` tiene un valor predeterminado de cero. - - Los parámetros con valores predeterminados son parámetros opcionales de la función, y se separan por comas entre sí. Para la función anterior, estos son `$precision` y `$mode`. `$mode`, a su vez, tiene un valor predeterminado igual al valor de la constante `PHP_ROUND_HALF_UP`. Si algún parámetro tiene un valor igual al valor de una constante, significa que en la documentación de esta función hay una enumeración y descripción de todas las constantes posibles que se pueden utilizar como valor de este parámetro. - - Basándonos en lo dicho anteriormente, podemos llamar a la función de la siguiente manera: - - ```php - Date: Thu, 11 Jun 2026 18:46:08 +0500 Subject: [PATCH 20/29] =?UTF-8?q?feat(31-advanced-strings):=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=BE=D1=81=20=D1=83=D1=80=D0=BE=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B8=D0=B7=2060-deep-into-strings=20=D0=B2=20=D1=85?= =?UTF-8?q?=D0=B2=D0=BE=D1=81=D1=82=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= =?UTF-8?q?,=20=D0=B8=D0=BB=D0=BB=D1=8E=D1=81=D1=82=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20symbols?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 60-deep-into-strings/{10-unicode,30-locales,40-startwith} -> 31-advanced-strings/{100-unicode,110-locales,120-startwith}; модуль 60 удален; namespace DeepIntoStrings -> AdvancedStrings - уроки адаптированы под уровень модуля 31 (решение гейта): задания и эталоны переписаны прямым кодом без функций/циклов/условий — 100-unicode: strlen vs mb_strlen на 'Привет!' (13 / 7); 120-startwith: позиция подстроки через mb_strpos, ловушка 0 vs false описана текстом с отсылкой к будущим урокам логики; 110-locales уже соответствовал уровню - en/es уроков 100/120 устарели — на фазу перевода - 30-symbols: перенос языконезависимой иллюстрации symbols.png из Python Co-Authored-By: Claude Fable 5 --- .../10-unicode => 31-advanced-strings/100-unicode}/Makefile | 0 .../100-unicode}/SolutionTest.php | 0 .../100-unicode}/description.es.yml | 0 .../100-unicode}/en/EXERCISE.md | 0 .../100-unicode}/en/README.md | 0 .../100-unicode}/en/data.yml | 0 .../100-unicode}/es/EXERCISE.md | 0 .../100-unicode}/es/README.md | 0 .../100-unicode}/es/data.yml | 0 .../10-unicode => 31-advanced-strings/100-unicode}/index.php | 0 .../100-unicode}/ru/EXERCISE.md | 0 .../100-unicode}/ru/README.md | 0 .../100-unicode}/ru/data.yml | 0 .../30-locales => 31-advanced-strings/110-locales}/Makefile | 0 .../110-locales}/SolutionTest.php | 0 .../110-locales}/description.es.yml | 0 .../110-locales}/en/EXERCISE.md | 0 .../110-locales}/en/README.md | 0 .../110-locales}/en/data.yml | 0 .../110-locales}/es/EXERCISE.md | 0 .../110-locales}/es/README.md | 0 .../110-locales}/es/data.yml | 0 .../30-locales => 31-advanced-strings/110-locales}/index.php | 0 .../110-locales}/ru/EXERCISE.md | 0 .../110-locales}/ru/README.md | 0 .../110-locales}/ru/data.yml | 0 .../120-startwith}/Makefile | 0 .../120-startwith}/SolutionTest.php | 0 .../120-startwith}/description.es.yml | 0 .../120-startwith}/en/EXERCISE.md | 0 .../120-startwith}/en/README.md | 0 .../120-startwith}/en/data.yml | 0 .../120-startwith}/es/EXERCISE.md | 0 .../120-startwith}/es/README.md | 0 .../120-startwith}/es/data.yml | 0 .../120-startwith}/index.php | 0 .../120-startwith}/ru/EXERCISE.md | 0 .../120-startwith}/ru/README.md | 0 .../120-startwith}/ru/data.yml | 0 modules/60-deep-into-strings/description.en.yml | 5 ----- modules/60-deep-into-strings/description.es.yml | 5 ----- modules/60-deep-into-strings/description.ru.yml | 5 ----- 42 files changed, 15 deletions(-) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/Makefile (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/SolutionTest.php (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/description.es.yml (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/en/EXERCISE.md (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/en/README.md (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/en/data.yml (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/es/EXERCISE.md (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/es/README.md (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/es/data.yml (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/index.php (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/ru/EXERCISE.md (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/ru/README.md (100%) rename modules/{60-deep-into-strings/10-unicode => 31-advanced-strings/100-unicode}/ru/data.yml (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/Makefile (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/SolutionTest.php (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/description.es.yml (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/en/EXERCISE.md (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/en/README.md (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/en/data.yml (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/es/EXERCISE.md (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/es/README.md (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/es/data.yml (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/index.php (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/ru/EXERCISE.md (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/ru/README.md (100%) rename modules/{60-deep-into-strings/30-locales => 31-advanced-strings/110-locales}/ru/data.yml (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/Makefile (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/SolutionTest.php (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/description.es.yml (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/en/EXERCISE.md (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/en/README.md (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/en/data.yml (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/es/EXERCISE.md (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/es/README.md (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/es/data.yml (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/index.php (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/ru/EXERCISE.md (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/ru/README.md (100%) rename modules/{60-deep-into-strings/40-startwith => 31-advanced-strings/120-startwith}/ru/data.yml (100%) delete mode 100644 modules/60-deep-into-strings/description.en.yml delete mode 100644 modules/60-deep-into-strings/description.es.yml delete mode 100644 modules/60-deep-into-strings/description.ru.yml diff --git a/modules/60-deep-into-strings/10-unicode/Makefile b/modules/31-advanced-strings/100-unicode/Makefile similarity index 100% rename from modules/60-deep-into-strings/10-unicode/Makefile rename to modules/31-advanced-strings/100-unicode/Makefile diff --git a/modules/60-deep-into-strings/10-unicode/SolutionTest.php b/modules/31-advanced-strings/100-unicode/SolutionTest.php similarity index 100% rename from modules/60-deep-into-strings/10-unicode/SolutionTest.php rename to modules/31-advanced-strings/100-unicode/SolutionTest.php diff --git a/modules/60-deep-into-strings/10-unicode/description.es.yml b/modules/31-advanced-strings/100-unicode/description.es.yml similarity index 100% rename from modules/60-deep-into-strings/10-unicode/description.es.yml rename to modules/31-advanced-strings/100-unicode/description.es.yml diff --git a/modules/60-deep-into-strings/10-unicode/en/EXERCISE.md b/modules/31-advanced-strings/100-unicode/en/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/10-unicode/en/EXERCISE.md rename to modules/31-advanced-strings/100-unicode/en/EXERCISE.md diff --git a/modules/60-deep-into-strings/10-unicode/en/README.md b/modules/31-advanced-strings/100-unicode/en/README.md similarity index 100% rename from modules/60-deep-into-strings/10-unicode/en/README.md rename to modules/31-advanced-strings/100-unicode/en/README.md diff --git a/modules/60-deep-into-strings/10-unicode/en/data.yml b/modules/31-advanced-strings/100-unicode/en/data.yml similarity index 100% rename from modules/60-deep-into-strings/10-unicode/en/data.yml rename to modules/31-advanced-strings/100-unicode/en/data.yml diff --git a/modules/60-deep-into-strings/10-unicode/es/EXERCISE.md b/modules/31-advanced-strings/100-unicode/es/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/10-unicode/es/EXERCISE.md rename to modules/31-advanced-strings/100-unicode/es/EXERCISE.md diff --git a/modules/60-deep-into-strings/10-unicode/es/README.md b/modules/31-advanced-strings/100-unicode/es/README.md similarity index 100% rename from modules/60-deep-into-strings/10-unicode/es/README.md rename to modules/31-advanced-strings/100-unicode/es/README.md diff --git a/modules/60-deep-into-strings/10-unicode/es/data.yml b/modules/31-advanced-strings/100-unicode/es/data.yml similarity index 100% rename from modules/60-deep-into-strings/10-unicode/es/data.yml rename to modules/31-advanced-strings/100-unicode/es/data.yml diff --git a/modules/60-deep-into-strings/10-unicode/index.php b/modules/31-advanced-strings/100-unicode/index.php similarity index 100% rename from modules/60-deep-into-strings/10-unicode/index.php rename to modules/31-advanced-strings/100-unicode/index.php diff --git a/modules/60-deep-into-strings/10-unicode/ru/EXERCISE.md b/modules/31-advanced-strings/100-unicode/ru/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/10-unicode/ru/EXERCISE.md rename to modules/31-advanced-strings/100-unicode/ru/EXERCISE.md diff --git a/modules/60-deep-into-strings/10-unicode/ru/README.md b/modules/31-advanced-strings/100-unicode/ru/README.md similarity index 100% rename from modules/60-deep-into-strings/10-unicode/ru/README.md rename to modules/31-advanced-strings/100-unicode/ru/README.md diff --git a/modules/60-deep-into-strings/10-unicode/ru/data.yml b/modules/31-advanced-strings/100-unicode/ru/data.yml similarity index 100% rename from modules/60-deep-into-strings/10-unicode/ru/data.yml rename to modules/31-advanced-strings/100-unicode/ru/data.yml diff --git a/modules/60-deep-into-strings/30-locales/Makefile b/modules/31-advanced-strings/110-locales/Makefile similarity index 100% rename from modules/60-deep-into-strings/30-locales/Makefile rename to modules/31-advanced-strings/110-locales/Makefile diff --git a/modules/60-deep-into-strings/30-locales/SolutionTest.php b/modules/31-advanced-strings/110-locales/SolutionTest.php similarity index 100% rename from modules/60-deep-into-strings/30-locales/SolutionTest.php rename to modules/31-advanced-strings/110-locales/SolutionTest.php diff --git a/modules/60-deep-into-strings/30-locales/description.es.yml b/modules/31-advanced-strings/110-locales/description.es.yml similarity index 100% rename from modules/60-deep-into-strings/30-locales/description.es.yml rename to modules/31-advanced-strings/110-locales/description.es.yml diff --git a/modules/60-deep-into-strings/30-locales/en/EXERCISE.md b/modules/31-advanced-strings/110-locales/en/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/30-locales/en/EXERCISE.md rename to modules/31-advanced-strings/110-locales/en/EXERCISE.md diff --git a/modules/60-deep-into-strings/30-locales/en/README.md b/modules/31-advanced-strings/110-locales/en/README.md similarity index 100% rename from modules/60-deep-into-strings/30-locales/en/README.md rename to modules/31-advanced-strings/110-locales/en/README.md diff --git a/modules/60-deep-into-strings/30-locales/en/data.yml b/modules/31-advanced-strings/110-locales/en/data.yml similarity index 100% rename from modules/60-deep-into-strings/30-locales/en/data.yml rename to modules/31-advanced-strings/110-locales/en/data.yml diff --git a/modules/60-deep-into-strings/30-locales/es/EXERCISE.md b/modules/31-advanced-strings/110-locales/es/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/30-locales/es/EXERCISE.md rename to modules/31-advanced-strings/110-locales/es/EXERCISE.md diff --git a/modules/60-deep-into-strings/30-locales/es/README.md b/modules/31-advanced-strings/110-locales/es/README.md similarity index 100% rename from modules/60-deep-into-strings/30-locales/es/README.md rename to modules/31-advanced-strings/110-locales/es/README.md diff --git a/modules/60-deep-into-strings/30-locales/es/data.yml b/modules/31-advanced-strings/110-locales/es/data.yml similarity index 100% rename from modules/60-deep-into-strings/30-locales/es/data.yml rename to modules/31-advanced-strings/110-locales/es/data.yml diff --git a/modules/60-deep-into-strings/30-locales/index.php b/modules/31-advanced-strings/110-locales/index.php similarity index 100% rename from modules/60-deep-into-strings/30-locales/index.php rename to modules/31-advanced-strings/110-locales/index.php diff --git a/modules/60-deep-into-strings/30-locales/ru/EXERCISE.md b/modules/31-advanced-strings/110-locales/ru/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/30-locales/ru/EXERCISE.md rename to modules/31-advanced-strings/110-locales/ru/EXERCISE.md diff --git a/modules/60-deep-into-strings/30-locales/ru/README.md b/modules/31-advanced-strings/110-locales/ru/README.md similarity index 100% rename from modules/60-deep-into-strings/30-locales/ru/README.md rename to modules/31-advanced-strings/110-locales/ru/README.md diff --git a/modules/60-deep-into-strings/30-locales/ru/data.yml b/modules/31-advanced-strings/110-locales/ru/data.yml similarity index 100% rename from modules/60-deep-into-strings/30-locales/ru/data.yml rename to modules/31-advanced-strings/110-locales/ru/data.yml diff --git a/modules/60-deep-into-strings/40-startwith/Makefile b/modules/31-advanced-strings/120-startwith/Makefile similarity index 100% rename from modules/60-deep-into-strings/40-startwith/Makefile rename to modules/31-advanced-strings/120-startwith/Makefile diff --git a/modules/60-deep-into-strings/40-startwith/SolutionTest.php b/modules/31-advanced-strings/120-startwith/SolutionTest.php similarity index 100% rename from modules/60-deep-into-strings/40-startwith/SolutionTest.php rename to modules/31-advanced-strings/120-startwith/SolutionTest.php diff --git a/modules/60-deep-into-strings/40-startwith/description.es.yml b/modules/31-advanced-strings/120-startwith/description.es.yml similarity index 100% rename from modules/60-deep-into-strings/40-startwith/description.es.yml rename to modules/31-advanced-strings/120-startwith/description.es.yml diff --git a/modules/60-deep-into-strings/40-startwith/en/EXERCISE.md b/modules/31-advanced-strings/120-startwith/en/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/40-startwith/en/EXERCISE.md rename to modules/31-advanced-strings/120-startwith/en/EXERCISE.md diff --git a/modules/60-deep-into-strings/40-startwith/en/README.md b/modules/31-advanced-strings/120-startwith/en/README.md similarity index 100% rename from modules/60-deep-into-strings/40-startwith/en/README.md rename to modules/31-advanced-strings/120-startwith/en/README.md diff --git a/modules/60-deep-into-strings/40-startwith/en/data.yml b/modules/31-advanced-strings/120-startwith/en/data.yml similarity index 100% rename from modules/60-deep-into-strings/40-startwith/en/data.yml rename to modules/31-advanced-strings/120-startwith/en/data.yml diff --git a/modules/60-deep-into-strings/40-startwith/es/EXERCISE.md b/modules/31-advanced-strings/120-startwith/es/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/40-startwith/es/EXERCISE.md rename to modules/31-advanced-strings/120-startwith/es/EXERCISE.md diff --git a/modules/60-deep-into-strings/40-startwith/es/README.md b/modules/31-advanced-strings/120-startwith/es/README.md similarity index 100% rename from modules/60-deep-into-strings/40-startwith/es/README.md rename to modules/31-advanced-strings/120-startwith/es/README.md diff --git a/modules/60-deep-into-strings/40-startwith/es/data.yml b/modules/31-advanced-strings/120-startwith/es/data.yml similarity index 100% rename from modules/60-deep-into-strings/40-startwith/es/data.yml rename to modules/31-advanced-strings/120-startwith/es/data.yml diff --git a/modules/60-deep-into-strings/40-startwith/index.php b/modules/31-advanced-strings/120-startwith/index.php similarity index 100% rename from modules/60-deep-into-strings/40-startwith/index.php rename to modules/31-advanced-strings/120-startwith/index.php diff --git a/modules/60-deep-into-strings/40-startwith/ru/EXERCISE.md b/modules/31-advanced-strings/120-startwith/ru/EXERCISE.md similarity index 100% rename from modules/60-deep-into-strings/40-startwith/ru/EXERCISE.md rename to modules/31-advanced-strings/120-startwith/ru/EXERCISE.md diff --git a/modules/60-deep-into-strings/40-startwith/ru/README.md b/modules/31-advanced-strings/120-startwith/ru/README.md similarity index 100% rename from modules/60-deep-into-strings/40-startwith/ru/README.md rename to modules/31-advanced-strings/120-startwith/ru/README.md diff --git a/modules/60-deep-into-strings/40-startwith/ru/data.yml b/modules/31-advanced-strings/120-startwith/ru/data.yml similarity index 100% rename from modules/60-deep-into-strings/40-startwith/ru/data.yml rename to modules/31-advanced-strings/120-startwith/ru/data.yml diff --git a/modules/60-deep-into-strings/description.en.yml b/modules/60-deep-into-strings/description.en.yml deleted file mode 100644 index 04003d39..00000000 --- a/modules/60-deep-into-strings/description.en.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -name: Diving into the lines -description: | - СModern string encoding and handling of strings in PHP using functions for multi-byte encodings. Localization. diff --git a/modules/60-deep-into-strings/description.es.yml b/modules/60-deep-into-strings/description.es.yml deleted file mode 100644 index eb7c2744..00000000 --- a/modules/60-deep-into-strings/description.es.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -name: Sumergiéndose en las cadenas -description: | - Codificación moderna de cadenas y su manipulación en PHP utilizando funciones para codificaciones multibyte. Localización. diff --git a/modules/60-deep-into-strings/description.ru.yml b/modules/60-deep-into-strings/description.ru.yml deleted file mode 100644 index 682536f6..00000000 --- a/modules/60-deep-into-strings/description.ru.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -name: Погружаясь в строки -description: | - Современное кодирование строк и работа с ними в PHP, используя функции для многобайтовых кодировок. Локализация. From 6ef98a30483751345fcd67be75231d84840b285d Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Thu, 11 Jun 2026 18:51:53 +0500 Subject: [PATCH 21/29] =?UTF-8?q?feat(50-loops):=20=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=8F=D0=B4=D0=BE=D0=BA=20=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20Python=20=E2=80=94=20=D1=83?= =?UTF-8?q?=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=20=D0=B2=20=D1=86=D0=B8?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=85=20=D0=B4=D0=BE=20=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D0=B5=D0=B3=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 26-conditions-inside-loops -> 15 (позиция Python, до агрегации); теория без блока «Агрегация с условием» (в Python его нет); задание countChars -> countHashtags (порт count_hashtags) - задания агрегации заменены питоновскими с жизненным контекстом: 20: multiplyNumbersFromRange -> calculateElectricityBill (ступенчатый тариф) 23: joinNumbersFromRange -> sanitizePhoneNumber (очистка номера, str_contains) 25: printReversedWordBySymbol -> maskCardNumber (маскирование карты) решения в полной форме ($x = $x + 1) — сахар вводится только в 30 - namespace-опечатки исправлены: AgregationNumber(s) -> AggregationNumbers, AgregationString -> AggregationStrings - delete 29-edge-cases (вердикт второго прохода) - теория 10-while переписана по новой питоновской структуре (Первый пример / По шагам / Тело цикла / Цикл внутри функции); теория 20 приведена к Python (перенесена иллюстрация iterations.png, убраны Excel-абзац и вопросы-затравки, PHP-вставка про Undefined variable сохранена) - while.png не переносится (на иллюстрации Python-код) - en/es EXERCISE уроков 15/20/23/25 устарели — на фазу перевода Co-Authored-By: Claude Fable 5 --- modules/50-loops/10-while/ru/README.md | 145 ++++++++---------- .../Makefile | 0 .../SolutionTest.php | 18 +++ .../description.es.yml | 0 .../en/EXERCISE.md | 0 .../en/README.md | 0 .../en/data.yml | 0 .../es/EXERCISE.md | 0 .../es/README.md | 0 .../es/data.yml | 0 .../15-conditions-inside-loops/index.php | 19 +++ .../15-conditions-inside-loops/ru/EXERCISE.md | 9 ++ .../ru/README.md | 41 ----- .../ru/assets/conditions-inside-loops.png | Bin .../ru/data.yml | 0 .../20-aggregation-numbers/SolutionTest.php | 10 +- .../50-loops/20-aggregation-numbers/index.php | 22 ++- .../20-aggregation-numbers/ru/EXERCISE.md | 18 ++- .../20-aggregation-numbers/ru/README.md | 19 +-- .../ru/assets/iterations.png | Bin 0 -> 68105 bytes .../23-aggregation-strings/SolutionTest.php | 8 +- .../50-loops/23-aggregation-strings/index.php | 13 +- .../23-aggregation-strings/ru/EXERCISE.md | 15 +- .../25-iteration-over-string/SolutionTest.php | 7 +- .../25-iteration-over-string/index.php | 19 ++- .../25-iteration-over-string/ru/EXERCISE.md | 14 +- .../SolutionTest.php | 18 --- .../26-conditions-inside-loops/index.php | 19 --- .../26-conditions-inside-loops/ru/EXERCISE.md | 9 -- modules/50-loops/29-edge-cases/Makefile | 2 - .../50-loops/29-edge-cases/SolutionTest.php | 23 --- .../50-loops/29-edge-cases/description.es.yml | 110 ------------- modules/50-loops/29-edge-cases/en/EXERCISE.md | 31 ---- modules/50-loops/29-edge-cases/en/README.md | 35 ----- modules/50-loops/29-edge-cases/en/data.yml | 2 - modules/50-loops/29-edge-cases/es/EXERCISE.md | 30 ---- modules/50-loops/29-edge-cases/es/README.md | 72 --------- modules/50-loops/29-edge-cases/es/data.yml | 3 - modules/50-loops/29-edge-cases/index.php | 22 --- modules/50-loops/29-edge-cases/ru/EXERCISE.md | 30 ---- modules/50-loops/29-edge-cases/ru/README.md | 72 --------- modules/50-loops/29-edge-cases/ru/data.yml | 3 - 42 files changed, 190 insertions(+), 668 deletions(-) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/Makefile (100%) create mode 100644 modules/50-loops/15-conditions-inside-loops/SolutionTest.php rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/description.es.yml (100%) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/en/EXERCISE.md (100%) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/en/README.md (100%) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/en/data.yml (100%) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/es/EXERCISE.md (100%) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/es/README.md (100%) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/es/data.yml (100%) create mode 100644 modules/50-loops/15-conditions-inside-loops/index.php create mode 100644 modules/50-loops/15-conditions-inside-loops/ru/EXERCISE.md rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/ru/README.md (67%) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/ru/assets/conditions-inside-loops.png (100%) rename modules/50-loops/{26-conditions-inside-loops => 15-conditions-inside-loops}/ru/data.yml (100%) create mode 100644 modules/50-loops/20-aggregation-numbers/ru/assets/iterations.png delete mode 100644 modules/50-loops/26-conditions-inside-loops/SolutionTest.php delete mode 100644 modules/50-loops/26-conditions-inside-loops/index.php delete mode 100644 modules/50-loops/26-conditions-inside-loops/ru/EXERCISE.md delete mode 100644 modules/50-loops/29-edge-cases/Makefile delete mode 100644 modules/50-loops/29-edge-cases/SolutionTest.php delete mode 100644 modules/50-loops/29-edge-cases/description.es.yml delete mode 100644 modules/50-loops/29-edge-cases/en/EXERCISE.md delete mode 100644 modules/50-loops/29-edge-cases/en/README.md delete mode 100644 modules/50-loops/29-edge-cases/en/data.yml delete mode 100644 modules/50-loops/29-edge-cases/es/EXERCISE.md delete mode 100644 modules/50-loops/29-edge-cases/es/README.md delete mode 100644 modules/50-loops/29-edge-cases/es/data.yml delete mode 100644 modules/50-loops/29-edge-cases/index.php delete mode 100644 modules/50-loops/29-edge-cases/ru/EXERCISE.md delete mode 100644 modules/50-loops/29-edge-cases/ru/README.md delete mode 100644 modules/50-loops/29-edge-cases/ru/data.yml diff --git a/modules/50-loops/10-while/ru/README.md b/modules/50-loops/10-while/ru/README.md index bca12c38..dcdf5aed 100644 --- a/modules/50-loops/10-while/ru/README.md +++ b/modules/50-loops/10-while/ru/README.md @@ -1,121 +1,106 @@ -Программы, которые мы пишем, становятся все сложнее и объемнее. Они все еще очень далеки от реальных программ, где количество строк кода измеряется десятками и сотнями тысяч. Текущая сложность уже способна заставить напрячься людей без опыта. Начиная с этого урока, мы переходим к одной из самых сложных базовых тем в программировании – **циклам**. +Помимо условных конструкций, в программировании невозможно обойтись без циклов. Это специальный механизм, позволяющий выполнять любое действие многократно. На его базе строятся практически любые вычисления — от подсчета среднего балла в группе до обработки входящих запросов на сайтах. -Любые прикладные программы служат прагматичным целям. Они помогают управлять сотрудниками и финансами, развлекают, в конце концов. Несмотря на различия, все эти программы выполняют заложенные в них алгоритмы, которые похожи между собой. Что это такое? **Алгоритм** — это последовательность действий или инструкций, которая приводит нас к некоему ожидаемому результату. Это описание подходит под любую программу, но под алгоритмами обычно понимается что-то более специфичное. +Цикл хранит повторяющееся действие в одном месте и запускает его снова, пока условие остается истинным. -Представьте себе, что у нас есть книга, и мы хотим найти внутри нее какую-то конкретную фразу. Саму фразу мы помним, но не знаем, на какой она странице. Как найти нужную страницу? Самый простой и долгий способ — последовательно просматривать страницы до тех пор, пока мы не найдем нужную фразу. В худшем случае придется просмотреть все страницы, но результат мы все равно получим. Именно этот процесс и называется **алгоритмом**. Он включает в себя перебор страниц и логические проверки, нашли мы фразу или нет. +## Первый пример -Заранее неизвестно количество страниц, которое придется посмотреть, но сам процесс просмотра повторяется из раза в раз совершенно одинаково. Для выполнения таких повторяющихся действий как раз и нужны **циклы**. Каждый такой повтор называется **итерацией**. +Пусть программа должна пять раз вывести строку `Hello!`. Чтобы остановить повторение в нужный момент, программе нужна переменная, которая хранит номер текущего шага. Такую переменную обычно называют счетчиком. -Допустим, мы хотим написать функцию, которая выводит на экран все числа от единицы до указанного (через аргументы): +В примере счетчик называется `$counter`. Перед циклом он равен `0`. После каждого вывода строки мы увеличиваем его на единицу. ```php 1 -// => 2 -// => 3 +$counter = 0; +while ($counter < 5) { + print_r("Hello!\n"); + $counter = $counter + 1; +} + +// => Hello! +// => Hello! +// => Hello! +// => Hello! +// => Hello! ``` -Эту функцию невозможно реализовать уже изученными средствами, так как количество выводов на экран заранее не известно. А с циклами это не составит никаких проблем: +Теперь цикл может проверять значение счетчика перед каждым повтором. Пока `$counter < 5`, выполняется код в фигурных скобках после `while`. Такой блок называют телом цикла. -```php - 1 -// => 2 -// => 3 -// => finished! -``` +## Работа цикла по шагам +Перед первым повтором `$counter` равен `0`. -В коде функции использован цикл `while`. Он состоит из трех элементов: +**Шаг 1.** Интерпретатор проверяет `$counter < 5`. Значение `0` меньше `5`, поэтому выполняется тело цикла. +На экран выводится `Hello!`, а `$counter` увеличивается до `1`. -* Ключевое слово `while` — несмотря на схожесть с вызовом функций, это не вызов функции -* Предикат — условие, которое указывается в скобках после `while` и вычисляется на каждой итерации -* Тело цикла — блок кода в фигурных скобках +**Шаг 2.** Интерпретатор снова проверяет условие. Значение `1` все еще меньше `5`, поэтому тело цикла выполняется еще раз. +На экран снова выводится `Hello!`, а `$counter` увеличивается до `2`. -Конструкция читается так: «делать то, что указано в теле цикла, пока истинно условие `$i <= $lastNumber`». +Так продолжается, пока `$counter` не станет равен `5`. При следующей проверке условие `$counter < 5` будет ложным, поэтому цикл завершится. Дальше программа выполнит код после цикла. -Разберем работу этого кода для вызова `printNumbers(3)`: +Та же последовательность на схеме. -```php - 1 +// => 2 +// => 3 +// => Finished! ``` -Подведем итог. Когда все же нужны циклы, а когда можно обойтись без них? Физически невозможно обойтись без циклов, когда алгоритм решения задачи требует повторения каких-то действий и количество этих операций заранее неизвестно — как в нашем примере с книгой. +Цикл `while` печатает числа, пока `$i` не станет больше `$n`. После этого программа выходит из цикла и выполняет `print_r("Finished!\n")`. + +Условие и изменение счетчика зависят от задачи. Счетчик можно увеличивать на `1`, на `2` или сразу на `10`. Его можно уменьшать, если цикл идет от большего значения к меньшему. Можно менять счетчик не на каждом повторе, а через один или после выполнения дополнительной проверки. Главное, чтобы условие когда-нибудь стало ложным. Иначе цикл будет работать бесконечно. diff --git a/modules/50-loops/26-conditions-inside-loops/Makefile b/modules/50-loops/15-conditions-inside-loops/Makefile similarity index 100% rename from modules/50-loops/26-conditions-inside-loops/Makefile rename to modules/50-loops/15-conditions-inside-loops/Makefile diff --git a/modules/50-loops/15-conditions-inside-loops/SolutionTest.php b/modules/50-loops/15-conditions-inside-loops/SolutionTest.php new file mode 100644 index 00000000..44b8f2ed --- /dev/null +++ b/modules/50-loops/15-conditions-inside-loops/SolutionTest.php @@ -0,0 +1,18 @@ +assertEquals(2, countHashtags('New post #php #code')); + $this->assertEquals(0, countHashtags('No tags here')); + $this->assertEquals(2, countHashtags('#start and #finish')); + $this->assertEquals(0, countHashtags('')); + } +} diff --git a/modules/50-loops/26-conditions-inside-loops/description.es.yml b/modules/50-loops/15-conditions-inside-loops/description.es.yml similarity index 100% rename from modules/50-loops/26-conditions-inside-loops/description.es.yml rename to modules/50-loops/15-conditions-inside-loops/description.es.yml diff --git a/modules/50-loops/26-conditions-inside-loops/en/EXERCISE.md b/modules/50-loops/15-conditions-inside-loops/en/EXERCISE.md similarity index 100% rename from modules/50-loops/26-conditions-inside-loops/en/EXERCISE.md rename to modules/50-loops/15-conditions-inside-loops/en/EXERCISE.md diff --git a/modules/50-loops/26-conditions-inside-loops/en/README.md b/modules/50-loops/15-conditions-inside-loops/en/README.md similarity index 100% rename from modules/50-loops/26-conditions-inside-loops/en/README.md rename to modules/50-loops/15-conditions-inside-loops/en/README.md diff --git a/modules/50-loops/26-conditions-inside-loops/en/data.yml b/modules/50-loops/15-conditions-inside-loops/en/data.yml similarity index 100% rename from modules/50-loops/26-conditions-inside-loops/en/data.yml rename to modules/50-loops/15-conditions-inside-loops/en/data.yml diff --git a/modules/50-loops/26-conditions-inside-loops/es/EXERCISE.md b/modules/50-loops/15-conditions-inside-loops/es/EXERCISE.md similarity index 100% rename from modules/50-loops/26-conditions-inside-loops/es/EXERCISE.md rename to modules/50-loops/15-conditions-inside-loops/es/EXERCISE.md diff --git a/modules/50-loops/26-conditions-inside-loops/es/README.md b/modules/50-loops/15-conditions-inside-loops/es/README.md similarity index 100% rename from modules/50-loops/26-conditions-inside-loops/es/README.md rename to modules/50-loops/15-conditions-inside-loops/es/README.md diff --git a/modules/50-loops/26-conditions-inside-loops/es/data.yml b/modules/50-loops/15-conditions-inside-loops/es/data.yml similarity index 100% rename from modules/50-loops/26-conditions-inside-loops/es/data.yml rename to modules/50-loops/15-conditions-inside-loops/es/data.yml diff --git a/modules/50-loops/15-conditions-inside-loops/index.php b/modules/50-loops/15-conditions-inside-loops/index.php new file mode 100644 index 00000000..20333f44 --- /dev/null +++ b/modules/50-loops/15-conditions-inside-loops/index.php @@ -0,0 +1,19 @@ +assertEquals(2, multiplyNumbersFromRange(2, 2)); - $this->assertEquals(6, multiplyNumbersFromRange(1, 3)); - $this->assertEquals(120, multiplyNumbersFromRange(1, 5)); + $this->assertEquals(0, calculateElectricityBill(0)); + $this->assertEquals(400, calculateElectricityBill(80)); + $this->assertEquals(500, calculateElectricityBill(100)); + $this->assertEquals(850, calculateElectricityBill(150)); + $this->assertEquals(1700, calculateElectricityBill(250)); } } diff --git a/modules/50-loops/20-aggregation-numbers/index.php b/modules/50-loops/20-aggregation-numbers/index.php index b646e63d..673a3d20 100644 --- a/modules/50-loops/20-aggregation-numbers/index.php +++ b/modules/50-loops/20-aggregation-numbers/index.php @@ -1,18 +1,24 @@ f_rce4gm&tx53>5Y~HtO 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%0Au_EEd1{h0eF}?ed+1dE

#>fM68+fL)YacQoAY5a?@P4{}s=Y#n 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

uy^|ujaaQDZ2KauLf|fIm+68Qx}AgZ@;W>y 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 literal 0 HcmV?d00001 diff --git a/modules/50-loops/23-aggregation-strings/SolutionTest.php b/modules/50-loops/23-aggregation-strings/SolutionTest.php index 1ad6dc0f..726116f9 100644 --- a/modules/50-loops/23-aggregation-strings/SolutionTest.php +++ b/modules/50-loops/23-aggregation-strings/SolutionTest.php @@ -1,6 +1,6 @@ assertEquals('2', joinNumbersFromRange(2, 2)); - $this->assertEquals('12345', joinNumbersFromRange(1, 5)); - $this->assertEquals('101112', joinNumbersFromRange(10, 12)); + $this->assertEquals('+79991234567', sanitizePhoneNumber('+7 (999) 123-45-67')); + $this->assertEquals('88005553535', sanitizePhoneNumber('8 800 555 35 35')); + $this->assertEquals('1234567890', sanitizePhoneNumber('(123) 456-7890')); } } diff --git a/modules/50-loops/23-aggregation-strings/index.php b/modules/50-loops/23-aggregation-strings/index.php index 6619794a..cc7fc605 100644 --- a/modules/50-loops/23-aggregation-strings/index.php +++ b/modules/50-loops/23-aggregation-strings/index.php @@ -1,15 +1,18 @@ expectOutputString($expected); - printReversedWordBySymbol($str); + $this->assertEquals('************5678', maskCardNumber('1234567812345678')); + $this->assertEquals('****5678', maskCardNumber('12345678')); + $this->assertEquals('************3333', maskCardNumber('0000111122223333')); } } diff --git a/modules/50-loops/25-iteration-over-string/index.php b/modules/50-loops/25-iteration-over-string/index.php index a2889972..512aa008 100644 --- a/modules/50-loops/25-iteration-over-string/index.php +++ b/modules/50-loops/25-iteration-over-string/index.php @@ -3,12 +3,21 @@ namespace HexletBasics\Loops\IterationOverString; // BEGIN -function printReversedWordBySymbol(string $word): void +function maskCardNumber(string $cardNumber): string { - $i = strlen($word) - 1; - while ($i >= 0) { - print_r("$word[$i]\n"); - $i = $i - 1; + $result = ''; + $i = 0; + $visiblePartStart = strlen($cardNumber) - 4; + + while ($i < strlen($cardNumber)) { + if ($i < $visiblePartStart) { + $result = $result . '*'; + } else { + $result = $result . $cardNumber[$i]; + } + $i = $i + 1; } + + return $result; } // END diff --git a/modules/50-loops/25-iteration-over-string/ru/EXERCISE.md b/modules/50-loops/25-iteration-over-string/ru/EXERCISE.md index 3bdf7ffd..52c06d5e 100644 --- a/modules/50-loops/25-iteration-over-string/ru/EXERCISE.md +++ b/modules/50-loops/25-iteration-over-string/ru/EXERCISE.md @@ -1,16 +1,10 @@ +Напишите функцию `maskCardNumber()`, которая скрывает номер банковской карты. Функция должна заменить все символы строки на `*`, кроме последних четырех. -Реализуйте функцию `printReversedWordBySymbol()`, которая печатает переданное слово посимвольно, как в примере из теории, но делает это в обратном порядке. +Пример работы: ```php 't' -// => 'e' -// => 'l' -// => 'x' -// => 'e' -// => 'H' +maskCardNumber('1234567812345678'); // '************5678' +maskCardNumber('12345678'); // '****5678' ``` diff --git a/modules/50-loops/26-conditions-inside-loops/SolutionTest.php b/modules/50-loops/26-conditions-inside-loops/SolutionTest.php deleted file mode 100644 index 8acb9898..00000000 --- a/modules/50-loops/26-conditions-inside-loops/SolutionTest.php +++ /dev/null @@ -1,18 +0,0 @@ -assertEquals(1, countChars('axe', 'a')); - $this->assertEquals(0, countChars('', 'a')); - $this->assertEquals(2, countChars('OpPa', 'p')); - $this->assertEquals(2, countChars('OpPa', 'P')); - } -} diff --git a/modules/50-loops/26-conditions-inside-loops/index.php b/modules/50-loops/26-conditions-inside-loops/index.php deleted file mode 100644 index 38094993..00000000 --- a/modules/50-loops/26-conditions-inside-loops/index.php +++ /dev/null @@ -1,19 +0,0 @@ -assertFalse(isArgumentsForSubstrCorrect($str, -1, 3), ); - $this->assertFalse(isArgumentsForSubstrCorrect($str, 4, 100), ); - $this->assertFalse(isArgumentsForSubstrCorrect($str, 10, 10), ); - $this->assertFalse(isArgumentsForSubstrCorrect($str, 11, 1), ); - $this->assertFalse(isArgumentsForSubstrCorrect($str, 11, 0), ); - $this->assertTrue(isArgumentsForSubstrCorrect($str, 3, 3)); - $this->assertTrue(isArgumentsForSubstrCorrect($str, 10, 1)); - } -} diff --git a/modules/50-loops/29-edge-cases/description.es.yml b/modules/50-loops/29-edge-cases/description.es.yml deleted file mode 100644 index 5348c233..00000000 --- a/modules/50-loops/29-edge-cases/description.es.yml +++ /dev/null @@ -1,110 +0,0 @@ ---- - -name: Casos límite -theory: | - En esta lección implementaremos la función `mysubstr()`, que extrae una subcadena de una cadena de longitud especificada. - - Recibe dos argumentos: - - * La cadena - * La longitud - - Esta función devuelve la subcadena comenzando desde el primer carácter: - - ```php - = $stringLength) { - return false; - } elseif ($index + $length > $stringLength) { - return false; - } - - return true; -} -// END diff --git a/modules/50-loops/29-edge-cases/ru/EXERCISE.md b/modules/50-loops/29-edge-cases/ru/EXERCISE.md deleted file mode 100644 index 4c851cdc..00000000 --- a/modules/50-loops/29-edge-cases/ru/EXERCISE.md +++ /dev/null @@ -1,30 +0,0 @@ -Реализуйте функцию-предикат `isArgumentsForSubstrCorrect`, которая принимает три аргумента: - -1. строку -2. индекс, с которого начинать извлечение -3. длину извлекаемой подстроки - -Функция возвращает `false`, если хотя бы одно из условий истинно: - -* Отрицательная длина извлекаемой подстроки -* Отрицательный заданный индекс -* Заданный индекс выходит за границу всей строки -* Длина подстроки в сумме с заданным индексом выходит за границу всей строки - -В ином случае функция возвращает `true`. - -Не забывайте, что индексы начинаются с `0`, поэтому индекс последнего элемента — это «длина строки минус 1». - -Пример вызова: - -```php - Date: Wed, 17 Jun 2026 17:54:45 +0500 Subject: [PATCH 22/29] upd --- .../100-unicode/SolutionTest.php | 8 +++---- .../31-advanced-strings/100-unicode/index.php | 24 ++++--------------- .../100-unicode/ru/EXERCISE.md | 10 ++------ .../100-unicode/ru/README.md | 6 ++--- .../110-locales/SolutionTest.php | 2 +- .../120-startwith/SolutionTest.php | 8 +++---- .../120-startwith/index.php | 11 +++------ .../120-startwith/ru/EXERCISE.md | 9 ++----- .../120-startwith/ru/README.md | 24 +++++++------------ .../30-symbols/ru/README.md | 2 ++ 10 files changed, 32 insertions(+), 72 deletions(-) diff --git a/modules/31-advanced-strings/100-unicode/SolutionTest.php b/modules/31-advanced-strings/100-unicode/SolutionTest.php index 93e8d94b..d8dbfaaf 100644 --- a/modules/31-advanced-strings/100-unicode/SolutionTest.php +++ b/modules/31-advanced-strings/100-unicode/SolutionTest.php @@ -1,6 +1,6 @@ expectOutputString($expected); require 'index.php'; - $this->assertEquals('ONE', invertCase('one')); - $this->assertEquals('two', invertCase('TWO')); - $this->assertEquals('tHrEE', invertCase('ThRee')); - $this->assertEquals('пРиВеТ!', invertCase('ПрИвЕт!')); } } diff --git a/modules/31-advanced-strings/100-unicode/index.php b/modules/31-advanced-strings/100-unicode/index.php index 6bdada65..a34687e0 100644 --- a/modules/31-advanced-strings/100-unicode/index.php +++ b/modules/31-advanced-strings/100-unicode/index.php @@ -1,22 +1,6 @@ 13 +print_r(strlen('Привет!')); // => 13 ``` Языки разделились на два лагеря. Одни языки встроили поддержку в уже существующие функции — в итоге переход на UTF-8 никак не отразился на процессе программирования. Среди таких языков есть Java, Ruby, JavaScript. @@ -52,7 +52,7 @@ echo strlen('Привет!'); // => 13 ```php 7 +print_r(mb_strlen('Привет!')); // => 7 ``` А вот достойной альтернативы взятию конкретного символа в строке по индексу не существует. Такую задачу нужно выполнять с помощью функции `mb_substr()`: diff --git a/modules/31-advanced-strings/110-locales/SolutionTest.php b/modules/31-advanced-strings/110-locales/SolutionTest.php index 117c8d06..997c0e51 100644 --- a/modules/31-advanced-strings/110-locales/SolutionTest.php +++ b/modules/31-advanced-strings/110-locales/SolutionTest.php @@ -1,6 +1,6 @@ expectOutputString($expected); require 'index.php'; - $this->assertTrue(startsWith('one', 'o')); - $this->assertFalse(startsWith('one', 'ne')); - $this->assertTrue(startsWith('one', 'on')); - $this->assertTrue(startsWith('one', 'one')); } } diff --git a/modules/31-advanced-strings/120-startwith/index.php b/modules/31-advanced-strings/120-startwith/index.php index de0d888c..32cf84d6 100644 --- a/modules/31-advanced-strings/120-startwith/index.php +++ b/modules/31-advanced-strings/120-startwith/index.php @@ -1,10 +1,5 @@ 6 ``` -В примере выше функция вернет 6, что соответствует индексу буквы М: +Функция вернула `6` — индекс буквы `М`, с которой начинается подстрока. Индексы, как обычно, отсчитываются с нуля: ```php 0 ``` -А в этом примере вернется `0`, что соответствует первой букве строки. В этом коде скрыта ошибка, которую часто допускают новички. В PHP `0` рассматривается, как `false` — значит, условие не выполнится. Правильная проверка выглядит так: +Здесь вернулся `0`: подстрока найдена в самом начале строки. + +Если же подстрока не найдена, `mb_strpos()` возвращает специальное значение `false` — «ложь». При выводе через `print_r()` оно выглядит как пустая строка: ```php ``` -Функция `mb_strpos()` возвращает `false`, если подстрока не была найдена. Значит, можно воспользоваться строгим сравнением с `false`. +Здесь скрыта ловушка, в которую часто попадают новички: результат `0` («найдено в начале строки») легко спутать с `false` («не найдено вообще»). Чтобы различать их, нужно строгое сравнение — мы разберем его в уроках про логику. А пока запомните: `mb_strpos()` отвечает на вопрос «где?», а не «есть ли?». diff --git a/modules/31-advanced-strings/30-symbols/ru/README.md b/modules/31-advanced-strings/30-symbols/ru/README.md index b0c9e077..f24ff8b3 100644 --- a/modules/31-advanced-strings/30-symbols/ru/README.md +++ b/modules/31-advanced-strings/30-symbols/ru/README.md @@ -1,5 +1,7 @@ Иногда нужно получить один символ из строки. Например, если сайт знает имя и фамилию пользователя и нужно вывести их в сокращенном формате вида A. Ivanov. Для этого потребуется взять первую букву имени. +![Извлечение символов из строки](./assets/symbols.png) + В PHP для доступа к символам строки используют индексацию. Индексация означает, что у каждого символа в строке есть свой номер, то есть индекс. Индексация начинается с нуля: у первого символа индекс `0`, у второго `1` и так далее. Представим, что у нас есть строка: ```php From b72ac633e9370c63237f4815a9cc36c2391bae06 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Wed, 17 Jun 2026 17:54:50 +0500 Subject: [PATCH 23/29] upd --- .../30-symbols/ru/assets/symbols.png | Bin 0 -> 50814 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 modules/31-advanced-strings/30-symbols/ru/assets/symbols.png diff --git a/modules/31-advanced-strings/30-symbols/ru/assets/symbols.png b/modules/31-advanced-strings/30-symbols/ru/assets/symbols.png new file mode 100644 index 0000000000000000000000000000000000000000..6093469e7251ecab77b2c0a0fede25df41ec624f GIT binary patch literal 50814 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 Date: Wed, 17 Jun 2026 21:54:37 +0500 Subject: [PATCH 24/29] remove dates module --- .../{65-match => 65-switch}/Makefile | 0 .../{70-switch => 65-switch}/SolutionTest.php | 0 .../description.es.yml | 0 .../{70-switch => 65-switch}/en/EXERCISE.md | 0 .../{70-switch => 65-switch}/en/README.md | 0 .../{70-switch => 65-switch}/en/data.yml | 0 .../{70-switch => 65-switch}/es/EXERCISE.md | 0 .../{70-switch => 65-switch}/es/README.md | 0 .../{70-switch => 65-switch}/es/data.yml | 0 .../{70-switch => 65-switch}/index.php | 0 .../{70-switch => 65-switch}/ru/EXERCISE.md | 0 .../{70-switch => 65-switch}/ru/README.md | 0 .../{70-switch => 65-switch}/ru/data.yml | 0 .../{70-switch => 70-match}/Makefile | 0 .../{65-match => 70-match}/SolutionTest.php | 0 .../{65-match => 70-match}/description.es.yml | 0 .../{65-match => 70-match}/en/EXERCISE.md | 0 .../{65-match => 70-match}/en/README.md | 0 .../{65-match => 70-match}/en/data.yml | 0 .../{65-match => 70-match}/es/EXERCISE.md | 0 .../{65-match => 70-match}/es/README.md | 0 .../{65-match => 70-match}/es/data.yml | 0 .../{65-match => 70-match}/index.php | 0 .../{65-match => 70-match}/ru/EXERCISE.md | 0 .../{65-match => 70-match}/ru/README.md | 0 .../{65-match => 70-match}/ru/data.yml | 0 modules/70-dates/10-timestamp/Makefile | 2 - .../70-dates/10-timestamp/SolutionTest.php | 17 ------- .../70-dates/10-timestamp/description.es.yml | 43 ---------------- modules/70-dates/10-timestamp/en/EXERCISE.md | 13 ----- modules/70-dates/10-timestamp/en/README.md | 14 ------ modules/70-dates/10-timestamp/en/data.yml | 2 - modules/70-dates/10-timestamp/es/EXERCISE.md | 12 ----- modules/70-dates/10-timestamp/es/README.md | 21 -------- modules/70-dates/10-timestamp/es/data.yml | 4 -- modules/70-dates/10-timestamp/index.php | 12 ----- modules/70-dates/10-timestamp/ru/EXERCISE.md | 12 ----- modules/70-dates/10-timestamp/ru/README.md | 21 -------- modules/70-dates/10-timestamp/ru/data.yml | 4 -- modules/70-dates/20-date/Makefile | 2 - modules/70-dates/20-date/SolutionTest.php | 17 ------- modules/70-dates/20-date/description.es.yml | 49 ------------------- modules/70-dates/20-date/en/EXERCISE.md | 12 ----- modules/70-dates/20-date/en/README.md | 25 ---------- modules/70-dates/20-date/en/data.yml | 6 --- modules/70-dates/20-date/es/EXERCISE.md | 11 ----- modules/70-dates/20-date/es/README.md | 26 ---------- modules/70-dates/20-date/es/data.yml | 7 --- modules/70-dates/20-date/index.php | 10 ---- modules/70-dates/20-date/ru/EXERCISE.md | 11 ----- modules/70-dates/20-date/ru/README.md | 26 ---------- modules/70-dates/20-date/ru/data.yml | 6 --- modules/70-dates/30-mktime/Makefile | 2 - modules/70-dates/30-mktime/SolutionTest.php | 15 ------ modules/70-dates/30-mktime/description.es.yml | 38 -------------- modules/70-dates/30-mktime/en/EXERCISE.md | 8 --- modules/70-dates/30-mktime/en/README.md | 14 ------ modules/70-dates/30-mktime/en/data.yml | 2 - modules/70-dates/30-mktime/es/EXERCISE.md | 8 --- modules/70-dates/30-mktime/es/README.md | 20 -------- modules/70-dates/30-mktime/es/data.yml | 4 -- modules/70-dates/30-mktime/index.php | 10 ---- modules/70-dates/30-mktime/ru/EXERCISE.md | 8 --- modules/70-dates/30-mktime/ru/README.md | 20 -------- modules/70-dates/30-mktime/ru/data.yml | 4 -- modules/70-dates/40-timezone/Makefile | 2 - modules/70-dates/40-timezone/SolutionTest.php | 15 ------ .../70-dates/40-timezone/description.es.yml | 23 --------- modules/70-dates/40-timezone/en/EXERCISE.md | 2 - modules/70-dates/40-timezone/en/README.md | 8 --- modules/70-dates/40-timezone/en/data.yml | 6 --- modules/70-dates/40-timezone/es/EXERCISE.md | 2 - modules/70-dates/40-timezone/es/README.md | 9 ---- modules/70-dates/40-timezone/es/data.yml | 7 --- modules/70-dates/40-timezone/index.php | 5 -- modules/70-dates/40-timezone/ru/EXERCISE.md | 2 - modules/70-dates/40-timezone/ru/README.md | 9 ---- modules/70-dates/40-timezone/ru/data.yml | 7 --- modules/70-dates/description.en.yml | 5 -- modules/70-dates/description.es.yml | 5 -- modules/70-dates/description.ru.yml | 5 -- 81 files changed, 650 deletions(-) rename modules/48-conditionals/{65-match => 65-switch}/Makefile (100%) rename modules/48-conditionals/{70-switch => 65-switch}/SolutionTest.php (100%) rename modules/48-conditionals/{70-switch => 65-switch}/description.es.yml (100%) rename modules/48-conditionals/{70-switch => 65-switch}/en/EXERCISE.md (100%) rename modules/48-conditionals/{70-switch => 65-switch}/en/README.md (100%) rename modules/48-conditionals/{70-switch => 65-switch}/en/data.yml (100%) rename modules/48-conditionals/{70-switch => 65-switch}/es/EXERCISE.md (100%) rename modules/48-conditionals/{70-switch => 65-switch}/es/README.md (100%) rename modules/48-conditionals/{70-switch => 65-switch}/es/data.yml (100%) rename modules/48-conditionals/{70-switch => 65-switch}/index.php (100%) rename modules/48-conditionals/{70-switch => 65-switch}/ru/EXERCISE.md (100%) rename modules/48-conditionals/{70-switch => 65-switch}/ru/README.md (100%) rename modules/48-conditionals/{70-switch => 65-switch}/ru/data.yml (100%) rename modules/48-conditionals/{70-switch => 70-match}/Makefile (100%) rename modules/48-conditionals/{65-match => 70-match}/SolutionTest.php (100%) rename modules/48-conditionals/{65-match => 70-match}/description.es.yml (100%) rename modules/48-conditionals/{65-match => 70-match}/en/EXERCISE.md (100%) rename modules/48-conditionals/{65-match => 70-match}/en/README.md (100%) rename modules/48-conditionals/{65-match => 70-match}/en/data.yml (100%) rename modules/48-conditionals/{65-match => 70-match}/es/EXERCISE.md (100%) rename modules/48-conditionals/{65-match => 70-match}/es/README.md (100%) rename modules/48-conditionals/{65-match => 70-match}/es/data.yml (100%) rename modules/48-conditionals/{65-match => 70-match}/index.php (100%) rename modules/48-conditionals/{65-match => 70-match}/ru/EXERCISE.md (100%) rename modules/48-conditionals/{65-match => 70-match}/ru/README.md (100%) rename modules/48-conditionals/{65-match => 70-match}/ru/data.yml (100%) delete mode 100644 modules/70-dates/10-timestamp/Makefile delete mode 100644 modules/70-dates/10-timestamp/SolutionTest.php delete mode 100644 modules/70-dates/10-timestamp/description.es.yml delete mode 100644 modules/70-dates/10-timestamp/en/EXERCISE.md delete mode 100644 modules/70-dates/10-timestamp/en/README.md delete mode 100644 modules/70-dates/10-timestamp/en/data.yml delete mode 100644 modules/70-dates/10-timestamp/es/EXERCISE.md delete mode 100644 modules/70-dates/10-timestamp/es/README.md delete mode 100644 modules/70-dates/10-timestamp/es/data.yml delete mode 100644 modules/70-dates/10-timestamp/index.php delete mode 100644 modules/70-dates/10-timestamp/ru/EXERCISE.md delete mode 100644 modules/70-dates/10-timestamp/ru/README.md delete mode 100644 modules/70-dates/10-timestamp/ru/data.yml delete mode 100644 modules/70-dates/20-date/Makefile delete mode 100644 modules/70-dates/20-date/SolutionTest.php delete mode 100644 modules/70-dates/20-date/description.es.yml delete mode 100644 modules/70-dates/20-date/en/EXERCISE.md delete mode 100644 modules/70-dates/20-date/en/README.md delete mode 100644 modules/70-dates/20-date/en/data.yml delete mode 100644 modules/70-dates/20-date/es/EXERCISE.md delete mode 100644 modules/70-dates/20-date/es/README.md delete mode 100644 modules/70-dates/20-date/es/data.yml delete mode 100644 modules/70-dates/20-date/index.php delete mode 100644 modules/70-dates/20-date/ru/EXERCISE.md delete mode 100644 modules/70-dates/20-date/ru/README.md delete mode 100644 modules/70-dates/20-date/ru/data.yml delete mode 100644 modules/70-dates/30-mktime/Makefile delete mode 100644 modules/70-dates/30-mktime/SolutionTest.php delete mode 100644 modules/70-dates/30-mktime/description.es.yml delete mode 100644 modules/70-dates/30-mktime/en/EXERCISE.md delete mode 100644 modules/70-dates/30-mktime/en/README.md delete mode 100644 modules/70-dates/30-mktime/en/data.yml delete mode 100644 modules/70-dates/30-mktime/es/EXERCISE.md delete mode 100644 modules/70-dates/30-mktime/es/README.md delete mode 100644 modules/70-dates/30-mktime/es/data.yml delete mode 100644 modules/70-dates/30-mktime/index.php delete mode 100644 modules/70-dates/30-mktime/ru/EXERCISE.md delete mode 100644 modules/70-dates/30-mktime/ru/README.md delete mode 100644 modules/70-dates/30-mktime/ru/data.yml delete mode 100644 modules/70-dates/40-timezone/Makefile delete mode 100644 modules/70-dates/40-timezone/SolutionTest.php delete mode 100644 modules/70-dates/40-timezone/description.es.yml delete mode 100644 modules/70-dates/40-timezone/en/EXERCISE.md delete mode 100644 modules/70-dates/40-timezone/en/README.md delete mode 100644 modules/70-dates/40-timezone/en/data.yml delete mode 100644 modules/70-dates/40-timezone/es/EXERCISE.md delete mode 100644 modules/70-dates/40-timezone/es/README.md delete mode 100644 modules/70-dates/40-timezone/es/data.yml delete mode 100644 modules/70-dates/40-timezone/index.php delete mode 100644 modules/70-dates/40-timezone/ru/EXERCISE.md delete mode 100644 modules/70-dates/40-timezone/ru/README.md delete mode 100644 modules/70-dates/40-timezone/ru/data.yml delete mode 100644 modules/70-dates/description.en.yml delete mode 100644 modules/70-dates/description.es.yml delete mode 100644 modules/70-dates/description.ru.yml diff --git a/modules/48-conditionals/65-match/Makefile b/modules/48-conditionals/65-switch/Makefile similarity index 100% rename from modules/48-conditionals/65-match/Makefile rename to modules/48-conditionals/65-switch/Makefile diff --git a/modules/48-conditionals/70-switch/SolutionTest.php b/modules/48-conditionals/65-switch/SolutionTest.php similarity index 100% rename from modules/48-conditionals/70-switch/SolutionTest.php rename to modules/48-conditionals/65-switch/SolutionTest.php diff --git a/modules/48-conditionals/70-switch/description.es.yml b/modules/48-conditionals/65-switch/description.es.yml similarity index 100% rename from modules/48-conditionals/70-switch/description.es.yml rename to modules/48-conditionals/65-switch/description.es.yml diff --git a/modules/48-conditionals/70-switch/en/EXERCISE.md b/modules/48-conditionals/65-switch/en/EXERCISE.md similarity index 100% rename from modules/48-conditionals/70-switch/en/EXERCISE.md rename to modules/48-conditionals/65-switch/en/EXERCISE.md diff --git a/modules/48-conditionals/70-switch/en/README.md b/modules/48-conditionals/65-switch/en/README.md similarity index 100% rename from modules/48-conditionals/70-switch/en/README.md rename to modules/48-conditionals/65-switch/en/README.md diff --git a/modules/48-conditionals/70-switch/en/data.yml b/modules/48-conditionals/65-switch/en/data.yml similarity index 100% rename from modules/48-conditionals/70-switch/en/data.yml rename to modules/48-conditionals/65-switch/en/data.yml diff --git a/modules/48-conditionals/70-switch/es/EXERCISE.md b/modules/48-conditionals/65-switch/es/EXERCISE.md similarity index 100% rename from modules/48-conditionals/70-switch/es/EXERCISE.md rename to modules/48-conditionals/65-switch/es/EXERCISE.md diff --git a/modules/48-conditionals/70-switch/es/README.md b/modules/48-conditionals/65-switch/es/README.md similarity index 100% rename from modules/48-conditionals/70-switch/es/README.md rename to modules/48-conditionals/65-switch/es/README.md diff --git a/modules/48-conditionals/70-switch/es/data.yml b/modules/48-conditionals/65-switch/es/data.yml similarity index 100% rename from modules/48-conditionals/70-switch/es/data.yml rename to modules/48-conditionals/65-switch/es/data.yml diff --git a/modules/48-conditionals/70-switch/index.php b/modules/48-conditionals/65-switch/index.php similarity index 100% rename from modules/48-conditionals/70-switch/index.php rename to modules/48-conditionals/65-switch/index.php diff --git a/modules/48-conditionals/70-switch/ru/EXERCISE.md b/modules/48-conditionals/65-switch/ru/EXERCISE.md similarity index 100% rename from modules/48-conditionals/70-switch/ru/EXERCISE.md rename to modules/48-conditionals/65-switch/ru/EXERCISE.md diff --git a/modules/48-conditionals/70-switch/ru/README.md b/modules/48-conditionals/65-switch/ru/README.md similarity index 100% rename from modules/48-conditionals/70-switch/ru/README.md rename to modules/48-conditionals/65-switch/ru/README.md diff --git a/modules/48-conditionals/70-switch/ru/data.yml b/modules/48-conditionals/65-switch/ru/data.yml similarity index 100% rename from modules/48-conditionals/70-switch/ru/data.yml rename to modules/48-conditionals/65-switch/ru/data.yml diff --git a/modules/48-conditionals/70-switch/Makefile b/modules/48-conditionals/70-match/Makefile similarity index 100% rename from modules/48-conditionals/70-switch/Makefile rename to modules/48-conditionals/70-match/Makefile diff --git a/modules/48-conditionals/65-match/SolutionTest.php b/modules/48-conditionals/70-match/SolutionTest.php similarity index 100% rename from modules/48-conditionals/65-match/SolutionTest.php rename to modules/48-conditionals/70-match/SolutionTest.php diff --git a/modules/48-conditionals/65-match/description.es.yml b/modules/48-conditionals/70-match/description.es.yml similarity index 100% rename from modules/48-conditionals/65-match/description.es.yml rename to modules/48-conditionals/70-match/description.es.yml diff --git a/modules/48-conditionals/65-match/en/EXERCISE.md b/modules/48-conditionals/70-match/en/EXERCISE.md similarity index 100% rename from modules/48-conditionals/65-match/en/EXERCISE.md rename to modules/48-conditionals/70-match/en/EXERCISE.md diff --git a/modules/48-conditionals/65-match/en/README.md b/modules/48-conditionals/70-match/en/README.md similarity index 100% rename from modules/48-conditionals/65-match/en/README.md rename to modules/48-conditionals/70-match/en/README.md diff --git a/modules/48-conditionals/65-match/en/data.yml b/modules/48-conditionals/70-match/en/data.yml similarity index 100% rename from modules/48-conditionals/65-match/en/data.yml rename to modules/48-conditionals/70-match/en/data.yml diff --git a/modules/48-conditionals/65-match/es/EXERCISE.md b/modules/48-conditionals/70-match/es/EXERCISE.md similarity index 100% rename from modules/48-conditionals/65-match/es/EXERCISE.md rename to modules/48-conditionals/70-match/es/EXERCISE.md diff --git a/modules/48-conditionals/65-match/es/README.md b/modules/48-conditionals/70-match/es/README.md similarity index 100% rename from modules/48-conditionals/65-match/es/README.md rename to modules/48-conditionals/70-match/es/README.md diff --git a/modules/48-conditionals/65-match/es/data.yml b/modules/48-conditionals/70-match/es/data.yml similarity index 100% rename from modules/48-conditionals/65-match/es/data.yml rename to modules/48-conditionals/70-match/es/data.yml diff --git a/modules/48-conditionals/65-match/index.php b/modules/48-conditionals/70-match/index.php similarity index 100% rename from modules/48-conditionals/65-match/index.php rename to modules/48-conditionals/70-match/index.php diff --git a/modules/48-conditionals/65-match/ru/EXERCISE.md b/modules/48-conditionals/70-match/ru/EXERCISE.md similarity index 100% rename from modules/48-conditionals/65-match/ru/EXERCISE.md rename to modules/48-conditionals/70-match/ru/EXERCISE.md diff --git a/modules/48-conditionals/65-match/ru/README.md b/modules/48-conditionals/70-match/ru/README.md similarity index 100% rename from modules/48-conditionals/65-match/ru/README.md rename to modules/48-conditionals/70-match/ru/README.md diff --git a/modules/48-conditionals/65-match/ru/data.yml b/modules/48-conditionals/70-match/ru/data.yml similarity index 100% rename from modules/48-conditionals/65-match/ru/data.yml rename to modules/48-conditionals/70-match/ru/data.yml diff --git a/modules/70-dates/10-timestamp/Makefile b/modules/70-dates/10-timestamp/Makefile deleted file mode 100644 index d0d0a48c..00000000 --- a/modules/70-dates/10-timestamp/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -test: - @ test.sh diff --git a/modules/70-dates/10-timestamp/SolutionTest.php b/modules/70-dates/10-timestamp/SolutionTest.php deleted file mode 100644 index 5067c572..00000000 --- a/modules/70-dates/10-timestamp/SolutionTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertEquals(2018, getYear(1532435204)); - $this->assertEquals(1986, getYear(532435204)); - $this->assertEquals(1970, getYear(5324352)); - } -} diff --git a/modules/70-dates/10-timestamp/description.es.yml b/modules/70-dates/10-timestamp/description.es.yml deleted file mode 100644 index 31192b3f..00000000 --- a/modules/70-dates/10-timestamp/description.es.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- - -name: Tiempo -theory: | - ¿Alguna vez te has preguntado cómo se almacena el tiempo en una computadora? En esta lección discutiremos cómo funcionan el tiempo y la fecha, y dónde se almacenan. - - ## Tiempo - - Como sabes, encender y apagar la computadora no afecta los relojes. Podemos concluir que los relojes en la computadora funcionan por sí mismos. - - Esto es realmente cierto. Los relojes principales de la computadora son **hardware**. Viven una vida independiente y tienen su propia batería. Al encender la computadora, lee los datos de estos relojes, los guarda en la memoria y comienza a contar el tiempo de forma independiente. Estos relojes se llaman **sistema**. Cualquier cambio en los relojes del sistema también afecta a los relojes de hardware. - - En Linux, Unix, MacOS y la mayoría de otros sistemas operativos, el tiempo del sistema se representa en formato _Unix Time_. Se define como la cantidad de segundos transcurridos desde este momento: - - > 00:00:00 UTC 1 de enero de 1970 (jueves) - - El tiempo desde este momento se llama "época de Unix" (_Unix Epoch_). El tiempo Unix se representa como un número entero que aumenta con cada segundo transcurrido, sin necesidad de cálculos para determinar el año, mes, día, hora o minuto. - - Una fecha específica en formato Unix Time se llama **timestamp** - sello de tiempo. Por ejemplo, para obtener el _timestamp_ actual en PHP, se utiliza la función `time()`: - - ```php - 00:00:00 UTC 1 de enero de 1970 (jueves) - -El tiempo desde este momento se llama "época de Unix" (_Unix Epoch_). El tiempo Unix se representa como un número entero que aumenta con cada segundo transcurrido, sin necesidad de cálculos para determinar el año, mes, día, hora o minuto. - -Una fecha específica en formato Unix Time se llama **timestamp** - sello de tiempo. Por ejemplo, para obtener el _timestamp_ actual en PHP, se utiliza la función `time()`: - -```php - 00:00:00 UTC 1 января 1970 года (четверг) - -Время с этого момента называют «эрой Unix» (_Unix Epoch_). Unix-время представлено целым числом, которое увеличивается с каждой прошедшей секундой без необходимости вычислений для определения года, месяца, дня, часа или минуты. - -Конкретная дата в формате Unix Time называется **timestamp** — временной штамп. Например, для получения текущего _timestamp_ в PHP используется функция `time()`: - -```php -assertEquals('24/07/2018', getCustomDate(1532435204)); - $this->assertEquals('15/11/1986', getCustomDate(532435204)); - $this->assertEquals('03/03/1970', getCustomDate(5324352)); - } -} diff --git a/modules/70-dates/20-date/description.es.yml b/modules/70-dates/20-date/description.es.yml deleted file mode 100644 index ee6e6857..00000000 --- a/modules/70-dates/20-date/description.es.yml +++ /dev/null @@ -1,49 +0,0 @@ ---- - -name: Fecha -theory: | - Una de las principales funciones para trabajar con fechas en PHP es [date()](https://php.net/manual/ru/function.date.php). Convierte una marca de tiempo (_timestamp_) en un formato legible por humanos. - - El primer parámetro de esta función es una descripción del formato de fecha, similar a los formatos utilizados en la función [sprintf()](https://php.net/manual/ru/function.sprintf.php): - - ```php - - [Examples of date - formats](https://www.php.net/manual/en/datetime.format.php) diff --git a/modules/70-dates/20-date/es/EXERCISE.md b/modules/70-dates/20-date/es/EXERCISE.md deleted file mode 100644 index c0a40093..00000000 --- a/modules/70-dates/20-date/es/EXERCISE.md +++ /dev/null @@ -1,11 +0,0 @@ -Complete la implementación de la función `getCustomDate()`, que devuelve una fecha en el formato `15/03/1985` basada en el _timestamp_ proporcionado. - -Ejemplos de uso: - -```php - - [Ejemplos de formatos de - fecha](https://www.php.net/manual/ru/datetime.format.php) -definitions: [] diff --git a/modules/70-dates/20-date/index.php b/modules/70-dates/20-date/index.php deleted file mode 100644 index 9b7015b1..00000000 --- a/modules/70-dates/20-date/index.php +++ /dev/null @@ -1,10 +0,0 @@ -assertEquals(1325376000, getHexletBirthday()); - } -} diff --git a/modules/70-dates/30-mktime/description.es.yml b/modules/70-dates/30-mktime/description.es.yml deleted file mode 100644 index 9771811c..00000000 --- a/modules/70-dates/30-mktime/description.es.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- - -name: mktime() -theory: | - La función [mktime()](https://php.net/manual/ru/function.mktime.php) genera una marca de tiempo (_timestamp_) a partir de la información de tiempo: segundos, horas, minutos y fecha: - - ```bash - mktime( - int $hora, - ?int $minuto = null, - ?int $segundo = null, - ?int $mes = null, - ?int $dia = null, - ?int $año = null - ): int|false - ``` - - `mktime()` es una función que acepta múltiples argumentos, donde cada parte de la fecha y el tiempo se pasa como un parámetro separado: - - ```php - expectOutputString($expected); - require 'index.php'; - } -} diff --git a/modules/70-dates/40-timezone/description.es.yml b/modules/70-dates/40-timezone/description.es.yml deleted file mode 100644 index 72e6688a..00000000 --- a/modules/70-dates/40-timezone/description.es.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- - -name: Zonas horarias -theory: | - Una de las partes más complicadas al trabajar con fechas son las zonas horarias (_time zones_). - - La Tierra se divide en 24 zonas horarias, por lo que en zonas adyacentes, la hora suele diferir en una hora. El tiempo universal coordinado (UTC) se considera el tiempo cero. Las zonas horarias alrededor del mundo se expresan como un desplazamiento positivo o negativo con respecto al UTC. Por ejemplo, en Moscú, la zona horaria es +3. - - Un detalle interesante de este mecanismo es el cambio de horario de verano e invierno. Mientras que las zonas horarias son fijas, el cambio de horario de verano e invierno es una prerrogativa de los países que periódicamente lo implementan o lo cancelan. El tiempo UTC nunca se cambia, los desplazamientos ocurren en relación a él. Además, hay mil y un problema más. - - La regla principal al trabajar con fechas es almacenar y comparar en formato UTC. Sin embargo, es mejor mostrar las fechas en la zona horaria del usuario. - - Si necesita verificar la zona horaria actual, puede utilizar la función `date_default_timezone_get()`. Para establecer la zona, utilice la función `date_default_timezone_set()`. - -instructions: | - - Muestre en pantalla la zona horaria actual. - -tips: - - | - [Lista de zonas horarias admitidas en PHP](https://php.net/manual/es/timezones.php) - -definitions: [] diff --git a/modules/70-dates/40-timezone/en/EXERCISE.md b/modules/70-dates/40-timezone/en/EXERCISE.md deleted file mode 100644 index b9e27402..00000000 --- a/modules/70-dates/40-timezone/en/EXERCISE.md +++ /dev/null @@ -1,2 +0,0 @@ - -Display the current time zone. diff --git a/modules/70-dates/40-timezone/en/README.md b/modules/70-dates/40-timezone/en/README.md deleted file mode 100644 index 66ca9943..00000000 --- a/modules/70-dates/40-timezone/en/README.md +++ /dev/null @@ -1,8 +0,0 @@ - -One of the most difficult parts of working with dates is time zones. The entire earth is divided into 24 time zones, meaning that in neighboring zones the time is often different by one hour. Zero time is [Coordinated Universal Time](https://en.wikipedia.org/wiki/Coordinated_Universal_Time) (UTC). Time zones around the globe are expressed as a positive or negative offset from UTC. For example, the time zone in Moscow is +3. - -The transition to daylight saving time and winter time adds a little zest to this system. And while the zones are strictly fixed, the transition to winter and summer time is the prerogative of individual states, which periodically introduce or cancel it. UTC time is never translated, shifts occur relative to it. On top of that, there are a thousand and one other problems. - -The main rule when working with dates is that storage and comparison should be made in UTC format. But it's better to display the dates in the zone in which the user lives. - -You can check the current zone with `date_default_timezone_get()`. Set the zone with the `date_default_timezone_set()`. diff --git a/modules/70-dates/40-timezone/en/data.yml b/modules/70-dates/40-timezone/en/data.yml deleted file mode 100644 index 2884f3c9..00000000 --- a/modules/70-dates/40-timezone/en/data.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -name: Time Zones (Time Zones) -tips: - - > - [List of supported time zones in - PHP](https://www.php.net/manual/en/timezones.php) diff --git a/modules/70-dates/40-timezone/es/EXERCISE.md b/modules/70-dates/40-timezone/es/EXERCISE.md deleted file mode 100644 index 8ada5e26..00000000 --- a/modules/70-dates/40-timezone/es/EXERCISE.md +++ /dev/null @@ -1,2 +0,0 @@ - -Muestre en pantalla la zona horaria actual. diff --git a/modules/70-dates/40-timezone/es/README.md b/modules/70-dates/40-timezone/es/README.md deleted file mode 100644 index 03407e19..00000000 --- a/modules/70-dates/40-timezone/es/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Una de las partes más complicadas al trabajar con fechas son las zonas horarias (_time zones_). - -La Tierra se divide en 24 zonas horarias, por lo que en zonas adyacentes, la hora suele diferir en una hora. El tiempo universal coordinado (UTC) se considera el tiempo cero. Las zonas horarias alrededor del mundo se expresan como un desplazamiento positivo o negativo con respecto al UTC. Por ejemplo, en Moscú, la zona horaria es +3. - -Un detalle interesante de este mecanismo es el cambio de horario de verano e invierno. Mientras que las zonas horarias son fijas, el cambio de horario de verano e invierno es una prerrogativa de los países que periódicamente lo implementan o lo cancelan. El tiempo UTC nunca se cambia, los desplazamientos ocurren en relación a él. Además, hay mil y un problema más. - -La regla principal al trabajar con fechas es almacenar y comparar en formato UTC. Sin embargo, es mejor mostrar las fechas en la zona horaria del usuario. - -Si necesita verificar la zona horaria actual, puede utilizar la función `date_default_timezone_get()`. Para establecer la zona, utilice la función `date_default_timezone_set()`. diff --git a/modules/70-dates/40-timezone/es/data.yml b/modules/70-dates/40-timezone/es/data.yml deleted file mode 100644 index dd52d632..00000000 --- a/modules/70-dates/40-timezone/es/data.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: Zonas horarias -tips: - - > - [Lista de zonas horarias admitidas en - PHP](https://php.net/manual/es/timezones.php) -definitions: [] diff --git a/modules/70-dates/40-timezone/index.php b/modules/70-dates/40-timezone/index.php deleted file mode 100644 index 164d71f5..00000000 --- a/modules/70-dates/40-timezone/index.php +++ /dev/null @@ -1,5 +0,0 @@ - - [Список поддерживаемых временных зон в - PHP](https://php.net/manual/ru/timezones.php) -definitions: [] diff --git a/modules/70-dates/description.en.yml b/modules/70-dates/description.en.yml deleted file mode 100644 index 4a1a1b7c..00000000 --- a/modules/70-dates/description.en.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -name: Date and Time -description: | - ПThe concept of time in computers. Hardware Timer and System Timer. Functions for working with date and time in PHP. Timezones diff --git a/modules/70-dates/description.es.yml b/modules/70-dates/description.es.yml deleted file mode 100644 index cfd6fe77..00000000 --- a/modules/70-dates/description.es.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -name: Fecha y Hora -description: | - El concepto de tiempo en las computadoras. Temporizadores de hardware y de sistema. Funciones para trabajar con fechas y horas en PHP. Zonas horarias. diff --git a/modules/70-dates/description.ru.yml b/modules/70-dates/description.ru.yml deleted file mode 100644 index 5a611aaa..00000000 --- a/modules/70-dates/description.ru.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -name: Дата и Время -description: | - Понятие времени в компьютерах. Аппаратный и Системный таймеры. Функции для работы с датой и временем в PHP. Таймзоны From 8c8a6892b6f156e11489ea6607446e1cab5a3593 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Wed, 17 Jun 2026 21:55:06 +0500 Subject: [PATCH 25/29] add hint --- modules/48-conditionals/65-switch/en/EXERCISE.md | 4 ++++ modules/48-conditionals/65-switch/es/EXERCISE.md | 6 +++--- modules/48-conditionals/65-switch/ru/EXERCISE.md | 6 +++--- modules/48-conditionals/65-switch/ru/README.md | 10 +--------- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/modules/48-conditionals/65-switch/en/EXERCISE.md b/modules/48-conditionals/65-switch/en/EXERCISE.md index 8e6d0d6d..7cdd9c52 100644 --- a/modules/48-conditionals/65-switch/en/EXERCISE.md +++ b/modules/48-conditionals/65-switch/en/EXERCISE.md @@ -1,6 +1,10 @@ Write a function, `getNumberExplanation()`, that describes a number passed to it. If there's no explanation available, it returns `null`: +* 666 - devil number +* 42 - answer for everything +* 7 - prime number + ```php Date: Wed, 17 Jun 2026 22:10:53 +0500 Subject: [PATCH 26/29] update match lesson --- Dockerfile | 2 +- .../70-match/description.es.yml | 49 ++++++++++--------- modules/48-conditionals/70-match/en/README.md | 49 ++++++++++--------- modules/48-conditionals/70-match/es/README.md | 49 ++++++++++--------- modules/48-conditionals/70-match/ru/README.md | 49 ++++++++++--------- 5 files changed, 101 insertions(+), 97 deletions(-) diff --git a/Dockerfile b/Dockerfile index 31fdf1ae..95e3f9bf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM hexletbasics/base-image -ARG PHP_VERSION=8.4 +ARG PHP_VERSION=8.5 WORKDIR /exercises-php diff --git a/modules/48-conditionals/70-match/description.es.yml b/modules/48-conditionals/70-match/description.es.yml index fc34e8b2..85fb9f02 100644 --- a/modules/48-conditionals/70-match/description.es.yml +++ b/modules/48-conditionals/70-match/description.es.yml @@ -2,32 +2,36 @@ name: Expresión match theory: | - La estructura `switch` de la lección anterior no es la única versión especializada de `if` en PHP. A partir de PHP 8, el lenguaje cuenta con la expresión `match`. También se debe usar donde hay una cadena de `if else` con comprobaciones de igualdad: + La expresión `match` apareció en PHP 8 y resuelve la misma tarea que `switch`: elige un resultado según el valor de una variable. Las construcciones son similares, pero `match` es más corta y funciona como una expresión. Comparémoslas con un ejemplo. Así se selecciona un texto según el estado del pedido con `switch`: ```php 'El pedido está en proceso', // $status === 'processing' - 'paid' => 'El pedido está pagado', // $status === 'paid' - 'new' => 'Pedido nuevo', // $status === 'new' - default => 'Estado desconocido', // else + 'processing' => 'El pedido está en proceso', + 'paid' => 'El pedido está pagado', + 'new' => 'Pedido nuevo', + default => 'Estado desconocido', }; ``` @@ -41,11 +45,7 @@ theory: | } ``` - En cuanto al número de elementos, `match` es una estructura compleja. La descripción externa incluye la palabra clave `match` y la variable cuyos valores usa `match` para elegir el comportamiento. Dentro hay ramas, cada una de las cuales describe el resultado para uno de los valores de la variable. Cada rama corresponde a un `if` del ejemplo anterior. La rama `default` es un caso especial que corresponde a la rama `else` de las estructuras condicionales. - - La principal diferencia entre `match` y tanto `switch` como un `if` normal es que se trata de una **expresión**. Toda la estructura se evalúa a un valor, por lo que su resultado se puede asignar directamente a una variable o devolver desde una función. No se necesita ningún `break`: se ejecuta exactamente una rama y aquí es imposible la caída en cascada. - - Dentro de `match` solo se permite la sintaxis mostrada arriba. A la izquierda de la flecha `=>` se indica el valor a comparar, y a la derecha, la expresión que se convertirá en el resultado. Si varios valores llevan al mismo resultado, se enumeran separados por comas: + A la izquierda de la flecha `=>` está el valor a comparar, y a la derecha, cualquier expresión que se convertirá en el resultado. La rama `default` se activa cuando ningún valor coincide y cumple el papel de `else`. Si varios valores llevan al mismo resultado, se enumeran separados por comas: ```php two ``` - Aunque la expresión `match` aparece en el código, técnicamente siempre se puede prescindir de ella. Su beneficio clave es que expresa mejor la intención del programador cuando hay que comprobar valores concretos de una variable. Ese código es más fácil de leer que los bloques `elseif`. + Técnicamente siempre se puede prescindir de `match`, igual que de `switch`. Pero cuando hay que elegir un resultado según valores concretos de una variable, `match` expresa esa intención con la mayor claridad, y ese código es más fácil de leer que una cadena de `elseif`. instructions: | Implementa una función `calculateDeliveryCost()` que reciba el país de entrega y el peso del paquete en kilogramos. La función debe devolver el costo de la entrega. diff --git a/modules/48-conditionals/70-match/en/README.md b/modules/48-conditionals/70-match/en/README.md index 33b01c02..31bc4329 100644 --- a/modules/48-conditionals/70-match/en/README.md +++ b/modules/48-conditionals/70-match/en/README.md @@ -1,29 +1,33 @@ -The `switch` construct from the previous lesson is not the only specialized version of `if` in PHP. Starting with PHP 8, the language has the `match` expression. It should also be used where there is an `if else` chain with equality checks: +The `match` expression appeared in PHP 8 and solves the same task as `switch`: it picks a result based on a variable's value. The constructs are similar, but `match` is shorter and works as an expression. Let's compare them on one example. Here is how you select a text by an order status with `switch`: ```php 'Order is being processed', // $status === 'processing' - 'paid' => 'Order is paid', // $status === 'paid' - 'new' => 'New order', // $status === 'new' - default => 'Unknown status', // else + 'processing' => 'Order is being processed', + 'paid' => 'Order is paid', + 'new' => 'New order', + default => 'Unknown status', }; ``` @@ -37,11 +41,7 @@ match (value) { } ``` -In terms of the number of elements, `match` is a complex construct. The outer description includes the `match` keyword and the variable whose values `match` uses to choose the behavior. Inside, there are arms, each describing the result for one of the variable's values. Each arm corresponds to an `if` in the example above. The `default` arm is a special case that corresponds to the `else` branch in conditional constructs. - -The main difference between `match` and both `switch` and a regular `if` is that it is an **expression**. The whole construct evaluates to a value, so its result can be directly assigned to a variable or returned from a function. No `break` is needed: exactly one arm is executed, and fall-through is impossible here. - -Only the syntax shown above is allowed inside `match`. To the left of the `=>` arrow is the value to compare, and to the right is the expression that becomes the result. If several values lead to the same result, they are listed separated by commas: +To the left of the `=>` arrow is the value to compare, and to the right is any expression that becomes the result. The `default` arm fires when no value matches and plays the role of `else`. If several values lead to the same result, they are listed separated by commas: ```php two ``` -Although the `match` expression appears in code, technically you can always do without it. Its key benefit is that it better expresses the programmer's intent when specific values of a variable need to be checked. Such code is easier to read than `elseif` blocks. +Technically you can always do without `match`, just as without `switch`. But when you need to pick a result by specific values of a variable, `match` expresses that intent most clearly, and such code is easier to read than a chain of `elseif`. diff --git a/modules/48-conditionals/70-match/es/README.md b/modules/48-conditionals/70-match/es/README.md index 4a6265e8..81abe7b8 100644 --- a/modules/48-conditionals/70-match/es/README.md +++ b/modules/48-conditionals/70-match/es/README.md @@ -1,29 +1,33 @@ -La estructura `switch` de la lección anterior no es la única versión especializada de `if` en PHP. A partir de PHP 8, el lenguaje cuenta con la expresión `match`. También se debe usar donde hay una cadena de `if else` con comprobaciones de igualdad: +La expresión `match` apareció en PHP 8 y resuelve la misma tarea que `switch`: elige un resultado según el valor de una variable. Las construcciones son similares, pero `match` es más corta y funciona como una expresión. Comparémoslas con un ejemplo. Así se selecciona un texto según el estado del pedido con `switch`: ```php 'El pedido está en proceso', // $status === 'processing' - 'paid' => 'El pedido está pagado', // $status === 'paid' - 'new' => 'Pedido nuevo', // $status === 'new' - default => 'Estado desconocido', // else + 'processing' => 'El pedido está en proceso', + 'paid' => 'El pedido está pagado', + 'new' => 'Pedido nuevo', + default => 'Estado desconocido', }; ``` @@ -37,11 +41,7 @@ match (valor) { } ``` -En cuanto al número de elementos, `match` es una estructura compleja. La descripción externa incluye la palabra clave `match` y la variable cuyos valores usa `match` para elegir el comportamiento. Dentro hay ramas, cada una de las cuales describe el resultado para uno de los valores de la variable. Cada rama corresponde a un `if` del ejemplo anterior. La rama `default` es un caso especial que corresponde a la rama `else` de las estructuras condicionales. - -La principal diferencia entre `match` y tanto `switch` como un `if` normal es que se trata de una **expresión**. Toda la estructura se evalúa a un valor, por lo que su resultado se puede asignar directamente a una variable o devolver desde una función. No se necesita ningún `break`: se ejecuta exactamente una rama y aquí es imposible la caída en cascada. - -Dentro de `match` solo se permite la sintaxis mostrada arriba. A la izquierda de la flecha `=>` se indica el valor a comparar, y a la derecha, la expresión que se convertirá en el resultado. Si varios valores llevan al mismo resultado, se enumeran separados por comas: +A la izquierda de la flecha `=>` está el valor a comparar, y a la derecha, cualquier expresión que se convertirá en el resultado. La rama `default` se activa cuando ningún valor coincide y cumple el papel de `else`. Si varios valores llevan al mismo resultado, se enumeran separados por comas: ```php two ``` -Aunque la expresión `match` aparece en el código, técnicamente siempre se puede prescindir de ella. Su beneficio clave es que expresa mejor la intención del programador cuando hay que comprobar valores concretos de una variable. Ese código es más fácil de leer que los bloques `elseif`. +Técnicamente siempre se puede prescindir de `match`, igual que de `switch`. Pero cuando hay que elegir un resultado según valores concretos de una variable, `match` expresa esa intención con la mayor claridad, y ese código es más fácil de leer que una cadena de `elseif`. diff --git a/modules/48-conditionals/70-match/ru/README.md b/modules/48-conditionals/70-match/ru/README.md index bf6c9f36..434937ac 100644 --- a/modules/48-conditionals/70-match/ru/README.md +++ b/modules/48-conditionals/70-match/ru/README.md @@ -1,29 +1,33 @@ -Выражение `match` представляет собой специализированную версию `if`, которую создали для особых ситуаций. Оно появилось в PHP 8, и его нужно использовать там, где есть цепочка `if else` с проверками на равенство: +Выражение `match` появилось в PHP 8 и решает ту же задачу, что и `switch`: выбирает результат по значению переменной. Конструкции похожи, но `match` записывается короче и работает как выражение. Сравним их на одном примере. Вот выбор текста по статусу заказа через `switch`: ```php 'Заказ в обработке', // $status === 'processing' - 'paid' => 'Заказ оплачен', // $status === 'paid' - 'new' => 'Новый заказ', // $status === 'new' - default => 'Неизвестный статус', // else + 'processing' => 'Заказ в обработке', + 'paid' => 'Заказ оплачен', + 'new' => 'Новый заказ', + default => 'Неизвестный статус', }; ``` @@ -37,11 +41,7 @@ match (значение) { } ``` -С точки зрения количества элементов `match` является сложной конструкцией. Внешнее описание включает ключевое слово `match` и переменную, по значениям которой `match` будет выбирать поведение. Внутри расположены ветки, каждая из которых описывает результат для одного из значений переменной. Каждая ветка соответствует `if` в примере выше. При этом `default` является особой ситуацией, которая соответствует ветке `else` в условных конструкциях. - -Главное отличие `match` от обычного `if` в том, что это **выражение**. Вся конструкция вычисляется в значение, поэтому ее результат можно сразу присвоить переменной или вернуть из функции. Никаких `break` не нужно: выполняется ровно одна ветка, «проваливание» здесь невозможно. - -Внутри `match` допустим только тот синтаксис, который показан выше. Слева от стрелки `=>` указывается значение для сравнения, справа — выражение, которое станет результатом. Если одному результату соответствует несколько значений, они перечисляются через запятую: +Слева от стрелки `=>` стоит значение для сравнения, справа — любое выражение, которое станет результатом. Ветка `default` срабатывает, когда не подошло ни одно значение, и играет роль `else`. Если одному результату соответствует несколько значений, их перечисляют через запятую: ```php two ``` -Выражение `match` хоть и встречается в коде, но технически всегда можно обойтись без него. Ключевая польза при его использовании в том, что он лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. Такой код читать легче, чем блоки `elseif`. +Технически без `match` всегда можно обойтись, как и без `switch`. Но когда нужно выбрать результат по конкретным значениям переменной, `match` выражает это намерение яснее всего, и читать такой код легче, чем цепочку `elseif`. From 0e9d0ebab63fa5bac4030ecde23b0af6e2f8baac Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Wed, 17 Jun 2026 22:22:29 +0500 Subject: [PATCH 27/29] Rename PHP solution file index.php to Solution.php Align the solution filename with the test filename (SolutionTest.php), matching the PHPUnit convention where SolutionTest tests Solution. - rename 72 modules/**/index.php -> Solution.php - update require/file_get_contents in 72 SolutionTest.php and src/Functions.php - set exercise_filename: Solution.php in spec.yml - update 350-modules theory references (ru/en/es) Co-Authored-By: Claude Opus 4.8 (1M context) --- modules/10-basics/10-hello-world/{index.php => Solution.php} | 0 modules/10-basics/10-hello-world/SolutionTest.php | 2 +- modules/10-basics/15-tags/{index.php => Solution.php} | 0 modules/10-basics/15-tags/SolutionTest.php | 2 +- modules/10-basics/20-comments/{index.php => Solution.php} | 0 modules/10-basics/20-comments/SolutionTest.php | 4 ++-- modules/10-basics/30-instructions/{index.php => Solution.php} | 0 modules/10-basics/30-instructions/SolutionTest.php | 2 +- modules/10-basics/40-testing/{index.php => Solution.php} | 0 modules/10-basics/40-testing/SolutionTest.php | 2 +- .../10-basics/50-syntax-errors/{index.php => Solution.php} | 0 modules/10-basics/50-syntax-errors/SolutionTest.php | 2 +- modules/20-arithmetics/20-basic/{index.php => Solution.php} | 0 modules/20-arithmetics/20-basic/SolutionTest.php | 2 +- .../20-arithmetics/25-operator/{index.php => Solution.php} | 0 modules/20-arithmetics/25-operator/SolutionTest.php | 2 +- .../27-commutativity/{index.php => Solution.php} | 0 modules/20-arithmetics/27-commutativity/SolutionTest.php | 2 +- .../20-arithmetics/30-composition/{index.php => Solution.php} | 0 modules/20-arithmetics/30-composition/SolutionTest.php | 2 +- .../20-arithmetics/40-priority/{index.php => Solution.php} | 0 modules/20-arithmetics/40-priority/SolutionTest.php | 2 +- modules/20-arithmetics/43-float/{index.php => Solution.php} | 0 modules/20-arithmetics/43-float/SolutionTest.php | 2 +- modules/20-arithmetics/45-linting/{index.php => Solution.php} | 0 modules/20-arithmetics/45-linting/SolutionTest.php | 2 +- modules/25-strings/10-quotes/{index.php => Solution.php} | 0 modules/25-strings/10-quotes/SolutionTest.php | 2 +- .../15-escape-characters/{index.php => Solution.php} | 0 modules/25-strings/15-escape-characters/SolutionTest.php | 2 +- .../20-string-concatenation/{index.php => Solution.php} | 0 modules/25-strings/20-string-concatenation/SolutionTest.php | 2 +- modules/25-strings/30-encoding/{index.php => Solution.php} | 0 modules/25-strings/30-encoding/SolutionTest.php | 2 +- .../30-variables/10-definition/{index.php => Solution.php} | 0 modules/30-variables/10-definition/SolutionTest.php | 2 +- modules/30-variables/12-change/{index.php => Solution.php} | 0 modules/30-variables/12-change/SolutionTest.php | 2 +- .../13-variables-naming/{index.php => Solution.php} | 0 modules/30-variables/13-variables-naming/SolutionTest.php | 2 +- .../15-variables-expressions/{index.php => Solution.php} | 0 .../30-variables/15-variables-expressions/SolutionTest.php | 2 +- .../18-variable-concatenation/{index.php => Solution.php} | 0 .../30-variables/18-variable-concatenation/SolutionTest.php | 2 +- .../30-variables/19-naming-style/{index.php => Solution.php} | 0 modules/30-variables/19-naming-style/SolutionTest.php | 2 +- .../30-variables/20-magic-numbers/{index.php => Solution.php} | 0 modules/30-variables/20-magic-numbers/SolutionTest.php | 2 +- modules/30-variables/23-constants/{index.php => Solution.php} | 0 modules/30-variables/23-constants/SolutionTest.php | 2 +- .../100-unicode/{index.php => Solution.php} | 0 modules/31-advanced-strings/100-unicode/SolutionTest.php | 2 +- .../110-locales/{index.php => Solution.php} | 0 modules/31-advanced-strings/110-locales/SolutionTest.php | 2 +- .../120-startwith/{index.php => Solution.php} | 0 modules/31-advanced-strings/120-startwith/SolutionTest.php | 2 +- .../25-interpolation/{index.php => Solution.php} | 0 modules/31-advanced-strings/25-interpolation/SolutionTest.php | 2 +- .../30-symbols/{index.php => Solution.php} | 0 modules/31-advanced-strings/30-symbols/SolutionTest.php | 2 +- .../31-advanced-strings/70-slices/{index.php => Solution.php} | 0 modules/31-advanced-strings/70-slices/SolutionTest.php | 2 +- .../90-multiline-strings/{index.php => Solution.php} | 0 .../31-advanced-strings/90-multiline-strings/SolutionTest.php | 2 +- .../40-primitive-data-types/{index.php => Solution.php} | 0 .../33-data-types/40-primitive-data-types/SolutionTest.php | 2 +- .../50-data-types-weak-typing/{index.php => Solution.php} | 0 .../33-data-types/50-data-types-weak-typing/SolutionTest.php | 2 +- .../52-data-types-immutability/{index.php => Solution.php} | 0 .../33-data-types/52-data-types-immutability/SolutionTest.php | 2 +- .../55-data-types-casting/{index.php => Solution.php} | 0 modules/33-data-types/55-data-types-casting/SolutionTest.php | 2 +- .../35-calling-functions/100-call/{index.php => Solution.php} | 0 modules/35-calling-functions/100-call/SolutionTest.php | 2 +- .../{index.php => Solution.php} | 0 .../135-calling-functions-default-params/SolutionTest.php | 2 +- .../{index.php => Solution.php} | 0 .../150-calling-functions-expression/SolutionTest.php | 2 +- .../180-variadic-parameters/{index.php => Solution.php} | 0 .../180-variadic-parameters/SolutionTest.php | 2 +- .../270-deterministic/{index.php => Solution.php} | 0 .../35-calling-functions/270-deterministic/SolutionTest.php | 2 +- .../100-define-function/{index.php => Solution.php} | 0 .../40-define-functions/100-define-function/SolutionTest.php | 2 +- .../150-return/{index.php => Solution.php} | 0 modules/40-define-functions/150-return/SolutionTest.php | 2 +- .../200-default-parameters/{index.php => Solution.php} | 0 .../200-default-parameters/SolutionTest.php | 2 +- .../250-named-arguments/{index.php => Solution.php} | 0 .../40-define-functions/250-named-arguments/SolutionTest.php | 2 +- .../300-type-annotations/{index.php => Solution.php} | 0 .../40-define-functions/300-type-annotations/SolutionTest.php | 2 +- .../350-modules/{index.php => Solution.php} | 0 modules/40-define-functions/350-modules/SolutionTest.php | 2 +- modules/40-define-functions/350-modules/description.es.yml | 4 ++-- modules/40-define-functions/350-modules/en/README.md | 4 ++-- modules/40-define-functions/350-modules/es/README.md | 4 ++-- modules/40-define-functions/350-modules/ru/README.md | 4 ++-- .../400-packages/{index.php => Solution.php} | 0 modules/40-define-functions/400-packages/SolutionTest.php | 2 +- modules/45-logic/10-bool-type/{index.php => Solution.php} | 0 modules/45-logic/10-bool-type/SolutionTest.php | 2 +- modules/45-logic/15-bool-strings/{index.php => Solution.php} | 0 modules/45-logic/15-bool-strings/SolutionTest.php | 2 +- .../20-logic-combine-expressions/{index.php => Solution.php} | 0 .../45-logic/20-logic-combine-expressions/SolutionTest.php | 2 +- .../45-logic/25-logical-operators/{index.php => Solution.php} | 0 modules/45-logic/25-logical-operators/SolutionTest.php | 2 +- .../45-logic/28-logical-negation/{index.php => Solution.php} | 0 modules/45-logic/28-logical-negation/SolutionTest.php | 2 +- .../90-logical-expressions/{index.php => Solution.php} | 0 modules/45-logic/90-logical-expressions/SolutionTest.php | 2 +- modules/48-conditionals/30-if/{index.php => Solution.php} | 0 modules/48-conditionals/30-if/SolutionTest.php | 2 +- .../48-conditionals/40-if-else/{index.php => Solution.php} | 0 modules/48-conditionals/40-if-else/SolutionTest.php | 2 +- .../48-conditionals/50-else-if/{index.php => Solution.php} | 0 modules/48-conditionals/50-else-if/SolutionTest.php | 2 +- .../60-ternary-operator/{index.php => Solution.php} | 0 modules/48-conditionals/60-ternary-operator/SolutionTest.php | 2 +- modules/48-conditionals/65-switch/{index.php => Solution.php} | 0 modules/48-conditionals/65-switch/SolutionTest.php | 2 +- modules/48-conditionals/70-match/{index.php => Solution.php} | 0 modules/48-conditionals/70-match/SolutionTest.php | 2 +- modules/48-conditionals/75-elvis/{index.php => Solution.php} | 0 modules/48-conditionals/75-elvis/SolutionTest.php | 2 +- modules/50-loops/10-while/{index.php => Solution.php} | 0 modules/50-loops/10-while/SolutionTest.php | 2 +- .../15-conditions-inside-loops/{index.php => Solution.php} | 0 modules/50-loops/15-conditions-inside-loops/SolutionTest.php | 2 +- .../20-aggregation-numbers/{index.php => Solution.php} | 0 modules/50-loops/20-aggregation-numbers/SolutionTest.php | 2 +- .../23-aggregation-strings/{index.php => Solution.php} | 0 modules/50-loops/23-aggregation-strings/SolutionTest.php | 2 +- .../25-iteration-over-string/{index.php => Solution.php} | 0 modules/50-loops/25-iteration-over-string/SolutionTest.php | 2 +- .../50-loops/30-syntactic-sugar/{index.php => Solution.php} | 0 modules/50-loops/30-syntactic-sugar/SolutionTest.php | 2 +- modules/50-loops/50-mutators/{index.php => Solution.php} | 0 modules/50-loops/50-mutators/SolutionTest.php | 2 +- .../50-loops/55-return-from-loops/{index.php => Solution.php} | 0 modules/50-loops/55-return-from-loops/SolutionTest.php | 2 +- modules/50-loops/70-for/{index.php => Solution.php} | 0 modules/50-loops/70-for/SolutionTest.php | 2 +- modules/50-loops/80-for-in-range/{index.php => Solution.php} | 0 modules/50-loops/80-for-in-range/SolutionTest.php | 2 +- modules/50-loops/90-debug/{index.php => Solution.php} | 0 modules/50-loops/90-debug/SolutionTest.php | 2 +- spec.yml | 2 +- src/Functions.php | 2 +- 150 files changed, 83 insertions(+), 83 deletions(-) rename modules/10-basics/10-hello-world/{index.php => Solution.php} (100%) rename modules/10-basics/15-tags/{index.php => Solution.php} (100%) rename modules/10-basics/20-comments/{index.php => Solution.php} (100%) rename modules/10-basics/30-instructions/{index.php => Solution.php} (100%) rename modules/10-basics/40-testing/{index.php => Solution.php} (100%) rename modules/10-basics/50-syntax-errors/{index.php => Solution.php} (100%) rename modules/20-arithmetics/20-basic/{index.php => Solution.php} (100%) rename modules/20-arithmetics/25-operator/{index.php => Solution.php} (100%) rename modules/20-arithmetics/27-commutativity/{index.php => Solution.php} (100%) rename modules/20-arithmetics/30-composition/{index.php => Solution.php} (100%) rename modules/20-arithmetics/40-priority/{index.php => Solution.php} (100%) rename modules/20-arithmetics/43-float/{index.php => Solution.php} (100%) rename modules/20-arithmetics/45-linting/{index.php => Solution.php} (100%) rename modules/25-strings/10-quotes/{index.php => Solution.php} (100%) rename modules/25-strings/15-escape-characters/{index.php => Solution.php} (100%) rename modules/25-strings/20-string-concatenation/{index.php => Solution.php} (100%) rename modules/25-strings/30-encoding/{index.php => Solution.php} (100%) rename modules/30-variables/10-definition/{index.php => Solution.php} (100%) rename modules/30-variables/12-change/{index.php => Solution.php} (100%) rename modules/30-variables/13-variables-naming/{index.php => Solution.php} (100%) rename modules/30-variables/15-variables-expressions/{index.php => Solution.php} (100%) rename modules/30-variables/18-variable-concatenation/{index.php => Solution.php} (100%) rename modules/30-variables/19-naming-style/{index.php => Solution.php} (100%) rename modules/30-variables/20-magic-numbers/{index.php => Solution.php} (100%) rename modules/30-variables/23-constants/{index.php => Solution.php} (100%) rename modules/31-advanced-strings/100-unicode/{index.php => Solution.php} (100%) rename modules/31-advanced-strings/110-locales/{index.php => Solution.php} (100%) rename modules/31-advanced-strings/120-startwith/{index.php => Solution.php} (100%) rename modules/31-advanced-strings/25-interpolation/{index.php => Solution.php} (100%) rename modules/31-advanced-strings/30-symbols/{index.php => Solution.php} (100%) rename modules/31-advanced-strings/70-slices/{index.php => Solution.php} (100%) rename modules/31-advanced-strings/90-multiline-strings/{index.php => Solution.php} (100%) rename modules/33-data-types/40-primitive-data-types/{index.php => Solution.php} (100%) rename modules/33-data-types/50-data-types-weak-typing/{index.php => Solution.php} (100%) rename modules/33-data-types/52-data-types-immutability/{index.php => Solution.php} (100%) rename modules/33-data-types/55-data-types-casting/{index.php => Solution.php} (100%) rename modules/35-calling-functions/100-call/{index.php => Solution.php} (100%) rename modules/35-calling-functions/135-calling-functions-default-params/{index.php => Solution.php} (100%) rename modules/35-calling-functions/150-calling-functions-expression/{index.php => Solution.php} (100%) rename modules/35-calling-functions/180-variadic-parameters/{index.php => Solution.php} (100%) rename modules/35-calling-functions/270-deterministic/{index.php => Solution.php} (100%) rename modules/40-define-functions/100-define-function/{index.php => Solution.php} (100%) rename modules/40-define-functions/150-return/{index.php => Solution.php} (100%) rename modules/40-define-functions/200-default-parameters/{index.php => Solution.php} (100%) rename modules/40-define-functions/250-named-arguments/{index.php => Solution.php} (100%) rename modules/40-define-functions/300-type-annotations/{index.php => Solution.php} (100%) rename modules/40-define-functions/350-modules/{index.php => Solution.php} (100%) rename modules/40-define-functions/400-packages/{index.php => Solution.php} (100%) rename modules/45-logic/10-bool-type/{index.php => Solution.php} (100%) rename modules/45-logic/15-bool-strings/{index.php => Solution.php} (100%) rename modules/45-logic/20-logic-combine-expressions/{index.php => Solution.php} (100%) rename modules/45-logic/25-logical-operators/{index.php => Solution.php} (100%) rename modules/45-logic/28-logical-negation/{index.php => Solution.php} (100%) rename modules/45-logic/90-logical-expressions/{index.php => Solution.php} (100%) rename modules/48-conditionals/30-if/{index.php => Solution.php} (100%) rename modules/48-conditionals/40-if-else/{index.php => Solution.php} (100%) rename modules/48-conditionals/50-else-if/{index.php => Solution.php} (100%) rename modules/48-conditionals/60-ternary-operator/{index.php => Solution.php} (100%) rename modules/48-conditionals/65-switch/{index.php => Solution.php} (100%) rename modules/48-conditionals/70-match/{index.php => Solution.php} (100%) rename modules/48-conditionals/75-elvis/{index.php => Solution.php} (100%) rename modules/50-loops/10-while/{index.php => Solution.php} (100%) rename modules/50-loops/15-conditions-inside-loops/{index.php => Solution.php} (100%) rename modules/50-loops/20-aggregation-numbers/{index.php => Solution.php} (100%) rename modules/50-loops/23-aggregation-strings/{index.php => Solution.php} (100%) rename modules/50-loops/25-iteration-over-string/{index.php => Solution.php} (100%) rename modules/50-loops/30-syntactic-sugar/{index.php => Solution.php} (100%) rename modules/50-loops/50-mutators/{index.php => Solution.php} (100%) rename modules/50-loops/55-return-from-loops/{index.php => Solution.php} (100%) rename modules/50-loops/70-for/{index.php => Solution.php} (100%) rename modules/50-loops/80-for-in-range/{index.php => Solution.php} (100%) rename modules/50-loops/90-debug/{index.php => Solution.php} (100%) diff --git a/modules/10-basics/10-hello-world/index.php b/modules/10-basics/10-hello-world/Solution.php similarity index 100% rename from modules/10-basics/10-hello-world/index.php rename to modules/10-basics/10-hello-world/Solution.php diff --git a/modules/10-basics/10-hello-world/SolutionTest.php b/modules/10-basics/10-hello-world/SolutionTest.php index 3934daad..395c5ea0 100644 --- a/modules/10-basics/10-hello-world/SolutionTest.php +++ b/modules/10-basics/10-hello-world/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'Hello, World!'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/10-basics/15-tags/index.php b/modules/10-basics/15-tags/Solution.php similarity index 100% rename from modules/10-basics/15-tags/index.php rename to modules/10-basics/15-tags/Solution.php diff --git a/modules/10-basics/15-tags/SolutionTest.php b/modules/10-basics/15-tags/SolutionTest.php index 88089397..380ed0a3 100644 --- a/modules/10-basics/15-tags/SolutionTest.php +++ b/modules/10-basics/15-tags/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'King in the North!'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/10-basics/20-comments/index.php b/modules/10-basics/20-comments/Solution.php similarity index 100% rename from modules/10-basics/20-comments/index.php rename to modules/10-basics/20-comments/Solution.php diff --git a/modules/10-basics/20-comments/SolutionTest.php b/modules/10-basics/20-comments/SolutionTest.php index 0fa8b589..28e7689d 100644 --- a/modules/10-basics/20-comments/SolutionTest.php +++ b/modules/10-basics/20-comments/SolutionTest.php @@ -9,8 +9,8 @@ class SolutionTest extends TestCase public function test() { $this->expectOutputString(''); - require 'index.php'; - $content = file_get_contents('index.php'); + require 'Solution.php'; + $content = file_get_contents('Solution.php'); $this->assertStringContainsString('// TODO: добавить функцию приветствия', $content); } } diff --git a/modules/10-basics/30-instructions/index.php b/modules/10-basics/30-instructions/Solution.php similarity index 100% rename from modules/10-basics/30-instructions/index.php rename to modules/10-basics/30-instructions/Solution.php diff --git a/modules/10-basics/30-instructions/SolutionTest.php b/modules/10-basics/30-instructions/SolutionTest.php index cb3f3aa4..2d5406e3 100644 --- a/modules/10-basics/30-instructions/SolutionTest.php +++ b/modules/10-basics/30-instructions/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'RobertStannisRenly'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/10-basics/40-testing/index.php b/modules/10-basics/40-testing/Solution.php similarity index 100% rename from modules/10-basics/40-testing/index.php rename to modules/10-basics/40-testing/Solution.php diff --git a/modules/10-basics/40-testing/SolutionTest.php b/modules/10-basics/40-testing/SolutionTest.php index e177af65..945b14fc 100644 --- a/modules/10-basics/40-testing/SolutionTest.php +++ b/modules/10-basics/40-testing/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '9780262531962'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/10-basics/50-syntax-errors/index.php b/modules/10-basics/50-syntax-errors/Solution.php similarity index 100% rename from modules/10-basics/50-syntax-errors/index.php rename to modules/10-basics/50-syntax-errors/Solution.php diff --git a/modules/10-basics/50-syntax-errors/SolutionTest.php b/modules/10-basics/50-syntax-errors/SolutionTest.php index 9ee60d1a..5a73f093 100644 --- a/modules/10-basics/50-syntax-errors/SolutionTest.php +++ b/modules/10-basics/50-syntax-errors/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'Программа успешно запущена'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/20-arithmetics/20-basic/index.php b/modules/20-arithmetics/20-basic/Solution.php similarity index 100% rename from modules/20-arithmetics/20-basic/index.php rename to modules/20-arithmetics/20-basic/Solution.php diff --git a/modules/20-arithmetics/20-basic/SolutionTest.php b/modules/20-arithmetics/20-basic/SolutionTest.php index e393e5eb..f6c9fa3b 100644 --- a/modules/20-arithmetics/20-basic/SolutionTest.php +++ b/modules/20-arithmetics/20-basic/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '9'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/20-arithmetics/25-operator/index.php b/modules/20-arithmetics/25-operator/Solution.php similarity index 100% rename from modules/20-arithmetics/25-operator/index.php rename to modules/20-arithmetics/25-operator/Solution.php diff --git a/modules/20-arithmetics/25-operator/SolutionTest.php b/modules/20-arithmetics/25-operator/SolutionTest.php index ae610922..7260e893 100644 --- a/modules/20-arithmetics/25-operator/SolutionTest.php +++ b/modules/20-arithmetics/25-operator/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '8729'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/20-arithmetics/27-commutativity/index.php b/modules/20-arithmetics/27-commutativity/Solution.php similarity index 100% rename from modules/20-arithmetics/27-commutativity/index.php rename to modules/20-arithmetics/27-commutativity/Solution.php diff --git a/modules/20-arithmetics/27-commutativity/SolutionTest.php b/modules/20-arithmetics/27-commutativity/SolutionTest.php index 2479e46a..3477f5bb 100644 --- a/modules/20-arithmetics/27-commutativity/SolutionTest.php +++ b/modules/20-arithmetics/27-commutativity/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '2563'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/20-arithmetics/30-composition/index.php b/modules/20-arithmetics/30-composition/Solution.php similarity index 100% rename from modules/20-arithmetics/30-composition/index.php rename to modules/20-arithmetics/30-composition/Solution.php diff --git a/modules/20-arithmetics/30-composition/SolutionTest.php b/modules/20-arithmetics/30-composition/SolutionTest.php index 14c9a37f..b14cb520 100644 --- a/modules/20-arithmetics/30-composition/SolutionTest.php +++ b/modules/20-arithmetics/30-composition/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '660'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/20-arithmetics/40-priority/index.php b/modules/20-arithmetics/40-priority/Solution.php similarity index 100% rename from modules/20-arithmetics/40-priority/index.php rename to modules/20-arithmetics/40-priority/Solution.php diff --git a/modules/20-arithmetics/40-priority/SolutionTest.php b/modules/20-arithmetics/40-priority/SolutionTest.php index f4d59c49..a2f74ab4 100644 --- a/modules/20-arithmetics/40-priority/SolutionTest.php +++ b/modules/20-arithmetics/40-priority/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '160'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/20-arithmetics/43-float/index.php b/modules/20-arithmetics/43-float/Solution.php similarity index 100% rename from modules/20-arithmetics/43-float/index.php rename to modules/20-arithmetics/43-float/Solution.php diff --git a/modules/20-arithmetics/43-float/SolutionTest.php b/modules/20-arithmetics/43-float/SolutionTest.php index 76a93d5d..9f09c0d3 100644 --- a/modules/20-arithmetics/43-float/SolutionTest.php +++ b/modules/20-arithmetics/43-float/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '5.5511151231258E-17'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/20-arithmetics/45-linting/index.php b/modules/20-arithmetics/45-linting/Solution.php similarity index 100% rename from modules/20-arithmetics/45-linting/index.php rename to modules/20-arithmetics/45-linting/Solution.php diff --git a/modules/20-arithmetics/45-linting/SolutionTest.php b/modules/20-arithmetics/45-linting/SolutionTest.php index 9a51fb7e..75c137b4 100644 --- a/modules/20-arithmetics/45-linting/SolutionTest.php +++ b/modules/20-arithmetics/45-linting/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '4'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/25-strings/10-quotes/index.php b/modules/25-strings/10-quotes/Solution.php similarity index 100% rename from modules/25-strings/10-quotes/index.php rename to modules/25-strings/10-quotes/Solution.php diff --git a/modules/25-strings/10-quotes/SolutionTest.php b/modules/25-strings/10-quotes/SolutionTest.php index 3cba6099..8c1eea7b 100644 --- a/modules/25-strings/10-quotes/SolutionTest.php +++ b/modules/25-strings/10-quotes/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'The file "user\'s_config.json" was not found.'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/25-strings/15-escape-characters/index.php b/modules/25-strings/15-escape-characters/Solution.php similarity index 100% rename from modules/25-strings/15-escape-characters/index.php rename to modules/25-strings/15-escape-characters/Solution.php diff --git a/modules/25-strings/15-escape-characters/SolutionTest.php b/modules/25-strings/15-escape-characters/SolutionTest.php index 6402e88a..8a5a4d9f 100644 --- a/modules/25-strings/15-escape-characters/SolutionTest.php +++ b/modules/25-strings/15-escape-characters/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "Для разделения строк используйте \"\\n\"\nПример: print_r(\"строка1\\nстрока2\")"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/25-strings/20-string-concatenation/index.php b/modules/25-strings/20-string-concatenation/Solution.php similarity index 100% rename from modules/25-strings/20-string-concatenation/index.php rename to modules/25-strings/20-string-concatenation/Solution.php diff --git a/modules/25-strings/20-string-concatenation/SolutionTest.php b/modules/25-strings/20-string-concatenation/SolutionTest.php index 491fe63e..6123c12e 100644 --- a/modules/25-strings/20-string-concatenation/SolutionTest.php +++ b/modules/25-strings/20-string-concatenation/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'https://github.com/hexlet/exercises-php'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/25-strings/30-encoding/index.php b/modules/25-strings/30-encoding/Solution.php similarity index 100% rename from modules/25-strings/30-encoding/index.php rename to modules/25-strings/30-encoding/Solution.php diff --git a/modules/25-strings/30-encoding/SolutionTest.php b/modules/25-strings/30-encoding/SolutionTest.php index 5642f101..3e1e7aac 100644 --- a/modules/25-strings/30-encoding/SolutionTest.php +++ b/modules/25-strings/30-encoding/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "~\n^\n%\n"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/30-variables/10-definition/index.php b/modules/30-variables/10-definition/Solution.php similarity index 100% rename from modules/30-variables/10-definition/index.php rename to modules/30-variables/10-definition/Solution.php diff --git a/modules/30-variables/10-definition/SolutionTest.php b/modules/30-variables/10-definition/SolutionTest.php index d1d569e0..3f81f98a 100644 --- a/modules/30-variables/10-definition/SolutionTest.php +++ b/modules/30-variables/10-definition/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "https://hexlet.io\nhttps://hexlet.io"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/30-variables/12-change/index.php b/modules/30-variables/12-change/Solution.php similarity index 100% rename from modules/30-variables/12-change/index.php rename to modules/30-variables/12-change/Solution.php diff --git a/modules/30-variables/12-change/SolutionTest.php b/modules/30-variables/12-change/SolutionTest.php index b215a274..2aabbca5 100644 --- a/modules/30-variables/12-change/SolutionTest.php +++ b/modules/30-variables/12-change/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'доставлен'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/30-variables/13-variables-naming/index.php b/modules/30-variables/13-variables-naming/Solution.php similarity index 100% rename from modules/30-variables/13-variables-naming/index.php rename to modules/30-variables/13-variables-naming/Solution.php diff --git a/modules/30-variables/13-variables-naming/SolutionTest.php b/modules/30-variables/13-variables-naming/SolutionTest.php index 7657c077..c6f8e21a 100644 --- a/modules/30-variables/13-variables-naming/SolutionTest.php +++ b/modules/30-variables/13-variables-naming/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "2"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/30-variables/15-variables-expressions/index.php b/modules/30-variables/15-variables-expressions/Solution.php similarity index 100% rename from modules/30-variables/15-variables-expressions/index.php rename to modules/30-variables/15-variables-expressions/Solution.php diff --git a/modules/30-variables/15-variables-expressions/SolutionTest.php b/modules/30-variables/15-variables-expressions/SolutionTest.php index 0be31001..a99b3d90 100644 --- a/modules/30-variables/15-variables-expressions/SolutionTest.php +++ b/modules/30-variables/15-variables-expressions/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "125\n863.75"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/30-variables/18-variable-concatenation/index.php b/modules/30-variables/18-variable-concatenation/Solution.php similarity index 100% rename from modules/30-variables/18-variable-concatenation/index.php rename to modules/30-variables/18-variable-concatenation/Solution.php diff --git a/modules/30-variables/18-variable-concatenation/SolutionTest.php b/modules/30-variables/18-variable-concatenation/SolutionTest.php index 6ec61939..a6729df8 100644 --- a/modules/30-variables/18-variable-concatenation/SolutionTest.php +++ b/modules/30-variables/18-variable-concatenation/SolutionTest.php @@ -17,6 +17,6 @@ public function test() HERE; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/30-variables/19-naming-style/index.php b/modules/30-variables/19-naming-style/Solution.php similarity index 100% rename from modules/30-variables/19-naming-style/index.php rename to modules/30-variables/19-naming-style/Solution.php diff --git a/modules/30-variables/19-naming-style/SolutionTest.php b/modules/30-variables/19-naming-style/SolutionTest.php index a67f68a5..1b5f3ab8 100644 --- a/modules/30-variables/19-naming-style/SolutionTest.php +++ b/modules/30-variables/19-naming-style/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "2000"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/30-variables/20-magic-numbers/index.php b/modules/30-variables/20-magic-numbers/Solution.php similarity index 100% rename from modules/30-variables/20-magic-numbers/index.php rename to modules/30-variables/20-magic-numbers/Solution.php diff --git a/modules/30-variables/20-magic-numbers/SolutionTest.php b/modules/30-variables/20-magic-numbers/SolutionTest.php index c7475526..47f1797d 100644 --- a/modules/30-variables/20-magic-numbers/SolutionTest.php +++ b/modules/30-variables/20-magic-numbers/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "Ящиков на складе:\n102"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/30-variables/23-constants/index.php b/modules/30-variables/23-constants/Solution.php similarity index 100% rename from modules/30-variables/23-constants/index.php rename to modules/30-variables/23-constants/Solution.php diff --git a/modules/30-variables/23-constants/SolutionTest.php b/modules/30-variables/23-constants/SolutionTest.php index 4c0d2634..5714d6de 100644 --- a/modules/30-variables/23-constants/SolutionTest.php +++ b/modules/30-variables/23-constants/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals(3, MAX_LOGIN_ATTEMPTS); } } diff --git a/modules/31-advanced-strings/100-unicode/index.php b/modules/31-advanced-strings/100-unicode/Solution.php similarity index 100% rename from modules/31-advanced-strings/100-unicode/index.php rename to modules/31-advanced-strings/100-unicode/Solution.php diff --git a/modules/31-advanced-strings/100-unicode/SolutionTest.php b/modules/31-advanced-strings/100-unicode/SolutionTest.php index d8dbfaaf..b92a040c 100644 --- a/modules/31-advanced-strings/100-unicode/SolutionTest.php +++ b/modules/31-advanced-strings/100-unicode/SolutionTest.php @@ -10,6 +10,6 @@ public function test() { $expected = "13\n7\n"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/110-locales/index.php b/modules/31-advanced-strings/110-locales/Solution.php similarity index 100% rename from modules/31-advanced-strings/110-locales/index.php rename to modules/31-advanced-strings/110-locales/Solution.php diff --git a/modules/31-advanced-strings/110-locales/SolutionTest.php b/modules/31-advanced-strings/110-locales/SolutionTest.php index 997c0e51..280cd877 100644 --- a/modules/31-advanced-strings/110-locales/SolutionTest.php +++ b/modules/31-advanced-strings/110-locales/SolutionTest.php @@ -10,6 +10,6 @@ public function test() { $expected = setlocale(LC_CTYPE, 0); $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/120-startwith/index.php b/modules/31-advanced-strings/120-startwith/Solution.php similarity index 100% rename from modules/31-advanced-strings/120-startwith/index.php rename to modules/31-advanced-strings/120-startwith/Solution.php diff --git a/modules/31-advanced-strings/120-startwith/SolutionTest.php b/modules/31-advanced-strings/120-startwith/SolutionTest.php index 1c5a430c..d16af4aa 100644 --- a/modules/31-advanced-strings/120-startwith/SolutionTest.php +++ b/modules/31-advanced-strings/120-startwith/SolutionTest.php @@ -10,6 +10,6 @@ public function test() { $expected = '18'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/25-interpolation/index.php b/modules/31-advanced-strings/25-interpolation/Solution.php similarity index 100% rename from modules/31-advanced-strings/25-interpolation/index.php rename to modules/31-advanced-strings/25-interpolation/Solution.php diff --git a/modules/31-advanced-strings/25-interpolation/SolutionTest.php b/modules/31-advanced-strings/25-interpolation/SolutionTest.php index 4d26bbba..870f7af6 100644 --- a/modules/31-advanced-strings/25-interpolation/SolutionTest.php +++ b/modules/31-advanced-strings/25-interpolation/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'Здравствуйте, Анна! Ваш заказ #1337 принят.'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/30-symbols/index.php b/modules/31-advanced-strings/30-symbols/Solution.php similarity index 100% rename from modules/31-advanced-strings/30-symbols/index.php rename to modules/31-advanced-strings/30-symbols/Solution.php diff --git a/modules/31-advanced-strings/30-symbols/SolutionTest.php b/modules/31-advanced-strings/30-symbols/SolutionTest.php index c0f5cbd7..a9450c41 100644 --- a/modules/31-advanced-strings/30-symbols/SolutionTest.php +++ b/modules/31-advanced-strings/30-symbols/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'grip'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/70-slices/index.php b/modules/31-advanced-strings/70-slices/Solution.php similarity index 100% rename from modules/31-advanced-strings/70-slices/index.php rename to modules/31-advanced-strings/70-slices/Solution.php diff --git a/modules/31-advanced-strings/70-slices/SolutionTest.php b/modules/31-advanced-strings/70-slices/SolutionTest.php index a8817b82..29cd8600 100644 --- a/modules/31-advanced-strings/70-slices/SolutionTest.php +++ b/modules/31-advanced-strings/70-slices/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'hexlet.io'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/90-multiline-strings/index.php b/modules/31-advanced-strings/90-multiline-strings/Solution.php similarity index 100% rename from modules/31-advanced-strings/90-multiline-strings/index.php rename to modules/31-advanced-strings/90-multiline-strings/Solution.php diff --git a/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php b/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php index d6b0e281..07c2c219 100644 --- a/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php +++ b/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php @@ -17,6 +17,6 @@ public function test() Спасибо, что выбрали нас! EOT; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/33-data-types/40-primitive-data-types/index.php b/modules/33-data-types/40-primitive-data-types/Solution.php similarity index 100% rename from modules/33-data-types/40-primitive-data-types/index.php rename to modules/33-data-types/40-primitive-data-types/Solution.php diff --git a/modules/33-data-types/40-primitive-data-types/SolutionTest.php b/modules/33-data-types/40-primitive-data-types/SolutionTest.php index a0ffe9c3..1af4674f 100644 --- a/modules/33-data-types/40-primitive-data-types/SolutionTest.php +++ b/modules/33-data-types/40-primitive-data-types/SolutionTest.php @@ -18,6 +18,6 @@ public function test() HERE; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/33-data-types/50-data-types-weak-typing/index.php b/modules/33-data-types/50-data-types-weak-typing/Solution.php similarity index 100% rename from modules/33-data-types/50-data-types-weak-typing/index.php rename to modules/33-data-types/50-data-types-weak-typing/Solution.php diff --git a/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php b/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php index afe3146f..690e101f 100644 --- a/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php +++ b/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '13'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/33-data-types/52-data-types-immutability/index.php b/modules/33-data-types/52-data-types-immutability/Solution.php similarity index 100% rename from modules/33-data-types/52-data-types-immutability/index.php rename to modules/33-data-types/52-data-types-immutability/Solution.php diff --git a/modules/33-data-types/52-data-types-immutability/SolutionTest.php b/modules/33-data-types/52-data-types-immutability/SolutionTest.php index ff53b6e6..f3f17133 100644 --- a/modules/33-data-types/52-data-types-immutability/SolutionTest.php +++ b/modules/33-data-types/52-data-types-immutability/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = 'print'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/33-data-types/55-data-types-casting/index.php b/modules/33-data-types/55-data-types-casting/Solution.php similarity index 100% rename from modules/33-data-types/55-data-types-casting/index.php rename to modules/33-data-types/55-data-types-casting/Solution.php diff --git a/modules/33-data-types/55-data-types-casting/SolutionTest.php b/modules/33-data-types/55-data-types-casting/SolutionTest.php index a9c3d5d9..683605f6 100644 --- a/modules/33-data-types/55-data-types-casting/SolutionTest.php +++ b/modules/33-data-types/55-data-types-casting/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '36 °C'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/35-calling-functions/100-call/index.php b/modules/35-calling-functions/100-call/Solution.php similarity index 100% rename from modules/35-calling-functions/100-call/index.php rename to modules/35-calling-functions/100-call/Solution.php diff --git a/modules/35-calling-functions/100-call/SolutionTest.php b/modules/35-calling-functions/100-call/SolutionTest.php index d1039aba..911e223b 100644 --- a/modules/35-calling-functions/100-call/SolutionTest.php +++ b/modules/35-calling-functions/100-call/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "12"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/35-calling-functions/135-calling-functions-default-params/index.php b/modules/35-calling-functions/135-calling-functions-default-params/Solution.php similarity index 100% rename from modules/35-calling-functions/135-calling-functions-default-params/index.php rename to modules/35-calling-functions/135-calling-functions-default-params/Solution.php diff --git a/modules/35-calling-functions/135-calling-functions-default-params/SolutionTest.php b/modules/35-calling-functions/135-calling-functions-default-params/SolutionTest.php index d10f3544..c6041ce2 100644 --- a/modules/35-calling-functions/135-calling-functions-default-params/SolutionTest.php +++ b/modules/35-calling-functions/135-calling-functions-default-params/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "37.8\n2426.76\n607\n"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/35-calling-functions/150-calling-functions-expression/index.php b/modules/35-calling-functions/150-calling-functions-expression/Solution.php similarity index 100% rename from modules/35-calling-functions/150-calling-functions-expression/index.php rename to modules/35-calling-functions/150-calling-functions-expression/Solution.php diff --git a/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php b/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php index adaf1c55..377b27ec 100644 --- a/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php +++ b/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = "First: H\nLast: !"; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/35-calling-functions/180-variadic-parameters/index.php b/modules/35-calling-functions/180-variadic-parameters/Solution.php similarity index 100% rename from modules/35-calling-functions/180-variadic-parameters/index.php rename to modules/35-calling-functions/180-variadic-parameters/Solution.php diff --git a/modules/35-calling-functions/180-variadic-parameters/SolutionTest.php b/modules/35-calling-functions/180-variadic-parameters/SolutionTest.php index 2174ff4b..58067fb2 100644 --- a/modules/35-calling-functions/180-variadic-parameters/SolutionTest.php +++ b/modules/35-calling-functions/180-variadic-parameters/SolutionTest.php @@ -12,6 +12,6 @@ public function test() { $expected = '-3'; $this->expectOutputString($expected); - require 'index.php'; + require 'Solution.php'; } } diff --git a/modules/35-calling-functions/270-deterministic/index.php b/modules/35-calling-functions/270-deterministic/Solution.php similarity index 100% rename from modules/35-calling-functions/270-deterministic/index.php rename to modules/35-calling-functions/270-deterministic/Solution.php diff --git a/modules/35-calling-functions/270-deterministic/SolutionTest.php b/modules/35-calling-functions/270-deterministic/SolutionTest.php index 571f06eb..95e466ab 100644 --- a/modules/35-calling-functions/270-deterministic/SolutionTest.php +++ b/modules/35-calling-functions/270-deterministic/SolutionTest.php @@ -10,7 +10,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $randomRoll = $this->getActualOutputForAssertion(); $this->assertThat( $randomRoll, diff --git a/modules/40-define-functions/100-define-function/index.php b/modules/40-define-functions/100-define-function/Solution.php similarity index 100% rename from modules/40-define-functions/100-define-function/index.php rename to modules/40-define-functions/100-define-function/Solution.php diff --git a/modules/40-define-functions/100-define-function/SolutionTest.php b/modules/40-define-functions/100-define-function/SolutionTest.php index 264a143d..d59f631f 100644 --- a/modules/40-define-functions/100-define-function/SolutionTest.php +++ b/modules/40-define-functions/100-define-function/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $expected = 'Hello, World!'; $this->expectOutputString($expected); diff --git a/modules/40-define-functions/150-return/index.php b/modules/40-define-functions/150-return/Solution.php similarity index 100% rename from modules/40-define-functions/150-return/index.php rename to modules/40-define-functions/150-return/Solution.php diff --git a/modules/40-define-functions/150-return/SolutionTest.php b/modules/40-define-functions/150-return/SolutionTest.php index 3d0e249c..003e66e3 100644 --- a/modules/40-define-functions/150-return/SolutionTest.php +++ b/modules/40-define-functions/150-return/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('he...', truncate('hexlet', 2)); $this->assertEquals('it w...', truncate('it works!', 4)); diff --git a/modules/40-define-functions/200-default-parameters/index.php b/modules/40-define-functions/200-default-parameters/Solution.php similarity index 100% rename from modules/40-define-functions/200-default-parameters/index.php rename to modules/40-define-functions/200-default-parameters/Solution.php diff --git a/modules/40-define-functions/200-default-parameters/SolutionTest.php b/modules/40-define-functions/200-default-parameters/SolutionTest.php index 6fa03059..9bf5a0dc 100644 --- a/modules/40-define-functions/200-default-parameters/SolutionTest.php +++ b/modules/40-define-functions/200-default-parameters/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('****1234', getHiddenCard('1234123412341234')); $this->assertEquals('****4321', getHiddenCard('1234123412344321')); diff --git a/modules/40-define-functions/250-named-arguments/index.php b/modules/40-define-functions/250-named-arguments/Solution.php similarity index 100% rename from modules/40-define-functions/250-named-arguments/index.php rename to modules/40-define-functions/250-named-arguments/Solution.php diff --git a/modules/40-define-functions/250-named-arguments/SolutionTest.php b/modules/40-define-functions/250-named-arguments/SolutionTest.php index b720f7a8..04e7ed2f 100644 --- a/modules/40-define-functions/250-named-arguments/SolutionTest.php +++ b/modules/40-define-functions/250-named-arguments/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('python', trimAndRepeat('python')); $this->assertEquals('on', trimAndRepeat('python', offset: 4)); diff --git a/modules/40-define-functions/300-type-annotations/index.php b/modules/40-define-functions/300-type-annotations/Solution.php similarity index 100% rename from modules/40-define-functions/300-type-annotations/index.php rename to modules/40-define-functions/300-type-annotations/Solution.php diff --git a/modules/40-define-functions/300-type-annotations/SolutionTest.php b/modules/40-define-functions/300-type-annotations/SolutionTest.php index cbcde506..579583a5 100644 --- a/modules/40-define-functions/300-type-annotations/SolutionTest.php +++ b/modules/40-define-functions/300-type-annotations/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $reflection = new \ReflectionFunction(__NAMESPACE__ . '\wordMultiply'); $parameterTypes = array_map( diff --git a/modules/40-define-functions/350-modules/index.php b/modules/40-define-functions/350-modules/Solution.php similarity index 100% rename from modules/40-define-functions/350-modules/index.php rename to modules/40-define-functions/350-modules/Solution.php diff --git a/modules/40-define-functions/350-modules/SolutionTest.php b/modules/40-define-functions/350-modules/SolutionTest.php index d9d6214a..6ce796ff 100644 --- a/modules/40-define-functions/350-modules/SolutionTest.php +++ b/modules/40-define-functions/350-modules/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals(75, amountPerPerson(300, 4, 0)); $this->assertEquals(90, amountPerPerson(300, 4, 20)); diff --git a/modules/40-define-functions/350-modules/description.es.yml b/modules/40-define-functions/350-modules/description.es.yml index a53d8140..42043eb9 100644 --- a/modules/40-define-functions/350-modules/description.es.yml +++ b/modules/40-define-functions/350-modules/description.es.yml @@ -6,14 +6,14 @@ theory: | ```php Hi! ``` - Las pruebas de este curso usan el mismo mecanismo: cargan tu solución con `require 'index.php';`. + Las pruebas de este curso usan el mismo mecanismo: cargan tu solución con `require 'Solution.php';`. `include` se diferencia de `require` en cómo se gestiona un archivo inexistente: `include` emite una advertencia y el programa continúa, mientras que `require` se detiene con un error. `require_once` carga un archivo solo una vez, lo cual es importante para archivos con funciones: volver a declarar una función provoca un error. diff --git a/modules/40-define-functions/350-modules/en/README.md b/modules/40-define-functions/350-modules/en/README.md index 8f12c224..2b442f61 100644 --- a/modules/40-define-functions/350-modules/en/README.md +++ b/modules/40-define-functions/350-modules/en/README.md @@ -2,14 +2,14 @@ As a program grows, the code is split into separate files. In PHP, a file is con ```php Hi! ``` -The tests in this course use the same mechanism: they load your solution with `require 'index.php';`. +The tests in this course use the same mechanism: they load your solution with `require 'Solution.php';`. `include` differs from `require` in how a missing file is handled: `include` emits a warning and the program keeps running, while `require` stops with an error. `require_once` loads a file only once, which matters for files with functions: redeclaring a function causes an error. diff --git a/modules/40-define-functions/350-modules/es/README.md b/modules/40-define-functions/350-modules/es/README.md index 134debf7..912c16ea 100644 --- a/modules/40-define-functions/350-modules/es/README.md +++ b/modules/40-define-functions/350-modules/es/README.md @@ -2,14 +2,14 @@ A medida que un programa crece, el código se divide en archivos separados. En P ```php Hi! ``` -Las pruebas de este curso usan el mismo mecanismo: cargan tu solución con `require 'index.php';`. +Las pruebas de este curso usan el mismo mecanismo: cargan tu solución con `require 'Solution.php';`. `include` se diferencia de `require` en cómo se gestiona un archivo inexistente: `include` emite una advertencia y el programa continúa, mientras que `require` se detiene con un error. `require_once` carga un archivo solo una vez, lo cual es importante para archivos con funciones: volver a declarar una función provoca un error. diff --git a/modules/40-define-functions/350-modules/ru/README.md b/modules/40-define-functions/350-modules/ru/README.md index 66e8d442..95f5595b 100644 --- a/modules/40-define-functions/350-modules/ru/README.md +++ b/modules/40-define-functions/350-modules/ru/README.md @@ -18,7 +18,7 @@ function sayHi() ```php Hi! После подключения все функции из файла `helpers.php` доступны так, как будто они были определены прямо в текущем файле. -Кстати, вы уже видели этот механизм в действии. Автоматизированные тесты в этом курсе подключают файл с вашим решением строкой `require 'index.php';` — и после этого могут вызывать функции, которые вы определили. +Кстати, вы уже видели этот механизм в действии. Автоматизированные тесты в этом курсе подключают файл с вашим решением строкой `require 'Solution.php';` — и после этого могут вызывать функции, которые вы определили. ## require, include и require_once diff --git a/modules/40-define-functions/400-packages/index.php b/modules/40-define-functions/400-packages/Solution.php similarity index 100% rename from modules/40-define-functions/400-packages/index.php rename to modules/40-define-functions/400-packages/Solution.php diff --git a/modules/40-define-functions/400-packages/SolutionTest.php b/modules/40-define-functions/400-packages/SolutionTest.php index 74cb5e70..90ccbc1c 100644 --- a/modules/40-define-functions/400-packages/SolutionTest.php +++ b/modules/40-define-functions/400-packages/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $reflection = new \ReflectionFunction(__NAMESPACE__ . '\generatePin'); $this->assertEquals('string', $reflection->getReturnType()?->getName(), 'You should add a return type declaration!'); diff --git a/modules/45-logic/10-bool-type/index.php b/modules/45-logic/10-bool-type/Solution.php similarity index 100% rename from modules/45-logic/10-bool-type/index.php rename to modules/45-logic/10-bool-type/Solution.php diff --git a/modules/45-logic/10-bool-type/SolutionTest.php b/modules/45-logic/10-bool-type/SolutionTest.php index 3efb6d06..75da847c 100644 --- a/modules/45-logic/10-bool-type/SolutionTest.php +++ b/modules/45-logic/10-bool-type/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertFalse(isPensioner(23)); $this->assertFalse(isPensioner(59)); diff --git a/modules/45-logic/15-bool-strings/index.php b/modules/45-logic/15-bool-strings/Solution.php similarity index 100% rename from modules/45-logic/15-bool-strings/index.php rename to modules/45-logic/15-bool-strings/Solution.php diff --git a/modules/45-logic/15-bool-strings/SolutionTest.php b/modules/45-logic/15-bool-strings/SolutionTest.php index dc0debd4..73d9d21a 100644 --- a/modules/45-logic/15-bool-strings/SolutionTest.php +++ b/modules/45-logic/15-bool-strings/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertFalse(isLongWord('apple')); $this->assertTrue(isLongWord('banana')); diff --git a/modules/45-logic/20-logic-combine-expressions/index.php b/modules/45-logic/20-logic-combine-expressions/Solution.php similarity index 100% rename from modules/45-logic/20-logic-combine-expressions/index.php rename to modules/45-logic/20-logic-combine-expressions/Solution.php diff --git a/modules/45-logic/20-logic-combine-expressions/SolutionTest.php b/modules/45-logic/20-logic-combine-expressions/SolutionTest.php index 28b950a9..71017530 100644 --- a/modules/45-logic/20-logic-combine-expressions/SolutionTest.php +++ b/modules/45-logic/20-logic-combine-expressions/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertFalse(isInternationalPhone('89602223423')); $this->assertTrue(isInternationalPhone('+79602223423')); } diff --git a/modules/45-logic/25-logical-operators/index.php b/modules/45-logic/25-logical-operators/Solution.php similarity index 100% rename from modules/45-logic/25-logical-operators/index.php rename to modules/45-logic/25-logical-operators/Solution.php diff --git a/modules/45-logic/25-logical-operators/SolutionTest.php b/modules/45-logic/25-logical-operators/SolutionTest.php index c08fea72..f392f29e 100644 --- a/modules/45-logic/25-logical-operators/SolutionTest.php +++ b/modules/45-logic/25-logical-operators/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertTrue(isLeapYear(2016)); $this->assertTrue(isLeapYear(2000)); diff --git a/modules/45-logic/28-logical-negation/index.php b/modules/45-logic/28-logical-negation/Solution.php similarity index 100% rename from modules/45-logic/28-logical-negation/index.php rename to modules/45-logic/28-logical-negation/Solution.php diff --git a/modules/45-logic/28-logical-negation/SolutionTest.php b/modules/45-logic/28-logical-negation/SolutionTest.php index 14ea9b29..3d0a097b 100644 --- a/modules/45-logic/28-logical-negation/SolutionTest.php +++ b/modules/45-logic/28-logical-negation/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertFalse(isNotPalindrome('wow')); $this->assertFalse(isNotPalindrome('asdffdsa')); diff --git a/modules/45-logic/90-logical-expressions/index.php b/modules/45-logic/90-logical-expressions/Solution.php similarity index 100% rename from modules/45-logic/90-logical-expressions/index.php rename to modules/45-logic/90-logical-expressions/Solution.php diff --git a/modules/45-logic/90-logical-expressions/SolutionTest.php b/modules/45-logic/90-logical-expressions/SolutionTest.php index 687134a2..08c25b7a 100644 --- a/modules/45-logic/90-logical-expressions/SolutionTest.php +++ b/modules/45-logic/90-logical-expressions/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertTrue(isFalsy('')); $this->assertFalse(isFalsy(' ')); diff --git a/modules/48-conditionals/30-if/index.php b/modules/48-conditionals/30-if/Solution.php similarity index 100% rename from modules/48-conditionals/30-if/index.php rename to modules/48-conditionals/30-if/Solution.php diff --git a/modules/48-conditionals/30-if/SolutionTest.php b/modules/48-conditionals/30-if/SolutionTest.php index 1ad5fea0..9af96f10 100644 --- a/modules/48-conditionals/30-if/SolutionTest.php +++ b/modules/48-conditionals/30-if/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('Try again!', guessNumber(100500)); $this->assertEquals('You win!', guessNumber(42)); diff --git a/modules/48-conditionals/40-if-else/index.php b/modules/48-conditionals/40-if-else/Solution.php similarity index 100% rename from modules/48-conditionals/40-if-else/index.php rename to modules/48-conditionals/40-if-else/Solution.php diff --git a/modules/48-conditionals/40-if-else/SolutionTest.php b/modules/48-conditionals/40-if-else/SolutionTest.php index 959aa5a3..96554f6e 100644 --- a/modules/48-conditionals/40-if-else/SolutionTest.php +++ b/modules/48-conditionals/40-if-else/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('https://yandex.ru', normalizeUrl('yandex.ru')); $this->assertEquals('https://yandex.ru', normalizeUrl('http://yandex.ru')); diff --git a/modules/48-conditionals/50-else-if/index.php b/modules/48-conditionals/50-else-if/Solution.php similarity index 100% rename from modules/48-conditionals/50-else-if/index.php rename to modules/48-conditionals/50-else-if/Solution.php diff --git a/modules/48-conditionals/50-else-if/SolutionTest.php b/modules/48-conditionals/50-else-if/SolutionTest.php index 48498f72..759249bb 100644 --- a/modules/48-conditionals/50-else-if/SolutionTest.php +++ b/modules/48-conditionals/50-else-if/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('go', getTrafficLightAction('green')); $this->assertEquals('slow down', getTrafficLightAction('yellow')); diff --git a/modules/48-conditionals/60-ternary-operator/index.php b/modules/48-conditionals/60-ternary-operator/Solution.php similarity index 100% rename from modules/48-conditionals/60-ternary-operator/index.php rename to modules/48-conditionals/60-ternary-operator/Solution.php diff --git a/modules/48-conditionals/60-ternary-operator/SolutionTest.php b/modules/48-conditionals/60-ternary-operator/SolutionTest.php index 488742a9..5acd3f24 100644 --- a/modules/48-conditionals/60-ternary-operator/SolutionTest.php +++ b/modules/48-conditionals/60-ternary-operator/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('flop', flipFlop('flip')); $this->assertEquals('flip', flipFlop('flop')); diff --git a/modules/48-conditionals/65-switch/index.php b/modules/48-conditionals/65-switch/Solution.php similarity index 100% rename from modules/48-conditionals/65-switch/index.php rename to modules/48-conditionals/65-switch/Solution.php diff --git a/modules/48-conditionals/65-switch/SolutionTest.php b/modules/48-conditionals/65-switch/SolutionTest.php index 7902d170..32e8d327 100644 --- a/modules/48-conditionals/65-switch/SolutionTest.php +++ b/modules/48-conditionals/65-switch/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('just a number', getNumberExplanation(0)); $this->assertEquals('devil number', getNumberExplanation(666)); diff --git a/modules/48-conditionals/70-match/index.php b/modules/48-conditionals/70-match/Solution.php similarity index 100% rename from modules/48-conditionals/70-match/index.php rename to modules/48-conditionals/70-match/Solution.php diff --git a/modules/48-conditionals/70-match/SolutionTest.php b/modules/48-conditionals/70-match/SolutionTest.php index 4cabd23b..c2567842 100644 --- a/modules/48-conditionals/70-match/SolutionTest.php +++ b/modules/48-conditionals/70-match/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals(600, calculateDeliveryCost('canada', 0.5)); $this->assertEquals(600, calculateDeliveryCost('canada', 1)); diff --git a/modules/48-conditionals/75-elvis/index.php b/modules/48-conditionals/75-elvis/Solution.php similarity index 100% rename from modules/48-conditionals/75-elvis/index.php rename to modules/48-conditionals/75-elvis/Solution.php diff --git a/modules/48-conditionals/75-elvis/SolutionTest.php b/modules/48-conditionals/75-elvis/SolutionTest.php index e49dc302..360f6b97 100644 --- a/modules/48-conditionals/75-elvis/SolutionTest.php +++ b/modules/48-conditionals/75-elvis/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals(6, generateAmount(0, 2)); $this->assertEquals(15, generateAmount(0, 5)); diff --git a/modules/50-loops/10-while/index.php b/modules/50-loops/10-while/Solution.php similarity index 100% rename from modules/50-loops/10-while/index.php rename to modules/50-loops/10-while/Solution.php diff --git a/modules/50-loops/10-while/SolutionTest.php b/modules/50-loops/10-while/SolutionTest.php index 4c7fb0c1..9d149cc8 100644 --- a/modules/50-loops/10-while/SolutionTest.php +++ b/modules/50-loops/10-while/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $expected = "4\n3\n2\n1\nGo!"; $this->expectOutputString($expected); diff --git a/modules/50-loops/15-conditions-inside-loops/index.php b/modules/50-loops/15-conditions-inside-loops/Solution.php similarity index 100% rename from modules/50-loops/15-conditions-inside-loops/index.php rename to modules/50-loops/15-conditions-inside-loops/Solution.php diff --git a/modules/50-loops/15-conditions-inside-loops/SolutionTest.php b/modules/50-loops/15-conditions-inside-loops/SolutionTest.php index 44b8f2ed..3ee0ae85 100644 --- a/modules/50-loops/15-conditions-inside-loops/SolutionTest.php +++ b/modules/50-loops/15-conditions-inside-loops/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals(2, countHashtags('New post #php #code')); $this->assertEquals(0, countHashtags('No tags here')); diff --git a/modules/50-loops/20-aggregation-numbers/index.php b/modules/50-loops/20-aggregation-numbers/Solution.php similarity index 100% rename from modules/50-loops/20-aggregation-numbers/index.php rename to modules/50-loops/20-aggregation-numbers/Solution.php diff --git a/modules/50-loops/20-aggregation-numbers/SolutionTest.php b/modules/50-loops/20-aggregation-numbers/SolutionTest.php index 3b066642..24ae9f23 100644 --- a/modules/50-loops/20-aggregation-numbers/SolutionTest.php +++ b/modules/50-loops/20-aggregation-numbers/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals(0, calculateElectricityBill(0)); $this->assertEquals(400, calculateElectricityBill(80)); diff --git a/modules/50-loops/23-aggregation-strings/index.php b/modules/50-loops/23-aggregation-strings/Solution.php similarity index 100% rename from modules/50-loops/23-aggregation-strings/index.php rename to modules/50-loops/23-aggregation-strings/Solution.php diff --git a/modules/50-loops/23-aggregation-strings/SolutionTest.php b/modules/50-loops/23-aggregation-strings/SolutionTest.php index 726116f9..dedf1502 100644 --- a/modules/50-loops/23-aggregation-strings/SolutionTest.php +++ b/modules/50-loops/23-aggregation-strings/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('+79991234567', sanitizePhoneNumber('+7 (999) 123-45-67')); $this->assertEquals('88005553535', sanitizePhoneNumber('8 800 555 35 35')); diff --git a/modules/50-loops/25-iteration-over-string/index.php b/modules/50-loops/25-iteration-over-string/Solution.php similarity index 100% rename from modules/50-loops/25-iteration-over-string/index.php rename to modules/50-loops/25-iteration-over-string/Solution.php diff --git a/modules/50-loops/25-iteration-over-string/SolutionTest.php b/modules/50-loops/25-iteration-over-string/SolutionTest.php index b0fea4b2..4603bfcc 100644 --- a/modules/50-loops/25-iteration-over-string/SolutionTest.php +++ b/modules/50-loops/25-iteration-over-string/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('************5678', maskCardNumber('1234567812345678')); $this->assertEquals('****5678', maskCardNumber('12345678')); diff --git a/modules/50-loops/30-syntactic-sugar/index.php b/modules/50-loops/30-syntactic-sugar/Solution.php similarity index 100% rename from modules/50-loops/30-syntactic-sugar/index.php rename to modules/50-loops/30-syntactic-sugar/Solution.php diff --git a/modules/50-loops/30-syntactic-sugar/SolutionTest.php b/modules/50-loops/30-syntactic-sugar/SolutionTest.php index a92c759c..50130287 100644 --- a/modules/50-loops/30-syntactic-sugar/SolutionTest.php +++ b/modules/50-loops/30-syntactic-sugar/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('-----', buildProgressBar(0, 5)); $this->assertEquals('###--', buildProgressBar(3, 5)); diff --git a/modules/50-loops/50-mutators/index.php b/modules/50-loops/50-mutators/Solution.php similarity index 100% rename from modules/50-loops/50-mutators/index.php rename to modules/50-loops/50-mutators/Solution.php diff --git a/modules/50-loops/50-mutators/SolutionTest.php b/modules/50-loops/50-mutators/SolutionTest.php index 8dad8c17..d502fe66 100644 --- a/modules/50-loops/50-mutators/SolutionTest.php +++ b/modules/50-loops/50-mutators/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $text = 'I never look back'; $this->assertEquals('I NevEr LooK bAck', makeItFunny($text, 3)); $this->assertEquals('hElLo', makeItFunny('hello', 2)); diff --git a/modules/50-loops/55-return-from-loops/index.php b/modules/50-loops/55-return-from-loops/Solution.php similarity index 100% rename from modules/50-loops/55-return-from-loops/index.php rename to modules/50-loops/55-return-from-loops/Solution.php diff --git a/modules/50-loops/55-return-from-loops/SolutionTest.php b/modules/50-loops/55-return-from-loops/SolutionTest.php index 47b68a58..fceed53d 100644 --- a/modules/50-loops/55-return-from-loops/SolutionTest.php +++ b/modules/50-loops/55-return-from-loops/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertTrue(hasAtSymbol('support@example.com')); $this->assertFalse(hasAtSymbol('wrong-email')); diff --git a/modules/50-loops/70-for/index.php b/modules/50-loops/70-for/Solution.php similarity index 100% rename from modules/50-loops/70-for/index.php rename to modules/50-loops/70-for/Solution.php diff --git a/modules/50-loops/70-for/SolutionTest.php b/modules/50-loops/70-for/SolutionTest.php index 04b71433..3efaeb7e 100644 --- a/modules/50-loops/70-for/SolutionTest.php +++ b/modules/50-loops/70-for/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('my_photo.png', normalizeFilename('my photo.png')); $this->assertEquals('final_report.pdf', normalizeFilename('final report.pdf')); diff --git a/modules/50-loops/80-for-in-range/index.php b/modules/50-loops/80-for-in-range/Solution.php similarity index 100% rename from modules/50-loops/80-for-in-range/index.php rename to modules/50-loops/80-for-in-range/Solution.php diff --git a/modules/50-loops/80-for-in-range/SolutionTest.php b/modules/50-loops/80-for-in-range/SolutionTest.php index 51c14c75..5886095c 100644 --- a/modules/50-loops/80-for-in-range/SolutionTest.php +++ b/modules/50-loops/80-for-in-range/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('1', fizzbuzz(1)); $this->assertEquals('1 2 Fizz', fizzbuzz(3)); diff --git a/modules/50-loops/90-debug/index.php b/modules/50-loops/90-debug/Solution.php similarity index 100% rename from modules/50-loops/90-debug/index.php rename to modules/50-loops/90-debug/Solution.php diff --git a/modules/50-loops/90-debug/SolutionTest.php b/modules/50-loops/90-debug/SolutionTest.php index 9b5c05c1..0745f1db 100644 --- a/modules/50-loops/90-debug/SolutionTest.php +++ b/modules/50-loops/90-debug/SolutionTest.php @@ -8,7 +8,7 @@ class SolutionTest extends TestCase { public function test() { - require 'index.php'; + require 'Solution.php'; $this->assertEquals('a3bc4', compress('aaabcccc')); $this->assertEquals('abcd', compress('abcd')); diff --git a/spec.yml b/spec.yml index f3a492ea..0a3602a7 100644 --- a/spec.yml +++ b/spec.yml @@ -3,7 +3,7 @@ language: docker_image: "ghcr.io/hexlet-basics/exercises-php" extension: php - exercise_filename: index.php + exercise_filename: Solution.php exercise_test_filename: SolutionTest.php learn_as: first_language progress: completed diff --git a/src/Functions.php b/src/Functions.php index 2c1f6870..87634b3b 100644 --- a/src/Functions.php +++ b/src/Functions.php @@ -4,6 +4,6 @@ function runScript() { - require 'index.php'; + require 'Solution.php'; print_r("\n"); } From ab901b710720a72c5c50a913a929e0cc8d9ea0c4 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Wed, 17 Jun 2026 22:28:36 +0500 Subject: [PATCH 28/29] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B0=D0=BD=D0=BD=D0=BE=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B2=20=D1=80=D0=B5?= =?UTF-8?q?=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D1=8B=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?UTF-8?q?=D1=83=D1=80=D0=BE=D0=BA=D0=B0=20type-annotations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проставлены объявления типов там, где их не хватало (начиная с урока 40-define-functions/300-type-annotations): - Решения (Solution.php): isFalsy, getNumberExplanation, generateAmount, makeItFunny - Примеры в теории: 350-modules (ru), 65-switch и 75-elvis (ru/en/es + description.es.yml) Co-Authored-By: Claude Opus 4.8 (1M context) --- modules/40-define-functions/350-modules/ru/README.md | 4 ++-- modules/45-logic/90-logical-expressions/Solution.php | 2 +- modules/48-conditionals/65-switch/Solution.php | 2 +- modules/48-conditionals/65-switch/description.es.yml | 4 ++-- modules/48-conditionals/65-switch/en/README.md | 4 ++-- modules/48-conditionals/65-switch/es/README.md | 4 ++-- modules/48-conditionals/65-switch/ru/README.md | 4 ++-- modules/48-conditionals/75-elvis/Solution.php | 2 +- modules/48-conditionals/75-elvis/description.es.yml | 6 +++--- modules/48-conditionals/75-elvis/en/README.md | 6 +++--- modules/48-conditionals/75-elvis/es/README.md | 6 +++--- modules/48-conditionals/75-elvis/ru/README.md | 6 +++--- modules/50-loops/50-mutators/Solution.php | 2 +- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/modules/40-define-functions/350-modules/ru/README.md b/modules/40-define-functions/350-modules/ru/README.md index 95f5595b..2cc9b068 100644 --- a/modules/40-define-functions/350-modules/ru/README.md +++ b/modules/40-define-functions/350-modules/ru/README.md @@ -10,7 +10,7 @@ 4 namespace App\Custom; -function floor($number) +function floor(float $number): string { return 'custom floor'; } diff --git a/modules/45-logic/90-logical-expressions/Solution.php b/modules/45-logic/90-logical-expressions/Solution.php index b506e1d0..6a82af89 100644 --- a/modules/45-logic/90-logical-expressions/Solution.php +++ b/modules/45-logic/90-logical-expressions/Solution.php @@ -3,7 +3,7 @@ namespace HexletBasics\Logic\LogicalExpressions; // BEGIN -function isFalsy($value): bool +function isFalsy(int|float|string|bool|null $value): bool { return $value == false; } diff --git a/modules/48-conditionals/65-switch/Solution.php b/modules/48-conditionals/65-switch/Solution.php index c4333cef..8f3968ab 100644 --- a/modules/48-conditionals/65-switch/Solution.php +++ b/modules/48-conditionals/65-switch/Solution.php @@ -3,7 +3,7 @@ namespace HexletBasics\Conditionals\SwitchStatement; // BEGIN -function getNumberExplanation($number) +function getNumberExplanation(int $number): string { switch ($number) { case 666: diff --git a/modules/48-conditionals/65-switch/description.es.yml b/modules/48-conditionals/65-switch/description.es.yml index f382272c..5738e0a9 100644 --- a/modules/48-conditionals/65-switch/description.es.yml +++ b/modules/48-conditionals/65-switch/description.es.yml @@ -70,7 +70,7 @@ theory: | ```php Date: Wed, 17 Jun 2026 22:55:51 +0500 Subject: [PATCH 29/29] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B0=D1=82=D1=8C=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=B8=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D1=8B=D0=B9=20TestCase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Вынес ручной `require 'Solution.php'` из 72 тестов в общий базовый класс `HexletBasics\Exercise\TestCase`, который в `setUp()` подключает соседний Solution.php через рефлексию (без зависимости от CWD). Буфер вывода PHPUnit стартует до setUp(), поэтому вывод решения по-прежнему ловится `expectOutputString`. Удалил устаревший src/Functions.php (runScript). Co-Authored-By: Claude Opus 4.8 (1M context) --- composer.json | 6 +++--- .../10-basics/10-hello-world/SolutionTest.php | 5 +---- modules/10-basics/15-tags/SolutionTest.php | 5 +---- modules/10-basics/20-comments/SolutionTest.php | 3 +-- .../10-basics/30-instructions/SolutionTest.php | 5 +---- modules/10-basics/40-testing/SolutionTest.php | 5 +---- .../10-basics/50-syntax-errors/SolutionTest.php | 5 +---- .../20-arithmetics/20-basic/SolutionTest.php | 5 +---- .../20-arithmetics/25-operator/SolutionTest.php | 5 +---- .../27-commutativity/SolutionTest.php | 5 +---- .../30-composition/SolutionTest.php | 5 +---- .../20-arithmetics/40-priority/SolutionTest.php | 5 +---- .../20-arithmetics/43-float/SolutionTest.php | 5 +---- .../20-arithmetics/45-linting/SolutionTest.php | 5 +---- modules/25-strings/10-quotes/SolutionTest.php | 5 +---- .../15-escape-characters/SolutionTest.php | 5 +---- .../20-string-concatenation/SolutionTest.php | 5 +---- modules/25-strings/30-encoding/SolutionTest.php | 5 +---- .../30-variables/10-definition/SolutionTest.php | 5 +---- modules/30-variables/12-change/SolutionTest.php | 5 +---- .../13-variables-naming/SolutionTest.php | 5 +---- .../15-variables-expressions/SolutionTest.php | 5 +---- .../18-variable-concatenation/SolutionTest.php | 5 +---- .../19-naming-style/SolutionTest.php | 5 +---- .../20-magic-numbers/SolutionTest.php | 5 +---- .../30-variables/23-constants/SolutionTest.php | 3 +-- .../100-unicode/SolutionTest.php | 3 +-- .../110-locales/SolutionTest.php | 3 +-- .../120-startwith/SolutionTest.php | 3 +-- .../25-interpolation/SolutionTest.php | 5 +---- .../30-symbols/SolutionTest.php | 5 +---- .../70-slices/SolutionTest.php | 5 +---- .../90-multiline-strings/SolutionTest.php | 5 +---- .../40-primitive-data-types/SolutionTest.php | 5 +---- .../50-data-types-weak-typing/SolutionTest.php | 5 +---- .../52-data-types-immutability/SolutionTest.php | 5 +---- .../55-data-types-casting/SolutionTest.php | 5 +---- .../100-call/SolutionTest.php | 5 +---- .../SolutionTest.php | 5 +---- .../SolutionTest.php | 5 +---- .../180-variadic-parameters/SolutionTest.php | 5 +---- .../270-deterministic/SolutionTest.php | 5 +---- .../100-define-function/SolutionTest.php | 4 +--- .../150-return/SolutionTest.php | 4 +--- .../200-default-parameters/SolutionTest.php | 4 +--- .../250-named-arguments/SolutionTest.php | 4 +--- .../300-type-annotations/SolutionTest.php | 4 +--- .../350-modules/SolutionTest.php | 4 +--- .../400-packages/SolutionTest.php | 4 +--- modules/45-logic/10-bool-type/SolutionTest.php | 4 +--- .../45-logic/15-bool-strings/SolutionTest.php | 4 +--- .../SolutionTest.php | 3 +-- .../25-logical-operators/SolutionTest.php | 4 +--- .../28-logical-negation/SolutionTest.php | 4 +--- .../90-logical-expressions/SolutionTest.php | 4 +--- modules/48-conditionals/30-if/SolutionTest.php | 4 +--- .../48-conditionals/40-if-else/SolutionTest.php | 4 +--- .../48-conditionals/50-else-if/SolutionTest.php | 4 +--- .../60-ternary-operator/SolutionTest.php | 4 +--- .../48-conditionals/65-switch/SolutionTest.php | 4 +--- .../48-conditionals/70-match/SolutionTest.php | 4 +--- .../48-conditionals/75-elvis/SolutionTest.php | 4 +--- modules/50-loops/10-while/SolutionTest.php | 4 +--- .../15-conditions-inside-loops/SolutionTest.php | 4 +--- .../20-aggregation-numbers/SolutionTest.php | 4 +--- .../23-aggregation-strings/SolutionTest.php | 4 +--- .../25-iteration-over-string/SolutionTest.php | 4 +--- .../30-syntactic-sugar/SolutionTest.php | 4 +--- modules/50-loops/50-mutators/SolutionTest.php | 3 +-- .../55-return-from-loops/SolutionTest.php | 4 +--- modules/50-loops/70-for/SolutionTest.php | 4 +--- .../50-loops/80-for-in-range/SolutionTest.php | 4 +--- modules/50-loops/90-debug/SolutionTest.php | 4 +--- src/Functions.php | 9 --------- src/TestCase.php | 17 +++++++++++++++++ 75 files changed, 92 insertions(+), 257 deletions(-) delete mode 100644 src/Functions.php create mode 100644 src/TestCase.php diff --git a/composer.json b/composer.json index a2cd8579..df5cbfde 100644 --- a/composer.json +++ b/composer.json @@ -17,9 +17,9 @@ } ], "autoload": { - "files": [ - "src/Functions.php" - ] + "psr-4": { + "HexletBasics\\Exercise\\": "src/" + } }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.0", diff --git a/modules/10-basics/10-hello-world/SolutionTest.php b/modules/10-basics/10-hello-world/SolutionTest.php index 395c5ea0..a2377bf9 100644 --- a/modules/10-basics/10-hello-world/SolutionTest.php +++ b/modules/10-basics/10-hello-world/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Basics\HelloWorld; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'Hello, World!'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/10-basics/15-tags/SolutionTest.php b/modules/10-basics/15-tags/SolutionTest.php index 380ed0a3..8d77257f 100644 --- a/modules/10-basics/15-tags/SolutionTest.php +++ b/modules/10-basics/15-tags/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Basics\Tags; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'King in the North!'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/10-basics/20-comments/SolutionTest.php b/modules/10-basics/20-comments/SolutionTest.php index 28e7689d..94a09e37 100644 --- a/modules/10-basics/20-comments/SolutionTest.php +++ b/modules/10-basics/20-comments/SolutionTest.php @@ -2,14 +2,13 @@ namespace HexletBasics\Basics\Comments; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { $this->expectOutputString(''); - require 'Solution.php'; $content = file_get_contents('Solution.php'); $this->assertStringContainsString('// TODO: добавить функцию приветствия', $content); } diff --git a/modules/10-basics/30-instructions/SolutionTest.php b/modules/10-basics/30-instructions/SolutionTest.php index 2d5406e3..aede0059 100644 --- a/modules/10-basics/30-instructions/SolutionTest.php +++ b/modules/10-basics/30-instructions/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Basics\Instructions; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'RobertStannisRenly'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/10-basics/40-testing/SolutionTest.php b/modules/10-basics/40-testing/SolutionTest.php index 945b14fc..bbf48ac1 100644 --- a/modules/10-basics/40-testing/SolutionTest.php +++ b/modules/10-basics/40-testing/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Basics\Testing; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '9780262531962'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/10-basics/50-syntax-errors/SolutionTest.php b/modules/10-basics/50-syntax-errors/SolutionTest.php index 5a73f093..915b3b9f 100644 --- a/modules/10-basics/50-syntax-errors/SolutionTest.php +++ b/modules/10-basics/50-syntax-errors/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Basics\SyntaxErrors; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'Программа успешно запущена'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/20-arithmetics/20-basic/SolutionTest.php b/modules/20-arithmetics/20-basic/SolutionTest.php index f6c9fa3b..a246685b 100644 --- a/modules/20-arithmetics/20-basic/SolutionTest.php +++ b/modules/20-arithmetics/20-basic/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Arithmetics\Basics; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '9'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/20-arithmetics/25-operator/SolutionTest.php b/modules/20-arithmetics/25-operator/SolutionTest.php index 7260e893..a4019612 100644 --- a/modules/20-arithmetics/25-operator/SolutionTest.php +++ b/modules/20-arithmetics/25-operator/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Arithmetics\Operator; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '8729'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/20-arithmetics/27-commutativity/SolutionTest.php b/modules/20-arithmetics/27-commutativity/SolutionTest.php index 3477f5bb..d219d54f 100644 --- a/modules/20-arithmetics/27-commutativity/SolutionTest.php +++ b/modules/20-arithmetics/27-commutativity/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Arithmetics\Commutativity; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '2563'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/20-arithmetics/30-composition/SolutionTest.php b/modules/20-arithmetics/30-composition/SolutionTest.php index b14cb520..e1df4641 100644 --- a/modules/20-arithmetics/30-composition/SolutionTest.php +++ b/modules/20-arithmetics/30-composition/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Arithmetics\Composition; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '660'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/20-arithmetics/40-priority/SolutionTest.php b/modules/20-arithmetics/40-priority/SolutionTest.php index a2f74ab4..aed274b5 100644 --- a/modules/20-arithmetics/40-priority/SolutionTest.php +++ b/modules/20-arithmetics/40-priority/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Arithmetics\Priority; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '160'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/20-arithmetics/43-float/SolutionTest.php b/modules/20-arithmetics/43-float/SolutionTest.php index 9f09c0d3..007d6b3a 100644 --- a/modules/20-arithmetics/43-float/SolutionTest.php +++ b/modules/20-arithmetics/43-float/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Arithmetics\FloatingPointNumbers; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '5.5511151231258E-17'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/20-arithmetics/45-linting/SolutionTest.php b/modules/20-arithmetics/45-linting/SolutionTest.php index 75c137b4..b8bfb7bd 100644 --- a/modules/20-arithmetics/45-linting/SolutionTest.php +++ b/modules/20-arithmetics/45-linting/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Arithmetics\Linting; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '4'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/25-strings/10-quotes/SolutionTest.php b/modules/25-strings/10-quotes/SolutionTest.php index 8c1eea7b..5aaa69b7 100644 --- a/modules/25-strings/10-quotes/SolutionTest.php +++ b/modules/25-strings/10-quotes/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Strings\Quotes; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'The file "user\'s_config.json" was not found.'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/25-strings/15-escape-characters/SolutionTest.php b/modules/25-strings/15-escape-characters/SolutionTest.php index 8a5a4d9f..c7993076 100644 --- a/modules/25-strings/15-escape-characters/SolutionTest.php +++ b/modules/25-strings/15-escape-characters/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Strings\EscapeCharacters; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "Для разделения строк используйте \"\\n\"\nПример: print_r(\"строка1\\nстрока2\")"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/25-strings/20-string-concatenation/SolutionTest.php b/modules/25-strings/20-string-concatenation/SolutionTest.php index 6123c12e..a4ac3688 100644 --- a/modules/25-strings/20-string-concatenation/SolutionTest.php +++ b/modules/25-strings/20-string-concatenation/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Strings\Concatenation; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'https://github.com/hexlet/exercises-php'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/25-strings/30-encoding/SolutionTest.php b/modules/25-strings/30-encoding/SolutionTest.php index 3e1e7aac..a19cfb88 100644 --- a/modules/25-strings/30-encoding/SolutionTest.php +++ b/modules/25-strings/30-encoding/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Strings\Encoding; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "~\n^\n%\n"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/30-variables/10-definition/SolutionTest.php b/modules/30-variables/10-definition/SolutionTest.php index 3f81f98a..5ae87dbd 100644 --- a/modules/30-variables/10-definition/SolutionTest.php +++ b/modules/30-variables/10-definition/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Variables\Definition; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "https://hexlet.io\nhttps://hexlet.io"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/30-variables/12-change/SolutionTest.php b/modules/30-variables/12-change/SolutionTest.php index 2aabbca5..1cb89bd0 100644 --- a/modules/30-variables/12-change/SolutionTest.php +++ b/modules/30-variables/12-change/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Variables\Change; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'доставлен'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/30-variables/13-variables-naming/SolutionTest.php b/modules/30-variables/13-variables-naming/SolutionTest.php index c6f8e21a..0621225e 100644 --- a/modules/30-variables/13-variables-naming/SolutionTest.php +++ b/modules/30-variables/13-variables-naming/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Variables\Naming; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "2"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/30-variables/15-variables-expressions/SolutionTest.php b/modules/30-variables/15-variables-expressions/SolutionTest.php index a99b3d90..61bcaae1 100644 --- a/modules/30-variables/15-variables-expressions/SolutionTest.php +++ b/modules/30-variables/15-variables-expressions/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Variables\Expressions; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "125\n863.75"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/30-variables/18-variable-concatenation/SolutionTest.php b/modules/30-variables/18-variable-concatenation/SolutionTest.php index a6729df8..fc4b6d51 100644 --- a/modules/30-variables/18-variable-concatenation/SolutionTest.php +++ b/modules/30-variables/18-variable-concatenation/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Variables\Concatenation; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -17,6 +15,5 @@ public function test() HERE; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/30-variables/19-naming-style/SolutionTest.php b/modules/30-variables/19-naming-style/SolutionTest.php index 1b5f3ab8..f2def806 100644 --- a/modules/30-variables/19-naming-style/SolutionTest.php +++ b/modules/30-variables/19-naming-style/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Variables\Naming; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "2000"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/30-variables/20-magic-numbers/SolutionTest.php b/modules/30-variables/20-magic-numbers/SolutionTest.php index 47f1797d..827829b1 100644 --- a/modules/30-variables/20-magic-numbers/SolutionTest.php +++ b/modules/30-variables/20-magic-numbers/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\Variables\MagicNumbers; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "Ящиков на складе:\n102"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/30-variables/23-constants/SolutionTest.php b/modules/30-variables/23-constants/SolutionTest.php index 5714d6de..699f8579 100644 --- a/modules/30-variables/23-constants/SolutionTest.php +++ b/modules/30-variables/23-constants/SolutionTest.php @@ -2,13 +2,12 @@ namespace HexletBasics\Variables\Constants; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; $this->assertEquals(3, MAX_LOGIN_ATTEMPTS); } } diff --git a/modules/31-advanced-strings/100-unicode/SolutionTest.php b/modules/31-advanced-strings/100-unicode/SolutionTest.php index b92a040c..f0ba2ef6 100644 --- a/modules/31-advanced-strings/100-unicode/SolutionTest.php +++ b/modules/31-advanced-strings/100-unicode/SolutionTest.php @@ -2,7 +2,7 @@ namespace HexletBasics\AdvancedStrings\Unicode; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -10,6 +10,5 @@ public function test() { $expected = "13\n7\n"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/110-locales/SolutionTest.php b/modules/31-advanced-strings/110-locales/SolutionTest.php index 280cd877..358fc408 100644 --- a/modules/31-advanced-strings/110-locales/SolutionTest.php +++ b/modules/31-advanced-strings/110-locales/SolutionTest.php @@ -2,7 +2,7 @@ namespace HexletBasics\AdvancedStrings\Locales; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -10,6 +10,5 @@ public function test() { $expected = setlocale(LC_CTYPE, 0); $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/120-startwith/SolutionTest.php b/modules/31-advanced-strings/120-startwith/SolutionTest.php index d16af4aa..1c62e406 100644 --- a/modules/31-advanced-strings/120-startwith/SolutionTest.php +++ b/modules/31-advanced-strings/120-startwith/SolutionTest.php @@ -2,7 +2,7 @@ namespace HexletBasics\AdvancedStrings\StartWith; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -10,6 +10,5 @@ public function test() { $expected = '18'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/25-interpolation/SolutionTest.php b/modules/31-advanced-strings/25-interpolation/SolutionTest.php index 870f7af6..1be5d35f 100644 --- a/modules/31-advanced-strings/25-interpolation/SolutionTest.php +++ b/modules/31-advanced-strings/25-interpolation/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\AdvancedStrings\Interpolation; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'Здравствуйте, Анна! Ваш заказ #1337 принят.'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/30-symbols/SolutionTest.php b/modules/31-advanced-strings/30-symbols/SolutionTest.php index a9450c41..f94cbb73 100644 --- a/modules/31-advanced-strings/30-symbols/SolutionTest.php +++ b/modules/31-advanced-strings/30-symbols/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\AdvancedStrings\Symbols; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'grip'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/70-slices/SolutionTest.php b/modules/31-advanced-strings/70-slices/SolutionTest.php index 29cd8600..28f2201c 100644 --- a/modules/31-advanced-strings/70-slices/SolutionTest.php +++ b/modules/31-advanced-strings/70-slices/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\AdvancedStrings\Slices; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'hexlet.io'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php b/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php index 07c2c219..094b72d9 100644 --- a/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php +++ b/modules/31-advanced-strings/90-multiline-strings/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\AdvancedStrings\MultilineStrings; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -17,6 +15,5 @@ public function test() Спасибо, что выбрали нас! EOT; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/33-data-types/40-primitive-data-types/SolutionTest.php b/modules/33-data-types/40-primitive-data-types/SolutionTest.php index 1af4674f..6d27cb11 100644 --- a/modules/33-data-types/40-primitive-data-types/SolutionTest.php +++ b/modules/33-data-types/40-primitive-data-types/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\DataTypes\PrimitiveDataTypes; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -18,6 +16,5 @@ public function test() HERE; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php b/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php index 690e101f..c3a89d76 100644 --- a/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php +++ b/modules/33-data-types/50-data-types-weak-typing/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\DataTypes\WeakTyping; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '13'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/33-data-types/52-data-types-immutability/SolutionTest.php b/modules/33-data-types/52-data-types-immutability/SolutionTest.php index f3f17133..3239872b 100644 --- a/modules/33-data-types/52-data-types-immutability/SolutionTest.php +++ b/modules/33-data-types/52-data-types-immutability/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\DataTypes\DataTypesImmutability; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = 'print'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/33-data-types/55-data-types-casting/SolutionTest.php b/modules/33-data-types/55-data-types-casting/SolutionTest.php index 683605f6..814092d6 100644 --- a/modules/33-data-types/55-data-types-casting/SolutionTest.php +++ b/modules/33-data-types/55-data-types-casting/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\DataTypes\DataTypesCasting; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '36 °C'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/35-calling-functions/100-call/SolutionTest.php b/modules/35-calling-functions/100-call/SolutionTest.php index 911e223b..1b276e41 100644 --- a/modules/35-calling-functions/100-call/SolutionTest.php +++ b/modules/35-calling-functions/100-call/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\CallingFunctions\Call; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "12"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/35-calling-functions/135-calling-functions-default-params/SolutionTest.php b/modules/35-calling-functions/135-calling-functions-default-params/SolutionTest.php index c6041ce2..3e48af8e 100644 --- a/modules/35-calling-functions/135-calling-functions-default-params/SolutionTest.php +++ b/modules/35-calling-functions/135-calling-functions-default-params/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\CallingFunctions\DefaultParams; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "37.8\n2426.76\n607\n"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php b/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php index 377b27ec..a95251eb 100644 --- a/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php +++ b/modules/35-calling-functions/150-calling-functions-expression/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\CallingFunctions\Expression; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = "First: H\nLast: !"; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/35-calling-functions/180-variadic-parameters/SolutionTest.php b/modules/35-calling-functions/180-variadic-parameters/SolutionTest.php index 58067fb2..5cb4d1c2 100644 --- a/modules/35-calling-functions/180-variadic-parameters/SolutionTest.php +++ b/modules/35-calling-functions/180-variadic-parameters/SolutionTest.php @@ -2,9 +2,7 @@ namespace HexletBasics\CallingFunctions\VariadicParameters; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { @@ -12,6 +10,5 @@ public function test() { $expected = '-3'; $this->expectOutputString($expected); - require 'Solution.php'; } } diff --git a/modules/35-calling-functions/270-deterministic/SolutionTest.php b/modules/35-calling-functions/270-deterministic/SolutionTest.php index 95e466ab..8e3b179d 100644 --- a/modules/35-calling-functions/270-deterministic/SolutionTest.php +++ b/modules/35-calling-functions/270-deterministic/SolutionTest.php @@ -2,15 +2,12 @@ namespace HexletBasics\CallingFunctions\Deterministic; -use PHPUnit\Framework\TestCase; - -\HexletBasics\Functions\runScript(); +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; $randomRoll = $this->getActualOutputForAssertion(); $this->assertThat( $randomRoll, diff --git a/modules/40-define-functions/100-define-function/SolutionTest.php b/modules/40-define-functions/100-define-function/SolutionTest.php index d59f631f..887bfae6 100644 --- a/modules/40-define-functions/100-define-function/SolutionTest.php +++ b/modules/40-define-functions/100-define-function/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\DefineFunctions\DefineFunction; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $expected = 'Hello, World!'; $this->expectOutputString($expected); sayHello(); diff --git a/modules/40-define-functions/150-return/SolutionTest.php b/modules/40-define-functions/150-return/SolutionTest.php index 003e66e3..a239fe4b 100644 --- a/modules/40-define-functions/150-return/SolutionTest.php +++ b/modules/40-define-functions/150-return/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\DefineFunctions\ReturnInstruction; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('he...', truncate('hexlet', 2)); $this->assertEquals('it w...', truncate('it works!', 4)); } diff --git a/modules/40-define-functions/200-default-parameters/SolutionTest.php b/modules/40-define-functions/200-default-parameters/SolutionTest.php index 9bf5a0dc..a8b86878 100644 --- a/modules/40-define-functions/200-default-parameters/SolutionTest.php +++ b/modules/40-define-functions/200-default-parameters/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\DefineFunctions\DefaultParameters; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('****1234', getHiddenCard('1234123412341234')); $this->assertEquals('****4321', getHiddenCard('1234123412344321')); $this->assertEquals('***4321', getHiddenCard('1234123412344321', 3)); diff --git a/modules/40-define-functions/250-named-arguments/SolutionTest.php b/modules/40-define-functions/250-named-arguments/SolutionTest.php index 04e7ed2f..6537fec7 100644 --- a/modules/40-define-functions/250-named-arguments/SolutionTest.php +++ b/modules/40-define-functions/250-named-arguments/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\DefineFunctions\NamedArguments; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('python', trimAndRepeat('python')); $this->assertEquals('on', trimAndRepeat('python', offset: 4)); $this->assertEquals('pythonpython', trimAndRepeat('python', repetitions: 2)); diff --git a/modules/40-define-functions/300-type-annotations/SolutionTest.php b/modules/40-define-functions/300-type-annotations/SolutionTest.php index 579583a5..4b7c9323 100644 --- a/modules/40-define-functions/300-type-annotations/SolutionTest.php +++ b/modules/40-define-functions/300-type-annotations/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\DefineFunctions\TypeAnnotations; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $reflection = new \ReflectionFunction(__NAMESPACE__ . '\wordMultiply'); $parameterTypes = array_map( fn ($parameter) => $parameter->getType()?->getName(), diff --git a/modules/40-define-functions/350-modules/SolutionTest.php b/modules/40-define-functions/350-modules/SolutionTest.php index 6ce796ff..3536fbfd 100644 --- a/modules/40-define-functions/350-modules/SolutionTest.php +++ b/modules/40-define-functions/350-modules/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\DefineFunctions\Modules; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals(75, amountPerPerson(300, 4, 0)); $this->assertEquals(90, amountPerPerson(300, 4, 20)); $this->assertEquals(129, amountPerPerson(350, 3, 10)); diff --git a/modules/40-define-functions/400-packages/SolutionTest.php b/modules/40-define-functions/400-packages/SolutionTest.php index 90ccbc1c..1d7c817c 100644 --- a/modules/40-define-functions/400-packages/SolutionTest.php +++ b/modules/40-define-functions/400-packages/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\DefineFunctions\Packages; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $reflection = new \ReflectionFunction(__NAMESPACE__ . '\generatePin'); $this->assertEquals('string', $reflection->getReturnType()?->getName(), 'You should add a return type declaration!'); diff --git a/modules/45-logic/10-bool-type/SolutionTest.php b/modules/45-logic/10-bool-type/SolutionTest.php index 75da847c..48000215 100644 --- a/modules/45-logic/10-bool-type/SolutionTest.php +++ b/modules/45-logic/10-bool-type/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Logic\BoolType; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertFalse(isPensioner(23)); $this->assertFalse(isPensioner(59)); $this->assertTrue(isPensioner(60)); diff --git a/modules/45-logic/15-bool-strings/SolutionTest.php b/modules/45-logic/15-bool-strings/SolutionTest.php index 73d9d21a..410ec753 100644 --- a/modules/45-logic/15-bool-strings/SolutionTest.php +++ b/modules/45-logic/15-bool-strings/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Logic\BoolStrings; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertFalse(isLongWord('apple')); $this->assertTrue(isLongWord('banana')); $this->assertTrue(isLongWord('pineapple')); diff --git a/modules/45-logic/20-logic-combine-expressions/SolutionTest.php b/modules/45-logic/20-logic-combine-expressions/SolutionTest.php index 71017530..d47c6117 100644 --- a/modules/45-logic/20-logic-combine-expressions/SolutionTest.php +++ b/modules/45-logic/20-logic-combine-expressions/SolutionTest.php @@ -2,13 +2,12 @@ namespace HexletBasics\Logic\CombineExpressions; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; $this->assertFalse(isInternationalPhone('89602223423')); $this->assertTrue(isInternationalPhone('+79602223423')); } diff --git a/modules/45-logic/25-logical-operators/SolutionTest.php b/modules/45-logic/25-logical-operators/SolutionTest.php index f392f29e..f9730f99 100644 --- a/modules/45-logic/25-logical-operators/SolutionTest.php +++ b/modules/45-logic/25-logical-operators/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Logic\LogicalOperators; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertTrue(isLeapYear(2016)); $this->assertTrue(isLeapYear(2000)); $this->assertFalse(isLeapYear(2017)); diff --git a/modules/45-logic/28-logical-negation/SolutionTest.php b/modules/45-logic/28-logical-negation/SolutionTest.php index 3d0a097b..4c5971f8 100644 --- a/modules/45-logic/28-logical-negation/SolutionTest.php +++ b/modules/45-logic/28-logical-negation/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Logic\LogicalNegation; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertFalse(isNotPalindrome('wow')); $this->assertFalse(isNotPalindrome('asdffdsa')); $this->assertFalse(isNotPalindrome('Wow')); diff --git a/modules/45-logic/90-logical-expressions/SolutionTest.php b/modules/45-logic/90-logical-expressions/SolutionTest.php index 08c25b7a..b8f80adb 100644 --- a/modules/45-logic/90-logical-expressions/SolutionTest.php +++ b/modules/45-logic/90-logical-expressions/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Logic\LogicalExpressions; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertTrue(isFalsy('')); $this->assertFalse(isFalsy(' ')); $this->assertTrue(isFalsy(null)); diff --git a/modules/48-conditionals/30-if/SolutionTest.php b/modules/48-conditionals/30-if/SolutionTest.php index 9af96f10..211e04c2 100644 --- a/modules/48-conditionals/30-if/SolutionTest.php +++ b/modules/48-conditionals/30-if/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Conditionals\IfStatement; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('Try again!', guessNumber(100500)); $this->assertEquals('You win!', guessNumber(42)); } diff --git a/modules/48-conditionals/40-if-else/SolutionTest.php b/modules/48-conditionals/40-if-else/SolutionTest.php index 96554f6e..4a064998 100644 --- a/modules/48-conditionals/40-if-else/SolutionTest.php +++ b/modules/48-conditionals/40-if-else/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Conditionals\IfElse; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('https://yandex.ru', normalizeUrl('yandex.ru')); $this->assertEquals('https://yandex.ru', normalizeUrl('http://yandex.ru')); $this->assertEquals('https://yandex.ru', normalizeUrl('https://yandex.ru')); diff --git a/modules/48-conditionals/50-else-if/SolutionTest.php b/modules/48-conditionals/50-else-if/SolutionTest.php index 759249bb..45c344db 100644 --- a/modules/48-conditionals/50-else-if/SolutionTest.php +++ b/modules/48-conditionals/50-else-if/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Conditionals\ElseIfStatement; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('go', getTrafficLightAction('green')); $this->assertEquals('slow down', getTrafficLightAction('yellow')); $this->assertEquals('stop', getTrafficLightAction('red')); diff --git a/modules/48-conditionals/60-ternary-operator/SolutionTest.php b/modules/48-conditionals/60-ternary-operator/SolutionTest.php index 5acd3f24..9701095e 100644 --- a/modules/48-conditionals/60-ternary-operator/SolutionTest.php +++ b/modules/48-conditionals/60-ternary-operator/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Conditionals\TernaryOperator; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('flop', flipFlop('flip')); $this->assertEquals('flip', flipFlop('flop')); $this->assertEquals('flip', flipFlop('')); diff --git a/modules/48-conditionals/65-switch/SolutionTest.php b/modules/48-conditionals/65-switch/SolutionTest.php index 32e8d327..3670dc52 100644 --- a/modules/48-conditionals/65-switch/SolutionTest.php +++ b/modules/48-conditionals/65-switch/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Conditionals\SwitchStatement; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('just a number', getNumberExplanation(0)); $this->assertEquals('devil number', getNumberExplanation(666)); $this->assertEquals('answer for everything', getNumberExplanation(42)); diff --git a/modules/48-conditionals/70-match/SolutionTest.php b/modules/48-conditionals/70-match/SolutionTest.php index c2567842..6b8525e5 100644 --- a/modules/48-conditionals/70-match/SolutionTest.php +++ b/modules/48-conditionals/70-match/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Conditionals\MatchExpression; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals(600, calculateDeliveryCost('canada', 0.5)); $this->assertEquals(600, calculateDeliveryCost('canada', 1)); $this->assertEquals(900, calculateDeliveryCost('canada', 2)); diff --git a/modules/48-conditionals/75-elvis/SolutionTest.php b/modules/48-conditionals/75-elvis/SolutionTest.php index 360f6b97..f019ac96 100644 --- a/modules/48-conditionals/75-elvis/SolutionTest.php +++ b/modules/48-conditionals/75-elvis/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Conditionals\Elvis; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals(6, generateAmount(0, 2)); $this->assertEquals(15, generateAmount(0, 5)); $this->assertEquals(1, generateAmount(1, 2)); diff --git a/modules/50-loops/10-while/SolutionTest.php b/modules/50-loops/10-while/SolutionTest.php index 9d149cc8..e92c2077 100644 --- a/modules/50-loops/10-while/SolutionTest.php +++ b/modules/50-loops/10-while/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\WhileLoop; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $expected = "4\n3\n2\n1\nGo!"; $this->expectOutputString($expected); printCountdown(4); diff --git a/modules/50-loops/15-conditions-inside-loops/SolutionTest.php b/modules/50-loops/15-conditions-inside-loops/SolutionTest.php index 3ee0ae85..29969960 100644 --- a/modules/50-loops/15-conditions-inside-loops/SolutionTest.php +++ b/modules/50-loops/15-conditions-inside-loops/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\ConditionsInsideLoops; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals(2, countHashtags('New post #php #code')); $this->assertEquals(0, countHashtags('No tags here')); $this->assertEquals(2, countHashtags('#start and #finish')); diff --git a/modules/50-loops/20-aggregation-numbers/SolutionTest.php b/modules/50-loops/20-aggregation-numbers/SolutionTest.php index 24ae9f23..60e8f1ff 100644 --- a/modules/50-loops/20-aggregation-numbers/SolutionTest.php +++ b/modules/50-loops/20-aggregation-numbers/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\AggregationNumbers; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals(0, calculateElectricityBill(0)); $this->assertEquals(400, calculateElectricityBill(80)); $this->assertEquals(500, calculateElectricityBill(100)); diff --git a/modules/50-loops/23-aggregation-strings/SolutionTest.php b/modules/50-loops/23-aggregation-strings/SolutionTest.php index dedf1502..0c2104bb 100644 --- a/modules/50-loops/23-aggregation-strings/SolutionTest.php +++ b/modules/50-loops/23-aggregation-strings/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\AggregationStrings; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('+79991234567', sanitizePhoneNumber('+7 (999) 123-45-67')); $this->assertEquals('88005553535', sanitizePhoneNumber('8 800 555 35 35')); $this->assertEquals('1234567890', sanitizePhoneNumber('(123) 456-7890')); diff --git a/modules/50-loops/25-iteration-over-string/SolutionTest.php b/modules/50-loops/25-iteration-over-string/SolutionTest.php index 4603bfcc..7263df22 100644 --- a/modules/50-loops/25-iteration-over-string/SolutionTest.php +++ b/modules/50-loops/25-iteration-over-string/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\IterationOverString; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('************5678', maskCardNumber('1234567812345678')); $this->assertEquals('****5678', maskCardNumber('12345678')); $this->assertEquals('************3333', maskCardNumber('0000111122223333')); diff --git a/modules/50-loops/30-syntactic-sugar/SolutionTest.php b/modules/50-loops/30-syntactic-sugar/SolutionTest.php index 50130287..ca12038c 100644 --- a/modules/50-loops/30-syntactic-sugar/SolutionTest.php +++ b/modules/50-loops/30-syntactic-sugar/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\SyntacticSugar; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('-----', buildProgressBar(0, 5)); $this->assertEquals('###--', buildProgressBar(3, 5)); $this->assertEquals('#####', buildProgressBar(5, 5)); diff --git a/modules/50-loops/50-mutators/SolutionTest.php b/modules/50-loops/50-mutators/SolutionTest.php index d502fe66..ea1b3a2c 100644 --- a/modules/50-loops/50-mutators/SolutionTest.php +++ b/modules/50-loops/50-mutators/SolutionTest.php @@ -2,13 +2,12 @@ namespace HexletBasics\Loops\Mutators; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; $text = 'I never look back'; $this->assertEquals('I NevEr LooK bAck', makeItFunny($text, 3)); $this->assertEquals('hElLo', makeItFunny('hello', 2)); diff --git a/modules/50-loops/55-return-from-loops/SolutionTest.php b/modules/50-loops/55-return-from-loops/SolutionTest.php index fceed53d..6a72042e 100644 --- a/modules/50-loops/55-return-from-loops/SolutionTest.php +++ b/modules/50-loops/55-return-from-loops/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\ReturnFromLoops; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertTrue(hasAtSymbol('support@example.com')); $this->assertFalse(hasAtSymbol('wrong-email')); $this->assertTrue(hasAtSymbol('@admin')); diff --git a/modules/50-loops/70-for/SolutionTest.php b/modules/50-loops/70-for/SolutionTest.php index 3efaeb7e..9f020630 100644 --- a/modules/50-loops/70-for/SolutionTest.php +++ b/modules/50-loops/70-for/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\ForLoop; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('my_photo.png', normalizeFilename('my photo.png')); $this->assertEquals('final_report.pdf', normalizeFilename('final report.pdf')); $this->assertEquals('already_ready.txt', normalizeFilename('already_ready.txt')); diff --git a/modules/50-loops/80-for-in-range/SolutionTest.php b/modules/50-loops/80-for-in-range/SolutionTest.php index 5886095c..36d4c006 100644 --- a/modules/50-loops/80-for-in-range/SolutionTest.php +++ b/modules/50-loops/80-for-in-range/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\ForInRange; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('1', fizzbuzz(1)); $this->assertEquals('1 2 Fizz', fizzbuzz(3)); $this->assertEquals('1 2 Fizz 4 Buzz', fizzbuzz(5)); diff --git a/modules/50-loops/90-debug/SolutionTest.php b/modules/50-loops/90-debug/SolutionTest.php index 0745f1db..e56f2a32 100644 --- a/modules/50-loops/90-debug/SolutionTest.php +++ b/modules/50-loops/90-debug/SolutionTest.php @@ -2,14 +2,12 @@ namespace HexletBasics\Loops\Debug; -use PHPUnit\Framework\TestCase; +use HexletBasics\Exercise\TestCase; class SolutionTest extends TestCase { public function test() { - require 'Solution.php'; - $this->assertEquals('a3bc4', compress('aaabcccc')); $this->assertEquals('abcd', compress('abcd')); $this->assertEquals('a2b2a2', compress('aabbaa')); diff --git a/src/Functions.php b/src/Functions.php deleted file mode 100644 index 87634b3b..00000000 --- a/src/Functions.php +++ /dev/null @@ -1,9 +0,0 @@ -getFileName()) . '/Solution.php'; + require $solutionPath; + } +}