Вход | Регистрация
    1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

Упростить выражение для оценки показателя

Упростить выражение для оценки показателя
Я
   pavelprk
 
26.04.19 - 08:14
Небольшой брейнтренинг!
Дано: есть какой-то показатель, назовем его К
Необходимо рассчитать другой показатель, назовем его П, по правилам:
1) если К >= 1, то П = 1
2) если К >= 0.5 И К < 1, то П = К
3) если К < 0.5, то П = 0
Задача: написать выражение вычисления показателя П на языке 1С
Одно условие! Показатель К в выражении должен встречаться ТОЛЬКО ОДИН РАЗ
 
 
   Кирпич
 
1 - 26.04.19 - 08:34
Не понятно в чем подвох. Только К и П можно использовать что ли?
   dmt
 
2 - 26.04.19 - 08:37
п = макс(?(к>=0.5, п, 0), 1)
   pavelprk
 
3 - 26.04.19 - 08:47
(2) П через П?
   dmt
 
4 - 26.04.19 - 08:47
чето я херню сморозил
(0), выражение одно?
   pavelprk
 
5 - 26.04.19 - 08:48
(1) Подвоха нет
Выражение должно быть вида:
П = f(К)
где в выражении f(К), можно использовать любые функции и операции, но К встречаться только один раз
   pavelprk
 
6 - 26.04.19 - 08:49
(4) Да, конечно одно
   pavelprk
 
7 - 26.04.19 - 08:52
(5) Ошибся, не любые функции, а только встроенные платформы, иначе смысл теряется
   quest
 
8 - 26.04.19 - 08:58
(0) какой в этом смысл?
   pavelprk
 
9 - 26.04.19 - 09:00
(8) Речь не о смысле, а о решении конкретно данной задачи, на практике такое иногда необходимо
   НЕА123
 
10 - 26.04.19 - 09:05
п=Макс( Мин(Цел(к/2),1)*к, 1)
 
 Рекламное место пустует
   Asmody
 
11 - 26.04.19 - 09:08
(0) Точно разрыв должен быть?
   pavelprk
 
12 - 26.04.19 - 09:08
(10) К - два раза встречается
   pavelprk
 
13 - 26.04.19 - 09:09
(11) Не понял какой разрыв, результат вычисления должен быть по правилам
   Asmody
 
14 - 26.04.19 - 09:10
(13) Нужно объяснять что такое разрыв функции?
   pavelprk
 
15 - 26.04.19 - 09:11
(14) А, если речь про это, то да
   Кирпич
 
16 - 26.04.19 - 09:13
(9) про практику не гони. использовать переменную один раз в одном выражении на практике никто не запретит :)
   Asmody
 
17 - 26.04.19 - 09:18
(16) Может у него там вычисляемое поле в СКД, а k - это вызов какой-нибудь функции ОМ?
   pavelprk
 
18 - 26.04.19 - 09:19
(16) Я бы не стал создавать тему, если такое действительно не нужно. Речь не идет о достижении результата П, речь идет об упрощении выражения. Например К, в свою очередь, это другое выражение, при чем очень громоздкое, и не хотелось бы в формуле одно и тоже повторять.
   pavelprk
 
19 - 26.04.19 - 09:20
(17) Это не СКД, хотя и в СКД может пригодиться
   Кирпич
 
20 - 26.04.19 - 09:26
(18) я думал это типа головоломка и у тебя есть готовый ответ :))
   pavelprk
 
21 - 26.04.19 - 09:30
(20) Мне интересны варианты решения
   Кирпич
 
22 - 26.04.19 - 09:31
А Вычислить() туда нельзя пристроить никак?
   trad
 
23 - 26.04.19 - 09:32
(21) у тебя есть хотя бы один вариант решения (0) ?
   pavelprk
 
24 - 26.04.19 - 09:32
(22) Если есть такое решение, то почему нет
   pavelprk
 
25 - 26.04.19 - 09:32
(23) Пока нет
   pavelprk
 
26 - 26.04.19 - 09:39
В выражении точно нельзя использовать конструкцию ?(,,), т.к. в этом случает К встретиться минимум 2 раза
   SSSSS_AAAAA
 
27 - 26.04.19 - 09:40
(5) П = Справочники.Показатели.НайтиПоРеквизиту("К", К).П
   pavelprk
 
28 - 26.04.19 - 09:42
(27) Оригинально, но не подойдет, т.к. К - вещественное число
   seevkik
 
29 - 26.04.19 - 09:42
n = К
Если n >= 1 тогда
 П = 1 
ИначеЕсли n >= 0.5 И n < 1 тогда
 П = К 
ИначеЕсли n < 0.5 тогда
 П = 0 
КонецЕсли
   catena
 
30 - 26.04.19 - 09:42
(27)А если К рациональное?
   catena
 
31 - 26.04.19 - 09:43
+(28)В смысле да, вещественное)))
   seevkik
 
32 - 26.04.19 - 09:43
(29) ну, второе условие недописал)
   pavelprk
 
33 - 26.04.19 - 09:43
(29) читаем условие задачи (0)
 
 
   pavelprk
 
