Решение алгоритмических задач на базе 1С:Предприятие | Новый выпуск Algo1C

03.10.24

Разработка - Математика и алгоритмы

Решаем новые задачи по программированию на 1С!

Добро пожаловать на новый выпуск рубрики "Algo1C", в которой я стараюсь каждый день решать новые задачи по программированию и делиться своими решениями с вами!

Цель рубрики заключается в тренировке практик по применению различных алгоритмов и в поддержании навыка "Писать код" в тонусе!


Что было раньше:

В предыдущей части (нажмите на строку) мы решили:

В этой части вас ждут еще более интересные алгоритмические задачи. Давайте, приступим!

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


Решение новых задач:

 
 Задача 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 LeetCode Algo1C Задачи

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3154    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7541    user1959478    51    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3101    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    10893    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4353    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

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

23.11.2022    3517    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9038    7    kalyaka    11    

44
Оставьте свое сообщение