Имя: Пароль:
IT
 
задачка на сообразительность
0 vasbur
 
06.05.13
08:25
Придумал задачку по 1С. Т.к. соответствующий конкурс прошел, напишу здесь:
Есть текстовый файл, в нем код процедуры 1С. Процедура на входе никаких параметров не получает, на выходе что-то сообщает пользователю.
Необходимо написать обработку, которая получив на входе этот текстовый файл, на выходе скажет, закончит ли когда-нибудь эта процедура работу (по ошибке или штатно) или будет работать бесконечно (зациклится).

P.S. Если кто знает ответ заранее - не светите, дайте догадаться другим.
1 Wobland
 
06.05.13
08:30
незачёт. текст:

Пока ГСЧ.СлучайноеЧисло(0, 1) Цикл
КонецЦикла;
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
Вот она, эта хрень

wiki:Проверка_моделей

...вроде бы
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn