Сейчас на форуме: ==DJ==[ZLO], Magister Yoda, Rio, Dart Raiden, Alf (+6 невидимых)

 eXeL@B —› Основной форум —› Крякерская задача
Посл.ответ Сообщение


Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 18 октября 2004 13:57
· Личное сообщение · #1

В общем перебирая архивы хлама натолкнулся на интересную задачу что мне попалась на одной из олимпиад... давно это было... я ее решил за 40 минут (+ минут десять на доводку интерфейса).

Цель: решить на любом языке пргограммирования. Asm и С++ приветствуются. Потом приведу свой вариант на VB

Вот ссылка на условие: reversing.dotfix.net/question.jpg

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 19 октября 2004 04:15
· Личное сообщение · #2

Привет, вот, написал на дельфях, вот текст:


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Edit1: TEdit;
Label3: TLabel;
Memo3: TMemo;
Label4: TLabel;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
A,B,NN,SUM: array of dword;
N: dword;
i,k,now: dword;
OK: BOOLEAN;
begin

N:=memo1.Lines.Count;
if memo2.Lines.Count<>N then
begin
showmessage('errorrr');
exit;
end;

setlength(A,N+1);
setlength(B,N+1);
setlength(NN,N+1);
setlength(SUM,N+1);

for i:=1 to N do
begin
A[i]:=strtoint(memo1.Lines[i-1]);
B[i]:=strtoint(memo2.Lines[i-1]);
end;

for i:=1 to N do
begin
if A[i]=0 then
begin
NN[i]:=B[i];
SUM[i]:=0;
end;
end;


for i:=1 to N do
begin
if A[i]<>0 then
begin
now:=i;
OK:=FALSE;
WHILE OK=FALSE
DO begin
if A[now]<>0 then k:=B[now] else k:=now;
if A[k]=0 then
begin
inc(SUM[k]);
OK:=TRUE;
end
else
begin
now:=B[k];
end;
end;
end;
end;


k:=0;
memo3.Clear;
for i:=1 to N do
begin
if SUM[i]>k then
begin
k:=SUM[i];
now:=NN[i];
end;
if NN[i]>0 then memo3.Lines.Add('Topic '+inttostr(NN[i])+', '+inttostr(SUM[i])+' messages')
end;


edit1.Text:='Topic '+inttostr(now)+', '+inttostr(k)+' messages';


end;


end.



Вот полные исходники: www.parquet.am/ita/GPcH_question_only_source.zip

Вот исходники плюс экзешник:
www.parquet.am/ita/GPcH_question_bin_and_source.zip




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 19 октября 2004 06:37 · Поправил: Ara
· Личное сообщение · #3

Задачка легкая, 5-10 минут на паскале, на асме чуть дольше. Больше в само задание врубался =)
arnix
У меня на асме код меньше вышел ;)

_57151498__Zadacha.asm




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 19 октября 2004 09:57 · Поправил: GPcH
· Личное сообщение · #4

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

Вот мой вариант:

Private Sub Command1_Click()


ReDim Preserve Forum(0)
Dim sCount As Long, sCountOld As Long, sNumberOfMessages As Long, sNumberOfMessagesOld As Long
txtResults.Text = "void Forum()" & vbCrLf & "{" & vbCrLf & _
" Input = " & txtNumbers.Text & vbCrLf & " Results()" & vbCrLf & " {" & vbCrLf

'парсим данные и заносим их в массив
For i = 1 To Len(txtNumbers.Text)
sRetVal = Mid$(txtNumbers.Text, i, 1)
'находим начальную скобку
If sRetVal = "(" Then
'находим конечную скобку
sRetEndVal = InStr(i + 1, txtNumbers.Text, ")")
'заносим данные в массив
Call AddValue(Mid$(txtNumbers.Text, i + 1, sRetEndVal - i - 1))
End If
Next

'подводим результаты
For i = 1 To UBound(Forum)
'находим тему
If Forum(i).Ai = 0 Then
sTheme = Forum(i).Bi
'определяем порядковый номер сообщения
sCount = i
'ищем число сообщений
For j = i To UBound(Forum)
'если найдено очередное сообщение темы sTheme
If Forum(j).Ai = 1 And Forum(j).Bi = sCount Then
'изменяем порядковый номер на j
sCount = j
'увеличиваем число сообщений темы sTheme на 1
sNumberOfMessages = sNumberOfMessages + 1
End If
Next
If sNumberOfMessages > sNumberOfMessagesOld Then
sNumberOfMessagesOld = sNumberOfMessages: sCountOld = Forum(i).Bi
txtResults.Text = txtResults.Text & " На тему '" & sTheme & _
"' пришло " & sNumberOfMessages & " сообщений" & vbCrLf: sNumberOfMessages = 0: sCount = 0
End If
Next
txtResults.Text = txtResults.Text & " Больше всего сообщений (" & sNumberOfMessagesOld & ")
в теме " & sCountOld & " }" & vbCrLf & "}"
End Sub

Private Sub AddValue(sText)
ReDim Preserve Forum(UBound(Forum) + 1)
Forum(UBound(Forum)).Ai = Left$(sText, InStr(1, sText, ",") - 1)
Forum(UBound(Forum)).Bi = Right$(sText, InStrRev(sText, ",", Len(sText)) - 1)
End Sub


Полный сорс: http://reversing.dotfix.net/X%20Forum.rar http://reversing.dotfix.net/X%20Forum.rar

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 19 октября 2004 11:04
· Личное сообщение · #5

GPcH пишет:
Вау... молодцы ребята...




 eXeL@B —› Основной форум —› Крякерская задача
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати