31 lines
1.5 KiB
ObjectPascal
31 lines
1.5 KiB
ObjectPascal
// Threaded use of 15 solver Unit. Nigel Galloway; February 1st., 2019.
|
|
program testFifteenSolver;
|
|
uses {$IFDEF UNIX}cthreads,{$ENDIF}sysutils,strutils,FifteenSolverT;
|
|
var Tz:array[0..5] of TThreadID; Tr:array[0..5] of TG; Tc:array[0..5] of shortint; Tw:array[0..5] of shortint;
|
|
const N:array[0..4 ] of string=('','d','u','r','l');
|
|
const G:array[0..15] of string=('41','841','841','81','421','8421','8421','821','421','8421','8421','821','42','842','842','82');
|
|
var ip:string; x,y:UInt64; P,Q:^TN; bPos,v,w,z,f:shortint; time1, time2: TDateTime; c:char;
|
|
function T(a:pointer):ptrint;
|
|
begin
|
|
Tr[uint32(a)]:=solve15(x,bPos,Tw[uint32(a)],Tc[uint32(a)]);
|
|
if Tr[uint32(a)].found then f:=uint32(a);
|
|
T:=0;
|
|
end;
|
|
begin
|
|
ReadLn(ip);
|
|
bPos:=Npos('0',ip,1)-1; w:=0; z:=0; f:=-1;
|
|
y:=(UInt64(Hex2Dec(ip[9..17]))<<32)>>32; x:=UInt64(Hex2Dec(ip[1..8]))<<32+y;
|
|
time1:=Now;
|
|
for w:=0 to $7f do begin
|
|
for c in G[bpos] do begin v:=z mod 6; Tc[v]:=integer(c)-48; Tw[v]:=w;
|
|
Tz[v]:=BeginThread(@T,pointer(v));
|
|
z+=1; if z>5 then waitforthreadterminate(Tz[z mod 6],$7fff);
|
|
end;
|
|
if f>=0 then break;
|
|
end;
|
|
for bpos:=0 to 5 do if Tw[bpos]>=Tw[f] then killthread(Tz[bpos]) else waitforthreadterminate(Tz[bpos],$7fff);
|
|
time2:=Now; WriteLn('Solution(s) found in ' + FormatDateTime('hh.mm.ss.zzz', time2-time1) + ' seconds');
|
|
for bpos:=0 to 5 do if Tr[bpos].found then begin
|
|
P:=@Tr[bpos].path; repeat Q:=P; Write(N[Q^.g]); P+=1; until Q^.n=endpos; WriteLn();
|
|
end;
|
|
end.
|