Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Конкурс среди Delphi-программистов


Автор: Alexeis 10.10.2008, 09:53

Конкурс среди Delphi-программистов


Мы объявляем о начале конкурса по программированию. Участие в конкурсе – отличный способ 
оценить уровень своих знаний. Каждый день мы пишем какой-то код, решая различные задачи. Но 
все эти задачи являются типовыми и со временем выполняются на «автомате». Повышение 
мастерства программиста, наоборот, происходит при решении оригинальных задач, при изучении 
нового материала, когда программист думает. Данный конкурс позволит всем желающим проверить 
уровень своих знаний и сообразительность.
Данный конкурс является первым у нас, и мы надеемся, что проведение подобных конкурсов в 
будущем станет хорошей традицией.

Правила участия в конкурсе по программированию

1.Регистрация участников
К участию в конкурсе допускаются все желающие, при соблюдении данных правил.
Для того, чтобы стать участником, нужно быть зарегистрированным участником форума Vingrad. 

До 15 октября 2008 года надо направить заявку на участие в конкурсе.  Для этого необходимо
 написать сообщение в данной теме с содержанием «Буду участвовать» или отправить ПМ представителям комиссии. http://forum.vingrad.ru/index.php?act=Msg&CODE=4&MID=13931 
Участие в конкурсе бесплатное.


2.Сроки проведения конкурса 
Конкурсное задание высылается всем участникам по внутренней почте форума (PM) и публикуется на
 форуме 16 октября в 12-00 (МСК).
С 16 по 19 октября 2008 года включительно будут приниматься решения внутреннюю почту (PM) участника http://forum.vingrad.ru/index.php?act=Msg&CODE=4&MID=13931 
C 20 по 23 октября будет проводиться рассмотрение предоставленных решений путем тайного 
голосования внутри комиссии по проведению конкурса.
К 24 октября будет объявлен победитель с его решением. И выставлены все решения, для того чтобы 
все убедились в справедливости решения.

3.Выбор победителя 
Победа в конкурсе подразумевает 100% правильное решение задачи (при всевозможных входных условиях задачи программа давала заданный условием результат).
При отсутствии решений в соответствии с вышесказанным условием конкурс может быть признан 
недействительным.
Критерии оценки правильности решения будут указаны в тексте задачи.
По результатам конкурса будет только один победитель. Если решений, которые претендуют на 
победу, больше – будет отобрано то, которые было прислано раньше.

4.Призы 
Победитель будет немедленно переведен в группу «Эксперт», а также получит 5 баллов репутации. 
Всем участникам предоставившим рабочее решение хотя бы одной задачи будет повышена репутация на один балл. Занявшим 2 и 3е место на 3 и 2 бала соответственно.

5.Заключительные положения 
Исходные тексты решения необходимо писать 100% на Delphi в любой версии, но используя 
синтаксис Delphi 7.
Информация о победителе и его решение будет опубликовано на форуме.
Выбор победителей проводится силами комиссии по проведению конкурса. Её состав : Rrader
AlexeisSnowyGirderDecember.
Победитель объявляется один раз, без возможности пересмотра.
Данный конкурс является некоммерческим. 
Комиссия по проведению конкурса обязуется неукоснительно соблюдать данные правила. В случае 
возникновения разногласий, которые на урегулированы данными правилами, – комиссия по 
проведению конкурса оставляет за собой право вносить односторонние изменения в правила с 
последующим уведомлением всех участников.

---------------------------------------------------

Зарегистрированные участники: 
morpheyushkakemiistoTHandleStaruhaCoderjsaBose
MakPocctHE_EGOiSTEmr.AndersonQu1ntMetalFanChristoph
aktubaSneG0KPoseidon,klimrmadWaReZMENILyAHA
ilBEastline0nVICTARigimonBaD_SeCt0RVanHelsing
ShaggyMadCoder,586MriboAversSanechichek,DCeres,
Frees,Telepyz,safon777,Rennigth,pseud,bems~FoX~
AndreyZ53,AntonN,Alix,Felan,RockClimber,Matematik,
Solitaire,Pichuser,Yanis,actualSajtran,Mauzer91MERLIN123.

-------------------------------------------------------------------------------------------------------------------

Задания на конкурс

1) Задача на алогоритм
Дана матрица случайных чисел m x n (m и n) константы (например 10 на 10). Требуется отсортировать ее элементы по спирали. Т.е. для матрицы 3 х 3 получить примерно такой результат. 
123
894
765

Вывод по своему усмотрению. Можно и в консоль.

Критерии оценки задания: лучшим будет считаться такое решение, которое будет быстрее всех.
------------------------------------------------------------------------------------

2)Задача на потоки.
  Условие: Есть Хулиган с мусорными пакетиками и дворник. Задача хулигана разбросать все мусорные пакетики и при этом не попасться на глаза дворнику. Задача дворника убирать мусор и накостылять хулигану smile . 
  Поле состоит из 60 ячеек (одномерное). 
  Хулиган появляется в произвольной позиции на поле и выбрасывает за раз только 1 пакетик (занимает ячейку) в течении 60мс, после чего он исчезает чтобы через 300 мс появиться в новой позиции начать там гадить. У хулигана запас 22 пакетика.
  Дворник бегает от края до края поля за раз сметая 3 бумажки (очищая 3 соседние ячейки) в течении 400мс.
  Условие поимки. Попытка одновременного доступа (2х потоков) к общей ячейке.

  Требование к решению. В программе должно быть 3 потока (Основной, дворник, хулиган) + простейшая отрисовка в виде ячеек.

  В атаче пример реализации (зеркало http://narod.ru/disk/3216906000/huligan_vs_Dvornik.zip.html) . 3 красных квадарата это дворник в процессе уборки. Ячейки рисуются по XOR во время уборки и заполняется белым после очистки, пакетик хулигана на время выброса становиться желтым, а после ухода становиться синим. Красным кружком помечается позиция где пойман хулиган.

  Примечание: графическая отрисовка может отличаться от предложенной, но тогда, дополнительно, потребуется ее описание. 

Критерии оценки задания: лучшим будет считаться такое решение, которое будет правильнее всех, т.е. грамотная синхронизация потоков, без лишних простоев и одновременных обращений к общей памяти. Также будет учитываться прозрачность кода и наглядность визуализации.
--------------------------------------------------------------------------------------

3) На знание внутренних механизмов Delphi.

В Delphi конструктор любого класса может работать в двух режимах:

1) Режим создания нового экземпляра объекта:
Код

...
var
  Button: TButton;
begin
  Button := TButton.Create(Nil);
end;


2) Но можно сделать и так:
Код

...
var
  Button: TButton;
begin
  Button := TButton.Create(Nil);
  Button.Create(Nil);
end;


Во втором случае просто произойдет реинициализация экземпляра класса.

Представьте, что перед Вами возникла задача создать экземпляр некоторого класса в "чужом" приложении. Что для этого нужно? Ну, во-первых, сам класс, который будет создан, во-вторых, режим работы (создание нового или реинициализация уже созданного экземпляра).
Если конструктор класса может принимать параметры, то они также понадобятся. Зная адрес конструктора, его можно вызвать. 

Отмечу один из важнейших моментов при работе с "чужими" приложениями - для начала все действия нужно проверять на своем приложении. Задание посвящено методике создания классов в "чужих" приложениях.

Итак, дан простой класс, имеющий конструктор с целочисленным параметром. Он просто выводит сообщение с переданным при создании числом.

Код

type
 TDummy = class(TObject)
  private
    FValue: Integer;
  public
    procedure ShowValue; virtual;
    constructor Create(Value: Integer); virtual;
  end;

implementation

{ TDummy }

constructor TDummy.Create(Value: Integer);
begin
  inherited Create;
  FValue := Value;
  ShowValue;
end;

procedure TDummy.ShowValue;
begin
  ShowMessage('Value is: ' + IntToStr(FValue));
end;


Требуется:

1) Написать обыкновенную функцию (не метод) CreateClass, которая бы создавала объект класса TDummy (т.е. написать аналог родного конструктора). Параметры функции - на Ваше усмотрение.

Иными словами: 

Dummy := TDummy.Create(); 

будет эквивалентен коду:

Dummy := CreateClass();

2) Написать простой пример использования функции, создав экземпляр класса (в локальной переменной), передав в конструктор произвольное значение.

Входные данные:
1) Можно пользоваться классом TDummy как типом данных.

Условия:
1) Не использовать ассемблер.
2) Не вызывать конструктор напрямую:

Код

...
var
  Dummy: TDummy;
begin
  Dummy := TDummy.Create(123); // Подобные вызовы в любом месте решения запрещены!
end;


3) Все остальное делать можно smile

Критерии оценки задания: лучшим будет считаться такое решение, которое будет идеально моделировать "родной" конструктор в любом режиме его работы.

Полезность задачи - позволяет динамически создавать классы и компоненты в "чужих" приложениях без использования модулей VCL в своих.

----------------------------------------------------------------------------------------------------------------


Победители конкурса. 

Всего можно было набрать 60 баллов, 10 за 1ю, 30 за 2ю, 20 за 3ю

bems      - 53
MetalFan    - 53
actual    - 45

Sajtran    - 41
aktuba    - 30
AntonN    - 27
Poseidon    - 24
jsa       - 23
THandle - 19


ne0n             - 10
Shaggy          - 9
Felan             - 9 
tHE_EGOiSTE - 4
Qu1nt             - 3
mr.Anderson   -2
Staruha          - 2

Очень хорошие решения представили Sajtran,  AntonNaktubajsa
Суперское решение первой задачи представили ne0nbems и Shaggy
Очень хорошо 3е задание решил bems.
2е задание лучше всех удалось MetalFan. Очень грамотно, аккуратно, эффективно и прозрачно.

Как и обещалось все кто прислал решения хотя бы одной задачи или попытку решения, получат по одному +

 Все задачи были просмотрены на предмет упущений, отступлений от задания, т.е. весьма подробно.

 

Автор: morpheyushka 10.10.2008, 10:15
Хорошее решение. smile 
Буду участвовать

Автор: ne0n 10.10.2008, 10:40
Alexeis,  очень хорошая идея, на моей памяти это первый такой конкурс! Вообщем я клоню это к тому, чтобы проведение конкурсов стало традицией) Сам бы с радостью принял участие, но как по закону подлости  - сейчас нет свободного времени(

Автор: Alexeis 10.10.2008, 10:48
ne0n, Это идея Rrader я только помогаю.

Автор: ne0n 10.10.2008, 11:02
Цитата(Alexeis @  10.10.2008,  10:48 Найти цитируемый пост)
Это идея Rrader я только помогаю.

 smile 


Alexeis,  А раз задание будет общедоступным, значит можно поучаствовать внеконкурса?
(хочу постараться урвать свободного времени) smile 

Автор: Alexeis 10.10.2008, 11:07
Цитата(ne0n @  10.10.2008,  10:02 Найти цитируемый пост)

Alexeis,  А раз задание будет общедоступным, значит можно поучаствовать внеконкурса?
(хочу постараться урвать свободного времени) smile  

  Конечно.

Автор: kemiisto 10.10.2008, 11:14
Я, конечно, любитель, но попробовать можно. Буду участвовать.

Автор: THandle 10.10.2008, 11:36
Я, конечно же, участвую. Хоть и займу последнее место, но интересно smile


Автор: Staruha 10.10.2008, 11:55
Буду участвовать.Только хотелось бы что бы срок был продлен до 20 хотя бы до обеда.За выходные можно что-нить решить, а вот интернета у меня на даче нет.

Автор: Alexeis 10.10.2008, 12:02
Staruha, ну скажем часов до 8ми утра можно растянуть прием. Только для того чтобы можно было отправить.

Автор: jsa 10.10.2008, 12:03
Буду учавствовать

Автор: Bose 10.10.2008, 12:25
Я хочу проверить сообразительность. =) Запишите. 

Автор: morpheyushka 10.10.2008, 12:26
Цитата(THandle @  10.10.2008,  11:36 Найти цитируемый пост)
Я, конечно же, участвую. Хоть и займу последнее место, но интересно

За это место я с тобой посоревнуюсь smile 

Автор: MetalFan 10.10.2008, 13:00
тоже чтоли попробовать? ))) запишите и меня smile 

Автор: mr.Anderson 10.10.2008, 13:07
Буду участвовать!

Автор: tHE_EGOiSTE 10.10.2008, 13:17
Я тоже бы не прочь проверить себя в сообразительности. 
Буду участвовать!

Автор: Qu1nt 10.10.2008, 13:24
Участвую!

Автор: mr.Anderson 10.10.2008, 13:25
Блин, против MetalFan нет шансов... Даже неинтересно... :( smile

Автор: kemiisto 10.10.2008, 13:49
Цитата(mr.Anderson @  10.10.2008,  12:25 Найти цитируемый пост)
Блин, против MetalFan нет шансов

И от кого я это слышу!? От человека с ником mr.Anderson!? Пора бы уже запомнить...
Цитата(Matrix)
Ты думаешь, что моя реакция и сила здесь, в этом мире, зависят от мускулов? Нет... Я даже воздухом не дышу...

Автор: Poseidon 10.10.2008, 13:53
Цитата(Alexeis @  10.10.2008,  09:53 Найти цитируемый пост)
4.Призы 
Победитель будет немедленно переведен в группу «Эксперт», а также получит 5 баллов репутации. 
Всем участникам будет повышена репутация на один балл.
Призы не заинтересовали, хотя поучаствовать можно. Пока в раздумьях...

Автор: MetalFan 10.10.2008, 13:53
а я что? я ничего)  smile я вообще не при чем! может еще и сделать задание не успею, ибо дела срочные какраз с 16 по 19 smile 

Автор: Staruha 10.10.2008, 14:42
Насчет сдвига по времени. Дело не только во мне.Если будет интересное решение помчусь домой и кину.Но дома не у всех тоже есть интернет.А представляешь приходишь в понедельник на работу - телефон трезвонит а ты начхал на все и лезешь в Интернет.А многие программисты раньше 9 на работе не появятся - профессиональная болезнь smile Ну ради такого случая можно на пол часа раньше придти.Так что 9 часов как минимум smile 

Автор: Christoph 10.10.2008, 14:44
И меня запишите smile буду учиться думать головой)

Автор: mr.Anderson 10.10.2008, 15:02
kemiisto, в точку, я как-то не подумал... smile MetalFan, держись! smile *убегает*

Автор: aktuba 10.10.2008, 15:06
И я поучаствую. Чур сильно не пинать =)

Автор: SneG0K 10.10.2008, 15:46
Ну и поучаствую=) Чтоб THandle занял не последнее место=)

Автор: morpheyushka 10.10.2008, 17:34
Блин...все такие скромные smile 

Автор: Poseidon 10.10.2008, 17:54
Ладно, и я поучаствую. Так и быть, займу первое место smile

Автор: THandle 10.10.2008, 17:59
Poseidon, фиг ты чо займешь smile Я всех порву, разве кто сомневается?

Вообще выношу предложение:

Раз уж тов. Посейдон так хочет занять первое место, то предлагаю не лишать его приза, то есть перевести сейчас же в группу "Ушастик Клуба".
Так у него будет цель и желание, а иначе их может быть меньше. А если их будет меньше, то значит для конкурс будет менее интересным.

Кто "За"?

ЗЫ: при проигрыше обратно в Эксперты Посейдона естественно не возвращать...

Сорри за офыфтоп.

Автор: ILyAHA 10.10.2008, 18:50
Буду участвовать    smile 

Автор: ilBEastli 10.10.2008, 19:00
Буду участвовать

Автор: mr.Anderson 10.10.2008, 19:02
Ща точно весь форум сбежится... smile

Автор: ne0n 10.10.2008, 20:40
А ладно, рискуну smile  не могу отказать себе поучатсвовать в таком событии smile 
записываейте)  постараюсь все успеть)

Автор: Poseidon 10.10.2008, 23:18
THandle, эээ  smile

Добавлено через 1 минуту и 5 секунд
Понятно, что для меня не перевод в Эксперты важен smile и явно не 5 плюсов. Спортивный интерес притягивает  smile 

Автор: VICTAR 10.10.2008, 23:42
И меня возьмите тоже  smile 

Автор: Kbl4AH 11.10.2008, 11:38
Я бы тоже поучавствовал, но не буду (даже ради балла репы), так как еще молодо выгляжу и это будет некрасиво с моей стороны. smile 
Обязуюсь стремиться к участию в последующих конкурсах. smile 

Автор: BaD_SeCt0R 11.10.2008, 13:58
Ого! Такие события и без меня! smile  Меня, меня впишите тоже!!!  smile 

Автор: VanHelsing 11.10.2008, 14:48
Буду участвовать. Хочется проверить свои силы. Записывайте.

Автор: Shaggy 11.10.2008, 17:18
Буду участвовать

Автор: Rohoss 11.10.2008, 21:00
Буду участвовать, участия, по крайней мере добавляет опыт  smile 

Автор: 586 12.10.2008, 01:19
Буду участвовать.

Автор: Mribo 12.10.2008, 20:21
Буду участвовать.

Автор: AntonN 12.10.2008, 23:17
Alexeis, тематика заданий будет озвучена?

Автор: Sanechichek 13.10.2008, 00:29
Буду участвовать

Автор: Avers 13.10.2008, 08:43
Буду участвовать
Я так понимаю, это будет похоже на спортивное программирование?

Автор: Alexeis 13.10.2008, 11:09
Цитата(AntonN @  12.10.2008,  22:17 Найти цитируемый пост)
Alexeis, тематика заданий будет озвучена?


Цитата(Alexeis @  10.10.2008,  08:53 Найти цитируемый пост)
Конкурсное задание высылается всем участникам по внутренней почте форума (PM) и публикуется на
 форуме 16 октября в 12-00 (МСК).


Добавлено @ 11:15
 До сих пор нет полной  определённости и заданиями. То ли выбрать простые и победителя выбирать по качеству решения, то ли выбрать очень сложные и тогда решивших все будет совсем мало или вообще никого.

Автор: AntonN 13.10.2008, 11:33
Alexeis, может сделать два-три задания, по уровню сложности?
ну и было бы хорошо заранее знать, что предстоит делать. А то может там какая нибудь скучная сортировка массива в условиях ограниченности памяти и по времени... Вообще, задания планируются полезные с точки зрения практического применения (быстрый поиск файлов, например, резка файла на части и склеивание - для новичков не сложно, опыт пригодитсЯ, в отличии от той же сортирвки, которая никому не нужна, а кому нужна - и сами знают как ее сделать), или просто теоретические задания в духе олимпиад?

Автор: BaD_SeCt0R 13.10.2008, 11:41
Цитата(Alexeis @  13.10.2008,  11:09 Найти цитируемый пост)
 До сих пор нет полной  определённости и заданиями. То ли выбрать простые и победителя выбирать по качеству решения, то ли выбрать очень сложные и тогда решивших все будет совсем мало или вообще никого.


Alexeis, можно же совместить.

Добавлено через 3 минуты и 8 секунд
Часть заданий легкие, а один-два сложные. А считать решения тогда уже побально. Легкие задания 1-3 балла, сложные 4-5, например.

Автор: Alexeis 13.10.2008, 11:47
  AntonN, ну собственно это и так будет.
Планируется 3 задания, разной сложности на разные темы, включая задачи академического характера ну задание на знание глубин Delphi. Предварительные задания уже есть, осталось решить насколько сильно взрывать моск  smile  .

Автор: morpheyushka 13.10.2008, 11:48
Цитата(Alexeis @  13.10.2008,  11:09 Найти цитируемый пост)
До сих пор нет полной  определённости и заданиями. То ли выбрать простые и победителя выбирать по качеству решения, то ли выбрать очень сложные и тогда решивших все будет совсем мало или вообще никого. 

а как на счет несколько туров сделать smile 
с каждым уровнем сложности будут отсеиваться участники, ну и останется один - единственный и неповторимый smile 

Автор: THandle 13.10.2008, 11:52
Alexeis, как я уже говорил - чем сложнее будут задания тем луче. Иначе комиссии придется смотреть кучу кода. Так что моск взрывайте как можно сильнее. 


Цитата(morpheyushka @  13.10.2008,  12:48 Найти цитируемый пост)
с каждым уровнем сложности будут отсеиваться участники, ну и останется один - единственный и неповторимый


Ты думаешь rrader'у и прочим хочется придумывать много заданий? Ведь это не легкое дело. Тур должен быть один. Задания должны быть такой сложности, чтоб их могли решить от силы 5 человек(все задания). ИМХО.

Автор: Alexeis 13.10.2008, 11:58
THandle, а я думаю пусть лучше всем будет интересно решать smile .

Автор: THandle 13.10.2008, 12:03
Alexeis, интересно пусть будет всем, но решат пусть только некоторые smile 

Зачем нужны легкие задания? Чтобы те кто это знает просто сделали задание еще раз, а те у кого опыта поменьше практически ничего нового не узнали?

ИМХО должно быть так:
Знающие люди прилагают довольно большие усилия чтобы сделать задание.
А малознающие люди(то есть я) сидят, копаются, экспериментируют, грузут коленки... 
Те кто не знает и не хочет знать просто забьют на такое задание и победит действительно достойный.

А с легкими заданиями возможно победа того, кто просто раньше пришлет свое решение, то есть того у кого будет больше свободного времени. ИМХО, это не правильно.

Настоятельно требую прислушаться к моему мнению.

Автор: Alexeis 13.10.2008, 12:05
THandle, бум решать не так как это будет выгодно тебе, а как всем  smile 

Автор: BaD_SeCt0R 13.10.2008, 12:10
Цитата(Alexeis @  10.10.2008,  09:53 Найти цитируемый пост)
и публикуется на форуме 16 октября в 12-00 (МСК).

А зачем публиковать на форуме? Можно уже после конкурса.

Автор: Frees 13.10.2008, 12:41
Буду участвовать

Автор: Mayk 13.10.2008, 13:13
вопрос! А можно не дельфистам поучаствовать вне конкурса? Разумеется ради холивара "лалялялалаляля, а на c++/java/python решение короче на 60 KLOC и завершается до обеда"  smile 

Автор: Frees 13.10.2008, 13:17
Цитата(Avers @  13.10.2008,  10:43 Найти цитируемый пост)
Я так понимаю, это будет похоже на спортивное программирование?

все как в спорте. допинг травмы.....

Автор: THandle 13.10.2008, 13:21
Mayk, ну задания, как я понял, будут выложены в открытый доступ. Делай хоть на brainf*ck'е smile Хотя может будут какие задания именно по Delphi... Ну это уж никому не известно кроме комиссии...

Автор: AntonN 13.10.2008, 13:29
вообще написано, что конкурс среди Дельфи-программистов, и решение должно компилиться на D7 - какой брейнфак и Си? smile

Автор: THandle 13.10.2008, 13:31
AntonN

Цитата(Mayk @  13.10.2008,  14:13 Найти цитируемый пост)
вне конкурса



Автор: Rennigth 13.10.2008, 14:06
Участвую.

п.с. если так и не поучаствую (по причине лени/нехватки времени и т.д.) влепите мне жирный минус smile

Автор: pseud 13.10.2008, 15:57
участвую.

только из отпуска. чуть не прозевал.

Автор: MetalFan 13.10.2008, 17:34
балин, а если нету Д7??? или там будут такие задания, что есть вероятность, что будут попользовать возможности D2005-2009?

Автор: Poseidon 13.10.2008, 17:44
MetalFan, ты что, не дочитал???
Цитата(Alexeis @  10.10.2008,  09:53 Найти цитируемый пост)
Исходные тексты решения необходимо писать 100% на Delphi в любой версии, но используя 
синтаксис Delphi 7.

Автор: Rrader 13.10.2008, 18:16
MetalFan, такого не будет. smile 

P.S. Как много участников набралось! smile 

Автор: dumb 13.10.2008, 19:25
Цитата(Rrader @  13.10.2008,  19:16 Найти цитируемый пост)
P.S. Как много участников набралось!

Цитата(Alexeis @  10.10.2008,  10:53 Найти цитируемый пост)
Всем участникам будет повышена репутация на один балл.

следует добавить "предоставившим рабочее решение" smile

Автор: AntonN 13.10.2008, 19:39
dumb, кстати да, а то я сначала и не понял почему столько народу решило "поучавствовать", хотя даже не спросили тематики конкурса smile

Автор: bartram 13.10.2008, 19:44
Хотелось бы поучаствовать, но нету сейчас времени вообще. Так что решу только ради спортивного интереса smile

Автор: Alexeis 13.10.2008, 19:49
Цитата(dumb @  13.10.2008,  18:25 Найти цитируемый пост)
следует добавить "предоставившим рабочее решение"

  Спасибо за уточнение, подправил на 

Цитата

Победитель будет немедленно переведен в группу «Эксперт», а также получит 5 баллов репутации. 
Всем участникам предоставившим рабочее решение хотя бы одной задачи будет повышена репутация на один балл. Занявшим 2 и 3е место на 3 и 2 бала соответственно.


1ю задачу смогут решить многие, так что думаю никто не будет в обиде.

Автор: bems 13.10.2008, 19:55
ну раз такой движ пошёл, то и я поучаствую

Автор: ~FoX~ 13.10.2008, 19:59
Давно я не брал в руки шашки   smile  
Попробуем... smile 

Автор: bems 13.10.2008, 19:59
а целевая ось, запрещенные приемы, права аккаунта, в котором жюри будет прогонять решения?

Автор: AndreyZ53 13.10.2008, 20:20
Эх, ладно, учавствую, главное не победа, а участие

Автор: Alexeis 13.10.2008, 20:43
Цитата(bems @  13.10.2008,  18:59 Найти цитируемый пост)
а целевая ось, запрещенные приемы, права аккаунта, в котором жюри будет прогонять решения?

  На счет оси, ну линукса точно не будет  smile , а так постараемся чтобы решение не требовало использования особых свойств винды (если решение будет с шибко хитрое можно указать версю, ради такого случая найдем нужную винду). Насчет запрещённых приемов, все что не запрещено, то разрешено smile .

Добавлено через 3 минуты и 7 секунд
MetalFan, просто нужно чтобы все были в равных условиях, потому синтаксис Delphi 7 она есть почти у всех.

Автор: AntonN 14.10.2008, 00:20
Ну ладно, меня тоже добавляйте, учавствую smile

Автор: Mayk 14.10.2008, 08:05
Цитата(THandle @  13.10.2008,  17:21 Найти цитируемый пост)
Mayk, ну задания, как я понял, будут выложены в открытый доступ. Делай хоть на brainf*ck'е smile Хотя может будут какие задания именно по Delphi... Ну это уж никому не известно кроме комиссии... 

ыыы. мне почему-то показалось что задания будут по пм высылаться(перепутал с отправкой решений). 
Раз в открытом доступе тогда да, brainf*ck определенно зарулитъ smile   smile  smile 

Автор: RockClimber 14.10.2008, 09:45
Я тоже хочу участвовать.

Цитата(THandle @  10.10.2008,  11:36 Найти цитируемый пост)
Хоть и займу последнее место

Не, последнее место - мое. Без вариантов  smile

Добавлено через 1 минуту и 48 секунд
Цитата(Poseidon @  10.10.2008,  13:53 Найти цитируемый пост)
Призы не заинтересовали, хотя поучаствовать можно. Пока в раздумьях...

Я вообще участвую только для для того, чтобы посмотреть, какие задачи должны уметь решать труЪпрограммеры... А уж если даже решу что-то...

Автор: BaD_SeCt0R 14.10.2008, 10:24
Mayk, не один ты перепутал smile 

Автор: Matematik 14.10.2008, 10:40
> Я вообще участвую только для для того, чтобы посмотреть, какие задачи должны уметь решать труЪпрограммеры... А уж если даже решу что-то... 

+1

Меня тоже запишите.

Автор: Solitaire 14.10.2008, 10:52
Буду участвовать

Автор: BaD_SeCt0R 14.10.2008, 10:57
Только мне вот кажется, что после размещения задания на форуме начнется острая дискуссия и, возможно, многие задания будут решены хоровым способом людьми, не участвующими в конкурсе, что, в свою очередь, может изрядно повлиять на результаты.

Автор: THandle 14.10.2008, 11:01
Цитата(BaD_SeCt0R @  14.10.2008,  11:57 Найти цитируемый пост)
Только мне вот кажется, что после размещения задания на форуме начнется острая дискуссия и, возможно, многие задания будут решены хоровым способом людьми, не участвующими в конкурсе, что, в свою очередь, может изрядно повлиять на результаты.


Я думаю что стоит тему просто закрыть на время выполнения заданий.
Если какие то конкретные вопросы не по заданиям будут, а по самой организации или что то в этом роде - можно тому же Alexeis'у на PM.

Лично считаю что это было бы логично.

Советую в очередной раз комиссии прислушаться к моему мнению.

Автор: BaD_SeCt0R 14.10.2008, 11:27
Цитата(THandle @  14.10.2008,  11:01 Найти цитируемый пост)
Я думаю что стоит тему просто закрыть на время выполнения заданий.


THandle, есть и другие средства связи и обсуждения. Почему бы не рассылать задание только участникам в ПМ?

Автор: pseud 14.10.2008, 11:38
Цитата(BaD_SeCt0R @  14.10.2008,  11:27 Найти цитируемый пост)
Почему бы не рассылать задание только участникам в ПМ?

все равно найдуться умники
- получат задание реализовать фтп-траляля
- создадут тему "не могу реализовать фтп-траляля"
- или кинутся "ва усеагульнае" обсуждение

Автор: BaD_SeCt0R 14.10.2008, 11:47
pseud, излагать свои мысли участникам во всеуслышание как-то не в их интересах, я думаю... А по поводу создания тем и.т.п. по решению комиссии можно снимать с конкурса, если ввести это правило.

Автор: Mayk 14.10.2008, 11:52
Цитата(THandle @  14.10.2008,  15:01 Найти цитируемый пост)
Я думаю что стоит тему просто закрыть на время выполнения заданий.

не стоит. а вдруг формулировка задач потребует уточнений? 

Автор: BaD_SeCt0R 14.10.2008, 11:53
Цитата(Mayk @  14.10.2008,  11:52 Найти цитируемый пост)
не стоит. а вдруг формулировка задач потребует уточнений? 


Цитата(THandle @  14.10.2008,  11:01 Найти цитируемый пост)
Если какие то конкретные вопросы не по заданиям будут, а по самой организации или что то в этом роде - можно тому же Alexeis'у на PM


Автор: Poseidon 14.10.2008, 12:23
Мне вот что-то кажется, что если Rrader задаст что-нить из "глубин Дельфи", то завалимся все smile

Автор: BaD_SeCt0R 14.10.2008, 12:30
Хм... А разрешены ли ассемблерные вставки в код?

Автор: Mayk 14.10.2008, 12:35
BaD_SeCt0R
Цитата(BaD_SeCt0R @  14.10.2008,  15:53 Найти цитируемый пост)

Цитата(THandle @  14.10.2008,  11:01 Найти цитируемый пост)
Если какие то конкретные вопросы не по заданиям будут, а по самой организации или что то в этом роде - можно тому же Alexeis'у на PM

я же говорил как раз ПО заданиям
Цитата(Mayk @  14.10.2008,  15:52 Найти цитируемый пост)
не стоит. а вдруг формулировка задач потребует уточнений?  


Автор: BaD_SeCt0R 14.10.2008, 12:39
Mayk, да и по заданиям можно тоже в ПМ.

Добавлено через 47 секунд
Иначе будет такая кутерьма, имхо...

Автор: THandle 14.10.2008, 12:48
Цитата(BaD_SeCt0R @  14.10.2008,  13:30 Найти цитируемый пост)
Хм... А разрешены ли ассемблерные вставки в код? 


Вчера спрашивал у Alexeis'а. Низя.

Цитата(Poseidon @  14.10.2008,  13:23 Найти цитируемый пост)
Мне вот что-то кажется, что если Rrader задаст что-нить из "глубин Дельфи", то завалимся все


Пусть задает. Будет очень интересно. Вообще, имхо, если бы товарищ Rrader был не в комиссии, а участвовал в конкурсе - остальным можно было бы даже не садится что то делать smile А так еще посмотрим. Пусть даже и глубинные задания будут smile

Насчет закрытия темы, и вопросов по заданиям:

Я имел ввиду что "не по заданиям" - это не по их решению. А уточнения то - то почему ж нельзя....?

Автор: Rrader 14.10.2008, 12:49
Цитата(BaD_SeCt0R @  14.10.2008,  19:30 Найти цитируемый пост)
Хм... А разрешены ли ассемблерные вставки в код?


Цитата(Правила @  10.10.2008,  16:53 Найти цитируемый пост)
Исходные тексты решения необходимо писать 100% на Delphi


Poseidon, все задания вполне решаемы, а мое - тем более smile 

Автор: Qu1nt 14.10.2008, 12:53
Если все три задания будут на математику - я пропал smile 

Автор: BaD_SeCt0R 14.10.2008, 12:57
Предлагаю, несмотря на Delphi-тематику, сделать зеркала топика и в других разделах. Вдруг кто-то еще захочет опробовать свои силы?

Автор: Alexeis 14.10.2008, 14:36
Знания АСМа вам пригодятся, но использовать его не прийдется.

Автор: BaD_SeCt0R 14.10.2008, 15:40
Цитата(Alexeis @  10.10.2008,  09:53 Найти цитируемый пост)
Если решений, которые претендуют на победу, больше – будет отобрано то, которые было прислано раньше.

Я так понял, заданий будет несколько. Как уважаемая комиссия будет принимать готовые решения участников? По одному решенному заданию?

Автор: aktuba 14.10.2008, 19:21
Цитата(Alexeis @  13.10.2008,  21:43 Найти цитируемый пост)
MetalFan, просто нужно чтобы все были в равных условиях, потому синтаксис Delphi 7 она есть почти у всех. 

Как-раз для того, чтобы все были в равных условиях - необходимо разрешить все версии Delphi. В новых версиях есть полезные вещи, которых нет в старых и много кто их использует. Отказываться в пользу старой версии = потерять время на поиск альтернативного решения.
К тому-же, не пойму, почему выбрана D7, а не D2006...

Автор: December 14.10.2008, 22:21
aktuba, D7 - абсоллютный лидер по популярности среди ИДЕ Delphi

Автор: kemiisto 14.10.2008, 22:34
Цитата(aktuba @  14.10.2008,  18:21 Найти цитируемый пост)
Как-раз для того, чтобы все были в равных условиях - необходимо разрешить все версии Delphi. В новых версиях есть полезные вещи, которых нет в старых и много кто их использует. Отказываться в пользу старой версии = потерять время на поиск альтернативного решения.

Подписываюсь. Не вижу смысла в таком ограничении. Как уважаемые организаторы себе это представляют. Я что должен писать в 2009, потом пытаться откомпилировать это в Delphi 7, натыкаясь на многочисленные грабли изменившегося синтаксиса. И просто грабли, ибо их в 7 куча.

Автор: aktuba 14.10.2008, 23:23
Цитата(December @  14.10.2008,  23:21 Найти цитируемый пост)
aktuba, D7 - абсоллютный лидер по популярности среди ИДЕ Delphi 

Да я же не спорю с этим. Но у меня стоит Турба и D2009 - что делать? Ставить семерку? Я понимаю, что не так много поменялось, но все-же. Например, использование for..in, вместо обычного цикла...

Вообще, кто-то может объяснить, в чем именно выражается равноправие участников, при использовании определенной версии Delphi? В том, что те, кто использует новые версии, не смогут использовать новые конструкции? Так это наоборот - вставляете палки в колеса, людям надо развиваться ;).

В общем, прошу отменить это требование. Ничего практического оно не несет, а вот хлопоты добавить может.

Автор: Alexeis 14.10.2008, 23:35
Не нужно было делать такой длительной регистрацию, а то народ от того что руки чешутся уже не нает чего делать  smile 
  Спокойно это всего лишь маленький конкурс, а не соревнование на лучшего в мире делфиста. smile 

Автор: Poseidon 14.10.2008, 23:50
Да ладно вам спорить. Хоть на синтаксисе Паскаля. Интерес ведь не в этом... smile

Автор: aktuba 15.10.2008, 00:16
Цитата(Poseidon @  15.10.2008,  00:50 Найти цитируемый пост)
Да ладно вам спорить. Хоть на синтаксисе Паскаля. Интерес ведь не в этом... smile 

Так а я о чем?  smile 

Автор: Poseidon 15.10.2008, 08:37
Я имею ввиду, раз оглашено D7, значит D7. aktuba, я не думаю что тебе не хватит опыта и знаний, что бы даже на D2009 написать код, который компильнется на D7. У меня вот 2007 установлена, D7 тоже нет и что? Я знаю что будет в семерке компилится, а что нет. Конечно, если по заданию нужно будет использовать что-то, для чего обязательно нужно будет D7 (типо Инди), то придется ставить семерку. Но, думаю, составители заданий не будут так извращаться. Посмотрим. Осталось пара часиков smile

Автор: Alexeis 15.10.2008, 09:13
Цитата(Poseidon @  15.10.2008,  07:37 Найти цитируемый пост)
Посмотрим. Осталось пара часиков

  Не хулигань.

Цитата(Alexeis @  10.10.2008,  08:53 Найти цитируемый пост)
Конкурсное задание высылается всем участникам по внутренней почте форума (PM) и публикуется на
 форуме 16 октября в 12-00 (МСК).

Автор: Staruha 15.10.2008, 09:45
Цитата

Мне вот что-то кажется, что если Rrader задаст что-нить из "глубин Дельфи", то завалимся все

 Вот-вот обещали проверку умения мыслить так понимаю находить нестандартные решения smile 

Автор: Rrader 15.10.2008, 11:33
Оглашу тематику заданий smile 

1) Задача на алгоритм (работа с матрицей).
2) Задача на потоки и синхронизацию.
3) Третье задание посвящено внутреннему устройству классов в Delphi.

Первые два задания составил Alexeis, третье составил я.

Автор: Rennigth 15.10.2008, 12:45
Цитата(Poseidon @  15.10.2008,  08:37 Найти цитируемый пост)
Осталось пара часиков 

нетерпится smile

Автор: Alexeis 15.10.2008, 12:48
Rennigth, да каких же пару? Сутки еще. 16 го старт, а на 15 го.

Автор: Rennigth 15.10.2008, 12:52
Цитата(Alexeis @  15.10.2008,  12:48 Найти цитируемый пост)
Rennigth, да каких же пару? Сутки еще. 16 го старт, а на 15 го.

да я понял smile я о Poseidon, ему не терпиться, вот числа и попутал smile  

Автор: Poseidon 15.10.2008, 15:34
Да ну вас...  smile 

Автор: MetalFan 15.10.2008, 15:49
Цитата(Rrader @  15.10.2008,  11:33 Найти цитируемый пост)
2) Задача на потоки и синхронизацию.
3) Третье задание посвящено внутреннему устройству классов в Delphi.

/me довольно потирает руки  smile 

Автор: Rennigth 15.10.2008, 16:08
Цитата(MetalFan @  15.10.2008,  15:49 Найти цитируемый пост)
Цитата(Rrader @  15.10.2008,  11:33 )
2) Задача на потоки и синхронизацию.
3) Третье задание посвящено внутреннему устройству классов в Delphi.


/me довольно потирает руки    


А я то дурак думал, что все обрадуются первой математической задачке  smile 

Автор: mr.Anderson 15.10.2008, 16:10
Rennigth, я обрадовался! smile Остальные мне вряд ли светят, с потоками почти не работал совсем, про внутреннее устройство молчу вообще... smile

Автор: Rennigth 15.10.2008, 16:42
Цитата(mr.Anderson @  15.10.2008,  16:10 Найти цитируемый пост)
Rennigth, я обрадовался!  Остальные мне вряд ли светят, с потоками почти не работал совсем, про внутреннее устройство молчу вообще...  

Везет. Я математику вообще почти забыл. Недавно по работе нужно было простейшую тригонометрическую задачу 7-8го класса решить, дык без гугла яб неизвесно сколько времени бился головой ап стену.   smile  smile  smile 

Автор: Mauzer91 15.10.2008, 17:59
Если еще не поздно, то я участвую smile 

Автор: aktuba 15.10.2008, 19:03
Цитата(Rennigth @  15.10.2008,  17:08 Найти цитируемый пост)
А я то дурак думал, что все обрадуются первой математической задачке  smile  

Я вообще ни одной не обрадовался  smile Пока не известны подробности - рано делать выводы smile 

Автор: mr.Anderson 15.10.2008, 19:04
aktuba, почему рано? smile Уж если я не работал с потоками, то мне хоть что туда впихни - я просто не работал с ними и все, как решать-то... smile Так что кой-какие выводы уже есть...

Автор: bems 15.10.2008, 19:23
Я правильно понял, что при наличии двух рабочих решений побеждает более раннее, не зависимо от их скорости, размеров, ресурсоемкости и тд?

Автор: Alexeis 15.10.2008, 19:36
Цитата(bems @  15.10.2008,  18:23 Найти цитируемый пост)
Я правильно понял, что при наличии двух рабочих решений побеждает более раннее, не зависимо от их скорости, размеров, ресурсоемкости и тд?

  Только при равной оценке обоих.

Автор: bems 15.10.2008, 19:46
какой оценке?

Автор: Alexeis 15.10.2008, 19:50
bems, уже столько народу собралось, так что будем ставить какие-то балы, не важно по какой системе smile .

Добавлено через 1 минуту и 41 секунду
bems, за правильность, эффективность, прозрачность кода.

Автор: Yanis 15.10.2008, 21:22
Я всё-таки за то, что бы вручать несколько призов: за оригинальность, за лаконичность, за производительность…
Всё зависит от того какие задания будут в конкурсе.
Один победитель это как-то не правильно smile

Автор: Poseidon 16.10.2008, 01:02
Ёёё... ну и тематика. Хорошо что я уже Эксперт... smile

Добавлено через 3 минуты и 31 секунду
Кстати, я за несколько лет программирования еще не разу не сталкивался с задачей, которая каким-либо образом сводилась бы к матрице. Потоки - да. Классы - да. Но матрица... Ладно, что будет, то будет.

Автор: MetalFan 16.10.2008, 09:01
Цитата(Poseidon @  16.10.2008,  01:02 Найти цитируемый пост)
Кстати, я за несколько лет программирования еще не разу не сталкивался с задачей, которая каким-либо образом сводилась бы к матрице. Потоки - да. Классы - да. Но матрица...

аналогично... только давно на лабах в институте.
хотя опять же зависит, в какой области программировать приходится)

Автор: Alexeis 16.10.2008, 09:24
Цитата(Poseidon @  16.10.2008,  00:02 Найти цитируемый пост)
Кстати, я за несколько лет программирования еще не разу не сталкивался с задачей, которая каким-либо образом сводилась бы к матрице. Потоки - да. Классы - да. Но матрица... Ладно, что будет, то будет. 

  Гы... все намного проще  smile , у страха глаза велики  smile .

Добавлено через 1 минуту и 34 секунды
1.5 часа до старта. Обратный отсчёт  smile  

Автор: bartram 16.10.2008, 09:28
Цитата(Poseidon @  16.10.2008,  03:02 Найти цитируемый пост)
Кстати, я за несколько лет программирования еще не разу не сталкивался с задачей, которая каким-либо образом сводилась бы к матрице. Потоки - да. Классы - да. Но матрица... Ладно, что будет, то будет. 

Матрицы нужны для того чтобы использовать их в олимпиадных задачах  smile 

Автор: MetalFan 16.10.2008, 10:27
полчаса....

Автор: Rennigth 16.10.2008, 10:38
22 минуты

Автор: MetalFan 16.10.2008, 10:58
2 минуты)

Автор: Alexeis 16.10.2008, 10:59
Задания на конкурс

1) Задача на алогоритм
Дана матрица случайных чисел m x n (m и n) константы (например 10 на 10). Требуется отсортировать ее элементы по спирали. Т.е. для матрицы 3 х 3 получить примерно такой результат. 
123
894
765

Вывод по своему усмотрению. Можно и в консоль.

Критерии оценки задания: лучшим будет считаться такое решение, которое будет быстрее всех.
------------------------------------------------------------------------------------

2)Задача на потоки.
  Условие: Есть Хулиган с мусорными пакетиками и дворник. Задача хулигана разбросать все мусорные пакетики и при этом не попасться на глаза дворнику. Задача дворника убирать мусор и накостылять хулигану smile . 
  Поле состоит из 60 ячеек (одномерное). 
  Хулиган появляется в произвольной позиции на поле и выбрасывает за раз только 1 пакетик (занимает ячейку) в течении 60мс, после чего он исчезает чтобы через 300 мс появиться в новой позиции начать там гадить. У хулигана запас 22 пакетика.
  Дворник бегает от края до края поля за раз сметая 3 бумажки (очищая 3 соседние ячейки) в течении 400мс.
  Условие поимки. Попытка одновременного доступа (2х потоков) к общей ячейке.

  Требование к решению. В программе должно быть 3 потока (Основной, дворник, хулиган) + простейшая отрисовка в виде ячеек.

  В атаче пример реализации (зеркало http://narod.ru/disk/3216906000/huligan_vs_Dvornik.zip.html) . 3 красных квадарата это дворник в процессе уборки. Ячейки рисуются по XOR во время уборки и заполняется белым после очистки, пакетик хулигана на время выброса становиться желтым, а после ухода становиться синим. Красным кружком помечается позиция где пойман хулиган.

  Примечание: графическая отрисовка может отличаться от предложенной, но тогда, дополнительно, потребуется ее описание. 

Критерии оценки задания: лучшим будет считаться такое решение, которое будет правильнее всех, т.е. грамотная синхронизация потоков, без лишних простоев и одновременных обращений к общей памяти. Также будет учитываться прозрачность кода и наглядность визуализации.
--------------------------------------------------------------------------------------

3) На знание внутренних механизмов Delphi.

В Delphi конструктор любого класса может работать в двух режимах:

1) Режим создания нового экземпляра объекта:
Код

...
var
  Button: TButton;
begin
  Button := TButton.Create(Nil);
end;


2) Но можно сделать и так:
Код

...
var
  Button: TButton;
begin
  Button := TButton.Create(Nil);
  Button.Create(Nil);
end;


Во втором случае просто произойдет реинициализация экземпляра класса.

Представьте, что перед Вами возникла задача создать экземпляр некоторого класса в "чужом" приложении. Что для этого нужно? Ну, во-первых, сам класс, который будет создан, во-вторых, режим работы (создание нового или реинициализация уже созданного экземпляра).
Если конструктор класса может принимать параметры, то они также понадобятся. Зная адрес конструктора, его можно вызвать. 

Отмечу один из важнейших моментов при работе с "чужими" приложениями - для начала все действия нужно проверять на своем приложении. Задание посвящено методике создания классов в "чужих" приложениях.

Итак, дан простой класс, имеющий конструктор с целочисленным параметром. Он просто выводит сообщение с переданным при создании числом.

Код

type
 TDummy = class(TObject)
  private
    FValue: Integer;
  public
    procedure ShowValue; virtual;
    constructor Create(Value: Integer); virtual;
  end;

implementation

{ TDummy }

constructor TDummy.Create(Value: Integer);
begin
  inherited Create;
  FValue := Value;
  ShowValue;
end;

procedure TDummy.ShowValue;
begin
  ShowMessage('Value is: ' + IntToStr(FValue));
end;


Требуется:

1) Написать обыкновенную функцию (не метод) CreateClass, которая бы создавала объект класса TDummy (т.е. написать аналог родного конструктора). Параметры функции - на Ваше усмотрение.

Иными словами: 

Dummy := TDummy.Create(); 

будет эквивалентен коду:

Dummy := CreateClass();

2) Написать простой пример использования функции, создав экземпляр класса (в локальной переменной), передав в конструктор произвольное значение.

Входные данные:
1) Можно пользоваться классом TDummy как типом данных.

Условия:
1) Не использовать ассемблер.
2) Не вызывать конструктор напрямую:

Код

...
var
  Dummy: TDummy;
begin
  Dummy := TDummy.Create(123); // Подобные вызовы в любом месте решения запрещены!
end;


3) Все остальное делать можно smile

Критерии оценки задания: лучшим будет считаться такое решение, которое будет идеально моделировать "родной" конструктор в любом режиме его работы.

Полезность задачи - позволяет динамически создавать классы и компоненты в "чужих" приложениях без использования модулей VCL в своих.

Автор: MetalFan 16.10.2008, 11:24
пааанеслася!!! (эхх, срочные дела появились, надеюсь успею до конца конкурса хотяб одну задачку решить )

Автор: Alexeis 16.10.2008, 11:37
  Возникли вопросы по первому заданию, отвечаю для всех

Изначально матрица это двумерный массив типа array [0..n, 0..m] of Integer; или array of array of Integer; по желанию, дальше чего хотите то и делаете с ней.

Автор: AntonN 16.10.2008, 12:26
вот почему не люблю примеры "с ООП" - все высасано из пальца и сами себе сделаны проблемы...

еще вопрос - каким образом будет тестироваться скорость первого задания?

Автор: X-Vlad 16.10.2008, 12:32
я б тоже хотел

Автор: Rrader 16.10.2008, 12:50
Уточнение по поводу второго задания, чтобы потом не возникало пикантных вопросов. Все константы времени - 60мс, 300мс, 400мс являются условными (т.е. формально нужно использовать их, но фактически время может отличаться), так как Windows не является системой реального времени.

Автор: AntonN 16.10.2008, 13:35
Rrader, думаю даже без учета rtos временной интервал в 60мс она спокойно выдаст.

Автор: Felan 16.10.2008, 13:43
А в первом задании именно n*m матрица? Или все таки n*n?
Т.е. учитывать надо, что матрица может быть прямоугольной?

Автор: Alexeis 16.10.2008, 14:34
Цитата(AntonN @  16.10.2008,  11:26 Найти цитируемый пост)
еще вопрос - каким образом будет тестироваться скорость первого задания?

  В первую очередь скорость степень сложности n^2, n log2n , потому если будет спорный вопрос, то можно заюзать QueryPerformanceCounter для подсчета тактов проца.

Цитата(X-Vlad @  16.10.2008,  11:32 Найти цитируемый пост)
я б тоже хотел 

  В принципе если участники не против, я запишу еще одного участника.

Цитата(Felan @  16.10.2008,  12:43 Найти цитируемый пост)
А в первом задании именно n*m матрица? Или все таки n*n?
Т.е. учитывать надо, что матрица может быть прямоугольной? 

  Да, по условию n * m зачем упрощать жизнь smile . За n * n будем снимать балы.

  60 мс это 6 * 10 мс, вполне реальное время для таймера, ну если разик из 100 попыток не успеет, то это скажется только на том что хулиган спасется лишний раз, это не критично.

Автор: AntonN 16.10.2008, 14:45
Alexeis
Цитата

Да, по условию n * m зачем упрощать жизнь smile . За n * n будем снимать балы.

а смысл вообще рассматривать решение, которое не удовлетвояет условию, соответственно оно не есть решение поставленной задачи?

сдавать проектом или просто листингом?

Автор: Alexeis 16.10.2008, 15:09
Цитата(AntonN @  16.10.2008,  13:45 Найти цитируемый пост)
а смысл вообще рассматривать решение, которое не удовлетвояет условию, соответственно оно не есть решение поставленной задачи?

  Ну мы ж не звери smile , снимем процентов эдак 30 , думаю это будет честнее, а то старался старался, а потом раз и не засчитали. Думаю и балы будут разные за разные задачи. За 1ю много не дадим.

Цитата(AntonN @  16.10.2008,  13:45 Найти цитируемый пост)
сдавать проектом или просто листингом? 

  Как удобно. Проще листингом, так легче будет публиковать.

Автор: Poseidon 16.10.2008, 15:40
Сдавать по степени решения (т.е. по одному) или потом, в конце, все сразу?

Автор: Rrader 16.10.2008, 15:54
Можно по степени решения.

Автор: AntonN 16.10.2008, 16:18
уточнение небольшое:
тов. Дворник находится сразу на трех ячейках (ну например на соседние он может метлой ударить smile ) или на одной, а мусор убирается еще и с соседних?

Автор: Alexeis 16.10.2008, 16:40
  Дворник находиться одновременно на трех ячейках, если в пределах 3х ячеек появился хулиган, то считается что он пойман, т.е. фактически система залпового огня smile . 
  На самом деле это имеет практическую подоплёку, иногда требуется обеспечить синхронное изменение более чем в одной записи, но при этом сохранить доступ других потоков к другим записям, т.е. произвести множественные изменения не блокируя целиком все хранилище. 
Если блокировать записи поочерёдно, то есть ненулевая вероятность того что 2 потока будут охотиться за за общими записями и при этом будут ждать друг-друга и ни один не сможет завершить до конца свою операцию. Чтобы полностью смоделировать такую ситуацию потребуется, чтобы хулиган разбрасывал не по одной бумажке за раз, а больше, это но к сожалению усложнило бы и так непростую задачу, но если кто из участников возьмётся и сумеет, то получит дополнительные балы.

Автор: AntonN 16.10.2008, 16:49
Alexeis, ладно, сделал на три.
Вообще, довольно плохо сформулированное задание (я про второе), например, что есть "ячейка"? В принципе, тут потоки как таковые не нужны совершенно (именно при такой формулировке), но раз надо - получай "пустыши" smile

Автор: Virtuals 16.10.2008, 16:55
хм а ASM вставки нельзя только в 3 задании?
и еще как будет оцениватся, так-называемые, "нерекомендуемые" конструкции и вункции самой винды
например ктото говорит что absolute нерекомендуют (правда я так и не нашел почему), а мне нравится, при условии что использовать аккуратно.,
или какая либо функция типа пользуйте ее но рекомендуем другую?...

Автор: Alexeis 16.10.2008, 17:04
Цитата(AntonN @ 16.10.2008,  15:49)
Alexeis, ладно, сделал на три.
Вообще, довольно плохо сформулированное задание (я про второе), например, что есть "ячейка"? В принципе, тут потоки как таковые не нужны совершенно (именно при такой формулировке), но раз надо - получай "пустыши" smile

  AntonN, суть задания чтобы на простом задании приобрести опыт в решении сложной задачи на синхронизацию потоков. Что такое ячейка не важно, это некая сущность к которой требуется обеспечить атомарный доступ. Зачем заранее ограничивать людей? Кто-то сделает несколько массивов, кто-то массив записей или объектов, другой воспользуется списками или применит контейнер TObjectList, а может пронаследуется от него и сделает потокобезопасным ресурсом. Включаем фантазию smile .