34 - 26.04.19 - 09:45
(29) - (5)
   seevkik
 
35 - 26.04.19 - 09:46
(33) Прочитал, переделал
n = К
Если n >= 1 тогда
 П = 1 
ИначеЕсли n >= 0.5 И n < 1 тогда
 П = n 
ИначеЕсли n < 0.5 тогда
 П = 0 
КонецЕсли
   pavelprk
 
36 - 26.04.19 - 09:47
(35) Нет, где здесь f() ?
   seevkik
 
37 - 26.04.19 - 09:48
(36) окок, я (5) не видел
   SSSSS_AAAAA
 
38 - 26.04.19 - 09:48
(28) И что мешает его округлить до некоторого значения?
Кстати, какие еще условия задачи не оглашены?
   trad
 
39 - 26.04.19 - 09:49
вся проблема в разрыве. я думаю решения (0) - нет
   trad
 
40 - 26.04.19 - 09:51
(38) задача описана достаточно пОлно и понятно
(37) в (0) сказано "написать выражение", (35) - не выражение
   pavelprk
 
41 - 26.04.19 - 09:51
(39) Возможно, нужно найти решение, или показать, что решения нет
   SSSSS_AAAAA
 
42 - 26.04.19 - 09:52
(18) И что мешает таки результат этого громоздкого выражения присвоить переменной и не трахать мозги себе и другим идиотскими требованиями по количеству использования этого выражения?
   pavelprk
 
43 - 26.04.19 - 09:55
(42) Например такое дополнительное условие: П = Вычислить("f(К)")
никаких дополнительных переменных
   catena
 
44 - 26.04.19 - 09:57
формула показателя в ЗУП?
   pavelprk
 
45 - 26.04.19 - 10:00
(44) Ну если сравнить, то типа того
   dmt
 
46 - 26.04.19 - 10:04
(41) Какие у тебя есть мысли по этому поводу?
   pavelprk
 
47 - 26.04.19 - 10:06
(46) Думаю все таки решение есть, я копаю в сторону замены К на другое выражение вида Х(К), и преобразовать к условиям задачи
   pavelprk
 
48 - 26.04.19 - 10:07
На бумаге начертите график функции, станет понятно
   Garykom
 
49 - 26.04.19 - 10:10
 
 Рекламное место пустует
   Garykom
 
50 - 26.04.19 - 10:10
(49) Специально для любителей все делать через ж...запросы
   Lama12
 
51 - 26.04.19 - 10:11
Что-то мне подсказывает, что меньше чем 2 раза использовать "К" в выражении, не получится.
   pavelprk
 
52 - 26.04.19 - 10:11
(49) По условию задачи - это не запрос, а выражение на языке 1с
   Garykom
 
53 - 26.04.19 - 10:12
(52) Ты выражением не можешь Новый Запрос("ТекстЗапроса").Выполинть() ?
   pavelprk
 
54 - 26.04.19 - 10:16
(53) Повторюсь, ответ не соответствует условию задачи
   hhhh
 
55 - 26.04.19 - 10:19
(54) П = Макс(0, Мин(0.5, К - 0.5) + 0.5);

не благодари.
   pavelprk
 
56 - 26.04.19 - 10:21
(55) К = 0.25, ответ неверный
   dmt
 
57 - 26.04.19 - 10:21
(55) она непрерывна
   pavelprk
 
58 - 26.04.19 - 10:22
Если бы все так просто было...
   dmt
 
59 - 26.04.19 - 10:22
(47) Как ты думаешь, какие вообще есть способы сделать "разорванную" функцию из двух кусков? Не считая ?(,,)
   pavelprk
 
60 - 26.04.19 - 10:24
(59) Вот я об этом и думаю, хотя пока на данном этапе, соглашусь с тобой об отсутствии решения
   Garykom
 
61 - 26.04.19 - 10:27
(56) Оберни в условие  <0.25 = 0 и все
   pavelprk
 
62 - 26.04.19 - 10:27
Хотя, с другой стороны, не каждую непрерывную функцию тоже можно описать выражением с одним аргументом
   Garykom
 
63 - 26.04.19 - 10:28
П = ?((Макс(0, Мин(0.5, К - 0.5) + 0.5))<0.5;0;Макс(0, Мин(0.5, К - 0.5) + 0.5))
   Garykom
 
64 - 26.04.19 - 10:29
(63) Блин тогда К два раза
   pavelprk
 
65 - 26.04.19 - 10:30
(64) да я уже упоминал об этом (26)
   Garykom
 
66 - 26.04.19 - 10:33
Внутри Вычислить можно использовать второе Вычислить ?
   Asmody
 
67 - 26.04.19 - 10:34
Разрыв первого рода линейными преобразованиями сделать не получится
   НЕА123
 
68 - 26.04.19 - 10:34
ISменьшеНольПять() какой-то нужен.
   pavelprk
 
69 - 26.04.19 - 10:35
(66) да
   pavelprk
 
70 - 26.04.19 - 10:35
(67) Получается решения нет?
   pavelprk
 
