|
Очередная задачка на смекалку :) | ☑ | ||
---|---|---|---|---|
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)
ну.. Значит день прошел не зря! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |