Имя: Пароль:
1C
 
Очередная задачка на смекалку :)
,
0 mzelensky
 
03.12.14
16:17
Раз уж пошла такая кухня, тоже выложу одну задачку

Имеем офигенно польшую строку (например, миллион символов), которая содержит ТОЛЬКО числа и знак резделителя (пусть это будет пробел).

Нужно максимально оптимально рассчитать сумму всех этих чисел!

Ваши предложения :)
1 Euguln
 
03.12.14
16:19
Дать задачку на собеседовании. От тебя минимум трудозатрат )))
2 Ненавижу 1С
 
гуру
03.12.14
16:20
в 1С?
3 ДенисЧ
 
03.12.14
16:21
Сколько денег?
4 mzelensky
 
03.12.14
16:21
(2) ну разумеется. Мы же все еще на "желтом" форуме
5 mzelensky
 
03.12.14
16:22
(3) денег не сколько. Самоудовлетворения кучка.
6 spero
 
03.12.14
16:22
(0) Идешь по строке, суммируешь. Какие варианты?
7 Euguln
 
03.12.14
16:23
Сохраняешь в файл с разделителями, открываешь в Excel, ставишь автосумму.
8 Ненавижу 1С
 
гуру
03.12.14
16:23
между числами только по одному пробелу?
9 Азазель
 
03.12.14
16:23
(0) Условие изложено с недостатками.

Не раскрыт критерий оптимальности: число строк кода (число операторов), время выполнения задачи, быстрота создания кода или что-то иное.
10 pessok
 
03.12.14
16:23
разобрать в масси
массив в колонку тз
итог по колонке

это самое очевидное, но не факт что самое медленное
11 PLUT
 
03.12.14
16:24
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт


функция в общем модуле

а если будет жутко тормозить - значит "г .вно эта ваша 1С!"
12 busy1
 
03.12.14
16:24
(10) +1
13 mzelensky
 
03.12.14
16:24
(8) ДА. Формат:

"123 2 567898 324 43434 2 0 43 323"

И так далее. Только много-много-много больше
14 Euguln
 
03.12.14
16:24
(10) Пока разбираешь в массив, можно уже посчитать.
15 Rebelx
 
03.12.14
16:25
Сумма = Вычислить(СтрЗаменить(Источник, Разделитель, " + "))
16 Ник второй
 
03.12.14
16:26
(15) + зачет
17 mzelensky
 
03.12.14
16:26
(9) оптимальность не измеряется в количестве строк кода. Тк любой код можно записать в одну строку.

Оптимальность - максимальное быстродействие с минимальными награзками на сервер.
18 Smallrat
 
03.12.14
16:26
(15) прикольно)) если только ++ не получить
19 Ненавижу 1С
 
гуру
03.12.14
16:26
(15) красавчег!
20 oslokot
 
03.12.14
16:27
(15) 1 место
21 pessok
 
03.12.14
16:27
(15) а ведь взлетит
22 mzelensky
 
03.12.14
16:27
(11) Слабак. Запусти на строке с 10 миллионами символов.

Задаче не сводится к тому, как это сделать в принципе. Нужно сделать максимально быстро.
23 zulu_mix
 
03.12.14
16:28
(17) минимальная нагрузка на сервер = максимальная нагрузка на клиента.
(15) не уверен что взлетит на строке в миллион символов
24 Бледно Золотистый
 
03.12.14
16:28
(23) Коме не лень сгенерить и потестить?
25 mzelensky
 
03.12.14
16:30
В общем нужно собрать варианты, потом реально собрать и потестить.
26 Локи-13
 
03.12.14
16:30
(15) тоже хотел написать!)) первое что в голову пришло, пробел на плюс и вычислить)
27 18_plus
 
03.12.14
16:31
28 pessok
 
03.12.14
16:32
(24) щас сделаем
29 mzelensky
 
03.12.14
16:35
Расскажу как я предлагал:

1) Делим строку на несколько равных частей (последний разумеется будет меньше), допустим на 10.

2) Запускаем 10 фоновых заданий и передаем в каждый свой кусок строки

3) В процедуре фонового задания отщепляем первое число в строке, преобразуем в число и суммируем с общим счетчиком суммы текущего фонового задания. Затем отрезаем от строки это первое числои повторяем процедуру, пока не опустошим всю строку.

4) Получаем общие счетчики сумм из фоновых заданий и складываем в общий счетчик.
30 HEKPOH
 
03.12.14
16:35
(15) респект и уважуха!!!
31 Ник второй
 
03.12.14
16:36
(29) лошара учись у (15)
32 Rebelx
 
03.12.14
16:38
+(15) на строке 3 808 281 символов - менее 1сек
33 mzelensky
 
03.12.14
16:38
(32) Круто
34 Rebelx
 
03.12.14
16:40
+(32) 39 598 341 символов - 12сек
35 mzelensky
 
