Добро пожаловать на новый выпуск рубрики "Algo1C", в которой я стараюсь каждый день решать новые задачи по программированию и делиться своими решениями с вами!
Цель рубрики заключается в тренировке практик по применению различных алгоритмов и в поддержании навыка "Писать код" в тонусе!
Что было раньше:
В предыдущей части (нажмите на строку) мы решили:
- Count characters in your string (Посчитай количество букв в твоей строке) (Нажмите на строку)
- "Stringing"+"Me"+"Along" (Привяжи и меня) (Нажмите на строку)
- Split Strings (Раздели строки) (Нажмите на строку)
- +1 Array (+1 массив) (Нажмите на строку)
- IP Validation (Валидация IP адреса) (Нажмите на строку)
В этой части вас ждут еще более интересные алгоритмические задачи. Давайте, приступим!
Перед началом чтения решения задачи, хочу призвать каждого к самостоятельному решению задачи, чтобы после вы могли сравнить своё решение с моим и обсудить это в комментариях. Буду рад послушать ваше мнение!
Решение новых задач:
Задача 1
Платформа: Codewars
Название задачи: Twice as old (В два раза старше)
Ссылка на задачу: https://www.codewars.com/kata/5b853229cfde412a470000d0 (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Фундаментальные, Математика
Оригинальное описание задачи:
Your function takes two arguments: current father's age (years) current age of his son (years) Сalculate how many years ago the father was twice as old as his son (or in how many years he will be twice as old). The answer is always greater or equal to 0, no matter if it was in the past or it is in the future. Fundamentals Mathematics
Пояснение:
Суть задачи заключается в том чтобы вычислить через сколько лет отец будет старше сына ровно в два раза от возраста сына или наоборот, сколько лет назад он был старше него в два раза
Решение:
Для решения задачи нам достаточно воспользоваться одной интересной формулой, по которой нам необходимо из возраста отца вычесть два раза возраст сына что даст нам количество лет в будущем и в прошлом, когда отец был или будет в два раза старше сына. Например взять 43 года и 1 год. По формуле получаем 41. И на самом деле, 41 год назад отцу было два, а через 41 год отцу будет 84 а сыну 42
ВозрастОтца = 43;
ВозрастСына = 1;
//
КоличествоЛет = (ВозрастОтца-ВозрастСына)-ВозрастСына;
//
Вывод = Макс(-КоличествоЛет, КоличествоЛет);
Результат:
41
Получилась весьма интересная математическая задача!
Задача 2
Платформа: Codewars
Название задачи: Sum of differences in array (Сумма разниц элементов в массиве)
Ссылка на задачу: https://www.codewars.com/kata/5b73fe9fb3d9776fbf00009e (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Массивы, Фундаментальные
Оригинальное описание задачи:
Your task is to sum the differences between consecutive pairs in the array in descending order. Example [2, 1, 10] --> 9 In descending order: [10, 2, 1] Sum: (10 - 2) + (2 - 1) = 8 + 1 = 9 If the array is empty or the array has only one element the result should be 0 (Nothing in Haskell, None in Rust).
Пояснение:
По условию задачи нам необходимо найти общую сумму разниц между элементами массива, который перед этим нам необходимо отсортировать по убыванию. Например возьмем массив [2,1,10], отсортировав его мы получим [10,2,1]. Далее считаем разницу, получается 10-2=8 2-1=1 8+1=9 Итого общая сумма разниц элементов массива равна 9. Звучит просто, давайте попробуем решить!
Решение:
Для начала необходимо отсортировать исходный массив. Для этого перенесём все элементы исходного массива в новый список значений и затем отсортируем с помощью его метода "СортироватьПоЗначению()". После напишем цикл для перебора всех элементов массива и при каждой итерации будем записывать текущее значение в переменную а также прибавлять разницу между текущим значением и предыдущим к конечному результату. В итоге получится вот такой код:
ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить(2);
ИсходныйМассив.Добавить(1);
ИсходныйМассив.Добавить(10);
//
СЗ = Новый СписокЗначений;
Для Каждого Стр Из ИсходныйМассив Цикл
СЗ.Добавить(Стр);
КонецЦикла;
СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Вывод = 0;
ПредыдущееЗначение = Неопределено;
Для Каждого Стр Из СЗ Цикл
Если ПредыдущееЗначение = Неопределено Тогда
ПредыдущееЗначение = Стр.Значение;
Иначе
Вывод = Вывод + (ПредыдущееЗначение-Стр.Значение);
ПредыдущееЗначение = Стр.Значение;
КонецЕсли;
КонецЦикла;
Результат:
9
Получилась весьма интересная задача с простым решением!
Задача 3
Платформа: Codewars
Название задачи: easy logs (Простые логарифмы)
Ссылка на задачу: https://www.codewars.com/kata/5b68c7029756802aa2000176 (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Алгоритмы
Оригинальное описание задачи:
Given a logarithm base X and two values A and B, return a sum of logratihms with the base X: logR89;XA+logR89;XB \log_XA + \log_XB logXR03;A+logXR03;B.
Пояснение:
Суть задачи максимально проста. Нам необходимо найти сумму двух логарифмов с одинаковым основанием. В качестве входных данных нам будут даваться три значения, то есть общее основание и по одному аргументу на каждый логарифм
Решение:
Для того чтобы сложить алгоритмы с одинаковым основанием, нам достаточно перемножить их аргументы и в итоге получить один логарифм. Затем просто вычисляем логарифм и возвращаем значение
ОснованиеЛогарифма = 4;
ПервоеЗначение = 8;
ВтороеЗначение = 8;
//
Для НомерСтроки = 1 По 20 Цикл
Если Pow(ОснованиеЛогарифма,НомерСтроки) = ПервоеЗначение * ВтороеЗначение Тогда
Вывод = НомерСтроки;
Прервать;
КонецЕсли;
КонецЦикла;
Результат:
3
Как видим всё отлично отрабатывается. Логарифмом 64 по основанию 4 действительно является 3. Интересная получилась задача!
Задача 4
Платформа: CodeWars
Название задачи: If you can't sleep, just count sheep!! (Если не можешь заснуть, просто считай овец)
Ссылка на задачу: https://www.codewars.com/kata/5b077ebdaf15be5c7f000077 (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Фундаментальные, Строки
Оригинальное описание задачи:
If you can't sleep, just count sheep!! Task: Given a non-negative integer, 3 for example, return a string with a murmur: "1 sheep...2 sheep...3 sheep...". Input will always be valid, i.e. no negative integers.
Пояснение:
Суть задачи максимально проста. Будет даваться число из которого нам необходимо получить строку с количеством овец. Формат строки должен выглядеть так "1 sheep..." на каждую овцу.
Решение:
Всё что от нас требуется так это просто написать цикл, число итераций которого равно исходному числу и с каждой итерацией увеличивать строку вывода. Вот как это выглядит в коде:
ИсходноеЧисло = 3;
Вывод = "";
Для НомерСтроки = 1 По ИсходноеЧисло Цикл
Вывод = Вывод +Строка(НомерСтроки)+" sheep...";
КонецЦикла;
Результат:
1 sheep...2 sheep...3 sheep...
Весьма простая задача с коротким решением. Пойдет в качестве разминки!
Задача 5
Платформа: CodeWars
Название задачи: Expressions Matter (Выражения имеют значение)
Ссылка на задачу: https://www.codewars.com/kata/5ae62fcf252e66d44d00008e (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Алгоритмы, Фундаментальные
Оригинальное описание задачи:
Given three integers a, b, and c, return the largest number obtained after inserting the operators +, *, and parentheses (). In other words, try every combination of a, b, and c with the operators, without reordering the operands, and return the maximum value. Example With the numbers 1, 2, and 3, here are some possible expressions: 1 * (2 + 3) = 5 1 * 2 * 3 = 6 1 + 2 * 3 = 7 (1 + 2) * 3 = 9 The maximum value that can be obtained is 9. Notes The numbers are always positive, in the range 1 ≤ a, b, c ≤ 10. You can use the same operation more than once. It is not necessary to use all the operators or parentheses. You cannot swap the operands. For example, with the given numbers, you cannot get the expression (1 + 3) * 2 = 8. Input and Output Examples expressionsMatter(1, 2, 3) ==> 9, because (1 + 2) * 3 = 9. expressionsMatter(1, 1, 1) ==> 3, because 1 + 1 + 1 = 3. expressionsMatter(9, 1, 1) ==> 18, because 9 * (1 + 1) = 18.
Пояснение:
Суть задачи заключается в том чтобы из данных трёх чисел получить самое большое число построив выражение, используя операторы "+","*" и скобки. Простыми словами нам необходимо построить все возможные выражения используя три исходных числа, операторы и скобки и затем выяснить какой вариант даёт самый большой ответ. Звучит понятно, давайте попробуем решить:
Решение:
Для начала создадим массив в который запишем все возможные варианты. Затем найдём самый большой ответ и вернем его. Вот как это будет выглядеть в коде:
ПервоеИсходноеЗначение = 9;
ВтороеИсходноеЗначение = 1;
ТретьеИсходноеЗначение = 1;
//
ВсеВозможныеВарианты = Новый Массив;
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение*(ВтороеИсходноеЗначение+ТретьеИсходноеЗначение));
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение*ВтороеИсходноеЗначение*ТретьеИсходноеЗначение);
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение+ВтороеИсходноеЗначение*ТретьеИсходноеЗначение);
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение*ВтороеИсходноеЗначение+ТретьеИсходноеЗначение);
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение+ВтороеИсходноеЗначение+ТретьеИсходноеЗначение);
ВсеВозможныеВарианты.Добавить((ПервоеИсходноеЗначение+ВтороеИсходноеЗначение)*ТретьеИсходноеЗначение);
//
Вывод = 0;
Для Каждого Стр Из ВсеВозможныеВарианты Цикл
Если Стр > Вывод Тогда
Вывод = Стр;
КонецЕсли;
КонецЦикла;
Результат:
18
Вполне себе интересная задача с простым решением!
Новое в конфигурации Algo1C:
Заключение:
Платформа: Codewars
Название задачи: Twice as old (В два раза старше)
Ссылка на задачу: https://www.codewars.com/kata/5b853229cfde412a470000d0 (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Фундаментальные, Математика
Оригинальное описание задачи:
Your function takes two arguments: current father's age (years) current age of his son (years) Сalculate how many years ago the father was twice as old as his son (or in how many years he will be twice as old). The answer is always greater or equal to 0, no matter if it was in the past or it is in the future. Fundamentals Mathematics
Пояснение:
Суть задачи заключается в том чтобы вычислить через сколько лет отец будет старше сына ровно в два раза от возраста сына или наоборот, сколько лет назад он был старше него в два раза
Решение:
Для решения задачи нам достаточно воспользоваться одной интересной формулой, по которой нам необходимо из возраста отца вычесть два раза возраст сына что даст нам количество лет в будущем и в прошлом, когда отец был или будет в два раза старше сына. Например взять 43 года и 1 год. По формуле получаем 41. И на самом деле, 41 год назад отцу было два, а через 41 год отцу будет 84 а сыну 42
ВозрастОтца = 43;
ВозрастСына = 1;
//
КоличествоЛет = (ВозрастОтца-ВозрастСына)-ВозрастСына;
//
Вывод = Макс(-КоличествоЛет, КоличествоЛет);
Результат:
41
Получилась весьма интересная математическая задача!
Платформа: Codewars
Название задачи: Sum of differences in array (Сумма разниц элементов в массиве)
Ссылка на задачу: https://www.codewars.com/kata/5b73fe9fb3d9776fbf00009e (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Массивы, Фундаментальные
Оригинальное описание задачи:
Your task is to sum the differences between consecutive pairs in the array in descending order. Example [2, 1, 10] --> 9 In descending order: [10, 2, 1] Sum: (10 - 2) + (2 - 1) = 8 + 1 = 9 If the array is empty or the array has only one element the result should be 0 (Nothing in Haskell, None in Rust).
Пояснение:
По условию задачи нам необходимо найти общую сумму разниц между элементами массива, который перед этим нам необходимо отсортировать по убыванию. Например возьмем массив [2,1,10], отсортировав его мы получим [10,2,1]. Далее считаем разницу, получается 10-2=8 2-1=1 8+1=9 Итого общая сумма разниц элементов массива равна 9. Звучит просто, давайте попробуем решить!
Решение:
Для начала необходимо отсортировать исходный массив. Для этого перенесём все элементы исходного массива в новый список значений и затем отсортируем с помощью его метода "СортироватьПоЗначению()". После напишем цикл для перебора всех элементов массива и при каждой итерации будем записывать текущее значение в переменную а также прибавлять разницу между текущим значением и предыдущим к конечному результату. В итоге получится вот такой код:
ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить(2);
ИсходныйМассив.Добавить(1);
ИсходныйМассив.Добавить(10);
//
СЗ = Новый СписокЗначений;
Для Каждого Стр Из ИсходныйМассив Цикл
СЗ.Добавить(Стр);
КонецЦикла;
СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Вывод = 0;
ПредыдущееЗначение = Неопределено;
Для Каждого Стр Из СЗ Цикл
Если ПредыдущееЗначение = Неопределено Тогда
ПредыдущееЗначение = Стр.Значение;
Иначе
Вывод = Вывод + (ПредыдущееЗначение-Стр.Значение);
ПредыдущееЗначение = Стр.Значение;
КонецЕсли;
КонецЦикла;
Результат:
9
Получилась весьма интересная задача с простым решением!
Платформа: Codewars
Название задачи: easy logs (Простые логарифмы)
Ссылка на задачу: https://www.codewars.com/kata/5b68c7029756802aa2000176 (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Алгоритмы
Оригинальное описание задачи:
Given a logarithm base X and two values A and B, return a sum of logratihms with the base X: logR89;XA+logR89;XB \log_XA + \log_XB logXR03;A+logXR03;B.
Пояснение:
Суть задачи максимально проста. Нам необходимо найти сумму двух логарифмов с одинаковым основанием. В качестве входных данных нам будут даваться три значения, то есть общее основание и по одному аргументу на каждый логарифм
Решение:
Для того чтобы сложить алгоритмы с одинаковым основанием, нам достаточно перемножить их аргументы и в итоге получить один логарифм. Затем просто вычисляем логарифм и возвращаем значение
ОснованиеЛогарифма = 4;
ПервоеЗначение = 8;
ВтороеЗначение = 8;
//
Для НомерСтроки = 1 По 20 Цикл
Если Pow(ОснованиеЛогарифма,НомерСтроки) = ПервоеЗначение * ВтороеЗначение Тогда
Вывод = НомерСтроки;
Прервать;
КонецЕсли;
КонецЦикла;
Результат:
3
Как видим всё отлично отрабатывается. Логарифмом 64 по основанию 4 действительно является 3. Интересная получилась задача!
Платформа: CodeWars
Название задачи: If you can't sleep, just count sheep!! (Если не можешь заснуть, просто считай овец)
Ссылка на задачу: https://www.codewars.com/kata/5b077ebdaf15be5c7f000077 (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Фундаментальные, Строки
Оригинальное описание задачи:
If you can't sleep, just count sheep!! Task: Given a non-negative integer, 3 for example, return a string with a murmur: "1 sheep...2 sheep...3 sheep...". Input will always be valid, i.e. no negative integers.
Пояснение:
Суть задачи максимально проста. Будет даваться число из которого нам необходимо получить строку с количеством овец. Формат строки должен выглядеть так "1 sheep..." на каждую овцу.
Решение:
Всё что от нас требуется так это просто написать цикл, число итераций которого равно исходному числу и с каждой итерацией увеличивать строку вывода. Вот как это выглядит в коде:
ИсходноеЧисло = 3;
Вывод = "";
Для НомерСтроки = 1 По ИсходноеЧисло Цикл
Вывод = Вывод +Строка(НомерСтроки)+" sheep...";
КонецЦикла;
Результат:
1 sheep...2 sheep...3 sheep...
Весьма простая задача с коротким решением. Пойдет в качестве разминки!
Платформа: CodeWars
Название задачи: Expressions Matter (Выражения имеют значение)
Ссылка на задачу: https://www.codewars.com/kata/5ae62fcf252e66d44d00008e (Нажмите на строку)
Сложность: 8 kyu (8 / 8)
Тэги: Алгоритмы, Фундаментальные
Оригинальное описание задачи:
Given three integers a, b, and c, return the largest number obtained after inserting the operators +, *, and parentheses (). In other words, try every combination of a, b, and c with the operators, without reordering the operands, and return the maximum value. Example With the numbers 1, 2, and 3, here are some possible expressions: 1 * (2 + 3) = 5 1 * 2 * 3 = 6 1 + 2 * 3 = 7 (1 + 2) * 3 = 9 The maximum value that can be obtained is 9. Notes The numbers are always positive, in the range 1 ≤ a, b, c ≤ 10. You can use the same operation more than once. It is not necessary to use all the operators or parentheses. You cannot swap the operands. For example, with the given numbers, you cannot get the expression (1 + 3) * 2 = 8. Input and Output Examples expressionsMatter(1, 2, 3) ==> 9, because (1 + 2) * 3 = 9. expressionsMatter(1, 1, 1) ==> 3, because 1 + 1 + 1 = 3. expressionsMatter(9, 1, 1) ==> 18, because 9 * (1 + 1) = 18.
Пояснение:
Суть задачи заключается в том чтобы из данных трёх чисел получить самое большое число построив выражение, используя операторы "+","*" и скобки. Простыми словами нам необходимо построить все возможные выражения используя три исходных числа, операторы и скобки и затем выяснить какой вариант даёт самый большой ответ. Звучит понятно, давайте попробуем решить:
Решение:
Для начала создадим массив в который запишем все возможные варианты. Затем найдём самый большой ответ и вернем его. Вот как это будет выглядеть в коде:
ПервоеИсходноеЗначение = 9;
ВтороеИсходноеЗначение = 1;
ТретьеИсходноеЗначение = 1;
//
ВсеВозможныеВарианты = Новый Массив;
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение*(ВтороеИсходноеЗначение+ТретьеИсходноеЗначение));
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение*ВтороеИсходноеЗначение*ТретьеИсходноеЗначение);
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение+ВтороеИсходноеЗначение*ТретьеИсходноеЗначение);
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение*ВтороеИсходноеЗначение+ТретьеИсходноеЗначение);
ВсеВозможныеВарианты.Добавить(ПервоеИсходноеЗначение+ВтороеИсходноеЗначение+ТретьеИсходноеЗначение);
ВсеВозможныеВарианты.Добавить((ПервоеИсходноеЗначение+ВтороеИсходноеЗначение)*ТретьеИсходноеЗначение);
//
Вывод = 0;
Для Каждого Стр Из ВсеВозможныеВарианты Цикл
Если Стр > Вывод Тогда
Вывод = Стр;
КонецЕсли;
КонецЦикла;
Результат:
18
Вполне себе интересная задача с простым решением!
Ну что ж, пока на этом всё, надеюсь статья была увлекательной для вас, благодарю за внимание. Подключайтесь к решению алгоритмических задач вместе со мной, делитесь вашим мнением и решениями в комментариях! Увидимся в новой статье!