Algo1C: Решение алгоритмических задач на базе 1С:Предприятие [Часть #3]

23.09.24

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

Решаем новые задачи из LeetCode и CodeWars!

Йо, меня зовут Наби. Заранее благодарю за чтение и желаю продуктивно провести время! Если после прочтения возникнут вопросы, пожелания или предложения, то буду рад ознакомиться со всем в комментариях!


Предисловие:

В предыдущей части мы впервые встретились с задачами на тему ASCII Art, научились вручную создавать CSV файл из исходного массива, столкнулись впервые с чисто математическими задачами и попробовали придумать аналог встроенной 1Совской функции "СтрЧислоВхождений". В этой части вас ждут еще более интересные алгоритмические задачи!

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


Новое в конфигурации Algo1C (Последние 5 версий):

Актуальную версию конфигурации вы можете загрузить здесь (Нажмите на строку)

- 0.5 : Добавлена возможность выбирать контекст исполнения кода, например: НаСервере или НаКлиенте

- 0.4 : Исправлена ошибка при выводе содержимого исключения

- 0.3 : Добавлена возможность сохранять и загружать задачи; Внесены небольшие изменения в интерфейс

- 0.2 : Исправлена ошибка при выводе результата (Отдельная благодарность SAShikutkin)

 


Решение задач:

 
 Задача 1

 Платформа: CodeWars

 Название задачи: Sum without highest and lowest number

 Ссылка на задачу: https://www.codewars.com/kata/576b93db1129fcf2200001e6 (Нажмите на строку)

 Оригинальное описание задачи:

Sum all the numbers of a given array ( cq. list ), except the highest and the lowest element ( by value, not by index! ).

The highest or lowest element respectively is a single element at each edge, even if there are more than one with the same value.

Mind the input validation.

Example

{ 6, 2, 1, 8, 10 } => 16
{ 1, 1, 11, 2, 3 } => 6



Input validation

If an empty value ( null, None, Nothing, nil etc. ) is given instead of an array, or the given array is an empty list or a list with only 1 element, return 0.

 

Пояснение:

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


Решение:

Начнём с того что нам нужно вычислить самое большое и маленькое значения. Для этого достаточно будет написать только 1 цикл, в котором мы будем одновременно проверять текущее значение на один из вышесказанных признаков. Затем мы напишем новый цикл, будем перебирать все элементы массива суммируя их по пути. Ну и затем попросту вычтем те два числа, что мы вычислили ранее!

Давайте перейдем в 1С:

ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить(1);
ИсходныйМассив.Добавить(1);
ИсходныйМассив.Добавить(11);
ИсходныйМассив.Добавить(2);
ИсходныйМассив.Добавить(3);
//
СамоеБольшоеЧисло = Неопределено;
СамоеМаленькоеЧисло = Неопределено;
//
Для Каждого Стр Из ИсходныйМассив Цикл
	Если СамоеБольшоеЧисло = Неопределено Или СамоеБольшоеЧисло < Стр Тогда
		СамоеБольшоеЧисло = Стр;
	КонецЕсли;
	//
	Если СамоеМаленькоеЧисло = Неопределено Или СамоеМаленькоеЧисло > Стр Тогда
		СамоеМаленькоеЧисло = Стр;
	КонецЕсли;
КонецЦикла;
//
Вывод = 0;
Для Каждого Стр Из ИсходныйМассив Цикл
	Вывод = Вывод + Стр;
КонецЦикла;
Вывод = Вывод - (СамоеБольшоеЧисло+СамоеМаленькоеЧисло);

Заключение:

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

 
 Задача 2
 
 Задача 3
 
 Задача 4
 
 Задача 5

Заключение:

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

Математика Алгоритмы Leetcode CodeWars

См. также

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

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

1 стартмани

30.01.2024    2742    stopa85    12    

36

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

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

19.10.2023    6663    user1959478    50    

36

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

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

2 стартмани

29.09.2023    2675    maksa2005    8    

25

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

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

1 стартмани

09.06.2023    10211    7    SpaceOfMyHead    18    

61

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

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

03.04.2023    3946    RustIG    9    

25

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

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

23.11.2022    3061    gzharkoj    14    

24

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

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

1 стартмани

21.03.2022    8881    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. partizand 136 23.09.24 11:45 Сейчас в теме
Первая задача. Зачем два цикла? Можно же одним обойтись.
И в массиве из одного элемента решение будет неверным.
Вы слышали про сложность алгоритмов n, log n и т.д.?
И затратность по памяти бывает разной.
Применительно к 1с лучше разбираться с запросами и их оптимизацией, результата будет больше.
TheNabiulla; +1 Ответить
3. TheNabiulla 77 23.09.24 12:05 Сейчас в теме
(1) Не подумал об этом. Благодарю за подсказку, обязательно попробую!
2. partizand 136 23.09.24 11:53 Сейчас в теме
Да и кстати позанудствую. Вы забыли условия. Если элементов нет, неопределено то должно быть 0.
Мин и макс насколько я понял только если элементов больше одного и они разные.
Но это не принципиально.
TheNabiulla; +1 Ответить
4. TheNabiulla 77 23.09.24 12:06 Сейчас в теме
(2) Никакого занудства, я рад что вы комментируете и даëте советы, благодарю! В следующий раз учту условия более подробно!
5. Slypower 3 24.09.24 09:42 Сейчас в теме
Для первой задаче можно использовать макс() и мин().
в 4 задаче пишите: Порядок этих элементов может быть разный, но в решении вы делаете у вас всегда должен быть только обратный порядок.
Почем увы не используете стрШаблон()?
TheNabiulla; +1 Ответить
6. TheNabiulla 77 24.09.24 11:57 Сейчас в теме
(5) Благодарю за подсказку! А про СтрШаблон я не подумал, честно говоря. Далее буду обязательно воспользуюсь!
Оставьте свое сообщение