03.12.14
16:41
(34) А сравни с (11)
36 Rebelx
 
03.12.14
16:41
37 pessok
 
03.12.14
16:42
хм, а у меня вылетел с нехваткой памяти. правда я в одной обработке и генерировал и считал
38 iamnub
 
03.12.14
16:43
Ага. А как вот что-то другое, а не сумма - приплыли.
39 Ник второй
 
03.12.14
16:44
(38) перемножить?
40 pessok
 
03.12.14
16:44
(38) почему? кто мешает "*" или "/"
41 pessok
 
03.12.14
16:45
(37) у меня генератор больше отжирает, чем сам вычислить()
42 iamnub
 
03.12.14
16:45
Ахахах.

Ну конечно. В других языках программист даже не задумается, пробежит код - и всё.

А в 1С это - задача на СМЕКАЛКУ! O_O
43 mdocs
 
03.12.14
16:45
Учитывая как 1С форматирует числа по-дефолту - ТвоеЧисло=число(стрЗаменить(ИсходнаяСтрока, " ",""));
44 mzelensky
 
03.12.14
16:46
(38) кстати ДА!

Если изменить условие задачи на, например, найти МАКСИМАЛЬНОЕ число в строке, то уже простым "Выполнить" не отделаетесь.
45 mzelensky
 
03.12.14
16:46
(42) И как же он пробежит код?
46 iamnub
 
03.12.14
16:47
СуперСтрока.Split(" ").Sum()
47 Rebelx
 
03.12.14
16:48
48 Rebelx
 
03.12.14
16:48
(44) но это будет уже другая задача
49 pessok
 
03.12.14
16:49
ДлинаСтроки = 0;
    СтрокаРезультат = "";
    Пока ДлинаСтроки < 1000000 Цикл
        ГСЧ = Новый ГенераторСлучайныхЧисел;
        ЧислоГСЧ = Формат(ГСЧ.СлучайноеЧисло(1, 500000), "ЧГ=0");
        ДлинаСтроки = ДлинаСтроки + СтрДлина(ЧислоГСЧ);
        СтрокаРезультат = СтрокаРезультат + ЧислоГСЧ+" ";
    КонецЦикла;
    
    СтрокаРезультат = Лев(СтрокаРезультат, СтрДлина(СтрокаРезультат)-1);
    
    Сообщить(Вычислить(СтрЗаменить(СтрокаРезультат, " ", "+")));
50 pessok
 
03.12.14
16:49
нормально работает
51 mzelensky
 
03.12.14
16:49
(46) И что? это тоже самое, что в (11) Или ты думаешь там какие-то нано технологии применяются.
52 Smallrat
 
03.12.14
16:51
(44) Ну типа там тоже можно вычислить применить для функции Макс(), но я думаю она подавится миллионом параметров)))
53 pessok
 
03.12.14
16:51
(46) отработает медленнее чем (15), потому что split() таки генерирует массив, лишняя сущность
54 Ненавижу 1С
 
гуру
03.12.14
16:52
(44) почему?

"Макс("+СтрЗаменить(Стр," ",",")+")"
55 iamnub
 
03.12.14
16:52
Дремучий лес...
56 mzelensky
 
03.12.14
16:53
(54) Я уже думал об этом...попробуй получится?!
57 Rebelx
 
03.12.14
16:53
(52) не подавилась :)
58 pessok
 
03.12.14
16:53
(55) ну ты попробуй и дай нам результаты замера производительности. из 1С результат дали
59 mzelensky
 
03.12.14
16:56
(57) Прикольно.

Интересно, как платформа реализовывает "Выполнить"
60 Rebelx
 
03.12.14
16:56
+(57) и 10млн параметров не подавилась
61 Smallrat
 
03.12.14
16:58
(57) ого!
62 Бледно Золотистый
 
03.12.14
17:02
(60) 0_О. Круто!
63 iamnub
 
03.12.14
17:06
Ну давайте так, из этой же строки - сумма чисел из каждого второго десятка.

На СМИКАЛКУ!
64 SUA
 
03.12.14
17:14
(29)
криво
просуммируем 123456 7
1) делим
1234
56 7
2) суммируем
1234
56+7=63
итого ошибка 1297 вместо 123463
65 pessok
 
03.12.14
17:19
(63) как-то так

Индекс = 1;
    ДлинаСтроки = СтрДлина(СтрокаРезультат);
    Сумма = 0;
    Пока ДлинаСтроки > 0 Цикл
        
        Разделитель = Найти(СтрокаРезультат, " ");
        
        ЗначениеРасчет = Лев(СтрокаРезультат, Разделитель);
        
        СтрокаРезультат = Прав(СтрокаРезультат, ДлинаСтроки - Разделитель);
        
        Если Индекс <= 10 Тогда
            Сумма = Сумма + Число(СтрокаРезультат);
        ИначеЕсли Индекс > 20 Тогда
            Индекс = 1;
        КонецЕсли;
        
        ДлинаСтроки = СтрДлина(СтрокаРезультат);
        
    КонецЦикла;