Автор: AntonN 16.10.2008, 17:09
Alexeis, а, ну тогда я спокоен за свою реализацию smile

Автор: aktuba 16.10.2008, 17:33
Цитата(Poseidon @  16.10.2008,  02:02 Найти цитируемый пост)
Кстати, я за несколько лет программирования еще не разу не сталкивался с задачей, которая каким-либо образом сводилась бы к матрице. Потоки - да. Классы - да. Но матрица... Ладно, что будет, то будет. 

И с трехмерной графикой не работал? Везет ;) Мне когда-то пришлось вдоволь "насладится" матрицами...

Автор: Alexeis 16.10.2008, 17:38
Цитата(Virtuals @  16.10.2008,  15:55 Найти цитируемый пост)
хм а ASM вставки нельзя только в 3 задании?

  Если кто уже заюзал, то ладно уже не переделывайте, но вообще не рекомендуется, у нас конкурс по делфи, а не по асму. Задача написать оптимальный алгоритм, а не максимально приладить алгоритм к процессору. Короче дополнительных балов не ждите, но если все будет верно, то снижать тоже не будем. К остальным кто еще не решал, просьба воздержаться от асма.

Автор: bems 16.10.2008, 18:25
а вот во второй задаче "Хулиган появляется в произвольной позиции" значит, что он сам выбирает где появляться или там обязательно должно быть случайное число? Если первое то какая информация у хулигана есть относительно положения дворника?

Автор: bems 16.10.2008, 19:08
Цитата(Alexeis @  16.10.2008,  11:37 Найти цитируемый пост)
матрица это двумерный массив типа array [0..n, 0..m] of Integer;
а не [1..n,1..m] или [0..n-1,0..m-1]?

Автор: Alexeis 16.10.2008, 19:43
bems, в произвольной.

На счет массива прошу прощения, там или [1..n,1..m] или [0..n-1,0..m-1], индексы не суть, главное число элементов.

Добавлено через 2 минуты и 13 секунд
  Если позиция хулигана выбирается произвольной, он не знает где сейчас дворник.

Автор: Virtuals 16.10.2008, 20:06
Alexeis
Цитата

Если позиция хулигана выбирается произвольной, он не знает где сейчас дворник.

но!
он не знает где сейчас дворник, это неравно, позиция хулигана выбирается произвольной smile 

он не знает где дворник, но знает где был только что! тоесть можно ли сигануть в ту позицию откуда сигает? 
и что делать если он там уже нагадил, а дворник неубрал? особо интиресует задержка по времени:
.гадить поверх за такое-же время
.гадить вдвойне, и пусть дворник потом разгребает(тоже соответственно тому сколько нагадили х2,х3....)
.увидеть что нагажено и свалить без затрат времени
???

Добавлено через 1 минуту и 23 секунды
ЗЫ ух и ненавижу задачки высосаные из пальца... smile 

Автор: AntonN 16.10.2008, 20:41
Virtuals
Цитата

он не знает где сейчас дворник, это неравно, позиция хулигана выбирается произвольной

да, это не равно, одно есть следствие другого. знал бы он где дворник - смысл тогда в задаче искать одновременное обращение к одной ячейке?
Цитата

он не знает где дворник, но знает где был только что!

Хулиган настолько туп, сколько и хамоват мусорить на улице, он, наверное, даже своего предыдущего места не помнит, не то, чтобы даже о дворнике знать smile

Цитата

и что делать если он там уже нагадил, а дворник неубрал?

нагадить еще раз, потратив пакет мусора? дворник чистит ячейки, сколько бы в них мусора небыло, хулиган прыгает рандомно, при юзании одной ячейки побеждает дворник, при окончании пакетов мусора - хулиган, вес просто вроде бы. даже "демо" есть...

Автор: Virtuals 16.10.2008, 21:04
AntonN, у меня демо написало "404    Нет такой страницы" smile так что как это выглядело я не в курсе
теперь понял, тоесть абсолютно безусловно попал в ячейку-записал-потратил время, попал в дворника продул
пойман - прога останавливается? или рисует что пойман и перезапуск
пакеты кончились - останавливаемся или рисуем что выиграл и перезапуск...?

Автор: AntonN 16.10.2008, 21:12
Virtuals,
там в подсветку ссылки скобка попадает, потому и 404 smile

Автор: actual 16.10.2008, 22:18
По первой задаче, space complexity учитывается или только time complexity?

Автор: aktuba 16.10.2008, 22:28
Цитата(actual @  16.10.2008,  23:18 Найти цитируемый пост)
По первой задаче, space complexity учитывается или только time complexity? 

 smile А по-русски написать никак? Ну или, хотя бы, прочесть внимательно условия...

Автор: Poseidon 16.10.2008, 22:34
Кто-нить творение Rraderа решил? Я, как и писал, завалился на нем smile Хотя еще 2 дня есть, буду ломать мосх  smile 

Автор: AntonN 16.10.2008, 22:40
Poseidon, об чем речь-то? smile

Автор: Poseidon 16.10.2008, 22:49
Цитата(AntonN @  16.10.2008,  22:40 Найти цитируемый пост)
Poseidon, об чем речь-то?


Цитата(Rrader @  15.10.2008,  11:33 Найти цитируемый пост)
Оглашу тематику заданий  

1) Задача на алгоритм (работа с матрицей).
2) Задача на потоки и синхронизацию.
3) Третье задание посвящено внутреннему устройству классов в Delphi.

Первые два задания составил Alexeis, третье составил я.



Добавлено @ 22:50
Цитата(actual @  16.10.2008,  22:42 Найти цитируемый пост)
Хотелось бы услышать ответ от Alexeis, остальных прощу не беспокоиться.
В таких случайх пишут РМ

Автор: Alexeis 17.10.2008, 10:27
Цитата(AntonN @ 16.10.2008,  20:12)
Virtuals,
там в подсветку ссылки скобка попадает, потому и 404 smile

Балин я просто закинул ссылку, а форум решил что скобка тоже относиться к ссылке и самовольно ее туда добавил :( . Ладно я все поправил.
Насчёт высасоной из пальца, см. ниже я описывал суть задачи. Если бы она описывал реальные сущности, то на решение ушло бы не несколько часов, а несколько недель, так что критика не принимается.

Добавлено через 1 минуту и 45 секунд
actualaktuba все верно пояснил.

Добавлено через 3 минуты и 36 секунд
THandle, спокойно, а 4 дня на что? Зачем же все за 1 день smile .

Автор: AntonN 17.10.2008, 11:36
третья задача из разряда "а угадайте, что я задумал, но только как правильно делать нельзя, можно делать только как я задумал", с втыканием палок в колеса, с туманным объяснением самого задания (потому что чуть больше описания - и все сразу будет понятно). очень жду конца конкурса, чтобы посмотреть на "правильное решение", действительно ли оно такое, как мне кажется... и вот по этому поводу вопрос - конечно же решение в третьем задании следует принципам ООП и "общепринятыми" принципами работы с объектами (хотя бы выполнение конструктора/деструктора)?

Автор: Rrader 17.10.2008, 12:00
AntonN, полегче. Задание на знание возможностей языка.
Цитата

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

Что это за Дельфи-программист, который не понимает, как работает компилятор даже на базовом уровне? Задание не посвящено ООП. Оно покажет, умеете ли Вы создавать классы как-нибудь еще кроме TDummy.Create(); Конечно, об этом в книгах почти ничего не пишут, и в гугле трудно найти, но на то оно и задание, чтобы победил сильнейший.

Virtuals, интересные решения приветствуются! Если совсем недокументированные возможности будете использовать, то обосновать не лишне будет smile 

Автор: Alexeis 17.10.2008, 12:23
Модератор: Давайте вернёмся к теме обсуждения.

Просьба не оффтопить. Весь оффтоп удалил. 

Автор: AntonN 19.10.2008, 09:30
ну как там, сколько участников прислало работы? smile

Автор: MetalFan 19.10.2008, 10:09
чорт, почти закончил %) только сегодня время появилось, в последний момент так сказать)

Автор: MetalFan 19.10.2008, 10:41
а как архив с исходниками решений выслать через ЛС? или предлагается все исходники текстом слать?

Автор: Poseidon 19.10.2008, 11:36
Я на мэйл выслал

Автор: ne0n 19.10.2008, 18:06
Ыыы отправил свое решение 1-ой задачи) на 2 -ю времени не хватило, а на 3-ю ума smile 

Автор: Bose 19.10.2008, 18:16
меня можно вычёркивать

у меня терпения ни на одну из задач не хватило  smile 

Автор: Qu1nt 19.10.2008, 18:25
Только освободился, постараюсь успеть.

Автор: THandle 19.10.2008, 19:09
Блин... У меня из за падения компа времени все сделать не хватило :(
Не удачно... Ну ограничусь не лучшими решениями 1 и 3 задачи...
Как бы этого Alexeis'а в асе что ли поймать... А то не понятно куда архив кидать.

А вообще задания интеренсые были smile Так и хочется посмотреть на верные решения smile

Автор: Alexeis 19.10.2008, 19:59
человек 12 будет с решениями.

Автор: THandle 19.10.2008, 20:02
Alexeis, с полными решениями всех 3 задач?

Автор: Virtuals 19.10.2008, 20:56
вне конкурса
накидал решение первой, понял что это неинтересно, хотя есть очь интересная идейка с извращениями (основной изврат наложение спирали на линейную область памяти), на остальное времени нет, хотя вторая задачка точно есть в реализации,для своих нужд, а про 3 так и не понял нафига такое, классы да инжектить в чужое приложение,бррр....

Автор: AntonN 19.10.2008, 21:06
Цитата

 а про 3 так и не понял нафига такое, классы да инжектить в чужое приложение,бррр.... 

причем это как то относится к профессионализму работы в дельфи... понимаю, если бы то открыть метод, закрытый далеко в предках, а тут даже не ооп. вот потому и жду правильного решения, может я не так понял...

кстати, сегодня уже закроется принятие работ, можно выставить решения от администрации конкурса (ну на первые две ладно, там нет однозначного решения, а вот третье...)?

Автор: tHE_EGOiSTE 20.10.2008, 00:56
Цитата(AntonN @ 19.10.2008,  22:06)
Цитата

 а про 3 так и не понял нафига такое, классы да инжектить в чужое приложение,бррр.... 

 Это используется для того, чтобы мы могли создавать объекты, классы которых неизвестны на этапе компиляции.
\\
Реальная практическая задача, как и сказал Rrader - это например получить компоненты чужих программ из файла.
\\
Я вот часа 2 возился с этой задачай.... smile  Сделал таки..... smile 

Автор: Staruha 20.10.2008, 08:48
Вообще то если честно я уже в пятницу сошла с дистанции - оценила свои силенки -время и ... smile 

Автор: Alexeis 20.10.2008, 09:41
Все, ФИНИШ
Вот список приславших решения:
tHE_EGOiSTEmr.AndersonaktubaStaruhaShaggyjsaFelanAntonNSajtranPoseidonbemsMetalFanactualne0nTHandleQu1nt.

Решения больше не принимаются. Проверьте, все ли решения я получил.

Автор: Poseidon 20.10.2008, 09:58
Цитата(Staruha @  20.10.2008,  08:48 Найти цитируемый пост)
Вообще то если честно я уже в пятницу сошла с дистанции 
Хехе. А решение-то прислала все-раво smile

Автор: Alexeis 20.10.2008, 11:54
  Ну вот возмущений было куча, а беглый просмотр выявил 2 правильных 3х задания. Вторые задания почти все с огрехами, кроме одного. Уже наметились 2 явных победителя  smile .
  Все задания были решаемыми более того на 2ю задачу был поясняющий пример, однако, из 8 ми решенных 2х задач только 1 ведет себя правильно, возможно в реализации не все ситуации отлова, но выглядит правильно.

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

2) ситуация Дворник сначала пытается занять 3 ячейки, отрисовывается, если одна из них занята то хулиган пойман, иначе ждем 400 мс, в течении которых Хулиган может еще попасть на одну из 3х ячеек. Только после ожидания очищаем ячейки, отрисовываемся, отпускаем ячейки, и бежим дальше.

Только такое поведение будет считаться правильным. За любое отступление от алгоритма буду снимать балы.

Я для простоты рисовал прям из потоков, лоча канвас на время рисования, это быстро и требует минимальной синхронизации. 

Все события отлова удобно отправлять в виде сообщений. Так решили многие.

Автор: AntonN 20.10.2008, 12:34
Alexeis
Цитата

ситуация Хулиган перед тем как занять, проверят не занята ли ячейка, если занята, то он пойман, иначе занимает ячейку

Означает ли это, что хулигану нельзя отрисовываться, когда ячейка занята дворником? если да - простестую, в задании таких подробностей нет. Даже логически поразмыслить - дворник (настоящий smile ) поймает хулигана в тот момент, когда он встанет возле него с мусором, а не когда он подумает прибежать из другого конца парка. Да и отрисовка может отличаться от предложенной...
Так же нет подробностей по алгоритму оставления пакетика - сразу по прибытии или перед переходом на слудующую ячейку.


Автор: Alexeis 20.10.2008, 12:55
Цитата(AntonN @  20.10.2008,  11:34 Найти цитируемый пост)
Означает ли это, что хулигану нельзя отрисовываться, когда ячейка занята дворником? если да - простестую, в задании таких подробностей нет.

  Касательно отрисовки это второстепенно, к таким мелочам придераться не будем, тем более что сразу после такого события поверх всего должен появиться кружек. По этому пункту согласен.

Цитата(AntonN @  20.10.2008,  11:34 Найти цитируемый пост)
Так же нет подробностей по алгоритму оставления пакетика - сразу по прибытии или перед переходом на слудующую ячейку.

  Если пакетик будет оставлен перед переходом, а не до паузы в 60 мс, то хулигана не возможно будет поймать, по моему это очевидно, ведь если он ничего не выбросил, то за что его ловить? Ловят с поличным, после того как выбросил.

Цитата(Alexeis @  16.10.2008,  09:59 Найти цитируемый пост)
Хулиган появляется в произвольной позиции на поле и выбрасывает за раз только 1 пакетик (занимает ячейку) в течении 60мс, после чего он исчезает


Выбрасывание пакетика эквивалентно занятию ячейки, но всякие флаги того что мусор уже выброшен или в процессе (у кого как), должны быть выставлены до периода в 60мс. Флаг "выбрасывает" или "выбросил" выставленный до 60 мс буду считать эквивалентными.

Автор: AntonN 20.10.2008, 13:03
Alexeis, т.е. сел в клетку, тут же выкинул пакет, тут же получил по шее, если попал к дворнику? ну а если дворника нет - так и сидит в грязи 60мс smile

а вот про сообщения я даже не догадался, тут действительно можно было применить smile привык работать многопоточно без форм...

Автор: Alexeis 20.10.2008, 13:09
Цитата(AntonN @  20.10.2008,  12:03 Найти цитируемый пост)
Alexeis, т.е. сел в клетку, тут же выкинул пакет, тут же получил по шее, если попал к дворнику? ну а если дворника нет - так и сидит в грязи 60мс smile

  60мс ну смотри, это ж очень мало, почти мгновенно, потом в течении 300 мс спокойно убегает. Т.е. в среднем он не так долго сидит  smile . В примере на 60мс клетка желтеет. Его можно поймать только пока он желтый smile .

Автор: MetalFan 20.10.2008, 13:35
Цитата(Alexeis @  20.10.2008,  12:55 Найти цитируемый пост)
тем более что сразу после такого события поверх всего должен появиться кружек.

в задании это не было обязательным условием...
было написано 
Цитата
Условие поимки. Попытка одновременного доступа (2х потоков) к общей ячейке.

а уже в примере реализации было про кружок...
я посчитал это необязательным условием.

Автор: Rrader 20.10.2008, 14:34
Правильное решение 3-го задания
В Delphi конструктор может работать в двух режимах - создавать объект и реинициализировать созданный объект. Режим определяется способом вызова конструктора - в первом случае он вызывается как метод класса, во втором случае - как метод созданного объекта.

Delphi различает эти режимы по скрытому параметру, неявно передающемуся в конструктор. Если рассмотреть конструктор как обычную процедуру, то его можно представить следующим образом:

Код

constructor TDummy.Create(Value: Integer); virtual;
// Эквивалентен:
function TDummyCreate(TypeInfo: Pointer; Alloc: Boolean; Value: Integer): TDummy;

По соглашению параметры будут переданы следующим образом:
TypeInfo - EAX - информация о создаваемом классе.
Alloc - EDX - флаг режима, выделять память или нет. Поскольку однобайтовый, то достаточно использовать для него регистр DL (так делает Delphi).
Value - ECX - первый параметр конструктора.

Адрес конструктора можно получить так:
Код

@TDummy.Create;

Назначив его любой переменной процедурного типа, его можно вызвать:
Код

function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
type
  TCreator = function(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
var
  Creator: TCreator;
begin
  @Creator := @TDummy.Create;
  Result := Creator(FTypeInfo, Alloc, Value);
end;

Но зная, что при вызове Creator параметры уже подготовлены, можно переписать код более компактно:
Код

function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
type
  TCreator = function: TDummy;
var
  Creator: TCreator;
begin
  @Creator := @TDummy.Create;
  Result := Creator;
end;

А вот и пример использования:
Код

...
var
  Dummy: TDummy;
begin
  { Создание }
  Dummy := CreateClass(TDummy, True, 10);
  { Реинициализация }
  CreateClass(Dummy, False, 10);
  Dummy.Free;
end;

Задание очень простое, и есть люди, его решившие smile  smile 

Автор: THandle 20.10.2008, 14:39
Rrader, вон оно как...

Блин. Ведь просто же... smile 

RraderAlexeis, огромное спасибо за интересные задания и за сам конкурс вообще smile 

Автор: Mayk 20.10.2008, 16:55
А теперь эталонное решение первой задачи на brainfuck'e для сетки 3х3(прямоугольные - скуучно)  рядом с которым код дельфи скучен и уныл  smile smile  


(код генерился [и даже оптимизировался] скриптом на питоне, поэтому без рабочего интерпретатора brainfuck'а с 16 ячейками вправо и переводом строк по 0x0D лучше не смотреть )


Цитата

13:46:dvl:~/src/t1$ echo 012345678 | bf t1.bf 
012
783
654

13:46:dvl:~/src/t1$ echo zbcdefigh | bf t1.bf 
bcd
ize
hgf

13:47:dvl:~/src/t1$ echo 987654321 | bf t1.bf 
123
894
765



13:47:dvl:~/src/t1$ echo 595555515 | bf t1.bf 
155
595
555


Добавлено через 40 секунд
сам код слшиком большой чтобы пихать в сообщение :-(

Автор: CodeMonkey 20.10.2008, 17:30
Цитата(Rrader @  20.10.2008,  14:34 Найти цитируемый пост)
Но зная, что при вызове Creator параметры уже подготовлены

Аккуратнее надо.

Код
function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
(*
  FTypeInfo - eax
  Alloc - edx
  Value - ecx
*)
type
  TCreator = function(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
var
  Creator: TCreator;
begin
  @Creator := @TDummy.Create;
  // Поскольку в CreateClass FTypeInfo не используется, то eax - свободен. Следовательно, адрес конструктора копируется в eax, затирая ссылку на класс
  Result := Creator;
  // Конструктор получает ссылку на самого себя вместо ссылки на класс с соответствующими последствиями
end;


Добавлено через 1 минуту и 27 секунд
P.S. 
Цитата(CodeMonkey @  20.10.2008,  17:30 Найти цитируемый пост)
адрес конструктора копируется в eax

Допускаю, что может зависеть от версии компилятора и режимов компилирования, но выбор свободного общедоступного регистра eax, а не какого-либо другого - логичен.

Автор: MetalFan 20.10.2008, 17:36
кстати, можно поспорить о пользе использования конструктора для "реинициализации" объекта...
если в конструкторе создаются другие объекты, то будет утечка памяти. или я чегото недопонял)

Автор: Poseidon 20.10.2008, 17:47
Rrader, вообще-то в условии задания было 
Код

...
var
  Dummy: TDummy;
begin
  Dummy := TDummy.Create(123); // Подобные вызовы в любом месте решения запрещены!
end;


лично я это расценил как запрет вообще ссылаться на Create класса TDummy. Т.к. условие можно трактовать так, что @TDummy.Create так же запрещено использовать. Конечно, в таком виде решение элементарное. А вот мне бы хотелось увидеть решение без ссылания на метод Create класса TDummy (как было по условию). Как-то не правильно получилось. По условию запрещаем, а потом в правильном решении используем...

Автор: Rrader 20.10.2008, 17:49
CodeMonkey, у нас в заданиях D7. Ничего не затирается, смотрим ассемблерный код функции. EAX ни при чем.

MetalFan, да, за этим нужно следить. Ну так уж создатели Delphi придумали, такую возможность.

Добавлено @ 17:52
Poseidon, в задании было сказано, что запрещено вызывать конструктор только напрямую. Приведен пример неправильного вызова. И специально сделан пункт, где сказано, что все остальное можно.

Посмотрел код на других версиях Delphi - дело имеет место быть, оптимизатор лучше сделан.

Автор: aktuba 20.10.2008, 20:49
Цитата(Poseidon @  20.10.2008,  18:47 Найти цитируемый пост)
лично я это расценил как запрет вообще ссылаться на Create класса TDummy. Т.к. условие можно трактовать так, что @TDummy.Create так же запрещено использовать. Конечно, в таком виде решение элементарное. А вот мне бы хотелось увидеть решение без ссылания на метод Create класса TDummy (как было по условию). Как-то не правильно получилось. По условию запрещаем, а потом в правильном решении используем... 

Полностью согласен... Двигался в том же напралении. Теперь вод рад, что чуть раньше сошел (по личным причинам), не решая 3-ю задачу. А то ведь всю голову сломал, пытаясь в ручную выделить память, заполнить ее и вызвать конструктор.

Если уж запретили конструктор использовать (я именно так понял из задачи), то "верный ответ" какой-то не правильный...

В целом, конкурс хороший. Предлагаю проводить ежемесячно  smile

Добавлено через 46 секунд
Цитата(Rrader @  20.10.2008,  18:49 Найти цитируемый пост)
CodeMonkey, у нас в заданиях D7. Ничего не затирается, смотрим ассемблерный код функции. EAX ни при чем.

Предлагал же отказаться от какой-то определенной версии  smile 

Автор: MetalFan 20.10.2008, 20:55
по моему в задании было четко написано "не вызывать конструктор напрямую, все остальное делать можно". получение адреса конструктора - это же не прямой вызов.

Автор: THandle 20.10.2008, 20:59
Так. Отъехали все от Rrader'а.

Задание вам, товарищи, не понравилось, видимо потому что вы его не сделали smile 

На самом же дела все четко было написано:

Цитата(Alexeis @  16.10.2008,  11:59 Найти цитируемый пост)
Не вызывать конструктор напрямую:


Разве взятие адреса есть вызов??? 
Я лично двигался в направлению к верному решению, но... забыл блин о том что по порядку передается, в регистрах. Пытался извращаться. В итоге получился бред smile А задание между прочим было очень интересное, зря вы.

Цитата(aktuba @  20.10.2008,  21:49 Найти цитируемый пост)
В целом, конкурс хороший. Предлагаю проводить ежемесячно 


Кто задания будет сочинять? smile 

Лично на следующий конкурс выдвигаю в комиссию участника под ником THandle.

И вообще мне вот что интересно. Победитель получит приз - перевод в группу "эксперт". Но разве человек, который все это придумал не достоит того же? Я лично считаю что и Rrader должен быть повышен до "Эксперта".

Добавлено через 23 секунды
MetalFan,  smile 

Автор: aktuba 20.10.2008, 21:14
Цитата(MetalFan @  20.10.2008,  21:55 Найти цитируемый пост)
по моему в задании было четко написано "не вызывать конструктор напрямую, все остальное делать можно". получение адреса конструктора - это же не прямой вызов.


Цитата(THandle @  20.10.2008,  21:59 Найти цитируемый пост)
Разве взятие адреса есть вызов??? 

Ну тогда можно было через NewInstance/InitInstance делать, насколько я понимаю... Да и вообще получится куча решений, которые будут вызывать конструктор не напрямую, но вызывать будут. И что-то мне подсказывает, что их бы не принли  smile 

Автор: THandle 20.10.2008, 21:20
Цитата(aktuba @  20.10.2008,  22:14 Найти цитируемый пост)
Ну тогда можно было через NewInstance/InitInstance делать, насколько я понимаю... 


Ну я в принципе так и сделал. Только это неверно. Это не полностью имитирует конструктор.

Ладно. Чо то оффтопик пошел уже.

Автор: MetalFan 20.10.2008, 21:29
Цитата(aktuba @  20.10.2008,  21:14 Найти цитируемый пост)
Ну тогда можно было через NewInstance/InitInstance делать, насколько я понимаю...

ага... только еще корректно вызвать код конструтра(ов) останется...

Автор: aktuba 20.10.2008, 21:30
Цитата(MetalFan @  20.10.2008,  22:28 Найти цитируемый пост)
ага... только еще корректно вызвать код конструтра(ов) останется... 

Так это просто пример. Таких примеров кучу можно сделать  smile 

Автор: AntonN 20.10.2008, 21:41
тут главное не тучу примеров сделать, а правильно сформулировать задание с учетом "нужности" навыка.

Автор: Alexeis 20.10.2008, 21:54
Цитата(AntonN @  20.10.2008,  20:41 Найти цитируемый пост)
тут главное не тучу примеров сделать, а правильно сформулировать задание с учетом "нужности" навыка. 

  Гм... хорошо, когда есть кому почитать задание и глянуть со стороны. Нам не очень удалось собрать активных (не занятых участников), так что над заданиями фактически сидели всего 2е. Тебе кажется что все ясно и яснее быть не может, а другому не так.

  В любом случае идет проверка задний, выставление баллов, я проверяю вторые задания 
Rrader, 3ие, до первых мы еще не добрались. Так что терпение (мы все работаем, учимся). Кроме того в следующий раз, нужно договориться о формате решений задач, куда и в каком виде. Думаю нужно договориться с Вовой и завести общественное мыло для комиссии и соответственно менять пароль к каждому конкурсу. Так же принимаются идеи по темам задач.

Автор: AntonN 20.10.2008, 22:02
Alexeis
Цитата

Думаю нужно договориться с Вовой и завести общественное мыло для комиссии и соответственно менять пароль к каждому конкурсу. 

а можно написать страничку для закачки, где участники просто закачивают решение, комиссия потом просто забирает их из админки. Но врядли такое будет на мощностях этого сайта. Можно на собственном сайте реализовать, но там придется каждому зарегиться, а это так лень тащиться куда то и региться smile

Автор: aktuba 20.10.2008, 22:08
Цитата(Alexeis @  20.10.2008,  22:54 Найти цитируемый пост)
Так же принимаются идеи по темам задач.

Тут все сложно. На мой взгляд, должны быть несколько категорий задач: алгоритмы, работа с классами (стандартными и написание своих), работа с WinAPI, сеть и т.д. Например, для следующего конкурса, можно сделать 4 задачи, по основным разделам форума: для новичков (например, работа со стандартными классами), общие (алгоритмы/потоки), графика и сеть. Что думаете?

P.S.: задания, наподобии 3-е данного конкурса, необходимо полностью исключить! Причины, я вижу, две:

1. Зависимость от версии Delphi
2. Задача, скорее, для знакотов ASM, а не Delphi. Мало кому приходится копаться в регистрах и ассемблере (что я считаю большим плюсом).

Лучше сделать задачи на наследование/инкапсюляцию классов, что очень полезно для delphi-программистов (часто встречаю, что люди понятия не имеют, что это такое. подобные задачи заставят выучить, зазубрить и понять это ;))

Автор: Rrader 21.10.2008, 04:19
Цитата(aktuba @  21.10.2008,  05:08 Найти цитируемый пост)
1. Зависимость от версии Delphi

Код

function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
type
  TCreator = function(FTypeInfo: Pointer;
    Alloc: Boolean; Value: Integer): TDummy;
var
  Creator: TCreator;
begin
  @Creator := @TDummy.Create;
  Result := Creator(FTypeInfo, Alloc, Value);
end;

Задание придумывал так, чтобы оно не зависело от версии Delphi. Мое последнее "компактное" решение - уже мой недочет, в плане этого пункта, но оно гарантированно работает на D7 (и на более новых Delphi с отключенной оптимизацией).
Код

{$O-}
function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
type
  TCreator = function: TDummy;
var
  Creator: TCreator;
begin
  @Creator := @TDummy.Create;
  Result := Creator;
end;
{$O+}


Цитата(aktuba @  21.10.2008,  04:14 Найти цитируемый пост)
Да и вообще получится куча решений, которые будут вызывать конструктор не напрямую, но вызывать будут. И что-то мне подсказывает, что их бы не принли

Мы не такие звери, все решения будут приняты smile 

Цитата(aktuba @  21.10.2008,  05:08 Найти цитируемый пост)
2. Задача, скорее, для знакотов ASM, а не Delphi. Мало кому приходится копаться в регистрах и ассемблере (что я считаю большим плюсом).


Делов было на 5-минут.

Теперь каждый участник знает, как можно создать класс из asm-вставки smile 
Цитата(AntonN @  21.10.2008,  04:41 Найти цитируемый пост)
задание с учетом "нужности" навыка


Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Dummy: TDummy;
  TypeInfo: Pointer;
begin
  TypeInfo := TDummy;
  asm
          MOV EAX, TypeInfo
          MOV DL, True
          MOV ECX, 10
          CALL TDummy.Create
          MOV Dummy, EAX
          { Free }
          CALL TDummy.Free
  end;
end

Автор: Poseidon 21.10.2008, 08:39
Цитата(aktuba @  20.10.2008,  20:49 Найти цитируемый пост)
А то ведь всю голову сломал, пытаясь в ручную выделить память, заполнить ее и вызвать конструктор.
Вот. Видели бы вы тот код...  smile 

Все-равно, хоть и получаем адрес конструктора, но ведь что бы получить адрес, мы запрашиваем его напрямую у класса, т.е., по сути обращаемся на прямую к конструктору (да, не вызываем на прямую, а всего лишь адрес считываем, но все же). Тут все-таки не дополнительные задания на экзамене, а конкурс. И вопросы нужно формулировать однозначно. Иначе получилось "сделайте как я задумал и никак иначе".

(мне вот интересно, а если бы горе-программист, который писал TDummy, взял и отошел от соглашений и назвал конструктор не Create, а как-нибудь иначе. Вы бы также использовали в своем "правильном решении" @TDummy.Create? Нет? А как? Сослались бы на другое имя? Т.е. обратились бы к конструктору по другому имени? Если учесть, что в задании "использовать конструктор на прямую нельзя", то вам должно быть все-равно как называется конструктор у исходного класса. Именно так я понял задание, именно так я его пытался сделать).

Автор: AntonN 21.10.2008, 10:14
Poseidon
Цитата

мне вот интересно, а если бы горе-программист, который писал TDummy, взял и отошел от соглашений и назвал конструктор не Create, а как-нибудь иначе. Вы бы также использовали в своем "правильном решении" @TDummy.Create? Нет? А как? Сослались бы на другое имя? Т.е. обратились бы к конструктору по другому имени?

меня другое интересует, а что было бы если бы там был не Д7 (в чужой программе), а другая версия, при этом нужно узнавать версию, и написано ли приложение вообще на дельфи smile

Автор: aktuba 21.10.2008, 13:59
Цитата(Rrader @  21.10.2008,  05:19 Найти цитируемый пост)
Мы не такие звери, все решения будут приняты  

Сейчас то какая разница? Суть не в этом, а в том, что задание было на запрет вызова конструктора (как я понял, да и многие другие), а в результате все-равно вызывался конструктор. На примере формы, можно так:
Код

Form1 := TForm.Create;

а можн так:
Код

CreateForm(...);

Причем это стандартный вызов конструктора, хотя и не используется обычный вызов. Такое решение подошло бы? Или это считалось бы не верным решением?

Цитата(Rrader @  21.10.2008,  05:19 Найти цитируемый пост)
Делов было на 5-минут.

=))) Подмести пол тоже не долго, но к Delphi отношения не имеет ;)

Цитата(Rrader @  21.10.2008,  05:19 Найти цитируемый пост)
Теперь каждый участник знает, как можно создать класс из asm-вставки

Лучше бы каждый участник научился правильно использовать наследование, чем учить ассемблерные вставки. Я, например, ничему из этого задания не научился, т.к. мне не нужен ассембер, я против его использовани. Скорее всего и другием тоже ничего не дало, по другим причинам.

Цитата(Rrader @  21.10.2008,  05:19 Найти цитируемый пост)
задание с учетом "нужности" навыка

Об этом и сказал выше. Такая "нужность" мало кому нужна. Очень мало. Потоки или графика или, даже, сеть, нужна куда чаще.

Автор: Rrader 21.10.2008, 14:03
Есть два типа людей - одни постоянно спрашивают, куда катится этот мир? А другие катят его.

Цитата(Poseidon @  21.10.2008,  15:39 Найти цитируемый пост)
Если учесть, что в задании "использовать конструктор на прямую нельзя"

В задании было запрещено только вызывать конструктор с параметром. И приведен пример, как делать нельзя. В самом задании была дана подсказка: "Зная адрес конструктора, его можно вызвать".

Сколько еще будем перепираться? smile 

AntonN, еще раз повторюсь, от версии Delphi это не зависит. Или Вам кодом ткнуть?

Добавлено через 5 минут и 8 секунд
Цитата(aktuba @  21.10.2008,  20:59 Найти цитируемый пост)
Причем это стандартный вызов конструктора, хотя и не используется обычный вызов. Такое решение подошло бы? Или это считалось бы не верным решением?

Внимательно читаем задание.

Цитата(aktuba @  21.10.2008,  20:59 Найти цитируемый пост)
а в результате все-равно вызывался конструктор.

Да, но не напрямую - это значит без круглых скобочек.

Цитата(aktuba @  21.10.2008,  20:59 Найти цитируемый пост)
Лучше бы каждый участник научился правильно использовать наследование, чем учить ассемблерные вставки. Я, например, ничему из этого задания не научился, т.к. мне не нужен ассембер, я против его использовани. Скорее всего и другием тоже ничего не дало, по другим причинам.

Задания на наследование и рядом не стоят с заданиями на глубину познания компилятора.

Цитата(aktuba @  21.10.2008,  20:59 Найти цитируемый пост)
Об этом и сказал выше. Такая "нужность" мало кому нужна. Очень мало. Потоки или графика или, даже, сеть, нужна куда чаще.

А мне за это приличные деньги платят...

Автор: aktuba 21.10.2008, 14:11
Цитата(Rrader @  21.10.2008,  15:03 Найти цитируемый пост)
Есть два типа людей - одни постоянно спрашивают, куда катится этот мир? А другие катят его.

Нее, дело не в этом. Вопросы задаются, чтобы получать на них ответы. Задания дааются чтобы их решать. Данное задание было описано так, что для всех запрещено вызывать конструктор, а для "правильного" решения можно. Это не препирательство, хотелось бы на будущее исключить подобные казусы. Поэтому и предлагаю исключить на будущее подобные, бессмысленные, задания.

Добавлено через 8 минут и 9 секунд
Цитата(Rrader @  21.10.2008,  15:03 Найти цитируемый пост)
А мне за это приличные деньги платят...

А мне и без этого платят не плохо ;) Дело то не в этом. Такие задания, да еще с такой формулировкой, ОЧЕНЬ мало кому понятны и нужны. Отметьте для себя на будущее.

Автор: THandle 21.10.2008, 14:21
Модератор: хватит уже спорить!!! Вы еще поругайтесь!!!


aktuba, если подобные задания будут исключены, лично я врядли буду принимать участие в конкурсе. Вы путаете вызов конструктора, и взятие его адреса.
И действительно, в задании была подсказка:

Цитата

Зная адрес конструктора, его можно вызвать


Все, будьте разумными, хватит спорить из за какого то задания.

Автор: Rrader 21.10.2008, 14:26
aktuba
Poseidon

Тем не менее, Вы не решили это задание никаким образом. Ни через Create, ни через NewInstance. Тема закрыта.

Автор: Alexeis 21.10.2008, 14:36
  Ну и не следовало ожидать что все все поймут. Так никогда не бывает. Согласитесь, довольно много народу поняло о чем речь сами, без подсказок. Причем такая картина наблюдалась по всем задачам. Кто-то не дополнял одно, кто-то другое, но не было ни одного такого момента или условия чтобы абсолютно все до одного не поняли. Многие стучались в асю, в ПМ, спрашивали, однако наиболее правильные решения в основном у тех кто вообще ничего не спрашивал, а тихо решал и внимательно читал задания. 

Автор: Rrader 21.10.2008, 14:39
В общем, мне жаль, что так остро все приключилось.
aktubaPoseidon, в следующем конкурсе будем участвовать вместе smile 

Автор: aktuba 21.10.2008, 15:17
Цитата(Rrader @  21.10.2008,  15:26 Найти цитируемый пост)
Тем не менее, Вы не решили это задание никаким образом. Ни через Create, ни через NewInstance. Тема закрыта. 

Ну я и не решал, о чем и предупредил заранее.
Цитата(THandle @  21.10.2008,  15:21 Найти цитируемый пост)
aktuba, если подобные задания будут исключены, лично я врядли буду принимать участие в конкурсе. Вы путаете вызов конструктора, и взятие его адреса.

Ну а я наоборот - с такими не буду принимать участие. Так что предлагаю делать через раз ;)

Автор: Rrader 21.10.2008, 15:45
Вот еще как можно, совсем не вызывая конструктор напрямую, не получая его адрес по имени: smile 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TDummy = class(TObject)
  private
    FValue: Integer;
  public
    procedure ShowValue; virtual;
    constructor Create(Value: Integer); virtual;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TDummy.Create(Value: Integer);
begin
  inherited Create;
  FValue := Value;
  ShowValue;
end;

procedure TDummy.ShowValue;
begin
  ShowMessage('Value is: ' + IntToStr(FValue));
end;

function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
type
  TCreator = function(FTypeInfo: Pointer;
    Alloc: Boolean; Value: Integer): TDummy;
var
  Creator: TCreator;
begin
  if Alloc then
    Creator := TCreator(PPointer(Integer(FTypeInfo) + 4)^)
  else
    Creator := TCreator(PPointer(PInteger(FTypeInfo)^ + 4)^);
  Result := Creator(FTypeInfo, Alloc, Value);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Dummy: TDummy;
begin
  Dummy := CreateClass(TDummy, True, 100);
  CreateClass(Dummy, False, 100);
  Dummy.Free;
end;

end.

Автор: MetalFan 21.10.2008, 18:44
Rrader, у меня сначало была идея высчитать оффсет конструктора в VMT... но имхо это еще более зависимый от версии делфи способ...

Добавлено через 31 секунду
и вообще в защиту составителей задач - все задачи по-своему интересны) в т.ч. и 3я.

Автор: jsa 22.10.2008, 04:43
Цитата(Rrader @  21.10.2008,  19:03 Найти цитируемый пост)
В задании было запрещено только вызывать конструктор с параметром. И приведен пример, как делать нельзя. В самом задании была дана подсказка: "Зная адрес конструктора, его можно вызвать"

так и думал что надо получать адрес конструктора, но как это сделать если экземпляр класса не существует? значит должен существовать некий прелоадер классов, который получает данные о классе (я так думаю что и есть VMT), и потом уже выполняетя конструктор
если так, то можно ли получить доступ к этому некоему прелоадеру используя чистый паскаль, без ассемблера
Цитата(Rrader @  21.10.2008,  20:45 Найти цитируемый пост)

Код



function CreateClass(FTypeInfo: Pointer;  Alloc: Boolean; Value: Integer): TDummy;
type  TCreator = function(FTypeInfo: Pointer;    Alloc: Boolean; Value: Integer): TDummy;
var  Creator: TCreator;
begin  
if Alloc then    Creator := TCreator(PPointer(Integer(FTypeInfo) + 4)^)  else    Creator := TCreator(PPointer(PInteger(FTypeInfo)^ + 4)^);  
Result := Creator(FTypeInfo, Alloc, Value);
end;


уверен что это не единственный способ вызвать конструктор не напрямую

Автор: Poseidon 22.10.2008, 08:29
Цитата(Rrader @  21.10.2008,  15:45 Найти цитируемый пост)
Вот еще как можно, совсем не вызывая конструктор напрямую, не получая его адрес по имени:
Браво! Убедил! + smile

Автор: CodeMonkey 22.10.2008, 09:07
Цитата(Poseidon @  22.10.2008,  08:29 Найти цитируемый пост)
Браво! Убедил! +

Кстати, этот пример не сильно отличается от предыдущего.
Для начала заметим, что для его работы требуется, чтобы конструктор был виртуальным (не зря, наверное, в условии задачи приведено описание класса именно с виртуальным конструктором). Предыдущий пример работал бы с любым конструктором.
А проблема в этом примере в том, что мы всё равно должны иметь на руках больше информации, чем указатель на класс. В первом примере у нас на руках была информация: указатель на класс и адрес конструктора.
В этом примере адрес конструктора заменён на "волшебное число" (справка: волшебное число - это любое число, отличное от 0 и +/-1). Это число показывает смещение записи с адресом конструктора в VMT класса. Иными словами адрес конструктора мы заменили на информацию о его местонахождении. 
Это значит, что нам всё ещё необходимо знать что-то об устройстве класса: а именно, сколько он имеет виртуальных методов и как они располагаются относительно конструктора. В частности, если убрать или добавить методов до конструктора, то пример перестанет работать.

Добавлено через 7 минут и 30 секунд
Кстати, а как вам такая задачка на знание Delphi:

Код
function GetSomeObject: TSomeClass;
begin
  Result := nil;
  try
    Result := TSomeClass.Create;
    // ... действия с Result, его инициализиация, заполнение и т.п.
  except
    FreeAndNil(Result);  
  end;
end;


Это функция, которая создаёт, заполняет и возвращает новый объект. Если объект создать нельзя - функция возвращает nil.
Вопрос: может ли функция возбудить исключение? 
Не в смысле, что исключение просто будет возбуждено внутри функции - понятно, что в ... может прямо стоять raise. А с смысле, может ли исключение выйти наружу функции? Т.е. может ли код, вызывающий эту функцию, словить exception? Если нет, то объяснить почему ;)

Автор: MetalFan 22.10.2008, 12:24
CodeMonkey, я думаю - не может (в случае, если исключение возникнет в конструкторе, то Result := nil и все ок, если возникнет позже, то Result <> nil и опять же все ок). 
если всетаки может - объясни почему.
добавлено позже: нет, всетаки может. если в деструкторе объекта возникнет исключение.

Автор: pseud 22.10.2008, 14:14
Цитата(MetalFan @  22.10.2008,  12:24 Найти цитируемый пост)
добавлено позже: нет, всетаки может. если в деструкторе объекта возникнет исключение.

того же мнения. 
значит необходима конструксион:
Код

function GetSomeObject: TSomeClass;
begin
  Result := nil;
  try
    Result := TSomeClass.Create;
    // ... действия с Result, его инициализиация, заполнение и т.п.
  except
    try
      FreeAndNil(Result);  
    except
    end;
  end;
end;

Автор: MetalFan 22.10.2008, 21:59
а результаты когда предположительно станут известны?

Автор: Alexeis 22.10.2008, 22:09
Цитата(MetalFan @  22.10.2008,  20:59 Найти цитируемый пост)
а результаты когда предположительно станут известны? 

  Думаю завтра. 2е и 3е задачи проверены, остались первые. Вас много, а нас мало smile .

Автор: CodeMonkey 23.10.2008, 09:06
MetalFan, да в такой формулировке ответ найти легко, а вот в другом виде он был бы не так очевиден, т.к. если функция обёрнута в try/except на все исключения, то "есть интуитивное представление", что наружу выпускать исключения она не может - их же "except обрабатывает".

Автор: Alexeis 23.10.2008, 22:16
Извините за задержку. Победителя 2, решаем как поступить  smile 

Автор: Christoph 23.10.2008, 22:38
Дайте им еще одно задание smile а можно я им придумаю?  smile 

Автор: ne0n 24.10.2008, 00:37
Цитата(Alexeis @  23.10.2008,  22:16 Найти цитируемый пост)
Извините за задержку. Победителя 2, решаем как поступить  



что тут решать, обоим присудить победу!!! smile 

Автор: Alexeis 24.10.2008, 08:04
Цитата(ne0n @  23.10.2008,  23:37 Найти цитируемый пост)
что тут решать, обоим присудить победу!!!

  Я не то не против, но все от меня зависит. Сейчас решения 3х победителей пересматривает Girder, думаю у него могут получиться другие балы. Наберитесь терпения. Пока что можно объявить только места ниже 3го, начить торжественную раздачу плюсеков и публикацию решений.

Автор: Poseidon 24.10.2008, 08:39
Цитата(Alexeis @  24.10.2008,  08:04 Найти цитируемый пост)
Пока что можно объявить только места ниже 3го, начить торжественную раздачу плюсеков и публикацию решений. 
Ну и..? Огласите весь список, пжалуста (с) smile

Автор: Alexeis 24.10.2008, 09:49
Цитата(Poseidon @  24.10.2008,  07:39 Найти цитируемый пост)
Ну и..? Огласите весь список, пжалуста (с) 

ТАДАМ smile

Объявляем победителей конкурса. Всего можно было набрать 60 баллов, 10 за 1ю, 30 за 2ю, 20 за 3ю
bems      - ?
MetalFan    - ?
actual    - ?

Sajtran    - 41
aktuba    - 30
AntonN    - 27
Poseidon    - 24
jsa       - 23
THandle - 19


ne0n             - 10
Shaggy          - 9
Felan             - 9 
tHE_EGOiSTE - 4
Qu1nt             - 3
mr.Anderson   -2
Staruha          - 2

Очень хорошие решения представили Sajtran,  AntonNaktubajsa
Суперское решение первой задачи представили ne0nbems и Shaggy
Очень хорошо 3е задание решил bems.
2е задание лучше всех удалось MetalFan. Очень грамотно, аккуратно, эффективно и прозрачно.

Как и обещалось все кто прислал решения хотя бы одной задачи или попытку решения, получат по одному +

 Все задачи были просмотрены на предмет упущений, отступлений от задания, т.е. весьма подробно.

 

Автор: Poseidon 24.10.2008, 09:58
Блин, я в шоке. Обошел людей, которых считал в начале фаворитами. Ааааа  smile 

Ждем обьявления победителей и лучшие решения smile

Автор: Alexeis 24.10.2008, 10:08
Публикую все решения, в порядке их прихода.

----------------------------------------------------------------------

tHE_EGOiSTE
1)
Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label2: TLabel;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Edit3: TEdit;
    Label5: TLabel;
    label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
  Mas, Mas2: array[1..200, 1..200] of integer;
  ar: array[1..500] of integer;
  i, j, m, n, k, h, l, p, kol_vo: integer;
  str, str2: string;
begin
  Memo1.Clear;
// проверка на ошибки
  if (edit1.Text = '') or (edit2.Text = '') then begin
    exit;
  end;
  Label4.Caption := 'Элементы матрицы заданы произвольно';
// считывание m и n
  n := StrToInt(edit1.text);
  m := StrToInt(edit2.text);
// заполнение матрицы
  randomize;
  for i := 1 to n do begin
    for j := 1 to m do
    begin
      Mas[i, j] := random(10);
      Mas[j, i] := Mas[i, j];
    end;
  end;
// вывод матрицы
  memo1.Lines.Add('Матрица :');
  for i := 1 to n do begin
    str := ''; str2 := '';
    for j := 1 to m do begin
      str := IntToStr(Mas[i, j]);
      str2 := str2 + str + '   ';
    end;
    memo1.Lines.Add(str2);
  end;
// подсчет кол-ва елементов в матрице
  kol_vo := 0;
  for i := 1 to n do begin
    for j := 1 to m do kol_vo := kol_vo + 1;
  end;
// выполнение обхода
  k := 1; h := 2;
  repeat
    if (m = 1) and (n = 1) then begin ar[k] := Mas[n, m]; k := k + 1; end;
    if (m = 1) and (n > 1) then begin
      for i := 1 to n do begin
        ar[k] := Mas[i, m];
        k := k + 1;
      end; end;
    if (n = 1) and (m > 1) then begin
      for i := 1 to m do begin
        ar[k] := Mas[n, i];
        k := k + 1;
      end; end;
    if (m > 1) and (n > 1) then begin
      for j := 1 to m - h + 1 do begin
        ar[k] := Mas[1, j];
        k := k + 1;
      end;
      for j := 1 to n - h + 1 do begin
        ar[k] := Mas[j, m];
        k := k + 1;
      end;
      for j := m downto 2 do begin
        ar[k] := Mas[n, j];
        k := k + 1;
      end;
      for j := n downto 2 do begin
        ar[k] := Mas[j, 1];
        k := k + 1;
      end;
    end;
    if (n > 2) and (m > 2) then begin
      l := h;
      for i := h - 1 to n do begin
        p := h;
        for j := h - 1 to m do begin
          Mas2[i, j] := Mas[l, p];
          p := p + 1;
        end;
        l := l + 1;
      end;
      for i := 1 to n - 2 do begin
        for j := 1 to m - 2 do begin
          Mas[i, j] := Mas2[i, j];
        end; end;
      n := n - 2; m := m - 2;
    end;
  until (k - 1 = kol_vo);
// вывод результата
  str := '';
  for i := 1 to k - 1 do
    str := str + IntToStr(ar[i]) + '  ';
  edit3.Text := str;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  Label4.Caption := '        ';
  edit1.Text := '';
  edit2.Text := '';
  edit3.Text := '';
  Memo1.Clear;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
  close;
end;
end.

или проект http://rapidshare.com/files/154508437/_______________1.rar.html

3)
Код

(* Разработал tHE_EGOiSTE *)
(*!!! Суть в применении механизма виртуальных
 конструкторов совместно со ссылкой на класс !!!*)
unit UMain;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, XPMan;
type
  TDummy = class(TObject)
  private
    fValue: Integer;
  public
    { Виртуальный конструктор }
    constructor Create(Value: Integer); virtual;
    { Показ переданного значения }
    procedure ShowValue; virtual;
  end;
  { Новый тип ссылки на класс }
  TFooDummy = class of TDummy;
type
  TForm1 = class(TForm)
    mmoLog: TMemo;
    Panel1: TPanel;
    btnCreateObj: TButton;
    XPManifest1: TXPManifest;
    Edit1: TEdit;
    Label1: TLabel;
    procedure btnCreateObjClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  { Создание объекта класса TDummy }
  function CreateClass(DummyClassRef: TFooDummy; Value: Integer): TDummy;
var
  Form1: TForm1;
implementation
{$R *.dfm}
function CreateClass(DummyClassRef: TFooDummy; Value: Integer): TDummy;
begin
    Result := DummyClassRef.Create(Value);
//    with Result do
//    begin
//        fValue := Value;
//        ShowValue;
//    end;
end;
procedure TForm1.btnCreateObjClick(Sender: TObject);
var
    Dummy: TDummy;            { объект }
    DummyClassRef: TFooDummy; { класс }
    x: Integer;               { параметр конструктора }
begin
    { Инициализируем переменную }
    DummyClassRef := TDummy;
    x := StrToInt(Edit1.Text);
    try
        Dummy := CreateClass(DummyClassRef, x);
        mmoLog.Lines.Add('    объект создан');
    finally
        { Уничтожаем созданный объект }
        FreeAndNil(Dummy);
        mmoLog.Lines.Add('    объект уничтожен'#13#10);
    end;
    end;
{ TDummy }
constructor TDummy.Create;
begin
    inherited Create;
    fValue := Value;
    ShowValue;
end;
procedure TDummy.ShowValue;
begin
    ShowMessage('Value is: ' + IntToStr(fValue));
end;
end.


------------------------------------------------------------------------------------------------------------------------------------------------------

mr.Anderson
1)
Код

program Project1;
{$APPTYPE CONSOLE}
const
  M = 2;
  N = 3;
  Z = M * N;
var
  Matrix: Array [1..M, 1..N] Of Integer;
  Max: Array [1..Z] Of Integer;
  I, J, C, K: Integer;
  Ii, Ij: Integer;
  Ci, Cj: Integer;
//внутри используем глобальный массив без передачи в аргументе, это увеличит скорость
procedure QuickSort(L, R: Integer);
var
  I, J, X, Y: Integer;
begin
  I := L; 
  J := R; 
  X := Max[(R+L) shr 1];
  repeat
    while Max[I] < x do
      Inc(I);
    while X < Max[J] do
      Dec(J);
    if (I <= J) then
    begin
      if (Max[I] > Max[J]) then
      begin
        Y := Max[I]; 
        Max[I] := Max[J]; 
        Max[J] := Y; 
      end; 
      Inc(I);
      Dec(J);
    end;
  until I > J;
  
  if (L < J) then
    QuickSort(L, J);
  if (I < R) then
    QuickSort(I, R);
end;
begin
  Randomize;
  C := 1;
  for I := 1 to M do
    for J := 1 to N do
    begin
      Matrix[I, J] := 0;
      Max[C] := Random(1000);
      Inc(C);
    end;
  QuickSort(1, Z); //сортируем по возрастанию шустрой сортировкой :)
  //сортируем спиралью
  Ii := 0;
  Ij := 0;
  Ci := 1;
  Cj := 1;
  K := 1;
  while true do
  begin
    Ci := Ci + Ii;
    Cj := Cj + Ij;
    Matrix[Ci, Cj] := Max[K];
    Inc(K);
    if (K > Z) then
      break;
    
    if (Cj+1 <= N) then
    begin
      if (Matrix[Ci, Cj+1] = 0) then //по столбцам ->
      begin
        Ii := 0;
        Ij := 1;
      end;
    end
    else if (Ci+1 <= M) then
    begin
      if (Matrix[Ci+1, Cj] = 0) then //по строкам v
      begin
        Ii := 1;
        Ij := 0;
      end;
    end
    else if (Cj-1 >= 1) then
    begin
      if (Matrix[Ci, Cj-1] = 0) then //по столбцам <-
      begin
        Ii := 0;
        Ij := -1;
      end;
    end
    else if (Ci-1 >= 1) then
    begin
      if (Matrix[Ci-1, Cj] = 0) then //по строкам ^
      begin
        Ii := -1;
        Ij := 0;
      end;
    end;
  end;
  //выведем получившуюся матрицу
  for I := 1 to M do
  begin
    for J := 1 to N do
      Write(Matrix[I, J]:4, ' ');
    WriteLn;
  end;
  ReadLn; //глянем, что у нас получилось ;)
end.


--------------------------------------------------------------------------------------------------------------------------

aktuba
1) 
Код

program N1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  C_QSCutOff = 15;

var
  Arr: array of array of Integer;
  m, n: Integer;
  i, j: Integer;

// Используем алгоритм быстрой сортировки
procedure QuickSort(var AArray: array of Integer; AFirst, ALast: Integer);
var
  L, R: Integer;
  lPivot: Integer;
  lTemp: Integer;
  lStack: array[0..63] of Integer;
  lSP: Integer;
begin
  lStack[0] := AArray[AFirst];
  lStack[1] := AArray[ALast];
  lSP := 2;
  while lSP <> 0 do
  begin
    Dec(lSP, 2);
    AFirst := lStack[lSP];
    ALast := lStack[lSP + 1];
    while ((ALast - AFirst) > C_QSCutOff) do
    begin
      R := (AFirst + ALast) div 2;
      if AArray[AFirst] > AArray[R] then
      begin
        lTemp := AArray[AFirst];
        AArray[AFirst] := AArray[R];
        AArray[R] := lTemp;
      end;
      if AArray[AFirst] > AArray[ALast] then
      begin
        lTemp := AArray[AFirst];
        AArray[AFirst] := AArray[ALast];
        AArray[ALast] := lTemp;
      end;
      if AArray[R] > AArray[ALast] then
      begin
        lTemp := AArray[R];
        AArray[R] := AArray[ALast];
        AArray[ALast] := lTemp;
      end;
      lPivot := AArray[R];
      L := AFirst;
      R := ALast;
      while True do
      begin
        Repeat
          Dec®;
        Until AArray[R] <= lPivot;
        Repeat
          Inc(L);
        Until AArray[L] >= lPivot;
        if (l >= R) then
          Break;
        lTemp := AArray[L];
        AArray[L] := AArray[R];
        AArray[R] := lTemp;
      end;
      if (R - AFirst) < (ALast - R) then
      begin
        lStack[lSP] := Succ®;
        lStack[lSP + 1] := ALast;
        Inc(lSP, 2);
        ALast := R;
      end
      else
      begin
        lStack[lSP] := AFirst;
        lStack[lSP + 1] := R;
        Inc(lSP, 2);
        AFirst := Succ®;
      end;
    end;
  end;
end;

procedure QuickInsSort(var AArray: array of Integer; AFirst, ALast: Integer);
var
  i, j: Integer;
  lIndex: Integer;
  lTemp: Integer;
begin
  lIndex := AFirst;
  j := C_QSCutOff;
  if j > ALast then
    j := ALast;
  for i := Succ(AFirst) to j do
    if AArray[i] < AArray[lIndex] then
      lIndex := i;
  if AFirst <> lIndex then
  begin
    lTemp := AArray[AFirst];
    AArray[AFirst] := AArray[lIndex];
    AArray[lIndex] := lTemp;
  end;
  for i := AFirst + 2 to ALast do
  begin
    lTemp := AArray[i];
    j := i;
    while lTemp < AArray[j - 1] do
    begin
      AArray[j] := AArray[j - 1];
      Dec(j);
    end;
    AArray[j] := lTemp;
  end;
end;

procedure DoSort(var AArray: array of Integer);
begin
  QuickSort(AArray, 0, High(AArray));
  QuickInsSort(AArray, 0, High(AArray));
end;

procedure SpirSort;
var
  lTempArr: array of Integer;
  IdxM, IdxN: Integer;
  lCount: Integer;
  f: Boolean;
  xf, yf, x, y: Integer;
  lArr: array of array of Boolean;
begin
  // Подготовка данных для сортировки
  SetLength(lTempArr, m * n);
  lCount := 0;
  for IdxN := 0 to n - 1 do
    for IdxM := 0 to m - 1 do
    begin
      lTempArr[lCount] := Arr[IdxN, IdxM];
      Inc(lCount);
    end;

  // Сортировка временного массива
  DoSort(lTempArr);

  // Инициализация данных для расстановки результатов сортировки
  xf := 1;
  yf := 1;
  f := True;
  x := 0;
  y := 0;
  SetLength(lArr, n);
  for IdxN := 0 to n - 1 do
    SetLength(lArr[IdxN], m);
  for IdxN := 0 to n - 1 do
    for IdxM := 0 to m - 1 do
      lArr[IdxN, IdxM] := False;

  // Расставляем по спирали
  for lCount := 0 to High(lTempArr) do
  begin
    Arr[y, x] := lTempArr[lCount];
    lArr[y, x] := True;
    if f then
    begin
      Inc(x, xf);
      if (x < 0) or (x >= m) or lArr[y, x] then
      begin
        xf := -xf;
        f := not f;
        Inc(x, xf);
        Inc(y, yf);
      end;
    end
    else
    begin
      Inc(y, yf);
      if (y < 0) or (y >= n) or lArr[y, x] then
      begin
        yf := -yf;
        f := not f;
        Inc(y, yf);
        Inc(x, xf);
      end;
    end;
  end;
  
  // Уничтожение временных массивов
  for IdxM := 0 to m - 1 do
    SetLength(lArr[IdxM], 0);
  SetLength(lArr, 0);
  SetLength(lTempArr, 0);
end;

begin
  Randomize;

  // Инициализация данных
  m := 6;
  n := 4;
  SetLength(Arr, n);
  for i := 0 to n - 1 do
    SetLength(Arr[i], m);

  for j := 0 to m - 1 do
    for i := 0 to n - 1 do
      Arr[i, j] := Random(100);

  // Сортируем и расставляем
  SpirSort;

  // Выводим результат
  for j := 0 to n - 1 do
  begin
    for i := 0 to m - 1 do
      write(Arr[j, i], ' ');
    writeln;
  end;

  // Деинициализация
  for i := 0 to n - 1 do
    SetLength(Arr[i], 0);
  SetLength(Arr, 0);
  readln;
end.

2) В архиве
http://aktuba.ru/N2.rar

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Staruha
1)
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, Buttons;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
 var
 k1,k,i:integer;
 myarray:array[1..10,1..3] of integer;
 mi1:array[1..3] of integer;
 flag:boolean;

begin
        for k := 1 to 10 do
    for i := 1 to 3 do
      myarray[k,i] := Random(30);
 repeat

   flag:=false;
   for k:= 1 to 9 do
   begin

     if   myarray[k,1]>myarray[k+1,1] then

       begin
              for i := 1 to 3 do
        begin
             mi1[i]:=myarray[k,i];
             myarray[k,i]:=myarray[k+1,i];
              myarray[k+1,i]:=mi1[i];

       end;
          flag:=true;
   end;

   end;
 until not flag;
      k1:=1;
      for k :=1 to 9 do
    begin

           k1:=k1+1;

          if k1=3 then
            begin
              for i := 1 to 3 do
        begin
             mi1[i]:=myarray[k,i];
             myarray[k,i]:=myarray[k+1,i];
             myarray[k+1,i]:=mi1[i];

            end;

           k1:=0;

       end;

  end;
         for k := 1 to 10 do
    for i := 1 to 3 do
      StringGrid1.Cells[i, k] := inttostr(myarray[k,i]);
 end;


---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Shaggy
1)
Код

Program
  Task_Matrix;
{$APPTYPE CONSOLE}
Uses
  Types,
  Windows, Dialogs;
Const
  M = 16;
  N = 8;
Type
  TElementType = Integer;
Type
  TMatrix = Packed Array [0..M-1,0..N-1] Of TElementType;
  TVector = Packed Array [0..M*N-1] Of TElementType;
Const
  Delta:Array [0..3] Of TPoint =
    ((X:1;Y:0),(X:0;Y:1),(X:-1;Y:0),(X:0;Y:-1));
Var
  Matrix:TMatrix;
  Vector:TVector;
Procedure Sort(Var AVector:TVector;ALo,AHi:Integer);
Var
  Lo,Hi,Mid,B:Integer;
Begin
  Lo:=ALo;
  Hi:=AHi;
  Mid:=AVector[(Lo+Hi) Shr 1];
  Repeat
    While AVector[Lo]<Mid Do
      Inc(Lo);
    While AVector[Hi]>Mid Do
      Dec(Hi);
    If Lo<=Hi
    Then
      Begin
        B:=AVector[Lo];
        AVector[Lo]:=AVector[Hi];
        AVector[Hi]:=B;
        Inc(Lo);
        Dec(Hi);
      End;
  Until Lo>Hi;
  If Hi>ALo
  Then
    Sort(AVector,ALo,Hi);
  If Lo<AHi
  Then
    Sort(AVector,Lo,AHi);
End;
Procedure Roll(Const ASource:TVector;Var ADest:TMatrix);
Var
  Position,Size,Buf:TPoint;
  Index,Step:Integer;
Begin
  Step:=0;
  Buf:=Point(M,N);
  Size:=Buf;
  Position:=Point(0,0);
  For Index:=1 To M*N Do
  Begin
    ADest[Position.X,Position.Y]:=ASource[Index-1];
    Dec(Size.X,Abs(Delta[Step].X));
    Dec(Size.Y,Abs(Delta[Step].Y));
    If (Size.X=0) Or (Size.Y=0)
    Then
      Begin
        Step:=(Step+1) And 3;
        Dec(Buf.X,Abs(Delta[Step].X));
        Dec(Buf.Y,Abs(Delta[Step].Y));
        Size:=Buf;
      End;
    Inc(Position.X,Delta[Step].X);
    Inc(Position.Y,Delta[Step].Y);
  End;
End;
Procedure Fill;
Var
  Index:Integer;
Begin
  For Index:=0 To M*N-1 Do
    Matrix[Index Mod M, Index Div M]:=Random(100);
End;
Procedure Print;
Var
  Index:Integer;
Begin
  For Index:=0 To M*N-1 Do
  Begin
    Write(Matrix[Index Mod M, Index Div M]:3);
    If Index Mod M=M-1
    Then
      WriteLn;
  End;
  WriteLn;
End;
begin
  Randomize;
  // Çàïîëíÿåì ìàòðèöó
  Fill;
  Print;
  // Êîïèðóåì è ñîðòèðóåì
  Move(Matrix,Vector,SizeOf(TVector));
  Sort(Vector,0,High(Vector));
  // Çàïîëíÿåì ïî ñïèðàëè
  Roll(Vector,Matrix);
  Print;
  
  ReadLn;
End.


Добавлено через 3 минуты и 28 секунд
------------------------------------------------------------------------------------------------------------------------------------

jsa
1)
Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    SGSource: TStringGrid;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FState, FIndx: Integer;
    FCol, FRow, FCycleCol, FCycleRow: Integer;
    FNumbers: TStringList;
    procedure ChangeCellsPos;
    procedure Spirale;
    function FreeCell(ACol, ARow: Integer): Boolean;
    procedure SortNumbers;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
const
  MSize = 9;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  SortNumbers;
  FCol:=0;
  FRow:=0;
  FState:=0;
  FIndx:=0;
  FCycleCol:=0;
  FCycleRow:=0;
  Spirale;
end;
procedure TForm1.ChangeCellsPos;
begin
  case FState of
    0:  begin
          Inc(FCol);
          if(FCol = MSize) or (not FreeCell(FCol + 1, FRow)) then
            begin
              FState:=1;
            end;
        end;
    1:  begin
          Inc(FRow);
          if (FRow = MSize) or (not FreeCell(FRow + 1, FCol)) then
            begin
              FState:=2;
            end;
        end;
    2:  begin
          Dec(FCol);
          if (FCol = 0) or (not FreeCell(FCol - 1, FRow)) then
            begin
              FState:=3;
            end;
        end;
    3:  begin
          Dec(FRow);
          if (FRow = 0) or (not FreeCell(FCol, FRow - 1)) then
            begin
              FState:=0;
              Inc(FCycleCol);
              Inc(FCycleRow);
              FCol:=FCycleCol - 1;
              FRow:=FCycleRow;
            end;
        end;
  end;
end;
function TForm1.FreeCell(ACol, ARow: Integer): Boolean;
begin
  Result:=StringGrid1.Cells[ACol, ARow] = '';
end;
procedure TForm1.Spirale;
begin
  StringGrid1.Cells[FCol, FRow]:=FNumbers.Strings[FIndx];
  ChangeCellsPos;
  Inc(FIndx);
  if FIndx < FNumbers.Count then
    Spirale;
end;
procedure TForm1.Button2Click(Sender: TObject);
var I, J, Rnd: Integer;
begin
  FNumbers.Clear;
  Randomize;
  for I:=0 to MSize do
    for J:=0 to MSize do
      begin
        Rnd:=Random(1000);
        SGSource.Cells[I, J]:=IntToStr(Rnd);
        FNumbers.AddObject(IntToStr(Rnd), TObject(Rnd));
      end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  FNumbers:=TStringList.Create;
end;
procedure TForm1.SortNumbers;
  procedure sort(a,c: Integer);
  var x,y,z: Integer;
      p1, p2: Integer;
  begin
    x:=a;
    y:=a+1;
    z:=c;
    repeat
      p1:=Integer(FNumbers.Objects[x]);
      p2:=Integer(FNumbers.Objects[y]);
      if p1 > p2 then
       FNumbers.Exchange(x,y);
      x:=y+1;
      y:=x+1;
    until Y > FNumbers.Count - 1;
    Inc(z);
    if z <= FNumbers.Count then
     begin
       if a = 0 then sort(1,z) else sort(0,z);
     end;
  end;
begin
  sort(0,0);
end;
end.

Код

object Form1: TForm1
  Left = 291
  Top = 192
  Width = 870
  Height = 640
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object StringGrid1: TStringGrid
    Left = 16
    Top = 248
    Width = 273
    Height = 217
    ColCount = 10
    DefaultColWidth = 25
    DefaultRowHeight = 20
    FixedCols = 0
    RowCount = 10
    FixedRows = 0
    TabOrder = 0
  end
  object Button1: TButton
    Left = 304
    Top = 248
    Width = 105
    Height = 25
    Caption = '2 Sort by sprirale'
    TabOrder = 1
    OnClick = Button1Click
  end
  object SGSource: TStringGrid
    Left = 16
    Top = 16
    Width = 273
    Height = 217
    ColCount = 10
    DefaultColWidth = 25
    DefaultRowHeight = 20
    FixedCols = 0
    RowCount = 10
    FixedRows = 0
    TabOrder = 2
  end
  object Button2: TButton
    Left = 304
    Top = 16
    Width = 105
    Height = 25
    Caption = '1 generate random'
    TabOrder = 3
    OnClick = Button2Click
  end
end

Автор: Alexeis 24.10.2008, 10:22
jsa
2)
Описание раскраски для Второй задачи

Красный - дворник чистит пустую ячейку
Темно-красный - дворник чистит ячейку с мусором
Зеленый -  хулиган получил дюлей
Желтый - хулиган хулиганит - выкидывает мусор
Синий - мусор

Код

unit Main;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
type
  TFieldCellState = (fcsEmpty, fcsCleanEmpty, fcsCleanTrash,  fcsTrashPut, fcsTrashFill, fcsKilled);
    TKeeperMove = (kmForward, kmBackward);
  TObjType = (otKeeper, otHooligan);
  TFieldCell = class(TObject)
    private
        FState: TFieldCellState;
    public 
        property State: TFieldCellState read FState write FState;        
    end;
    
    TFieldCells = class(TObject)
    private
        FList: TList;
        function GetCellState(ACell: Byte): TFieldCellState;
    public
        property CellState[ACell: Byte]: TFieldCellState read GetCellState;
        constructor Create;
        destructor Destroy; override;
        procedure SetCellState(ABeginC, AEndC: Byte; AState: TFieldCellState);
        
    end;
  TMainForm = class(TForm)
    SGField: TStringGrid;
    ButtonStart: TButton;
    Label1: TLabel;
    procedure ButtonStartClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure SGFieldDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
    FCol: Byte;
  public
    { Public declarations }
    procedure RepaintField;
    procedure DoneXThread(Sender: TObject); 
  end;
  TXThread = class(TThread)
  private
    FObjType: TObjType;
    FKeeperPos, FKeeperMaxPos, FKeeperMinPos: Byte;
    FKeeperMove: TKeeperMove;
    FHooliganPos: Byte;
    FHooliganSleep: Word;
    procedure ChangeCellState;
    procedure KeeperChangeCellState;
    procedure KeeperFreeCells;
    procedure KeeperFillCells;
    procedure KeeperChangePos;
    procedure HooliganChangeCellState;
    procedure HooliganFreeCell;
    procedure HooliganFillCell;
    procedure HooliganChangePos;
  protected
    procedure Execute; override;
  public
    constructor Create(AObjType: TObjType);
  end;
var
  MainForm: TMainForm;
  CS: TRTLCriticalSection;
  FieldCells: TFieldCells;
var
  Pack, Killed: Byte;
implementation
{$R *.dfm}
procedure TMainForm.ButtonStartClick(Sender: TObject);
//var KeeperThread: TXThread;
begin
  Pack:=0;
  Killed:=0;
  InitializeCriticalSection(CS);
  TXThread.Create(otKeeper);
  TXThread.Create(otHooligan);
end;
{ TXThread }
procedure TXThread.ChangeCellState;
begin
  case FObjType of
    otKeeper: KeeperChangeCellState;
    otHooligan: HooliganChangeCellState;
  end;
end;
constructor TXThread.Create(AObjType: TObjType);
begin
  FObjType:=AObjType;
  FKeeperPos:=0;
  FKeeperMaxPos:=19;
  FKeeperMinPos:=0;
  FHooliganSleep:=60;
  FreeOnTerminate:=True;
  OnTerminate:=MainForm.DoneXThread;
  inherited Create(False);
end;
procedure TXThread.Execute;
begin
  while not Terminated do
    begin
      EnterCriticalSection(CS);
      if (Pack > 21) then
        Terminate
      else
        ChangeCellState;
      LeaveCriticalSection(CS);
      Synchronize(MainForm.RepaintField);
      case FObjType of
        otKeeper: Sleep(400);
        otHooligan: Sleep(FHooliganSleep);
      end;
    end;
  Terminate;
end;
procedure TMainForm.RepaintField;
var I: Byte;
begin
  for I:=0 to 59 do
    begin
      FCol:=I;
      SGField.Repaint;
      DoneXThread(Label1);
    end;
end;
procedure TXThread.HooliganChangeCellState;
begin
  HooliganFreeCell;
  HooliganFillCell;
end;
procedure TXThread.HooliganChangePos;
begin
  Randomize;
  FHooliganPos:=Random(59);
end;
procedure TXThread.HooliganFillCell;
var CS, NCS: TFieldCellState;
begin
  FHooliganSleep:=300;
  CS:=FieldCells.CellState[FHooliganPos];
  case CS of
    fcsEmpty: NCS:=fcsTrashPut;
    fcsCleanEmpty, fcsCleanTrash: NCS:=fcsKilled;
    fcsTrashFill: NCS:=fcsTrashPut;
  else
    NCS:=CS;
  end;
  if NCS = fcsKilled then
    Inc(Killed);
  FieldCells.SetCellState(FHooliganPos, FHooliganPos, NCS);
end;
procedure TXThread.HooliganFreeCell;
var CS, NCS: TFieldCellState;
begin
  FHooliganSleep:=60;
  CS:=FieldCells.CellState[FHooliganPos];
  case CS of
    fcsTrashPut: NCS:=fcsTrashFill;
  else
    NCS:=CS;
  end;
  if NCS = fcsTrashFill then
    Inc(Pack);
  FieldCells.SetCellState(FHooliganPos, FHooliganPos, NCS);
  HooliganChangePos;
end;
procedure TXThread.KeeperChangeCellState;
begin
  KeeperFreeCells;
  KeeperFillCells;
end;
procedure TXThread.KeeperChangePos;
begin
  case FKeeperMove of
    kmForward:
      begin
        Inc(FKeeperPos);
        if (FKeeperPos = FKeeperMaxPos) then
         FKeeperMove:=kmBackward
      end;
    kmBackward:
      begin
        Dec(FKeeperPos);
        if (FKeeperPos = FKeeperMinPos) then
         FKeeperMove:=kmForward;
      end;
  end;
end;
procedure TXThread.KeeperFillCells;
var CS, NCS: TFieldCellState;
    J, I: Byte;
begin
  J:=FKeeperPos * 3;
  for I:=J to J + 2 do
    begin
      CS:=FieldCells.CellState[I];
      case CS of
        fcsEmpty: NCS:=fcsCleanEmpty;
        fcsCleanEmpty: NCS:=fcsCleanEmpty;
        fcsCleanTrash: NCS:=fcsCleanTrash;
        fcsTrashPut: NCS:=fcsKilled;
        fcsTrashFill: NCS:=fcsCleanTrash;
      else
        NCS:=CS;
      end;
      if NCS = fcsKilled then
        Inc(Killed);
      FieldCells.SetCellState(I, I, NCS);
    end
end;
procedure TXThread.KeeperFreeCells;
var CS, NCS: TFieldCellState;
    J, I: Byte;
begin
  J:=FKeeperPos * 3;
  for I:=J to J + 2 do
    begin
      CS:=FieldCells.CellState[I];
      case CS of
        fcsEmpty: NCS:=fcsEmpty;
        fcsCleanEmpty: NCS:=fcsEmpty;
        fcsCleanTrash: NCS:=fcsEmpty;
      else
        NCS:=CS;
      end;
  
      FieldCells.SetCellState(I, I, NCS);
    end;
  KeeperChangePos;
end;
{ TFieldCells }
constructor TFieldCells.Create;
var FieldCell: TFieldCell;
    I: Byte;
begin
  FList:=TList.Create();
  for I:=0 to 59 do
    begin
      FieldCell:=TFieldCell.Create();
      FieldCell.State:=fcsEmpty;
      FList.Add(FieldCell);
    end;
end;
destructor TFieldCells.Destroy;
var FieldCell: TFieldCell;
    I: Byte;
begin
  FList:=TList.Create;
  for I:=0 to 59 do
    begin
      FieldCell:=TFieldCell.Create;
      FieldCell.State:=fcsEmpty;
      FList.Add(FieldCell);
    end;
  inherited Destroy;
end;
function TFieldCells.GetCellState(ACell: Byte): TFieldCellState;
begin
  Result:=TFieldCell(FList.Items[ACell]).State;
end;
procedure TFieldCells.SetCellState(ABeginC, AEndC: Byte;
  AState: TFieldCellState);
var I: Byte;
begin
  for I:=ABeginC to AEndC do
      TFieldCell(FList.Items[I]).State:=AState;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
  FieldCells:=TFieldCells.Create;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FieldCells.Free;
end;
procedure TMainForm.SGFieldDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var FS: TFieldCellState;
begin
  with (Sender as TStringGrid).Canvas do
    begin
      if ACol = FCol then
        begin
          FS:=FieldCells.CellState[FCol];
          case FS of
            fcsEmpty: Brush.Color:=clWhite;
            fcsCleanEmpty: Brush.Color:=clRed;
            fcsTrashPut: Brush.Color:=clYellow;
            fcsTrashFill: Brush.Color:=clBlue;
            fcsCleanTrash: Brush.Color:=clMaroon;
            fcsKilled: Brush.Color:=clGreen;
          end;
          FillRect(Rect);
          DrawFocusRect(Rect);
        end;
    end;
end;
procedure TMainForm.DoneXThread(Sender: TObject);
begin
  Label1.Caption:='Packs: ' + IntToStr(Pack) + ' Killed: ' + IntToStr(Killed);
end;
end.

DFM
Код

object MainForm: TMainForm
  Left = 392
  Top = 241
  Width = 698
  Height = 123
  Caption = 'Task 2'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnClose = FormClose
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 96
    Top = 56
    Width = 32
    Height = 13
    Caption = 'Label1'
  end
  object SGField: TStringGrid
    Left = 8
    Top = 24
    Width = 673
    Height = 25
    ColCount = 60
    DefaultColWidth = 10
    DefaultRowHeight = 10
    DefaultDrawing = False
    FixedCols = 0
    RowCount = 1
    FixedRows = 0
    Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine]
    TabOrder = 0
    OnDrawCell = SGFieldDrawCell
  end
  object ButtonStart: TButton
    Left = 8
    Top = 56
    Width = 75
    Height = 25
    Caption = 'Start'
    TabOrder = 1
    OnClick = ButtonStartClick
  end
end


--------------------------------------------------------------------------------------------------------

1) Felan
http://rapidshare.de/files/40696662/Matrix.rar.html 

--------------------------------------------------------------------------------------------------------

1), 2)
AntonN
http://antonn.com/xlam/vg_1.zip
http://antonn.com/xlam/vg_2.zip 


--------------------------------------------------------------------------------------------------------

Sajtran
1, 2, 3 В одном архиве
http://mudclient.narod.ru/Zadachi.rar 

--------------------------------------------------------------------------------------------------------

Poseidon

http://narod.ru/disk/3373823000/Zadanie1%20(Poseidon).rar.html
http://narod.ru/disk/3373824000/Zadanie2%20(Poseidon).rar.html

--------------------------------------------------------------------------------------------------------

bems,
1) 2) 3)

http://narod.ru/disk/3373825000/bems.rar.html

--------------------------------------------------------------------------------------------------------

MetalFan, 1) 2) 3)
http://slil.ru/26250387

--------------------------------------------------------------------------------------------------------

actual 1) 2) 3)
http://visualtasktips.com/public/Vingrad.Solutions.zip

--------------------------------------------------------------------------------------------------------

ne0n
Код

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;
const
    n = 8; //строк
    m = 10; // столбцов
type
  TMatrix = array [ 1..n, 1..m ] of integer;
  TVector = array [1..m*n] of integer;
var
    i, j, _i, _j, iBarrier, jBarrier, ind : integer;
    mymatrix : TMatrix;
    tmp_vector : TVector;
//Пираминадьная сортировка. Чесно скомунизденно из Википедии =)
procedure Sort(var Arr: array of integer; Count: Integer);
  procedure DownHeap(index, Count: integer; Current: integer);
  //Функция пробегает по пирамиде восстанавливая ее
  //Также используется для изначального создания пирамиды
  //Использование: Передать номер следующего элемента в index
  //Процедура пробежит по всем потомкам и найдет нужное место для следующего элемента
  var
    Child: Integer;
  begin
    while index < Count div 2 do begin
      Child := (index+1)*2-1;
      if (Child < Count-1) and (Arr[Child] < Arr[Child+1]) then
        Child:=Child+1;
      if Current >= Arr[Child] then
        break;
      Arr[index] := Arr[Child];
      index := Child;
    end;
    Arr[index] := Current;
  end;
 
//Основная функция
var
  i: integer;
  Current: integer;
begin
  //Собираем пирамиду
  for i := (Count div 2)-1 downto 0 do
    DownHeap(i, Count, Arr[i]);
  //Пирамида собрана. Теперь сортируем
  for i := Count-1 downto 1 do begin
    Current := Arr[i]; //перемещаем верхушку в начало отсортированного списка
    Arr[i] := Arr[0];
    DownHeap(0, i, Current); //находим нужное место в пирамиде для нового элемента
  end;
end;
function MtrxToVect( matr : TMatrix ) : TVector;
var
    vec : TVector;
    i, j, k : Integer;
begin
    k := 0;
    for i := 1 to n do
        for j := 1 to m do
            begin
                inc(k);
                vec[k] := matr[i, j];
            end;
    result := vec;
end;
begin
    ind := 1;
    iBarrier := n;
    jBarrier := m;
    _j := 1;
    _i := 1;
    Randomize;
    //Генериться матрица
     for i := 1 to n do
     for j := 1 to m do mymatrix[i,j] := Random(100);
   writeln('Original: ');
     for i := 1 to n do
        begin
            for j := 1 to m do write(mymatrix[i,j]:4);
            writeln;
        end;
     // Людям в здравлм уме и рассудке категоричски запрещено
     // это смотреть =)
     tmp_vector := MtrxToVect(mymatrix);
     Sort(tmp_vector,n*m);
  // Пошло заполнение по спирали
    while( _i <= iBarrier ) and (_j <= jBarrier) do
        begin
            for j := _j to jBarrier do
                begin
                    mymatrix[_i, j] := tmp_vector[ind];
                    inc(ind)
                end;
            if _i < iBarrier then
                begin
                    for i := _i + 1 to iBarrier do
                        begin
                            mymatrix[i, jBarrier] := tmp_vector[ind];
                            inc(ind)
                        end;
                    if _j < jBarrier then
                        begin
                            for j := jBarrier - 1 downto _j do
                                begin
                                    mymatrix[iBarrier, j] := tmp_vector[ind];
                                    inc(ind)
                                end;
                            if iBarrier - _i > 1 then
                                for i := iBarrier - 1 downto _i + 1 do
                                    begin
                                        mymatrix[i, _j] := tmp_vector[ind];
                                        inc(ind)
                                    end;
                        end;
                end;
            inc(_i);
            inc(_j);
            dec(iBarrier);
            dec(jBarrier);
        end;
 // вывод
     Writeln('Spiral : ');
    for i := 1 to n do
        begin
            for j := 1 to m do write(mymatrix[i, j] : 4);
          Writeln;
        end;
    readln;
end.


---------------------------------------------------------------------------------------------------

THandle
1) 3)
http://delphiprog.ucoz.ru/files/1and3second.rar

---------------------------------------------------------------------------------------------------

Qu1nt

Код

function CreateClass(Value: Integer): TDummy;
begin
  Result := TDummy(TDummy.NewInstance);
  Result.FValue := Value;
  Result.AfterConstruction;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  Dummy: TDummy;
begin
  Dummy := CreateClass(123);
  Dummy.ShowValue;
  Dummy.Free;
end;


Автор: Alexeis 24.10.2008, 10:47
Отдельная просьба к Sajtran, отписаться тут, поскольку поставить "+" можно только в пост.

Автор: AntonN 24.10.2008, 10:57
а мое первое задание?

ADD. суперское решение неОна первой задачи требует перекомпила приложения при использовании разных размерностей массива? smile
ADD2. да тут у многих оно фиксировано в листинге и статический массив :(

Автор: Alexeis 24.10.2008, 11:25
Внимание! Изменение в турнирной таблице.

Не было учтено одно решение. 

В результате AntonN перемещается с 9й позиции на 6ю.

Приношу свои извинения.

Добавлено @ 11:28
Цитата(AntonN @  24.10.2008,  09:57 Найти цитируемый пост)
ADD. суперское решение неОна первой задачи требует перекомпила приложения при использовании разных размерностей массива?

  Это строго по условию. В условии сказано, что размерности константы. Это позволяет избежать лишних копирований, и упростить сортировку.

Автор: MetalFan 24.10.2008, 12:17
Цитата(Alexeis @  24.10.2008,  11:25 Найти цитируемый пост)
В условии сказано, что размерности константы. 

о черт, и правда) а я както невнимательно прочитал условие первой задачи

Автор: Sajtran 24.10.2008, 14:11
Доброго времени суток
А можно балы в виде таблицы, а то непонятно что кому и за что

Участник, 1-я , 2-я , 3-я , итоговая сумма

Автор: THandle 24.10.2008, 14:51
Ну чтож... не плохо в общем выступил smile Это если еще учесть что все старше лет на пять-десять smile 

Спасибо еще раз за конкурс, было очень интересно, узнал что-то новое.
Думаю, что действительно, следует проводить такие конкурсы переодически(предлагаю 4 раза в год).

Победителей заранее поздравляю, так как на форум в ближайшие 20 часов выйти не смогу.

В общем, все было классно smile

Автор: AntonN 24.10.2008, 15:47
Цитата

Думаю, что действительно, следует проводить такие конкурсы переодически(предлагаю 4 раза в год).

мож почаще? smile

Автор: bems 24.10.2008, 19:07
ээээээ... извиняюсь, а я на каком месте?

Автор: CodeMonkey 24.10.2008, 19:20
Совет: когда объявляете задания или результаты - выносите в первый пост или ссылку на них или повтор. Чтобы не искать по всей теме.

Автор: Alexeis 24.10.2008, 19:39
Цитата(bems @  24.10.2008,  18:07 Найти цитируемый пост)
ээээээ... извиняюсь, а я на каком месте? 

  Первые 3 места на пересмотре в связи с тем что вы с металфаном набрали одинаковые балы. Вы в троем уже не ниже 3го места.


Цитата(CodeMonkey @  24.10.2008,  18:20 Найти цитируемый пост)
Совет: когда объявляете задания или результаты - выносите в первый пост или ссылку на них или повтор. Чтобы не искать по всей теме.


  Хорошо. Добавлю.

Автор: MetalFan 24.10.2008, 21:16
ай жду когда переподсчитаете! чур меня на последнее в общем списке место не смещать)

Автор: ne0n 25.10.2008, 01:52
Цитата(THandle @  24.10.2008,  14:51 Найти цитируемый пост)
Спасибо еще раз за конкурс, было очень интересно, узнал что-то новое.


полностью потдерживаю, темболее давно уже делфи в руки не брал, по долгу службы приходиться работать с С++  smile  , а тут такая приятная возможность подвернулась)
жалко что времени не хватило на 2-ю задачу...а так еще раз повторюсь - все было супер) 
вообщем большой респект за организацию сего мероприятия smile 


п.с. очень приятно удивлен, что мое топорное решение назвали суперским smile 

Автор: Rrader 27.10.2008, 19:06
MetalFan
bems

Поздравляю с победой в конкурсе!!!

Вы переведены в группу "Эксперт" smile 

 smile  smile  smile 


Автор: MetalFan 27.10.2008, 19:09
bems,  smile ))))
поздравляю всех участников!!!
и спасибо организаторам!!!
з.ы. кстати, упущение! на программерском форуме в смайлах нет пьющих пиво колобков))))

Автор: Rrader 27.10.2008, 19:10
actual - поздравляю со вторым местом!
Sajtran - с третьим! Мои поздравления!

 smile

Добавлено через 2 минуты и 33 секунды
Также спасибо всем участникам, принимавшим участие в конкурсе!!! smile  smile

Добавлено через 3 минуты и 37 секунд
MetalFan,  smile 

Автор: THandle 27.10.2008, 19:21
MetalFanbems, ну что ж, братцы, проздравляю!!! smile smile smile


Автор: bems 27.10.2008, 20:28
Спасиби, спасибо. 
Тоже всех поздравляю.
А что, так и не решили кого подвинуть?  smile 

Автор: Alexeis 27.10.2008, 21:43
К сожалению так результатов новой проверки мы не получили (либо еще получим, но позже), потому я решил что и так ждали довольно много, оставляем как  есть. Значит баллы такие

bems       - 53
MetalFan - 53
actual      - 45

Поздравляю победителей! Творческих успехов и новых побед smile . Сейчас подправим репку.

Автор: MetalFan 27.10.2008, 21:43
Rrader, чтото я видать сослепу не заметил)
 smile 

Автор: Riply 27.10.2008, 23:10
Поздравляю победителей и всех, кто участвовал в этом (отнюдь не простом) конкурсе !
Молодцы !    smile 

Автор: VICTAR 28.10.2008, 06:18
Присоединяюсь к поздравлениям) Молодцы!

Автор: Sajtran 28.10.2008, 08:09
Присоединяюсь к поздравлению smile
ждём продолжений

Автор: Staruha 28.10.2008, 16:19
Да было здорово!  smile .Так скать зацепилась за последнюю ступенечку на Делфи smile .Вот увидите лет через 50 отжую первое место smile .
Домаю организаторов тоже надо как то отметить.Но чем их мона удивить понятия не имею

Автор: mr.Anderson 28.10.2008, 16:47
Staruha, да чем их удивишь, они сами тут всех подряд удивляют... smile

Действительно спасибо за конкурс, было интересно, хотя я не понял, почему мое решение посчитали плохим... Хотя верю, что причины точно были. smile 

Автор: Alexeis 28.10.2008, 16:50
mr.Anderson, ну если есть вопросы, могу показать где снимал балы. (но через ПМ или аську).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)