63 lines
1.3 KiB
ObjectPascal
63 lines
1.3 KiB
ObjectPascal
program populationCount(input, output, stdErr);
|
||
var
|
||
// general advice: iterator variables are _signed_
|
||
iterator: int64;
|
||
// the variable we’d like to count the set bits in
|
||
number: qWord;
|
||
// how many evil numbers we’ve already found
|
||
evilCount: int64;
|
||
// odious numbers
|
||
odiousNumber: array[1..30] of qWord;
|
||
odiousIterator: int64;
|
||
begin
|
||
// population count for powers of three
|
||
for iterator := 0 to 29 do
|
||
begin
|
||
number := round(exp(ln(3) * iterator));
|
||
write(popCnt(number):3);
|
||
end;
|
||
writeLn();
|
||
|
||
// evil numbers
|
||
// (while preserving calculated odious numbers for next sub-task)
|
||
evilCount := 0;
|
||
odiousIterator := low(odiousNumber);
|
||
|
||
// for-loop: because we (pretend to) don’t know,
|
||
// when and where we’ve found the first 30 numbers of each
|
||
for iterator := 0 to high(iterator) do
|
||
begin
|
||
// implicit typecast: popCnt only accepts _un_-signed integers
|
||
number := iterator;
|
||
if odd(popCnt(number)) then
|
||
begin
|
||
if odiousIterator <= high(odiousNumber) then
|
||
begin
|
||
odiousNumber[odiousIterator] := number;
|
||
inc(odiousIterator);
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
if evilCount < 30 then
|
||
begin
|
||
write(number:20);
|
||
inc(evilCount);
|
||
end;
|
||
end;
|
||
|
||
if evilCount + odiousIterator > 60 then
|
||
begin
|
||
break;
|
||
end;
|
||
end;
|
||
writeLn();
|
||
|
||
// odious numbers
|
||
for number in odiousNumber do
|
||
begin
|
||
write(number:20);
|
||
end;
|
||
writeLn();
|
||
end.
|