71 - 26.04.19 - 10:37
(68) надо будет написать разработчикам )
   pavelprk
 
72 - 26.04.19 - 10:38
(67) возможно ли свести к нелинейному преобразованию?
   catena
 
73 - 26.04.19 - 10:40
(68) или соответствия по диапазонам
   SSSSS_AAAAA
 
74 - 26.04.19 - 10:46
(73) Собственно в своих ответах я на это и намекал. Но товарисч никак не хочет думать дальше...
   pavelprk
 
75 - 26.04.19 - 10:51
(27) (38) используя округление, думаю это пока единственное решение, хотя и оригинальное
   seevkik
 
76 - 26.04.19 - 10:52
а обрезать до десятых и уже с ним работать не вариант?
   pavelprk
 
77 - 26.04.19 - 10:53
Спасибо SSSSS_AAAAA, пока других решений не вижу
   pavelprk
 
78 - 26.04.19 - 10:56
Но результат между 0.5 и 1 будет не точен, округлен
   pavelprk
 
79 - 26.04.19 - 10:57
Получается это не совсем точное решение задачи
   bolobol
 
80 - 26.04.19 - 11:54
(79) Дискретное решение, цифровое)
   bolobol
 
81 - 26.04.19 - 11:54
модное-молодёжное!
   pavelprk
 
82 - 26.04.19 - 12:24
Но хотелось бы найти решение, используя только примитивные операции, типа Мин, Макс и других, а не привязываться к объектным данным
   pavelprk
 
83 - 26.04.19 - 12:24
Например, требуется вычисление f(К) в цикле, где не одна тысяча записей
   bolobol
 
84 - 26.04.19 - 12:28
(83) Ну и запросы у вас: "в цикле"!
   Михаил Козлов
 
85 - 26.04.19 - 12:39
1/2*(ТетаФункцияХевисайда(К)+1).
   Garykom
 
86 - 26.04.19 - 12:53
Функция Ф(К)
  Возврат ?((Макс(0, Мин(0.5, К - 0.5) + 0.5))<0.5;0;Макс(0, Мин(0.5, К - 0.5) + 0.5));
КонецФункции;

К = 0.5;
П = Вычислить("Ф(К)");

так пойдет?
   pavelprk
 
87 - 26.04.19 - 13:15
(86) Нет, уточню еще условия: расчет производится в контексте П = Вычислить(Строка), при чем Строка - это выражение, задаваемое в пользовательском режиме, т.е. у нас нет возможности создать функцию, у нас только шанс на одно, законченное выражение. Строка - это и есть f(К)
   pavelprk
 
88 - 26.04.19 - 13:17
Прицип такой же как в формулах видов расчета ЗУП
   pavelprk
 
89 - 26.04.19 - 13:20
Еще раз, можно не замарачиваться, сделать через ?(,,), используя хоть сколько раз К, но теперь представьте, что К - это результат вложенного выражения, при чем это выражение в несколько десятков строк кода, вот тогда и неудобства возникают
   pavelprk
 
90 - 26.04.19 - 13:21
(89) Поправлю себя, К - это не результат выражения, а само выражение
   pavelprk
 
91 - 26.04.19 - 13:32
В конфигураторе, в модуле:
Для Каждого Строка Из ОченьМногоСтрок Цикл
    // код до ...

    П = Вычислить(Выражение);
    // код после ...

КонецЦикла;

Выражение - задается в пользовательском режиме, например вида:

"?(_ГромоздкоеВыражениеПоВычислению_К_ < 0.5, 0, Мин(_ГромоздкоеВыражениеПоВычислению_К_, 1))"
   pavelprk
 
92 - 26.04.19 - 13:33
Как избавиться от повторения _ГромоздкоеВыражениеПоВычислению_К_ ?
   НЕА123
 
93 - 26.04.19 - 13:41
Попытка
П=мин(sin(asin(мин(К,1)-1.5))+1.5;
Исключение
П=0;
КонецПопытки
   НЕА123
 
94 - 26.04.19 - 13:42
*
П=sin(asin(мин(К,1)-1.5)+1.5;
первый мин() лишнее.
   pavelprk
 
95 - 26.04.19 - 13:42
(93) Супер, но это нельзя запихать в Вычислить()
   ptiz
 
96 - 26.04.19 - 13:44
(95) Запихни в Выполнить()
   pavelprk
 
97 - 26.04.19 - 13:46
(94) Будет исключение при К < 0.5
   Кирпич
 
98 - 26.04.19 - 13:47
(91) Ну добавь там в конфигураторе, что надо и не парься.
вместо Вычислить() Выполнить()

Для Каждого Строка Из ОченьМногоСтрок Цикл
    // код до ...

    П = 0;
    Выполнить(Выражение);
    // код после ...


КонецЦикла;

а в формуле пиши типа "К=ЧоХошь;П=ЧоХошь"
   pavelprk
 
99 - 26.04.19 - 13:48
(94) Думаю уже близко к решению, молодец
   pavelprk
 
100 - 26.04.19 - 13:49
(98) Выполнить() - это дырка, но и вопрос не в этом, Вычислить() - использовать принципиально
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует