package Ġio . dk oz ak . search . engine Ċ Ċ import Ġio . dk oz ak . search . model . Engine Configuration Ċ import Ġio . dk oz ak . search . model . Node Ċ import Ġio . dk oz ak . search . model . b fs . Fifo Open List Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ data Ġclass ĠNum Node ( val Ġnum : ĠInt ) Ġ: ĠNode Ċ Ċ class ĠEngine Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` simple Number Game Ġsolution Ġshould Ġbe Ġfound , Ġno Ġclosed Ġset `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠEngine Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState Ġ= ĠNum Node ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen List Ġ= ĠF ifo Open List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Node Ġ= Ġ{ Ġnode Ġ-> ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 ). map Ġ{ ĠNum Node ( it Ġ+ Ġnode . num ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Filter Ġ= Ġ{ Ġ_ Ġ-> Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Final State Ġ= Ġ{ Ġnode Ġ-> Ġnode . num Ġ== Ġ 4 2 Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġlogger : Ġ( String ) Ġ-> ĠUnit Ġ= Ġ{ Ġmsg Ġ-> Ġprintln ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsearch ( configuration , Ġlogger ) ĊĠĠĠĠĠĠĠ Ġprintln (" Found Ġresult Ġ$ result ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` simple Number Game Ġsolution Ġshould Ġbe Ġfound , Ġwith Ġclosed Ġset `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnotice Ġhow Ġmuch Ġfaster Ġthis Ġis Ġ:) ĊĠĠĠĠĠĠĠ Ġval Ġvisited Nodes Ġ= Ġmutable Set Of < Node >() ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠEngine Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState Ġ= ĠNum Node ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen List Ġ= ĠF ifo Open List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Node Ġ= Ġ{ Ġnode Ġ-> ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 ). map Ġ{ ĠNum Node ( it Ġ+ Ġnode . num ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Filter Ġ= Ġ{ Ġnode Ġ-> Ġvisited Nodes . add ( node ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Final State Ġ= Ġ{ Ġnode Ġ-> Ġnode . num Ġ== Ġ 4 2 Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġlogger : Ġ( String ) Ġ-> ĠUnit Ġ= Ġ{ Ġmsg Ġ-> Ġprintln ( msg ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsearch ( configuration , Ġlogger ) ĊĠĠĠĠĠĠĠ Ġprintln (" Found Ġresult Ġ$ result ") ĊĠĠĠ Ġ} Ċ }