package Ġio . github . ran ol p . m fs je a čĊč Ċ import Ġio . github . ran ol p . m fs je a . es cap er . Sentence Esc aper č Ċ import Ġio . github . ran ol p . m fs je a . grader .* č Ċ import Ġio . github . ran ol p . m fs je a . keyboard .* čĊč Ċ /** čĊ Ġ* ĠUniversal Ġsentence Ġconverter . Ġit Ġconverts Ġsentences Ġvia Ġkeyboard Ġset , Ġand Ġscore Ġit . Ġthen Ġreturns Ġbest Ġconversion Ġresult . čĊ Ġ*/ č Ċ class ĠM fs je a ( čĊĠĠĠ Ġprivate Ġval Ġinput Keyboard s : ĠList < Input Keyboard >, čĊĠĠĠ Ġprivate Ġval Ġoutput Keyboard s : ĠList < Output Keyboard >, čĊĠĠĠ Ġprivate Ġval Ġgrad ers : ĠList < Sentence Gr ader >, čĊĠĠĠ Ġprivate Ġval Ġescap ers : ĠList < Sentence Esc aper > č Ċ ) Ġ{ čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( input Keyboard s . isEmpty () Ġ|| Ġoutput Keyboard s . isEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo : Ġthrow Ġown Ġexception , Ġwe Ġmust Ġhave Ġone Ġor Ġmore Ġin / output Ġkeyboard s ! čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠConvert Ġthe Ġsentences Ġvia Ġkeyboard s Ġof Ġthis Ġinstance . čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ@ param Ġsentence Ġthe Ġtarget Ġsentence čĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġlist Ġof Ġresult . Ġit Ġsorted Ġby Ġdescending Ġscore . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġje am fs List ( sentence : ĠString ): ĠList < Conversion Result > Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġmutable ListOf < Conversion Result >() čĊĠĠĠĠĠĠĠ Ġinput Keyboard s . forEach Ġ{ Ġinput Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Keyboard s . forEach Ġ{ Ġoutput Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsets Ġ= Ġmutable ListOf < Character Set >() čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal s Ġ= ĠStringBuilder () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġmutable ListOf < Pair < Char , ĠChar >>() čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtrue Ġif Ġchanged čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmode Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtrue Ġif Ġstarted čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġescape Mode Ġ= Ġfalse čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġescap er : ĠSentence Esc aper ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġupdate Original () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsets Ġ+= ĠCharacter Set ( original s . toString ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal s . set Length ( 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġupdate Changed () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġchanges . map Ġ{ Ġit . first Ġ}. join ToString ("") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Ġ= Ġoutput . combinator . combine ( changes . map Ġ{ Ġit . second Ġ}. join ToString ("")) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore Ġ= Ġgrad ers . sum By Ġ{ Ġit . compute Score ( change ) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsets Ġ+= Ġif Ġ( score Ġ< Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter Set ( origin ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter Set ( origin , Ġchange , Ġscore ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . clear () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġupdate () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Changed () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Original () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( ch Ġin Ġsentence ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! escape Mode ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġescap er Ġ= Ġescap ers . first OrNull Ġ{ Ġit . check ( ch ) Ġ== ĠSentence Esc aper . Escape Mode . START Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( es cap er Ġ!== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġescape Mode Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( escape Mode ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( es cap er ?. check ( ch ) Ġ== ĠSentence Esc aper . Escape Mode . END ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġescape Mode Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal s . append ( ch ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgot Ġ= Ġinput . getKey code ( ch ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( got Ġ=== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Changed () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal s . append ( ch ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! mode ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Original () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges Ġ+= Ġch Ġto Ġoutput . get Character ( got ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsets . join ToString ("") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . state Ġ== ĠCharacter Set . State . CHANGED ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . combinator . combine ( it . changed ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . changed čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ+= ĠConversion Result ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH ang ul 2 3 5 0 Gr ader . compute Score ( result ), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsets . sum By Ġ{ Ġit . score Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġresults . sorted By Descending Ġ{ Ġit . score Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠFind Ġthe Ġbest Ġconverted Ġsentence Ġby Ġscore . čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ@ param Ġsentence Ġthe Ġtarget Ġsentence čĊĠĠĠĠ Ġ* Ġ@ return Ġbest Ġresult čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġje am fs Auto ( sentence : ĠString ): ĠConversion Result Ġ= Ġje am fs List ( sentence ). first () čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠExt ends Ġthe Ġm fs je a Ġinstance . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġextend ( čĊĠĠĠĠĠĠĠ Ġinput Keyboard s : Ġ( List < Input Keyboard >) Ġ-> ĠList < Input Keyboard > Ġ= Ġ{ Ġit Ġ}, čĊĠĠĠĠĠĠĠ Ġoutput Keyboard s : Ġ( List < Output Keyboard >) Ġ-> ĠList < Output Keyboard > Ġ= Ġ{ Ġit Ġ}, čĊĠĠĠĠĠĠĠ Ġgrad ers : Ġ( List < Sentence Gr ader >) Ġ-> ĠList < Sentence Gr ader > Ġ= Ġ{ Ġit Ġ}, čĊĠĠĠĠĠĠĠ Ġescap ers : Ġ( List < Sentence Esc aper >) Ġ-> ĠList < Sentence Esc aper > Ġ= Ġ{ Ġit Ġ} čĊĠĠĠ Ġ): ĠM fs je a Ġ= ĠM fs je a ( čĊĠĠĠĠĠĠĠ Ġinput Keyboard s ( this . input Keyboard s ), čĊĠĠĠĠĠĠĠ Ġoutput Keyboard s ( this . output Keyboard s ), čĊĠĠĠĠĠĠĠ Ġgrad ers ( this . gr aders ), čĊĠĠĠĠĠĠĠ Ġescap ers ( this . es cap ers ) čĊĠĠĠ Ġ) čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* ĠDefault Ġm fs je a Ġinstance . čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġ@ Jvm Field čĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT : ĠM fs je a Ġ= ĠM fs je a ( čĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Qw erty Keyboard , ĠD vor ak Keyboard , ĠCo lem ak Keyboard ), čĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( D ube ol Standard Keyboard , ĠSe be ol 3 9 0 Keyboard , ĠSe be ol Final Keyboard ), čĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Hang ul 2 3 5 0 Gr ader , ĠNumber Gr ader , ĠParent hesis Gr ader , ĠIn complete Word Gr ader , ĠAsc ii Gr ader ), čĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} č Ċ } čĊ