Skip to content

Instantly share code, notes, and snippets.

@andreyvit
Created June 6, 2011 10:06
Show Gist options
  • Save andreyvit/1010026 to your computer and use it in GitHub Desktop.
Save andreyvit/1010026 to your computer and use it in GitHub Desktop.
Wicked - fourdman's solution
{Во входном файле wicked.in записаны несколько натуральных
числе, меньших 10001. В выходной файл wicked.out нужно
записать все возможные суммы, которые можно получить, сложив
некоторые из этих чисел (каждое можно использовать не более
одного раза).
Пример входного файла: 2 3 4
Пример выходного файла: 2 3 4 5 6 7 9
Во входном файле повторяющиеся числа допускаются, в выходном,
разумеется, нет.
Разрешается создавать временные файлы, которые желательно
удалять. :) Хорошо комментировать код, чтобы всем было понятно
(если конструкции в принципе можно объяснить...)}
{ (c) Михаил Калугин, 2003 }
{Странно... зачем нам graph?}
uses graph,dos;
var
gd,gm:integer;
o:SearchRec;
i:longint;
{Почему INTEGER? LONGINT! Пямяти мало не бывает!}
{Чтение переменной}
function get_(n:longint):longint;
var
x,y:longint;
{Зачем делать исключения? И здесь LONGINT!}
begin
y:=n div 640;
if n mod 640<>0 then y:=y+1;
x:=n-640*(y-1);
if y>30 then begin
while 5>1 do write('Куда лезешь, дурень?'); end;
{Мы жестоки, очень жестоки.... :-E~}
y:=8*(y-1)+1;
get_:=GetPixel(x,y)*16*16*16*16*16*16*16+
GetPixel(x,y+1)*16*16*16*16*16*16+
GetPixel(x,y+2)*16*16*16*16*16+
GetPixel(x,y+3)*16*16*16*16+
GetPixel(x,y+4)*16*16*16+
GetPixel(x,y+5)*16*16+
GetPixel(x,y+6)*16+
GetPixel(x,y+7);
{Извращаться, так извращаться :)....}
end;
{Сохранение переменной}
function set_(n,_x:longint):longint;
var
an:longint;
x,y:longint;
{см.выше}
begin
y:=n div 640;
if n mod 640<>0 then y:=y+1;
x:=n-640*(y-1);
if y>30 then begin
while 5>1 do write('Куда лезешь, дурень!'); end;
{см.выше^2}
y:=8*(y-1)+1;
an:=_x;
PutPixel(x,y+7,an mod 16);
an:=an div 16;
PutPixel(x,y+6,an mod 16);
an:=an div 16;
PutPixel(x,y+5,an mod 16);
an:=an div 16;
PutPixel(x,y+4,an mod 16);
an:=an div 16;
PutPixel(x,y+3,an mod 16);
an:=an div 16;
PutPixel(x,y+2,an mod 16);
an:=an div 16;
PutPixel(x,y+1,an mod 16);
an:=an div 16;
PutPixel(x,y,an mod 16);
{М...да..., не надо было бегать за второй....}
set_:=_x;
end;
procedure store(i:longint);
var
s:string;
begin
str(i,s);
assign(input,s+'.wan');
rewrite(input);
close(input);
end;
{Основная процедура поиска решений}
procedure find(x:longint);
var
i:longint;
begin
if x<>0 then store(x);
for i:=1 to 10000 do
begin
if get_(i)<>0 then
begin
store(i);
set_(i,get_(i)-1);
find(x+i);
set_(i,get_(i)+1);
end;
end;
end;
begin
{Херим всё, что только нужно...}
FindFirst('*.wan',AnyFile,o);
while DosError=0 do
begin
assign(input,o.name);
erase(input);
FindNext(o);
end;
gd:=detect;
InitGraph(gd,gm,'e:\bp\bgi\');
{Читаем, что там юзер понакалякал...}
assign(input,'wicked.in');
reset(input);
for i:=1 to 10000 do set_(i,0);
while not seekeof do
begin
read(i);
{inc(a[i]);}
set_(i,get_(i)+1);
end;
{Пытаемся это понять...}
find(0);
closegraph;
{Пишем юзеру, всё что мы думаем о его числах.}
assign(output,'wicked.out');
rewrite(output);
FindFirst('*.wan',AnyFile,o);
while DosError=0 do
begin
assign(input,o.name);
write(copy(o.name,1,length(o.name)-4)+' ');
erase(input);
FindNext(o);
end;
{Уходя , тушите свет!}
assign(input,ParamStr(0));
erase(input);
close(output);
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment