![]() |
|
Самая короткая функция определения високосного года 🠗 (Волшебник 20.05.2025 09:01) | ☑ | ||
---|---|---|---|---|
0
mmg
18.05.25
✎
10:59
|
Попробуйте написать самую короткую функцию определения високосного года в 1С. Понятно, что это можно вместить в одну строку. Но какова минимальная длина этой строки?
Для имени входного параметра "год" У меня получилось **********************************, 34 символа. Сможете повторить? Сразу скажу, что проверка на 29 февраля даст 35 символов Функция ЭтоВисокосныйГод(год) возврат день(КонецМесяца(дата(год,2,1)))=29 КонецФункции Функция ЭтоВисокосныйГод(год) возврат ********************************** КонецФункции |
|||
1
Злопчинский
18.05.25
✎
11:15
|
НомерДняГода(Дата(год,12,31))
30 символов |
|||
2
Tatitutu
18.05.25
✎
11:32
|
(1) попытка хорошая , но ...
ещё нужна проверка 365 или 366 Ответ Да или Нет Возврат НомерДняГода(Дата(Г,12,31))=365 31 |
|||
3
mmg
18.05.25
✎
11:36
|
(1)
НомерДняГода нет в платформе. Есть деньгода(дата(год,12,31))=366 И это да 30 символов Переформулирую задачу. Надо найти самую короткую запись функции самостоятельного определения високосного года. И проверка на 29 февраля и проверка на количество дней в году задействуют платформенную функцию определения високосного года. А самостоятельное определение основывается на общих правилах: каждый четвертый вискосный, каждый четвертый из сотых вискосный, остальные сотые нет |
|||
4
mmg
18.05.25
✎
11:45
|
Т.е. речь идет о том, как превратить
Функция ЭтоВисокосныйГод(Год) Если Год % 400 = 0 Тогда Возврат Истина; ИначеЕсли Год % 100 = 0 Тогда Возврат Ложь; ИначеЕсли Год % 4 = 0 Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецФункции в Функция ЭтоВисокосныйГод(год) возврат ********************************** КонецФункции с длиной строки 34 символа (или меньше, если такое возможно) |
|||
5
Lama12
18.05.25
✎
11:59
|
(0) Что-то мне подсказывает, что здесь платформа определяет високосность года, а не функция.
|
|||
6
mmg
18.05.25
✎
12:01
|
(5) Нет. У меня решение проверяет год на 4, 100, 400.
С платформой разобрались. Ее не "рецепт" не берем |
|||
7
b_ru
18.05.25
✎
12:42
|
Возврат Не (Год % 4) И (Год % 100 Или Не (Год % 400))
может со скобками напутал, лень одинэску открывать |
|||
8
mmg
18.05.25
✎
13:03
|
(7)
Формула верная, но даже если убрать пробелы Не (Год%4) И (Год%100 Или Не (Год%400)) будет 39 символов Можно еще на два символа сократить Не (Год%4) И (Год%25 Или Не (Год%16)) Но все равно будет 37 |
|||
9
vbus
18.05.25
✎
13:40
|
(8) Не 37, а 28 Не(Г%4)И(Г%25 Или Не(Г%16));
|
|||
10
mmg
18.05.25
✎
13:51
|
(9) До "Г" сокращать нечестно. Я же "год" использую. Но все же
Не(Год%4)И(Год%25 Или Не(Год%16)) 33 символа, бинго! У меня 34 символа. Но, допустим, я тоже решил схитрить и называю входной параметр не "год", а например, "вхгод". Тогда вы проигрываете, потому что в моем решении входной параметр используется два раза, а в вашем три. Можете найти такое решение, где входной параметр упоминается два раза? |
|||
11
mmg
18.05.25
✎
14:01
|
(9) Вы тут меня на одну мысль натолкнули. И теперь мое решение 32 символа. Так что, нет, я погорячился. Не бинго.
Ваше лучшее решение 33 символа, а мое 32 |
|||
12
vis
18.05.25
✎
15:14
|
А зачем всё это???
|
|||
13
PR
18.05.25
✎
16:14
|
(12) Так все автоматизировали, теперь вот страдают хуйней
|
|||
14
b_ru
18.05.25
✎
17:03
|
Вместо ИЛИ можно OR написать. Минус символ.
|
|||
15
mmg
18.05.25
✎
18:22
|
(14) Не, ну тогда уж надо НЕ на NOT менять. Попробуйте вообще отказаться от деления по модулю %
|
|||
16
mmg
18.05.25
✎
18:23
|
(12) Для расширения кругозора
|
|||
17
Jackman
18.05.25
✎
18:54
|
//Написал, понял, что ошибся и удалил...
|
|||
18
b_ru
18.05.25
✎
18:58
|
(15) Зачем? 1Ска вполне себе позволяет ключевые слова на двух языках писать в одном модуле
|
|||
19
Garykom
гуру
18.05.25
✎
19:05
|
Зачем добавлять день по сложной формуле когда можно убирать один день раз в 128 лет?
|
|||
20
mmg
18.05.25
✎
19:31
|
(19) Так сложилось. Сначала формула была простая и, кстати, более точная с точки зрения оборота Земли вокруг Солнца. Добавляем день раз в четыре года. Но так как раньше людям нужны были не обороты Земли вокруг Солнца, а периоды между равноденствиями (в основном для целей сельского хозяйства), пришлось лепить костыли к простой формуле
|
|||
21
mmg
18.05.25
✎
19:36
|
(18) Хорошо. Будем считать, что у вас 32 символа и у меня 32 символа. Теперь найдите наименьшую строку для имени входного параметра "ГодРасчета"
|
|||
22
mmg
18.05.25
✎
19:44
|
(12) В принципе, можно найти смысл, если поискать. Деление по модулю затратная операция. Если вам когда-нибудь придется искать способы оптимизации расчетов, то знание, чем можно заменить деление по модулю может вам пригодиться
|
|||
23
b_ru
18.05.25
✎
20:13
|
(22) Боюсь тебя огорчить, но внутри твоих ДатаВремя сидят те же самые деления по модулю, и не только они. И, конечно же, они в 100500 раз более затратные чем явный алгоритм
|
|||
24
Fynjy
18.05.25
✎
20:30
|
А чем это не работает?
Возврат Год%4=0 |
|||
25
vis
18.05.25
✎
20:48
|
(24)Это не полное условие.
|
|||
26
Злопчинский
18.05.25
✎
20:54
|
деньгода(дата(год,12,31))=366
29! и околоптиц! |
|||
27
Волшебник
18.05.25
✎
22:56
|
Проверка високосности года в трёх командах CPU
https://habr.com/ru/articles/910188/ |
|||
28
Garykom
гуру
18.05.25
✎
23:50
|
Вся проблема в том что день (сутки = суточное вращение Земли) не сходится с периодом обращения Земли вокруг Солнца (год)
И попытки состыковать - синхронизировать их через добавление/удаление дней исторически считали самыми логичными Но оказалось что это не самое простое - все равно погрешности набегают и приходится через лишние секунды корректировать |
|||
29
Злопчинский
19.05.25
✎
02:14
|
(27) интересно
|
|||
30
mmg
19.05.25
✎
07:13
|
(28) Проблема глубже. Период обращения Земли вокруг Солнца не сходится с периодом между двумя весенними равноденствиями. Тем, кому надо за звездами наблюдать, нужен один календарь. А тем, кому картошку сажать, другой
|
|||
31
Ненавижу 1С
гуру
19.05.25
✎
08:26
|
Возврат День(Дата(Год,3,1)-1)=29
|
|||
32
Волшебник
19.05.25
✎
09:27
|
(31) Високосность года определяется платформой. 1С-ники — читеры
|
|||
33
СвинТуз
19.05.25
✎
09:29
|
Функция ЭтоНеВисокосныйГод(год)
возврат деньгода(дата(год,12,31))%2 КонецФункции |
|||
34
СвинТуз
19.05.25
✎
09:32
|
День(Дата(Год,3,1)-1)%2
|
|||
35
СвинТуз
19.05.25
✎
09:39
|
деньгода(дата(год,2,1))%2
|
|||
36
СвинТуз
19.05.25
✎
09:41
|
так точнее
деньгода(дата(год,2,2))%2 |
|||
37
Волшебник
19.05.25
✎
09:55
|
(31) Возврат Day(Дата(Год,3,1)-1)=29
|
|||
38
Ненавижу 1С
гуру
19.05.25
✎
10:04
|
(37) Return еще чуть короче
|
|||
39
Волшебник
19.05.25
✎
10:12
|
(38) итак:
Function LeapYear(Y) Return Day(Date(Y,3,1)-1)=29 EndFunction вычислительная часть - 21 символ |
|||
40
Волшебник
19.05.25
✎
10:17
|
Ещё короткий вариант:
Возврат ДеньГода(Дата(Год+1,1,1)-1)=366 |
|||
41
olegves
19.05.25
✎
12:27
|
ДеньГода(Дата(Год,3,1)=61
|
|||
42
olegves
19.05.25
✎
12:28
|
(41) но это все дурость сокращать знаки.
Код должен быть читаемым и понимаемым для дальнейшего сопровождения |
|||
43
Ненавижу 1С
гуру
19.05.25
✎
13:25
|
типовая ЗУП:
// Определяет, является ли год високосным (или дата относится к високосному году) // // Параметры: // Год - Число - год, високосность которого определяется; // - Дата - любая дата года, високосность которого нужно проверить // // Возвращаемое значение: // Булево - Истина, если год является високосным. // Функция ЭтоВисокосныйГод(Знач Год) Экспорт Если ТипЗнч(Год) = Тип("Дата") Тогда Год = Год(Год); КонецЕсли; Возврат День(КонецМесяца(Дата(Год, 2, 1))) = 29; КонецФункции |
|||
44
Garykom
гуру
19.05.25
✎
14:54
|
(30) Так и я о чем
Тропический год не сходится со звездным И они оба не сходятся с суточным вращением Самое смешное что это не постоянные величины, очень медленно меняются А могут измениться и быстро, например астероид бах и привет Или нечто тяжелое "рядом" пролетит (черную дыру нереально заметить например) и хана всем календарям |
|||
45
uno-group
19.05.25
✎
15:11
|
(44) Да даже пролетать не нужно. За последние 1.5 года 2 землетрясения заметно замедлили вращение + Китай платину построил которая тоже замедлила вращение. А там Маск на Марс таки соберется массово лететь куча космических стартов с экватора которым вращение земли помогает набрать нужную скорость на землю оказывают противоположное действие.
Просто пока этих стартов десяток по 100 тн это не особо заметно а если будет больше то уже начнет сказываться. Поэтому делением нельзя считать. через 100 лет поменяют правила високосного годи и ищи где ты там, что делил. А через системные функции этот баг сама 1с пофиксит и код будет работать без правок. |
|||
46
Garykom
гуру
19.05.25
✎
15:22
|
(45) Космически запуски влияют совсем незначительно
Там надо значимые доли процента от массы Земли умудриться запустить в космос |
|||
47
vladoe69
19.05.25
✎
20:45
|
(Год%4=0 И Год%100<>0) Или Год%400=0 |
|||
48
mmg
19.05.25
✎
20:46
|
(47) Год%4=0 — это для астрономов. А для тех, кто картошку сажает еще надо проверять на 100 и 400
|
|||
49
mmg
19.05.25
✎
18:10
|
Мой вариант
ПобитовоеИ(год,?(год%25,3,15))=0 Если бы 1С использовали классический & для побитового И, тогда это был бы самый короткий вариант. Также он примечателен тем, как можно использовать побитовое И для деления по модулю |
|||
50
Garykom
гуру
19.05.25
✎
18:09
|
(48) для тех кто картошку сажает надо не високосность года вычислять а температуру мерять и длительность светового дня
|
|||
51
Гость из Мариуполя
гуру
19.05.25
✎
18:15
|
(45) Китай платину построил
платина - это благородный металл, тяжелее золота. Китай просто физически не может "построить плАтину". |
|||
52
mmg
19.05.25
✎
18:16
|
(44) Тут примечательно то, что расхождение суточного вращения и годового большинству людей очевидно. Тут работает простая интуиция. Типа, а с чего бы им вдруг сходиться. Пока тело не вошло в приливный захват, конечно они будут расходиться. А вот с расхождением тропического и звездного года обратная ситуация. Обычная интуиция тут говорит: а с чего бы им расходиться
|
|||
53
mmg
19.05.25
✎
18:22
|
(50) Для того календари и придумали, чтобы эту самую продолжительность не измерять. Не так-то это и просто на самом деле
|
|||
54
Garykom
гуру
19.05.25
✎
18:35
|
(53) чего сложного?
простейшие водяные часы и засечь восход (рассвет) и заход (закат) Солнца |
|||
55
mmg
19.05.25
✎
18:41
|
(54) А тут, бац! облака
|
|||
56
mmg
19.05.25
✎
18:46
|
(47) Тоже самое только еще короче
Не(Год%4)И(Год%25 Или Не(Год%16)) |
|||
57
mmg
19.05.25
✎
18:47
|
(56) А
ПобитовоеИ(год,?(год%25,3,15))=0 еще на символ короче |
|||
58
Garykom
гуру
19.05.25
✎
18:48
|
(55) 1. Даже с облаками изменение видимости (темно и бац светлеет или наоборот темнеет и бац совсем темно) прекрасно наблюдается
2. Поляризационные кристаллы известны с хз когда "Cолнечный камень викингов (исландский шпат)" |
|||
59
mmg
19.05.25
✎
18:55
|
(58) Ну это не точно.
А потом, этим ведь надо заниматься аккуратно. Жрецы нужны. Они это и делали раньше, когда в году было 10 месяцев (название декабрь оттуда). Но это ненадежно. Жрец запил и что? |
|||
60
Garykom
гуру
19.05.25
✎
18:51
|
(59) Для посадки картошки хватит
|
|||
61
Garykom
гуру
19.05.25
✎
18:54
|
Да и длительность суток и длительность тропического года мало того что не совпадают кратно
Так они еще и постоянно потихоньку изменяются обе величины Пройдет несколько тысяч лет - и календарик то придется менять А все старые даты пойдут лесом полем |
|||
62
Умный Слоненок
20.05.25
✎
05:14
|
(49) То есть, я правильно понял суть темы? Речь шла про супер короткую однострочную проверку на високосный год, люди накидали вариантов даже короче ожидаемого, но по итогу изначально ожидаемый автором вариант - совершенно непонятная и нечитаемая нормальными людьми ерунда?
|
|||
63
olegves
20.05.25
✎
08:19
|
(59) в году не было 10 месяцев, просто у древних год начинался весной с марта месяца. У многих год начинался с дня весеннего равноденствия
|
|||
64
Гобсек
20.05.25
✎
08:27
|
(43) Самый читабельный из предложенных вариантов оказался в типовой ЗУП.
|
|||
65
mmg
20.05.25
✎
08:56
|
(63) Начинался в марте, длился ровно 10 лунных месяцев и заканчивался примерно в декабре. Потом наступали каникулы, которых никто не считал. Потом выходили жрецы, определяли момент весеннего равноденствия и объявляли начало нового года. Таким образом можно было не заморачиваться ни с какой високосностью. Начало тропического цикла определяли каждый год заново
|
|||
66
Волшебник
20.05.25
✎
09:01
|
(62) с придуманными методами
|
|||
67
mmg
20.05.25
✎
09:12
|
(62) Побитовые операции полезная для программиста вещь. Почему бы и не вникнуть.
И вариант, кстати, самый короткий, если не мешать кириллицу с латиницей и не пользоваться косвенным образом функцией, зашитой в платформу. |
|||
68
mmg
20.05.25
✎
09:15
|
(66) В смысле?
Глобальный контекст (Global context) ПобитовоеИ (BitwiseAnd) Синтаксис: ПобитовоеИ(<Число1>, <Число2>) Параметры: <Число1> (обязательный) Тип: Число. Первый операнд побитовой операции. Значение должно быть целым числом в диапазоне от 0 до 2^32-1. Если число не целое или не укладывается в данный диапазон - генерируется исключение. <Число2> (обязательный) Тип: Число. Второй операнд побитовой операции. Значение должно быть целым числом в диапазоне от 0 до 2^32-1. Если число не целое или не укладывается в данный диапазон - генерируется исключение. Возвращаемое значение: Тип: Число. Описание: Возвращает результат логической побитовой операции И для заданной пары чисел. Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция. Использование в версии: Доступен, начиная с версии 8.3.11. |
|||
69
Fish
гуру
20.05.25
✎
09:17
|
(67) А в чём смысл поиска самого короткого кода? На буквах сэкономить?
|
|||
70
mmg
20.05.25
✎
09:23
|
(69) Расширение кругозора. Вы узнаете, что деление по модулю можно заменить побитовой операцией. Попутно узнаете, что в 1С есть побитовые операции
|
|||
71
Timon1405
20.05.25
✎
09:24
|
(69) смысл как минимум размять свои мозги, сформировать нейронные связи на поиск новых оригинальных решений. особенно ценно в век ИИ и готовых решений
|
|||
72
Fish
гуру
20.05.25
✎
09:27
|
(70) (71) Для этого вовсе необязательно искать самый короткий код - это просто разные методы. Вопрос был, в чем смысл поиска именно самого КОРОТКОГО кода, а не про различные методы.
|
|||
73
mmg
20.05.25
✎
09:29
|
(72) А в чем смысл пробежать 100 метров как можно быстрее?
|
|||
74
Fish
гуру
20.05.25
✎
09:36
|
(73) Тут как раз всё просто и понятно: кто быстрее, тот лучший. А вот чем лучше короткий код от длинного - непонятно. Вот я и спросил. Но, похоже, ты сам не знаешь ответа.
|
|||
75
Умный Слоненок
20.05.25
✎
09:36
|
(67) Если мне нужно будет как можно быстрее что-то починить, от чего встал завод, а я в чужом коде увижу вот такую вот чушь, где в одну строчку вникать надо будет определенное значимое количество времени - я обязательно узнаю номер того спеца и объясню ему, что в 1С умом лучше не блистать.
Нет, серьезно, давайте вообще всё в 1С делать через побитовые операции? Это ж так полезно и обязательно нужно вникнуть всем. |
|||
76
mmg
20.05.25
✎
09:51
|
(75) Уметь лучше, чем не уметь. Вот возникнет перед вами задача впихнуть шесть галочек в одно числовое поле. Да, да, ее надо решить быстро и базу править не разрешают, говорят пользуйтесь тем полем, что уже есть. Что вы будете делать? "Не блеща умом" писать 64 если? Как думаете, тот, кто ваш код прочтет, захочет узнать ваш номер?
|
|||
77
Волшебник
20.05.25
✎
09:54
|
(76) Вы бы просто задали задачку ИИ, а он бы всё решил. Зачем ветку на форуме создавали?
|
|||
78
mmg
20.05.25
✎
09:58
|
(77) Не нравится, удалите. В чем проблема?
|
|||
79
Волшебник
20.05.25
✎
10:03
|
(78) Я спросил у ИИ, он не рекомендует.
|
|||
80
Волшебник
20.05.25
✎
10:47
|
Функция ЭтоВисокосныйГод(Год) Попытка Февраль29 = Дата(Формат(Год,"ЧГ="),2,29); Если ТипЗнч(Февраль29)=Тип("Дата") Тогда Возврат Истина; КонецЕсли; Исключение Возврат Ложь; КонецПопытки; Возврат Ложь; КонецФункции Книга знаний: Метод Рупора |
|||
81
Умный Слоненок
20.05.25
✎
11:26
|
(76) так вот вы бы сразу задачу поставили по существу "впихнуть шесть галочек в одно числовое поле". А вы же предложили совсем не подходящее решение для базовой задачи. Причем нет ни одного разумного сценария, когда такое решение для неё было бы необходимо в контексте 1С. А как часто с такими выдумщиками-изобретателями бывает - они очень горды своими неочевидными решениями и либо используют их в продакшене, чтобы все увидели насколько уникальный у них склад ума, либо намеренно или случайно провоцируют на это неокрепшие умы.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |