v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)

Автор Пиит, 16 апреля 2024, 12:33

« назад - далее »

Пиит

Цитата: Djelf от 16 апреля 2024, 15:05Давайте тестовую базу!

Согласен, виноват, исправлюсь, подготовлю тестовую базу и впредь, буду лучше готовиться к теме.

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

Пиит

Цитата: Djelf от 16 апреля 2024, 15:05Но если по условию задачи только дата,

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

Как говорит один мой знакомый, любой изврат, лишь бы не 1с++.

Пиит

Мне когда-то на экзамене Чистов щелбан треснул за такое. Кто, говорит, тебе мешал оборотное субконто в счет добавить? И - тресь, прямо в мозжечок.  После этого волшебного щелбана у меня реально мозг на место встал.

Djelf

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

Пиит

Цитата: Djelf от 16 апреля 2024, 15:18Непонятно как сейчас попугаями мерятся,

А че тут думать, скинем одному все решения, и пусть считает. Я даже знаю, кто это будет.

У меня старичок, первый icore, то что надо

Пиит

Только сначала все решения нужно подготовить, и сдать на перемене.
Можно и не одно решение.
Может, срок какой установить? Неделя хватит?

Djelf

Только ты учти что БД АЛьА на MSSQL ;)
Да и год или даже 10 лет нас не напрягает... Справляемся же...

Пиит

Цитата: Djelf от 16 апреля 2024, 15:35Только ты учти что БД АЛьА на MSSQL

Таки в чём вопрос?
Если АЛьФ захочет, может и у себя проверить.

Я подготовлю шаблон обработки, для решения, если не против, чтобы одни условия были.
На скорость влияет всякая фигня, в т.ч. обращение к реквизитам формы.


Пиит

Не на жопу ведь играем, так, мозги встряхнуть.
Пусть проверяет кто захочет.

Пиит

Вроде выродил, 119976 записей за 27817 млсек.
Даты - одна на месяц с начала эры по конец 9998 года.
Гляньте, может замечания будут.

ОлимпДатаЗнач.zip

Споймал косяк какой-то, по 9999 году, транзакция зависает в воздухе, по Esc снимается, а после этого вообще похоже Спр не работает.




Злоп

решение кривое.
Замер: 16.04.24 23:21:21: аргумент = 16.04.1966, результат =   .  .    , время выполнения = 0 млсек
Замер: 16.04.24 23:21:26: аргумент = 16.04.1966, результат =   .  .    , время выполнения = 0 млсек
есть значения 12.03.1966 и 17.04.1966 - одно из них очевидно (?) является решением

Злоп

ограничений на компостокод нет, поэтому тупо накомпостекодил
   СпрН = СоздатьОбъект("Справочник.Номенклатура");
   СпрН.ПорядокРеквизита("ДатаЗнач");
   СпрН.ОбратныйПорядок(0); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМин = СпрН.ДатаЗнач; ДатаМин = ДатаМин - 1;
   СпрН.ОбратныйПорядок(1); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМакс = СпрН.ДатаЗнач; ДатаМакс = Мин(ДатаМакс,ДатаДок);
   СпрН.ВыбратьЭлементы();
   Пока ДатаМакс > ДатаМин Цикл
      Если СпрН.НайтиПоРеквизиту("ДатаЗнач",ДатаМакс,1)=0 Тогда
         ДатаМакс = ДатаМакс - 1;
         Продолжить;
      КонецЕсли;
      Прервать;
   КонецЦикла;
   Если СпрН.Выбран()=1
   Тогда Сообщить("ДатаЗнач = "+ДатаМакс);
   Иначе Сообщить("ДатаЗнач = решение не найдено");
   КонецЕсли;

Злоп

обработка https://wdfiles.ru/1sG80
(как к ответу прикрепить файл?)
время = 0.
.
или в твою обработку

Функция ПоискЭлементаПоДате(Знач ДатаДок)
   Перем Результат;
   
   Результат = ПолучитьПустоеЗначение("Справочник.Тестовый");
   СпрН = СоздатьОбъект("Справочник.Тестовый");
   СпрН.ПорядокРеквизита("ДатаЗнач");
   СпрН.ОбратныйПорядок(0); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМин = СпрН.ДатаЗнач; ДатаМин = ДатаМин - 1;
   СпрН.ОбратныйПорядок(1); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМакс = СпрН.ДатаЗнач; ДатаМакс = Мин(ДатаМакс,ДатаДок);
   СпрН.ВыбратьЭлементы(); сч = 1;
   Пока ДатаМакс > ДатаМин Цикл
      Если СпрН.НайтиПоРеквизиту("ДатаЗнач",ДатаМакс,1)=0 Тогда
         ДатаМакс = ДатаМакс - 1; сч = сч + 1;
         Продолжить;
      КонецЕсли;
      Результат = СпрН.ТекущийЭлемент();
      Прервать;
   КонецЦикла;
   Возврат Результат;
КонецФункции

Злоп

Замер: 16.04.24 23:47:03: аргумент = 16.04.1966, результат = 12.03.1966, время выполнения = 0 млсек
Замер: 16.04.24 23:47:11: аргумент = 16.04.1960, результат = 12.03.1960, время выполнения = 1 млсек
Замер: 16.04.24 23:47:17: аргумент = 16.04.1958, результат = 18.03.1958, время выполнения = 0 млсек
Замер: 16.04.24 23:47:35: аргумент = 16.04.1938, результат = 18.03.1938, время выполнения = 0 млсек
Замер: 16.04.24 23:47:44: аргумент = 16.04.1925, результат = 02.03.1925, время выполнения = 1 млсек

Пиит

Вот, есть такие ученики в каждом Классе, которые не "тянут руку", а "с места" любят озвучить свои знания. За подсказки будем ругать. Как же мы узнаем знания других учеников?
Не торопитесь, Злоп, оформляйте рабочую тетрадь.
Как мы видим, решений уже не одно, и это радует.

И да, я таки намерен считать количество итераций, а то походу во всех решениях будет 01 млсек