Решение индивидуального задания по упрощенному раскрою пленки

12.10.24

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

В данной публикации рассматривается решение тестового задания из собеседования на должность программиста 1С.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Решение индивидуального задания по упрощенному раскрою пленки:
.epf 9,01Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Здоровья всем страждущим. Решил выложить задачу с собеседования и предполагаемый вариант решения.

Индивидуальное задание по упрощенному раскрою пленки

Нужно сделать обработку «Раскрой плёнки», помогающую выбрать оптимальный раскрой.

Есть таблица «Остатки» - заполняется рандомными 5ю разными числами от 1200 до 1600. (НомерСтроки/Ширина)

Есть таблица «Потребности» - заполняется рандомными 10ю разными числами от 250 до 500. (НомерСтроки/Ширина)

Нужно заполнить таблицу «Раскрой». В ней вывести все варианты укладки ширин «Потребностей» на каждую ширину «Остатков». В этой таблице будут следующие колонки:

НомерСтроки;

ШиринаОстатка – ширина из таблицы «Остатки», например «1400»;

КартаРаскроя – вариант списка ширин из таблицы «Потребности», в сумме не превышающий «ШиринуОстатка», например «250+300+350+350»;

ОстатокРаскроя – разность между «ШиринаОстатка» и суммой «КартаРаскроя», напримет «150».

Постараться, чтобы количество кода не превышало 100 строк.

Предполагается, что на решение задачи уйдет не более 3-4 часов.

Код решения:

&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
	ЗаполнитьТаблицуСлучайнымиЧислами(Объект.Остатки, 5, 1200, 1600);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПотребности(Команда)
	ЗаполнитьТаблицуСлучайнымиЧислами(Объект.Потребности, 10, 250, 500);
КонецПроцедуры 

&НаКлиенте
Процедура РассчитатьРаскрой(Команда)  
	
	Объект.Раскрой.Очистить();	
	Для каждого строкаОстатки из Объект.Остатки Цикл

		КомбинацииМассивов = РассчитатьКомбинации(строкаОстатки.Ширина);
		Для каждого МассивЧисел из КомбинацииМассивов Цикл 
			СтрокаРаскроя = Объект.Раскрой.Добавить();
			СтрокаРаскроя.ШиринаОстатка = строкаОстатки.Ширина;
			СтрокаРаскроя.КартаРаскроя = СтрСоединить(МассивЧисел,"+"); 
			СтрокаРаскроя.ОстатокРаскроя = СтрокаРаскроя.ШиринаОстатка - Вычислить(СтрокаРаскроя.КартаРаскроя); 
		КонецЦикла;    
		
	КонецЦикла;    
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТаблицуСлучайнымиЧислами(Таблица, ЧислоСтрок, НижняяГраница, ВерхняяГраница)   
	
	Таблица.Очистить();
	
	Генератор = Новый ГенераторСлучайныхЧисел();
	
	Для инд = 1 по ЧислоСтрок Цикл
		
		нСтр = Таблица.Добавить();
		нСтр.Ширина = Генератор.СлучайноеЧисло(НижняяГраница, ВерхняяГраница);
		
	КонецЦикла;
	
КонецПроцедуры	   

&НаСервере
Функция РассчитатьКомбинации(ИскомоеЗначение) 
	
	КомбинацииМассивов = Новый Массив;  
	МассивСтрок = Новый Массив;  
	
	Таб = Объект.Потребности.Выгрузить(); 
	Если Таб.Количество() = 0 Тогда Возврат Новый Массив; КонецЕсли;
	Таб.Сортировать("Ширина возр");  
	минЗначение = Таб[0].Ширина;
	
	Для инд = 0 по Таб.Количество() - 1 Цикл  
		
		МассивСтрок.Добавить(Таб[инд]);    
		Сумма = СуммаМассива(МассивСтрок); 	
		Если Сумма = ИскомоеЗначение ИЛИ (Сумма + минЗначение > ИскомоеЗначение И Сумма < ИскомоеЗначение) Тогда 
			КомбинацииМассивов.Добавить(МассивСтрокВМассивЧисел(МассивСтрок));
		ИначеЕсли Сумма > ИскомоеЗначение Тогда
			
			МассивСтрок.Удалить(МассивСтрок.ВГраница());
			инд = Таб.Индекс(МассивСтрок[МассивСтрок.ВГраница()]); 
			МассивСтрок.Удалить(МассивСтрок.ВГраница());
			
		КонецЕсли;   
		
	КонецЦикла;	
	
	Возврат КомбинацииМассивов;
	
КонецФункции

&НаСервереБезКонтекста
Функция СуммаМассива(тМассив)  
	
	Сумма = 0;   	
	Для каждого Элемент из тМассив Цикл    
		Сумма = Сумма + Элемент.Ширина;
	КонецЦикла;  
	
	Возврат Сумма; 
	
КонецФункции	 

&НаСервереБезКонтекста
Функция МассивСтрокВМассивЧисел(МассивСтрок) 
	
	МассивЧисел = Новый Массив;
	Для каждого Элемент из МассивСтрок Цикл
		МассивЧисел.Добавить(Элемент.Ширина);
	КонецЦикла;    
	
	Возврат МассивЧисел;
	
КонецФункции	

Обработка протестирована на конфигурации с версией платформы 8.3.23.2137.

См. также

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

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

1 стартмани

30.01.2024    3162    stopa85    12    

38

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

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

19.10.2023    7550    user1959478    51    

36

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

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

2 стартмани

29.09.2023    3107    maksa2005    8    

26

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

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

1 стартмани

09.06.2023    10902    7    SpaceOfMyHead    18    

61

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

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

03.04.2023    4357    RustIG    9    

25

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

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

23.11.2022    3527    gzharkoj    14    

25

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

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

1 стартмани

21.03.2022    9041    7    kalyaka    11    

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