Перейти к содержанию

Оцените код(почти "быдло")


Рекомендуемые сообщения

Решал лёгкую задачу, решил, но код получился, мне кажется, не очень хорошим. Потом посмотрел решение другого человека, так у него решение оказалось в два раза короче.

Пожалуйста посмотрите решения и укажите на ошибки.

Условие задачи:

В небольшом островном государстве действовали забавные законы относительно

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

Во-первых, общее количество автомобилей на острове не должно было превышать

256. Автомобилям назначались номера с 0 до 255, при этом соблюдались следующие

правила.

Номера, делившиеся без остатка на 7, назначались автобусам. Те, что делились без

остатка на 5, назначались грузовикам, а все прочие – легковушкам. Так, например, номера

35 и 70 доставались автобусам, а не грузовикам, хоть и делились на 5.

Похожие правила применялись и к окраске автомобилей, а именно.

Если номер авто делился на 4, его красили красным, если на 3 – желтым, если на 2 –

белым, а остальные автомобили красили черным.

· Сформируйте три множества по классам автомобилей – автобусы, грузовики и

легковушки. Вычислите количество машин каждого класса (Ответ: 37, 44, 175).

· Сформируйте четыре множества по цвету автомобилей – красные, желтые, белые и

черные. Определите количество машин каждого цвета (Ответ: 64, 64, 43, 85).

· Столица того государства – деревня Кокосовка – страдала от пробок. Для борьбы с

ними ввели ограничение на въезд транспорта. Так, в один из дней недели в столицу

пускали только красные легковушки, белые грузовики и все автобусы. Найдите

номера всех этих машин. Сколько всего автомобилей могло въехать в столицу в тот

день?

Моё решение:


TSet = set of byte;
var
i:byte;
Bus, Truck, Car, Red, Yellow, White, Black, Sets:TSet;
function ReadType(aI:byte):TSet;
var
n:byte;
begin
ReadType:=[];
for n:=0 to 255 do
if n mod aI=0 then ReadType:=ReadType+[n];
end;
procedure SetOfType(var aBus, aTruck, aCar:TSet);
var
i, j:byte;
begin
i:=7;
repeat
case i of
7:aBus:=ReadType(i);
5:aTruck:=ReadType(i)-aBus;
else for j:=0 to 255 do
if not (j in aBus+aTruck) then aCar:=aCar+[j];
end;
i:=i-2;
until i<3;
end;
function ReadColor(aI:byte):TSet;
var
n:byte;
begin
ReadColor:=[];
for n:=0 to 255 do
if n mod aI=0 then ReadColor:=ReadColor+[n];
end;
procedure SetOfColor(var aRed, aYellow, aWhite, aBlack:TSet);
var
i, j:byte;
begin
i:=4;
repeat
case i of
4:aRed:=ReadColor(i);
3:aYellow:=ReadColor(i)-aRed;
2:aWhite:=ReadColor(i)-(aRed+aYellow);
else for j:=0 to 255 do
if not (j in aRed+aYellow+aWhite) then aBlack:=aBlack+[j];
end;
dec(i);
until i=0;
end;
procedure WriteSets(aSet:TSet);
var
j, k:byte;
begin
k:=0;
for j:=0 to 255 do begin
if j in aSet then inc(k);
end;
write(k, ' ');
end;
begin
//Множества типов автомобилей
Bus:=[]; Truck:=[]; Car:=[];
//Множество цветов
Red:=[]; Yellow:=[]; White:=[]; Black:=[];
SetOfType(Bus, Truck, Car);
SetOfColor(Red, Yellow, White, Black);
for i:=1 to 7 do begin
case i of
1:Sets:=Bus;
2:Sets:=Truck;
3:Sets:=Car;
4:Sets:=Red;
5:Sets:=Yellow;
6:Sets:=White;
7:Sets:=Black;
end;
WriteSets(Sets);
if (i=3) or (i=7) then writeln;
end;
Sets:=(Red*Car)+(White*Truck)+Bus;
WriteSets(Sets);
readln;
end.
type

Решение другого человека:


procedure WriteSet(const aSet : TAuto);
var k : integer;
begin
for k:=0 to 255 do if k in aSet then Write(k:4);
Writeln; Writeln('---');
end;
function Count(const aSet : TAuto): integer;
var k, r : integer;
begin
r:=0;
for k:=0 to 255 do if k in aSet then Inc(r);
Result:=r;
end;
var Bus, Truck, Car : TAuto;
Red, Yellow, White, Black : TAuto;
i: integer;
R: TAuto;
begin
Bus:=[]; Truck:=[]; Car:=[];
Red:=[]; Yellow:=[]; White:=[]; Black:=[];
for i := 0 to 255 do begin
if (i mod 7 = 0) then Bus:= Bus+[i]
else
if (i mod 5 = 0) then Truck:= Truck+[i]
else
Car:= Car+[i];
end;
for i := 0 to 255 do begin
if (i mod 4 = 0) then Red:= Red+[i]
else
if (i mod 3 = 0) then Yellow:= Yellow+[i]
else
if (i mod 2 = 0) then White:= White+[i]
else
Black:= Black+[i];
end;
Writeln(Count(Bus)); WriteSet(Bus);
Writeln(Count(Truck)); WriteSet(Truck);
Writeln(Count(Car)); WriteSet(Car);
Readln;
Writeln(Count(Red)); WriteSet(Red);
Writeln(Count(Yellow));WriteSet(Yellow);
Writeln(Count(White)); WriteSet(White);
Writeln(Count(Black)); WriteSet(Black);
Readln;
R:= Red*Car + White*Truck + Bus;
Writeln(Count(R)); WriteSet(R);
Readln;
end.
type TAuto = set of byte;

Ссылка на комментарий

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

Я бы, наверное, как во втором варианте сделал только все в одном цикле :) .

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

Ссылка на комментарий

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

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...