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

24.09.24

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

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

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


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

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

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


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

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

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

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

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

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

 


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

 
 Задача 1

 Платформа: Codewars

 Название задачи: Find the unique number

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

 Сложность: 6 kyu

 Тэги: Фундаментальные, Алгоритмы, Массивы

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

There is an array with some numbers. All numbers are equal except for one. Try to find it!

find_uniq([ 1, 1, 1, 2, 1, 1 ]) == 2
find_uniq([ 0, 0, 0.55, 0, 0 ]) == 0.55

It’s guaranteed that array contains at least 3 numbers.

The tests contain some very huge arrays, so think about performance.

Пояснение:

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


Решение:

Первое что приходит на ум так это просто перебрать все элементы массива и затем в каждой итерации считать количество элементов но у Массивов в 1С нет встроенного метода подсчета вхождений. Будет лучше придумать другой вариант. Например можно воспользоваться Таблицей Значений, у которой есть метод "НайтиСтроки", который вернет список найденных значений. Но для того чтобы не менять условия задачи, давайте исходные данные оставим как массив, заполним его и уже будем все переносить в Таблицу Значений! Приступим?

ИсходныйМассив = Новый Массив;
Для НомерСтроки = 1 По 10000 Цикл
	ИсходныйМассив.Добавить(НомерСтроки);	
	Если ?(НомерСтроки%10 = 0,Истина,Ложь) Тогда	
		ИсходныйМассив.Добавить(5);
	КонецЕсли;
КонецЦикла;
//
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ЗначениеМассива");
Для Каждого Стр Из ИсходныйМассив Цикл
	НС = ТЗ.Добавить();
	НС.ЗначениеМассива = Стр;
КонецЦикла;
//
ПроверенныеЗначения = Новый Массив;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ЗначениеМассива",Неопределено);
//
Для Каждого Стр Из ИсходныйМассив Цикл
	Если ПроверенныеЗначения.Найти(Стр) = Неопределено Тогда
		ПараметрыОтбора.ЗначениеМассива = Стр;
		Если ТЗ.НайтиСтроки(ПараметрыОтбора).Количество() > 1 Тогда
			Вывод = Стр;
		Иначе
			ПроверенныеЗначения.Добавить(Стр);
		КонецЕсли; 		
	КонецЕсли;
КонецЦикла;

Заключение:

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

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

Заключение:

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

Алгоритмы Математика Оптимизация кода Leetcode CodeWars

См. также

Математика и алгоритмы Программист Платформа 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
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user984931 08.10.24 15:17 Сейчас в теме
Добрый день! Спасибо за задачу!
По-моему у Вас неверное решение задачи N 1. В условии сказано:
There is an array with some numbers. All numbers are equal except for one. Try to find it!

Есть массив с некоторыми числами. Все числа равны, кроме одного. Попробуйте найти его!
Вы создаёте массив с различными числами от 1 до 10000, а должен быть массив с одинаковыми числами и только одно отличается.
Одно из решений:
Процедура Задача_1_НаСервере()
	НачалоРаботы = ТекущаяДата();
	РазмерМассива = 100000;
	ГСЧ = Новый ГенераторСлучайныхЧисел;
	НеУникальноеЗначение = Формат(ГСЧ.СлучайноеЧисло(0, РазмерМассива), "ЧГ=");
	УникальноеЗначение = Формат(ГСЧ.СлучайноеЧисло(0, РазмерМассива), "ЧГ=");
	ИсходныйМассив = Новый Массив;
	Для Я = 1 По РазмерМассива Цикл
		Если Я = УникальноеЗначение Тогда
			ИсходныйМассив.Добавить(УникальноеЗначение);
		Иначе
			ИсходныйМассив.Добавить(НеУникальноеЗначение);
		КонецЕсли;
	КонецЦикла;
	СтруктурированныйМассив = Новый Структура;
	Кол_воЭлементов = 1;
	Для Каждого ЭлемМассива Из ИсходныйМассив Цикл
		СтруктурированныйМассив.Вставить("К_" + ЭлемМассива, ?(СтруктурированныйМассив.Свойство("К_" + ЭлемМассива, Кол_воЭлементов), Кол_воЭлементов + 1, 1));
	КонецЦикла;
	ОкончаниеРаботы = ТекущаяДата();
	Сообщить("Размер массива: " + Строка(РазмерМассива) + Символы.ПС + "Начало: " + НачалоРаботы + Символы.ПС + "Окончание: " + ОкончаниеРаботы + Символы.ПС + Строка(ОкончаниеРаботы - НачалоРаботы) + " сек.");
КонецПроцедуры
Показать

В итоге выполенния кода в Структуре "СтруктурированныйМассив" будет две записи, с количеством встречающихся в массиве значений: Одна запись с 99 999 и другая - уникальная с 1.
Массив размером в 100 000 элементов обрабатывется за 4 сек.
P. S. Возможно, если не использовать условие "ЕСЛИ" то, будет ещё быстрее...
TheNabiulla; +1 Ответить
2. TheNabiulla 78 08.10.24 19:16 Сейчас в теме
(1) Добрый. Принял, благодарю что указали на ошибку и предложили своë решение!
Оставьте свое сообщение