66 pessok
 
03.12.14
17:20
+(65) оу.

Сумма = Сумма + Число(ЗначениеРасчет );
67 pessok
 
03.12.14
17:26
(63) вот так проверим, работает


Индекс = 1;
    ДлинаСтроки = СтрДлина(СтрокаРезультат);
    Сумма = 0;
    Пока ДлинаСтроки > 0 Цикл
        
        Разделитель = Найти(СтрокаРезультат, " ");
        
        ЗначениеРасчет = Лев(СтрокаРезультат, Разделитель);
        
        СтрокаРезультат = Прав(СтрокаРезультат, ДлинаСтроки - Разделитель);
        
        Если Индекс <= 10 Тогда
            Сумма = Сумма + Число(ЗначениеРасчет);
            Индекс = Индекс + 1;
        ИначеЕсли Индекс > 10 И Индекс <= 20 Тогда
            Индекс = Индекс + 1;
        ИначеЕсли Индекс > 20 Тогда
            Индекс = 1;
        КонецЕсли;
        
        ДлинаСтроки = СтрДлина(СтрокаРезультат);
        
    КонецЦикла;
68 pessok
 
03.12.14
17:35
(0) у тебя фикси по верхней планке прога. полторы - нормальный ценник, франи берут чуть больше, но они дают гарантии
69 pessok
 
03.12.14
17:36
млять, не туда :)
70 iamnub
 
03.12.14
18:00
(67)
Ну и сравни.
int[] sd = {12, 15, 19, 24, 25, 56, 45, 53, 90};

            var result = sd.GroupBy(p => p / 10).OrderBy(p => p.Key).Select((p, y) => new { gr = p, ord = y }).Where(p => p.ord % 2 == 0).SelectMany(p => p.gr).Sum();
71 DS
 
03.12.14
18:06
(70) Сравнить что? Какие критерии?
72 Ndochp
 
03.12.14
18:13
(70) Ну читаемость ниже плинтуса. В 1С тоже можно через миллион точек с запросами работать, но обычно это оччень плохо заканчивается.
73 RomanYS
 
03.12.14
18:22
(29) если уж так заморачиваться, то быстрее будет ВК:
скомпилированный код С++ на вычислительных операциях быстрее 1С более чем на порядок и сервак грузить не придется
74 iamnub
 
03.12.14
18:23
(72)
так может быть ты просто... Читать не умеешь? Это банальное linq-выражение в одну строчку. Но ты как бы и не должен его понимать.
75 Enders
 
03.12.14
18:34
(74) это даёт какой-то профит по скорости/нагрузке?
Или "нифигасе я крутой могу всё это написать, а вы даже не поймете что это"?
Тебе уже в (55) просили результат производительности, ты попытался красиво съехать на другую задачу.
76 iamnub
 
03.12.14
18:38
(75)
ты всерьез шарп с 1с сравнивать собрался?
77 iamnub
 
03.12.14
18:41
Это дает "профит" по скорости написания кода, его выразительности и безопасности.
78 Гёдза
 
03.12.14
18:42
А если с обратного конца идти и прибавлять
х, 10х, 100х, ... y, 10y и тд,
вопрос в скорости операции Сред(Стр, Х, 1)
79 Enders
 
03.12.14
18:56
(76) я? зачем? это ты тут сравниваешь
Мне что шарп, что 1С. Каждый продукт имеет своё назначение)
80 iamnub
 
03.12.14
19:02
(79)
Я? Я лишь отвечал на (45). А вы уже потом набежали с "каждый продукт бла-бла-бла"
81 РазДва
 
03.12.14
19:08
(80) Так то ты не понял вопроса и смысла смекалки.  Предложил "пробежать" код(т.е. смекалки не проявил), причем обгадил программистов 1С, типа они не могут "пробежать", а вынуждены применять смекалку.
82 iamnub
 
03.12.14
19:10
(81)
Конкретно тебя - я обгадил?
83 Enders
 
03.12.14
19:15
(80) который был задан на пост (42).
То есть сам начал, сам ответил, а мы набежали?)
84 РазДва
 
03.12.14
19:18
(82) Да, конкретно меня. Своим тоном и неприкрытыми намеками на ущербность всех здесь собравшихся:
>>Ахахах.
>>
>>Ну конечно.
Обсмеял, высказал свое пренебрежение
>>В других языках .. и всё
>>1С это - задача на СМЕКАЛКУ! O_O
Сравнил несравнимое, раззявленым ртом высказал, что сравнение не в пользу 1С.
85 iamnub
 
03.12.14
19:43
(84)
ну.. Значит день прошел не зря!