package Ġcom . t so ved ens ki . csp . s udoku Ċ Ċ import Ġcom . t so ved ens ki . csp .* Ċ import Ġcom . t so ved ens ki . csp . he ur istics . pr uning . schemas . Full Look A head Ċ import Ġcom . t so ved ens ki . csp . reactor . Reactor Back tracking Ċ import Ġprocessing . core . P App let Ċ import Ġreactor . core . publisher . Mono Ċ import Ġreactor . core . publisher . Topic Processor Ċ import Ġreactor . core . scheduler . Schedulers Ċ import Ġjava . time . Duration Ċ import Ġkotlin . concurrent . thread ĊĊ Ċ data Ġclass ĠPosition ( val Ġx : ĠFloat , Ġval Ġy : ĠFloat ) Ċ Ċ class ĠProcessing S udoku : ĠP App let () Ġ{ ĊĠĠĠ Ġvar Ġassignment : ĠAssignment < String , ĠInt > Ġ= Ġempty Assignment () ĊĊĠĠĠ Ġcompanion Ġobject ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsketch Ġ= ĠProcessing S udoku () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsketch . setSize ( 1 0 0 0 , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsketch . run Sketch () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproblem Ġ= ĠS udoku ( s udoku 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= ĠTopic Processor . create < Assignment < String , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġval Ġsink Ġ= Ġprocessor . sink () ĊĊĠĠĠĠĠĠĠ Ġprocessor . concat Map Ġ{ Ġit Ġ-> ĠMono . just ( it ). delay Element ( Duration . of Millis ( 2 0 0 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . parallel ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. publish On ( Schedulers . parallel ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. subscribe Ġ{} ĊĊĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= Ġproblem . solve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrategy Ġ= ĠRe actor Back tracking ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprune Schema Ġ= ĠFull Look A head (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink Ġ= Ġsink ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsolution . print () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint S udoku ( problem . grid , Ġsolution ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw () Ġ{ ĊĠĠĠĠĠĠĠ Ġdraw S udoku ( assignment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw S udoku ( assignment : ĠAssignment < String , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġsqrt ( assignment . size . toFloat ()). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġsmallest Dimension Ġ= Ġmin ( width , Ġheight ) ĊĊĠĠĠĠĠĠĠ Ġrepeat ( size ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow First Index Ġ= Ġ( size ) Ġ* Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Last Index Ġ= Ġ( size ) Ġ* Ġi Ġ+ Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġassignment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub List ( row First Index , Ġrow Last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġprint Cell ( it . second ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Cells Row ( row , Ġi , Ġsmallest Dimension / size . toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprint Cell ( domain : ĠDomain < Int >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdomain . toList () ĊĠĠĠĠĠĠĠ Ġreturn Ġ Ġif Ġ( list . toList (). size Ġ== Ġ 1 ) Ġlist . first (). toString () Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġdraw Cells Row ( row : ĠList < String >, Ġrow Num : ĠInt , Ġcell Size : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrow . forEach Indexed { Ġi , Ġnum Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Cell ( Position ( i * cell Size , Ġrow Num * cell Size ), Ġcell Size , Ġnum ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw Cell ( position : ĠPosition , Ġsize : ĠFloat , Ġnumber : ĠString Ġ= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġstroke Weight ( 4 f ) ĊĠĠĠĠĠĠĠ Ġstroke ( 4 ) ĊĠĠĠĠĠĠĠ Ġfill ( 2 5 5 ) ĊĠĠĠĠĠĠĠ Ġrect ( position . x , Ġposition . y , Ġsize , Ġsize ) ĊĠĠĠĠĠĠĠ Ġfill ( 2 0 ) ĊĠĠĠĠĠĠĠ Ġtext Size ( size Ġ/ Ġ 1 . 5 f ) ĊĠĠĠĠĠĠĠ ĠtextAlign ( CENTER , ĠC ENTER ) ĊĠĠĠĠĠĠĠ Ġtext ( number , Ġposition . x Ġ+ Ġsize Ġ/ Ġ 2 f , Ġposition . y Ġ+ Ġsize Ġ/ Ġ 2 f ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ ĠProcessing S udoku . run () Ċ } Ċ