Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   ОФФ: v77 Арифметика. Ряды чисел. Написать кратчайшуу ф-цию. (http://forums.kuban.ru/f1040/off_v77_arifmetika_ryady_chisel_napisat-_kratchajshuu_f-ciyu-8325756.html)

Шухер 19.05.2017 19:40

ОФФ: v77 Арифметика. Ряды чисел. Написать кратчайшуу ф-цию.
 
Для тех, кому не лень размяться в арифметике - Задача :
Составить наикратчайшую функцию, вычисляющую У от Х.
Имеем Таблицу значений из двух колонок Х, У .
У= f(x); Написать ф-цию на 1Сv77. А можно и на любом языке, важен алгоритм.
Сравнивать длину кода будем по коду в 77.

Шухер 19.05.2017 19:42

[url=https://cloud.mail.ru/public/41KG/UkKPLUoLn]Таблица[/url]
Параметр (х) - может принимать целые положительные значения от 0 до бесконечности.
Дополнительные условия задачи, вся функция должна уместиться в одну строку, т.е
использовать ";" для разделения операторов в середине строки нельзя
пример:
в=10;а=в+1;у=а*х; // не зачет. Надо так:
у = х*(а+в) ;
У кого код окажется самый короткий, значит у того самый длинный [img]http://pl1c.org/.s/sm/1/smile.gif[/img]

Кто решит, тоже не показывает свое решение до поры до времени, просто сообщает сколько символов вся строка
СтрДлина("у = х*(а+в) ;"); ?

p.s. знакомым с решением этой задачи по публикации на другом форуме просьба не выдавать решение.

Шухер 19.05.2017 19:46

Начнем пожалуй так:
Я угадаю эту формулу со 100 букв :)

USSR 19.05.2017 20:07

Ничего не понял, как можно что-то написать не имея конкретных значений пар {x,y**? Про что ваще речь ? Самое короткое это y = x.

Шухер 19.05.2017 20:10

3-USSR > конкретные значения в [b]Таблица[/b]
Там ссылка спрятана. Плоховасто отображаются ссылки.
[url]https://cloud.mail.ru/public/41KG/UkKPLUoLn[/url]

Шухер 19.05.2017 20:21

Оформление не считаем, типа
Функция
Перем .... // и так далее
[b]у=f(x);[/b]
КонецФункции

считаем длину (кол-во символов без пробел) самой формулы.
[b]у=f(x);[/b]

Блондинка в шок 19.05.2017 20:59

Ты точно уверен в таблице?

У меня вопрос вызывают значения у
при х= 43, 44, 45
а также
при х = 56, 57, 58
так то формула бы получилась несложная, но вот эти две ... "триады".. хм.. выбиваются из ряда...
или это правильно, чтобы не было так уж легко?

Шухер 19.05.2017 21:06

[quote=Блондинка в шок;44237103]выбиваются из ряда...[/quote]
Ты это товой, "выбиваются", сейчас удалят тему за политику :) Все там цифры правильные, утвержденные Верховным советом и одобренные правительством.
Задача имеет вполне себе прикладное применение.
А вот логику ряда многим бы хотелось понять, но не только лишь все это могут.

Блондинка в шок 19.05.2017 21:11

эх.. а жаль..

ладно, завтра подумаем еще.

Шухер 19.05.2017 21:17

Исходники, можно сверить цифры
а то мало ли чего Шух с недоперепития напечатал :)
[url]https://cloud.mail.ru/public/2MB5/xzW7mYrbU[/url]

Гена 19.05.2017 21:22

Я не понял... надо написать функцию именно и только для данной таблички?

Шухер 19.05.2017 21:26

Я несколько упростил задачу, чтобы не париться с округлением. Округлять-то мы умеем. Или нет?
На самом деле параметр х - не из натурального ряда чисел, и может принимать дробные положительные значения с округлением вверх, те есть х = 30.01 должен округлиться до 31.

Шухер 19.05.2017 21:30

10-Гена > да, именно для этой
Для тех, кто не понял, написать ф-цию для этой же таблички с округлением вверх :)
Параметр (х) может принимать положительные значения, но до сотых :) например при х = 45.01, вычислить у.

Гена 19.05.2017 21:55

Я не одноэсник, поэтому в экселе:
=ЕСЛИ(ОКРУГЛВВЕРХ(A1;0)>61;256;ЕСЛИ(ОКРУГЛВВЕРХ(A1;0)>44;ОКРУГЛВНИЗ(3,52*ОКРУГЛВВЕРХ(A1;0)+37,85;0);ЕСЛИ(ОКРУГЛВВЕРХ(A1;0)<29;0;ОКРУГЛВНИЗ(3,5*ОКРУГЛВВЕРХ(A1;0)+38;0))))

Шухер 19.05.2017 22:01

13-Гена >это конечно круто, но даже без "у="
у тебя уже 172 символа получилось :)

[quote=Шухер;44236708]Начнем пожалуй так: Я угадаю эту формулу со 100 букв :) [/quote]

Шухер 19.05.2017 22:04

Гена, ты напиши алгоритм просто. Как физик

Гена 19.05.2017 22:12

14-Шухер > можно сначала определить в ячейке B1
=ОКРУГЛВВЕРХ(A1;0)
тогда в С1:
=ЕСЛИ(B1>61;256;ЕСЛИ(B1>44;ОКРУГЛВНИЗ(3,52*B1+37,85;0);ЕСЛИ(B1<29;0;ОКРУГЛВНИЗ(3,5*B1+38;0))))

Шухер 20.05.2017 07:31

16-Гена >Принимается округление вверх в другой ячейке.
Итак, Гена может угадать формулу с 97 букв :)
97 букв раз, 97 букв ...
Кто меньше 97 предложит ?

Шухер 20.05.2017 09:01

Решение у Гены, переписанное на v77, выглядит покороче, чем в екселе.
При проверке обнаружил, что 1С и Ексель по разному трактует ф-цию округления вниз.
в 1С так посчитает:
окр(3.52*[b]46[/b]+37.85,0,0) = 200
ОКРУГЛВНИЗ(3,52*[b]46[/b]+37,85;0) =199
Зато замена в 1С ф-ции Окр() на Цел(), которая соответствует ексельской ОКРУГЛВНИЗ, позволила укоротить нашу формулу еще на 4 символа.

Шухер 20.05.2017 09:34

Алгоритм Гены, переписанный из Ехеля на 1С, уложился в 66 символов. (Переписав её немного по другому, можно еще выиграть несколько символов, но я его оставляю, как у Гены, естественно - в переводе с иностранного )

Итак, Гена угадает слово с 66 букв.
[b]66 букв раз ...[/b]
Кто меньше?

Шухер 21.05.2017 04:22

[quote=Гена;44237595]тогда в С1: =ЕСЛИ(B1>61;256;ЕСЛИ[/quote]
Задача была написать в 1С, пока программисты вникали в тех задание, непрограммист Гена глянул, и с лёту написал функцию в С1.

p.s. Ирли Бёрд, тимбукту, ну типа уже можно смеяться, каламбурчик :)

Шухер 21.05.2017 04:39

Без использования логических операторов если(), можно описать данный ряд чисел? Так сказать чиста научно, существует математическая модель этого набора цифр? Вот так например,- достали свои логарифмические линейки, поелозили ползунками и высчитали, чему равен У при Х таком-то, без всяких условных переходов.

Ткачик 21.05.2017 11:35

[quote=Шухер;44239788]Без использования логических операторов если(), можно описать данный ряд чисел?[/quote] Может, и можно, но овчинка явно не стоит выделки.

Очевидно можно избавиться лишь от первого "ЕСЛИ", воспользовавшись тем, что значения в таблице не должны превышать 256:

=МИН(256;ЕСЛИ(B1>44;ОКРУГЛВНИЗ(3,52*B1+37,8 5;0);ЕСЛИ(B1<29;0;ОКРУГЛВНИЗ(3,5*B1+38;0))))

Но это так, косметическая правка, основная заслуга все равно принадлежит Гене.

VZ 21.05.2017 11:49

[b]?(f,F1,F2)[/b]

Ткачик 21.05.2017 12:18

Йес, кэп!

Шухер 21.05.2017 15:14

[quote=Ткачик;44240451]=МИН(256;[/quote]
Этот элегантный трюк позволяет выиграть три символа.

qweqwe123123 21.05.2017 16:37

110 + x + <некая подфункция (x-29)/2>

7.7 нет под рукой

как-то так подумалось

qweqwe123123 21.05.2017 16:53

что-то в этом роде, проверить не могу

y=?(X>28,?(x>62,256,Окр(2,5*(x-29))+110+29,0);

qweqwe123123 21.05.2017 16:54

точнее вот

y=?(X>28,?(x>62,256,Окр(2,5*(x-29))+110+X,0);

qweqwe123123 21.05.2017 17:01

а, не. в конце чегой-то заколбасилось не туда.

Шухер 21.05.2017 17:06

[quote=Зелёный тролль;44241707]7.7 нет под рукой[/quote]
Пиши, мы переведем :)
Можешь как Гена в С1 писать :)

qweqwe123123 21.05.2017 17:13

вместо 2.5 подставить 2.5345

Шухер 21.05.2017 17:24

31-Зелёный тролль > вроде правильно считает, щас проверю
кавычку одну пропустил закрывающую

Шухер 21.05.2017 17:38

31-Зелёный тролль > Круто! Работает, молодец
Итак, Зеленый может угадать Слово [b]с 50-ти букв[/b]!
[b]50 букв Раз! ...[/b]

Шухер 21.05.2017 17:44

Небольшой недочет с Окр()
Надо указывать жестко параметры округления - Окр(ч, 0, 1)
а то можно нарваться на ошибку, из за нестандартных настроек пользователя.

Блондинка в шок 21.05.2017 17:51

[quote=Шухер;44239788]Вот так например,- достали свои логарифмические линейки, поелозили ползунками и высчитали, чему равен У при Х таком-то, без всяких условных переходов.[/quote]
ну...
если ты так настаиваешь
елозь.
у=0,0009х^2+3.4519х+38,307

естественно, результат не забыть округлить.
по обычным правилам математики

Блондинка в шок 21.05.2017 17:58

одно ЕСЛИ все равно остается, тут я пас.
ну в общем как-то так:
Y=ОКР(МИН(256,?(X>28,0.0009*X*X+3.4519*X+38.307,0)))

qweqwe123123 21.05.2017 18:06

2.5345 на 2.535
ещё символ сэкономится )))

Шухер 21.05.2017 18:07

36-Блондинка в шок > да, а то у тебя везде >0 результат и растет без ограничений.
Сейчас проверим, что дает квадратное уравнение

qweqwe123123 21.05.2017 18:07

36-Блондинка в шок > ого! :-)


Текущее время: 14:55. Часовой пояс GMT +3.