RosettaCodeData/Task/Metallic-ratios/PascalABC.NET/metallic-ratios.pas

64 lines
1.5 KiB
ObjectPascal

type
Metal = (platinum, golden, silver, bronze, copper, nickel, aluminium, iron, tin, lead);
function seq(b: integer): sequence of biginteger;
begin
// Yield the successive terms if a “Lucas” sequence.
// The first two terms are ignored.
var x := 1bi;
var y := 1bi;
while true do
begin
x += b * y;
Swap(x, y);
yield y;
end;
end;
function plural(n: integer) := if n >= 2 then 's' else '';
procedure computeRatio(b: integer; digits: integer);
begin
// Compute the ratio for the given "n" with the required number of digits.
var M := Power(10bi, digits);
var niter := 0; // Number of iterations.
var prevN := 1bi; // Previous value of "n".
var ratio := M ; // Current value of ratio.
foreach var n in seq(b) do
begin
inc(niter);
var nextRatio := n * M div prevN;
if nextRatio = ratio then break;
prevN := n;
ratio := nextRatio;
end;
var str := ratio.ToString;
insert('.', str, 2);
Writeln('Value to ', digits, ' decimal places after ', niter, ' iteration', plural(niter), ': ',str);
end;
begin
foreach var b in 0..9 do
begin
Writeln('“Lucas” sequence for ', Metal(b), ' ratio where b = ', b, ':');
Write('First 15 elements: 1 1 ');
var count := 2;
foreach var n in seq(b) do
begin
Write(' ', n);
Inc(count);
if count = 15 then break
end;
println;
computeRatio(b, 32);
Println;
end;
Println('Golden ratio where b = 1:');
computeRatio(1, 256);
end.