Zitat von
He4dnut:
Aber beim besten Willen fällt mir keine schlaue Rechnung ein, mitder man jedem Stein seinen passenden Wert automatisch zuordnet. Zur Not würde ich auch einfach an einer Stelle der
Unit manuell jedem Stein seine Werte zuordnen. Das ist halt einmal viel Arbeit, aber dann hat mans wenigstens einmal richtig ;-)
Vielleicht so : (schönen Gruß von Carl Friedrich Gauss)
Delphi-Quellcode:
PROCEDURE StoneToValues(stone:integer; var value1,value2:integer);
// var i,j,n:integer;
begin
value1:=Trunc(Sqrt(stone*2)-0.5);
value2:=stone-(Sqr(value1)+value1) div 2-1;
// Oben die korrigierte Version.
// Die auskommentierte Fassung liefert korrekte Werte, aber
// es hat mir keine Ruhe gelassen, dass so ein triviales Ding auch noch ein IF ... benötigen soll.
// i:=Trunc(Sqrt(stone*2+0.25)-0.5);
// n:=(i*i+i) div 2;
// if n>=stone then begin
// value1:=i-1;
// value2:=value1;
// end else begin
// value1:=i;
// value2:=stone-n-1;
// end;
end;
Oder für einfache Gemüter so :
Delphi-Quellcode:
PROCEDURE SimpleStoneToValues(stone:integer;
var value1,value2:integer);
var i,j:integer;
begin
for i:=0
to stone
do
for j:=0
to i
do begin
dec(stone);
if stone=0
then begin
value1:=i;
value2:=j;
exit;
end;
end;
end;
Beide Funktionen setzen voraus, daß die Steine bei 1 beginnend numeriert sind.