|
задачка на сообразительность | ☑ | ||
---|---|---|---|---|
0
vasbur
06.05.13
✎
08:25
|
Придумал задачку по 1С. Т.к. соответствующий конкурс прошел, напишу здесь:
Есть текстовый файл, в нем код процедуры 1С. Процедура на входе никаких параметров не получает, на выходе что-то сообщает пользователю. Необходимо написать обработку, которая получив на входе этот текстовый файл, на выходе скажет, закончит ли когда-нибудь эта процедура работу (по ошибке или штатно) или будет работать бесконечно (зациклится). P.S. Если кто знает ответ заранее - не светите, дайте догадаться другим. |
|||
1
Wobland
06.05.13
✎
08:30
|
незачёт. текст:
|
|||
2
eeeio
06.05.13
✎
08:31
|
(0) это невозможно
|
|||
3
vasbur
06.05.13
✎
08:32
|
(1) очевидно, что рано или поздно цикл закончится.
|
|||
4
vasbur
06.05.13
✎
08:32
|
(2) чтоб программист 1С - да не смог алгоритмическую задачку решить?
|
|||
5
vde69
06.05.13
✎
08:33
|
Если ГСЧ.СлучайноеЧисло(0, 1) = 1 Тогда
Пока Истина Цикл Сообщить("+"); КонецЦикла; КонецЕсли; |
|||
6
1Сергей
06.05.13
✎
08:35
|
Задачка гамно
|
|||
7
Wobland
06.05.13
✎
08:35
|
(3) в каком месте это очевидно?
|
|||
8
vasbur
06.05.13
✎
08:36
|
(5) ну хорошо, уточним условие задачи: нужно сказать, возможна ли ситуация, что программа зациклится, либо они всегда будет заканчивать свою работу
|
|||
9
Wobland
06.05.13
✎
08:36
|
+(7) смущает (0, 1) - возьми (0, 4294967295)
|
|||
10
Wobland
06.05.13
✎
08:37
|
(8) вводишь в код ГСЧ и от твоего "всегда" остаётся мокрое место
|
|||
11
User_Agronom
06.05.13
✎
08:38
|
Требуется написать свой интерпретатор кода 1С?
С обработками всех стандартных функций? |
|||
12
angelic_e
06.05.13
✎
08:38
|
(6) Нормальная задачка, чёйто гамно?
|
|||
13
vasbur
06.05.13
✎
08:38
|
(11) нужно теоретически решить задачу, т.е. предложить принцип ее решения
|
|||
14
Ursus maritimus
06.05.13
✎
08:39
|
(13) Задача не имеет решения
|
|||
15
vde69
06.05.13
✎
08:39
|
(8) это определить можно, и совсем легко с программистской точки зрения.
Задача не интересная, банальная. (главное не забыть про оператор "перейти") |
|||
16
vasbur
06.05.13
✎
08:40
|
(14) и (15) друг другу противоречат, помоему
|
|||
17
vasbur
06.05.13
✎
08:40
|
(14) вы не прочитали p.s. или проигнорили его
|
|||
18
mehfk
06.05.13
✎
08:42
|
Рез = Вопрос("Уйти в бесконечный цикл?", РежимДиалогаВопрос.ДаНет);
Если Рез = КодВозвратаДиалога.Да Тогда Пока Истина Цикл Сообщить("+"); КонецЦикла; КонецЕсли; Сообщить("++"); |
|||
19
MaxS
06.05.13
✎
08:42
|
Анализировать каждую строку результата. Искать период. Если строки в некотором периоде повторяются, значит зациклилось.
|
|||
20
vde69
06.05.13
✎
08:43
|
нужно найти цикличные участки кода без выхода
|
|||
21
vasbur
06.05.13
✎
08:43
|
(18) см уточнение в (8)
|
|||
22
Ursus maritimus
06.05.13
✎
08:43
|
(17) Имхо, это очевидно любому мало мальски вменяемому человеку.
|
|||
23
vasbur
06.05.13
✎
08:43
|
(20) а если и нет?
|
|||
24
vasbur
06.05.13
✎
08:44
|
(22) если очевидно - то значит и доказуемо?
|
|||
25
vde69
06.05.13
✎
08:46
|
(23) при определенных упрощениях тогда задача решаема.
а вообще я задачу решил! любой код или исполнится или выподет по ошибке, даже зацикливание выпадет по ошибке нехватки памяти, все зависит только от времени :) |
|||
26
zak555
06.05.13
✎
08:46
|
причём тут 1с ?
|
|||
27
Ursus maritimus
06.05.13
✎
08:47
|
Ога один и тот же код в 50% случаев будет выполняться бесконечно, в 50% конечное время.
Наслаждайся: Четное = Секунда(ТекущаяДата())%2; Пока Четное Цикл КонецЦикла; |
|||
28
vasbur
06.05.13
✎
08:48
|
(25) не всегда зацикливание приведет к нехватке памяти
|
|||
29
Ranger_83
06.05.13
✎
08:49
|
(0) "Придумал задачку по 1С"
Казалось бы причем тут 1с с ее предметной ориентированностью? |
|||
30
1Сергей
06.05.13
✎
08:49
|
(20) про обращение к процедурам и функция ОМ не забыл?
|
|||
31
vasbur
06.05.13
✎
08:49
|
(27) с учетом уточнения (8) ответ - "программа иногда зациклится"
|
|||
32
vasbur
06.05.13
✎
08:51
|
(26) да не причем. Просто для примера.
|
|||
33
SeraFim
06.05.13
✎
08:51
|
Выполнить("ПроцедураИзФайла")
Если процедура что-то сообщила пользователю - она конечная, если нет - бесконечная. Ограничений на время исполнения не было =P |
|||
34
ДенисЧ
06.05.13
✎
08:51
|
Какой идиот отменил в школах НВП^W^W^W высшее образование для программистов???
wiki:Проблема_остановки |
|||
35
Лефмихалыч
06.05.13
✎
08:52
|
(0) и при чем тут 1С?
|
|||
36
vasbur
06.05.13
✎
08:53
|
(34) ну вот взяли и всем все рассказали.
|
|||
37
User_Agronom
06.05.13
✎
08:56
|
(14) Имеет. Оно сложное, правда.
(15) Задача весьма неопределённая. Нужно интерпретировать кусок кода. Просто анализом условия не получиться. В условии цикла может быть переменная, значение которой будет меняться в теле цикла. Как тогда поступать? Интерпретировать весь цикл? Со всем богатством встроенных функций языка 1С? |
|||
38
vasbur
06.05.13
✎
09:04
|
(37) премия Филдса, считайте что у вас в кармане
|
|||
39
Jolly Roger
06.05.13
✎
09:05
|
(0) давно МС и гугл стали принимать на работу одинэсников?..
|
|||
40
MaxS
06.05.13
✎
09:08
|
да, (35)
Пока ЗадолженностьПоЗарплате>0 Цикл Задолженность = ПолучитьЗадолженностьПоЗарплате(); Сообщить(Задолженность); КонецЦикла Как программно определить есть ли тут решение? ;) |
|||
41
User_Agronom
06.05.13
✎
09:09
|
(38) год не тот, наверное.
|
|||
42
kosts
06.05.13
✎
09:12
|
(0) А при чем тут 1С?
|
|||
43
vde69
06.05.13
✎
09:14
|
(40) еще про рекурсию забыли....
|
|||
44
Necessitudo
06.05.13
✎
09:25
|
Попытка - Исключение?))
|
|||
45
eeeio
06.05.13
✎
11:18
|
(36) по ссылка написано, что решения нет
|
|||
46
vasbur
06.05.13
✎
11:19
|
(45) я это знаю
|
|||
47
eeeio
06.05.13
✎
12:45
|
(46) т.е. (4) - просто провокация?
|
|||
48
PR
06.05.13
✎
12:54
|
(36) Написано же "Теорема. Анализатор не существует.".
В (2) тебе написали то же самое. Ты что хотел-то? |
|||
49
vasbur
06.05.13
✎
13:07
|
(47) как и (0)
|
|||
50
Эмбеддер
06.05.13
✎
13:12
|
в чем конкретно заключается провокация я не понял.
если выведется сообщение без таймаута, то очевидно что обработка никогда не завершит свою работу. с другой стороны если в процедуре нет ни одного цикла, то можно точно сказать, что она не зациклится неинтересно... |
|||
51
PR
06.05.13
✎
13:12
|
(50) А GoTo?
|
|||
52
vasbur
06.05.13
✎
13:13
|
(50) провокация в том, что существуют дискретные задачи, которые не решаются алгоритмически. Помоему, это прикольный факт.
|
|||
53
PR
06.05.13
✎
13:14
|
+(51) Плюс кто знает, что зацепит наш код, возможно какое-нить событие справочника ПередЗаписью например, в котором будет неявный цикл.
|
|||
54
Эмбеддер
06.05.13
✎
13:18
|
(51) да кто в 1С ей пользуется
|
|||
55
Барбариска
06.05.13
✎
13:26
|
(54) а рекурсия?
|
|||
56
anddro
06.05.13
✎
13:46
|
Как вариант, есть способ определить, будет выполнена или нет за заданный интервал времени:
1. Забудем про метки и Перейти. 2. Определяем свою переменную с временем окончания ожидания (ВыполнятьДо = ТекущаяДата() + Nсекунд). 3. Модифицируем код процедуры: Перед "КонецЦикла" и "Продолжить" вставляем (СтрЗаменить) сравнение "Если ТекущаяДата() > ВыполнятьДо Тогда ВызватьИсключение "Не дождались"; КонецЕсли;" 3. Используем Выполнить(ТекстМодифицированнойПроцедуры), и ловим исключения. |
|||
57
vde69
06.05.13
✎
14:26
|
(34) на самом деле есть и другой подход к решению сабжа
1. Анализатор может выявить ЧАСТЬ мест приводящих к зацикливанию. 2. Анализатор может проверить теоретическую достижимость участка кода. 3. Зная что отдельные участки кода достижимы и могут приводить к зацикливанию можно однозначно отнести часть процедур к однозначно "зацикливающимся". 4. Все остальные анализируемые процедуры будут оперировать вероятностями 5. Чем лучше анализатор справляется с пунктами 1 и 2 тем меньше вероятность его ошибки. примерно по такому принцепу работают эвристические антивирусы.... |
|||
58
ЧеловекДуши
06.05.13
✎
15:06
|
Предлагаю написать все на ВЕБ интерфейсе PHP, и работать через КОМ соединение :)
|
|||
59
ЧеловекДуши
06.05.13
✎
15:06
|
(55) Точно, рекурсия спасет теробайтный файлик :)
|
|||
60
Karavanych
06.05.13
✎
15:16
|
у меня есть тоже классная задача по 1С:
Как назвать человека который придумывает задачу по программированию и задает ее сообществу изначально прочитав в википедии, что она не имеет решения ? |
|||
61
Барбариска
06.05.13
✎
15:42
|
(59) я про то, что циклы и "Перейти" вспомнили
а рекурсию как средство успешного зацикливания забыли. |
|||
62
ptrtss
07.05.13
✎
13:52
|
(0) В универе проходили такую хрень. У нас это называлось верификация кода. Преподы говорили, раньше любая прога для военного использования, к примеру, подлежала верификации в обязательном порядке. Для каждой из конструкций там свои были методы. Для циклов, например - был персональный метод
Если ГСЧ нету - прокатит |
|||
63
ptrtss
07.05.13
✎
13:55
|
Блин, а был ли там анализ на зацикливание... ХЗ, может и не было))
|
|||
64
ptrtss
07.05.13
✎
13:57
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |