package Ġcom . co def or ces . sm ir nov Ċ Ċ import Ġcom . co def or ces . sm ir nov . api . Request Factory Ċ import Ġcom . co def or ces . sm ir nov . api . problem .* Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ class ĠProblem Importer ( factory : ĠRequest Factory , Ġid : ĠString , Ġprivate Ġval Ġroot Folder : ĠFile ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstatement Saver Ġ= ĠSave Statement ( factory , Ġid ) ĊĠĠĠ Ġprivate Ġval Ġtest Saver Ġ= ĠSave Test ( factory , Ġid ) ĊĠĠĠ Ġprivate Ġval Ġsolution Saver Ġ= ĠSave Solution ( factory , Ġid ) ĊĠĠĠ Ġprivate Ġval Ġfile Saver Ġ= ĠSave File ( factory , Ġid ) ĊĠĠĠ Ġprivate Ġval Ġvalidator Setter Ġ= ĠSet Validator ( factory , Ġid ) ĊĠĠĠ Ġprivate Ġval Ġchecker Setter Ġ= ĠSet Checker ( factory , Ġid ) ĊĠĠĠ Ġprivate Ġval Ġsample Marker Ġ= ĠMark Sample ( factory , Ġid ) ĊĊĠĠĠ Ġfun Ġimport () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġgenerate Problem Layout () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Tests ( layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Solutions ( layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Statement ( layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Checker ( layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Validator ( layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Sample Tests ( layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġtl , Ġml , Ġcomment , Ġsolution Ġtags ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmark Sample Tests ( layout : ĠProblem Layout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġregex Ġ= ĠRegex (" ex mp [{ ]") ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġlayout . statement ?. read Text () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsamples Number Ġ= Ġregex . findAll ( text ). count () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. samples Number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsample Marker . mark Sample (" tests ", Ġi ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Checker ( layout : ĠProblem Layout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchecker Ġ= Ġlayout . checker Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfile Saver . save File ( checker . name , Ġchecker . read Text ()) ĊĠĠĠĠĠĠĠ Ġchecker Setter . set Checker ( checker . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Validator ( layout : ĠProblem Layout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalidator Ġ= Ġlayout . validator Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfile Saver . save File ( validator . name , Ġvalidator . read Text ()) ĊĠĠĠĠĠĠĠ Ġvalidator Setter . set Validator ( validator . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Solutions ( layout : ĠProblem Layout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( layout . solutions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsolution sWith Tags Ġ= Ġlayout . solutions . sorted By Ġ{ Ġit . name . length Ġ}. map Indexed Ġ{ Ġindex , Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġto Ġif Ġ( index Ġ== Ġ 0 ) Ġ" MA " Ġelse Ġ" OK " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ(( solution , Ġtag ) Ġin Ġsolution sWith Tags ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsolution Saver . save Solution ( solution . name , Ġsolution . read Text (), Ġtag , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Tests ( layout : ĠProblem Layout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( test Set , Ġtests ) Ġin Ġlayout . tests ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( test Ġin Ġtests . sorted By Ġ{ Ġit . name Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Saver . save Test ( test Set , Ġtest . name . toInt (), Ġtest . read Text (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Statement ( layout : ĠProblem Layout ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġproblem Name ( name Line : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname Line . split ("{ ", Ġ" }") [ 3 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġlayout . statement ?. read Lines () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġinput File Index Ġ= Ġstatement . with Index (). single Ġ{ Ġit . value . startsWith ("\\ Input File ") Ġ}. index ĊĠĠĠĠĠĠĠ Ġval ĠoutputFile Index Ġ= Ġstatement . with Index (). single Ġ{ Ġit . value . startsWith ("\\ OutputFile ") Ġ}. index ĊĠĠĠĠĠĠĠ Ġval Ġexample Index Ġ= Ġstatement . with Index (). first Ġ{ Ġit . value . startsWith ("\\ Example ") Ġ|| Ġit . value . startsWith ("\\ begin { example }") Ġ}. index ĊĠĠĠĠĠĠĠ Ġval Ġnote Index Ġ= Ġstatement . with Index (). single OrNull Ġ{ Ġit . value . startsWith ("\\ Note ") Ġ} ?. index ĊĠĠĠĠĠĠĠ Ġval Ġend Problem Index Ġ= Ġstatement . with Index (). single Ġ{ Ġit . value . startsWith ("\\ end { problem }") Ġ}. index ĊĠĠĠĠĠĠĠ Ġvar Ġbegin Problem Index Ġ= Ġstatement . with Index (). single Ġ{ Ġit . value . startsWith ("\\ begin { problem }") Ġ}. index ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġproblem Name ( statement [ begin Problem Index ]) ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( statement [ begin Problem Index Ġ+ Ġ 1 ]. startsWith ("{ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ begin Problem Index ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlegend Ġ= Ġstatement . sub List ( begin Problem Index Ġ+ Ġ 1 , Ġinput File Index ). join ToString ( separator Ġ= Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġstatement . sub List ( inputFile Index Ġ+ Ġ 1 , ĠoutputFile Index ). join ToString ( separator Ġ= Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġstatement . sub List ( outputFile Index Ġ+ Ġ 1 , Ġexample Index ). join ToString ( separator Ġ= Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġval Ġnote Ġ= Ġif Ġ( note Index Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatement . sub List ( note Index Ġ+ Ġ 1 , Ġend Problem Index ). join ToString ( separator Ġ= Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstatement Saver . save Statement ( name , Ġlegend , Ġinput , Ġoutput , Ġnote ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Problem Layout (): ĠProblem Layout Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( root Folder . exists ()) ĊĠĠĠĠĠĠĠ Ġrequire ( root Folder . isDirectory ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠProblem Layout ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatement Ġ= ĠlistOf (" statement ", Ġ" statements ", Ġ" statements / r ussian "). map NotNull Ġ{ Ġget Statement ( it ) Ġ}. first OrNull (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecker Ġ= Ġget Checker (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator Ġ= Ġget Validator (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsolutions Ġ= Ġget Solutions (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtests Ġ= Ġget Tests () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Statement ( statement Dir : ĠString ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatements Dir Ġ= ĠFile ( root Folder , Ġstatement Dir ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! statements Dir . exists () Ġ|| Ġ! statements Dir . isDirectory ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġstatements Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Files Ġ{ Ġfile Ġ-> Ġfile . name . endsWith (". tex ") Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. min By OrNull Ġ{ Ġit . length () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Checker (): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchecker File Ġ= ĠFile ( root Folder , Ġ" check . cpp ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! checker File . exists () Ġ|| Ġ! checker File . isFile ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġchecker File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Validator (): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Dir Ġ= ĠFile ( root Folder , Ġ" src ") ĊĠĠĠĠĠĠĠ Ġval Ġvalidator File Ġ= ĠFile ( src Dir , Ġ" validate . cpp ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! validator File . exists () Ġ|| Ġ! validator File . isFile ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġvalidator File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Solutions (): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsolutions Dir Ġ= ĠFile ( root Folder , Ġ" solutions ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! solutions Dir . exists () Ġ|| Ġ! solutions Dir . isDirectory ) Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġreturn Ġsolutions Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Files Ġ{ Ġfile Ġ-> Ġfile . name . endsWith (". cpp ") Ġ|| Ġfile . name . endsWith (". py ") Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tests (): ĠList < Pair < String , ĠList < File >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtests Dir Ġ= ĠFile ( root Folder , Ġ" tests ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! tests Dir . exists () Ġ|| Ġ! tests Dir . isDirectory ) Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtests Dir . list Files () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġtest Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Set . name Ġto Ġif Ġ(! test Set . exists () Ġ|| Ġ! test Set . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Files Ġ{ Ġfile Ġ-> Ġfile . name . toInt OrNull () Ġ!= Ġnull Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" tests " Ġto Ġtests Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Files Ġ{ Ġfile Ġ-> Ġfile . name . toInt OrNull () Ġ!= Ġnull Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠProblem Layout ( ĊĠĠĠĠĠĠĠ Ġval Ġstatement : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġval Ġchecker : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġval Ġvalidator : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġval Ġsolutions : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġval Ġtests : ĠList < Pair < String , ĠList < File >>> ĊĠĠĠ Ġ) Ċ }