という無茶な願望は放っておいて。
まずはそもそも解くことができるかについて.問題はAtCoder Regular Contest #005のA,B,C
あれぇ〜? Dは〜?
待っていても来なさそうなので、仕方が無いので、作ってみた。
%% arc005_4.tex
\catcode`\@=11
%---------------------------------------
%(Constants)
\chardef\ET@ten=10
\mathchardef\ET@HUGE=10000
\newcount\ET@SLIMIT \ET@SLIMIT=100000000
%(Variables)
\newcount\ET@gm \ET@gm\z@
\newcount\ET@j %(j)
\newcount\ET@k %(k)
\newcount\ET@kk % another k
\newcount\ET@m %(m)
\newcount\ET@r % ret-value
\newcount\ET@tl % t lowerpart
\newcount\ET@tli % tl saved
\newcount\ET@tu % t upperpart
\newcount\ET@tui % tu saved
\newcount\ET@u % temp
%(Quasivariables)
\chardef\ET@ccost\z@ %(ccost)
\chardef\ET@clast\z@ %(clast)
\chardef\ET@d\z@ %(d)
\chardef\ET@dmax\z@ %(dmax)
\chardef\ET@lastk\z@ %(lastk)
\chardef\ET@lastm\z@ %(lastm)
\chardef\ET@xcost\z@ %(xcost)
%(Switches)
\newif\ifET@error
\newif\ifET@dserror
%(Token-lists)
\let\ET@za\empty % temp
\let\ET@zb\empty % temp
\let\ET@set\empty %(set)
\let\ET@dsetl\empty %(dset)
\let\ET@expr\empty %(expr)
%%(Arrays)
\def\ET@cscst#1#2{\expandafter\mathchardef
\csname E!#1\endcsname=#2\relax}
%\E!d/* (dvalid)
%\E!cc/* (ccol)
\ET@cscst{cc/0}\z@
%\E!cl/* (cslast)
%\E!mm/* (mmax)
\ET@cscst{mm/0}\z@
%\E!an/* (answer)
%\E!num/* (num)
%---------------------------------------
\def\ET@cs#1{\csname E!#1\endcsname}
\def\ET@csdef#1{\expandafter\def\csname E!#1\endcsname}
\def\ET@csedef#1{\expandafter\edef\csname E!#1\endcsname}
\def\ET@cslet#1#2{\expandafter\let\csname E!#1\endcsname=#2}
\def\ET@letcs#1#2{\expandafter\let\expandafter#1\csname
E!#2\endcsname}
\def\ET@iscsdef#1{\expandafter\ifx\csname E!#1\endcsname\relax
\z@\else\@ne\fi}
\def\ET@end{\noexpand\ET@end@}
%\def\ET@debug#1{\immediate\write16{#1}}
%\def\ET@debugp#1{\message{#1}\read\m@ne to\ET@zz}
%\newlinechar=10
%---------------------------------------
%% \ET@do@residue: t := residue(t, m)
\def\ET@do@residue{%
\advance\ET@tl-\ET@m
\divide\ET@tl\ET@ten
\ifnum\ET@tu>\z@
\ET@let@remainder\ET@r\ET@tu
\divide\ET@tu\ET@ten
\multiply\ET@r\ET@SLIMIT
\advance\ET@tl\ET@r
\fi
\ifnum\ET@tl<\z@
\advance\ET@tu\m@ne
\advance\ET@tl\ET@SLIMIT
\fi
}
%% \ET@do@tail: r := tail(t)
\def\ET@do@tail{%
\ET@let@remainder\ET@r\ET@tl
}
%% \ET@do@to@value: r := to_value(t)
\def\ET@do@to@value{%
\ifnum\ET@tu>\z@ \ET@r\ET@HUGE
\else \ET@r\ET@tl
\fi
}
%% \ET@let@remainder\X\Y: \Y := \X mod 10
\def\ET@let@remainder#1#2{%
#1#2\divide#1\ET@ten
\multiply#1-\ET@ten\advance#1#2%
}
%% \ET@do@to@internal{<num>}: t := to_internal(num)
\def\ET@do@to@internal#1{%
\let\ET@za\empty
\ET@do@to@internal@a#1\ET@end
}
\def\ET@do@to@internal@a#1{%
\ifx#1\ET@end
\ifx\ET@za\empty \let\ET@next\ET@errortrue
\else \let\ET@next\ET@do@to@internal@c
\fi
\else\ifnum2<1\noexpand#1\relax
\ifnum\ifx\ET@za\empty0\else1\fi#1>\z@
\edef\ET@za{#1\ET@za}%
\fi
\let\ET@next\ET@do@to@internal@a
\else
\let\ET@next\ET@do@to@internal@b
\fi\fi \ET@next
}
\def\ET@do@to@internal@b#1\ET@end{%
\ET@errortrue
}
\def\ET@do@to@internal@c{%
\expandafter\ET@do@to@internal@d\ET@za000000000000000000\ET@end
}
\def\ET@do@to@internal@d#1#2#3#4#5#6#7#8#9{%
\ET@tl=#9#8#7#6#5#4#3#2#1\relax
\ET@do@to@internal@e
}
\def\ET@do@to@internal@e#1#2#3#4#5#6#7#8#9{%
\ET@tu=#9#8#7#6#5#4#3#2#1\relax
\ET@do@to@internal@f
}
\def\ET@do@to@internal@f#1\ET@end{}
%% \ET@the@t: t stringified
\def\ET@the@t{\the\ET@tu:\the\ET@tl}
%% \ET@the@zero: zero stringified in same way as \ET@the@t
\def\ET@the@zero{0:0}
%---------------------------------------
%% \ET@get@cool@seq{<k>}: get_ccol_seq(k)
%* updates: \ET@gm, \E!cc/*, \E!cl/*, \E!mm/*
\def\ET@get@ccol@seq#1{%
\ET@u#1\relax \advance\ET@u\m@ne
\chardef\ET@cki\ET@u %== k-1
\let\ET@next\ET@get@ccol@seq@a
\ET@next\ET@get@ccol@seq@b
}
\def\ET@get@ccol@seq@a{%
\global\advance\ET@gm\@ne
\ET@get@ccol
\global\ET@cscst{cc/\the\ET@gm}\ET@ccost
\global\ET@cscst{cl/\the\ET@gm}\ET@clast
\global\ET@cscst{mm/\the\ET@ccost}\ET@gm
\ET@get@ccol@seq@b
}
\def\ET@get@ccol@seq@b{%
\ET@letcs\ET@za{mm/\the\ET@cki}%
\ifx\ET@za\relax\else
\ET@u\ET@za \advance\ET@u\ET@dmax
\ifnum\ET@gm<\ET@u\else
\let\ET@next\relax
\fi
\fi \ET@next
}
%% \ET@get@ccol: get_ccol(m)
%r updates: \ET@ccost, \ET@clast
\def\ET@get@ccol{%
\mathchardef\ET@ccost\ET@HUGE
\chardef\ET@clast\z@
\let\do\ET@get@ccol@a
\ET@digits
}
\def\ET@get@ccol@a#1{%
\chardef\ET@za#1\relax %==d
\ifnum\ET@gm<\ET@za\else
\ET@u\ET@gm \advance\ET@u-\ET@za
\ET@u\ET@cs{cc/\the\ET@u}\advance\ET@u\@ne
\ifnum\ET@u<\ET@ccost
\mathchardef\ET@ccost\ET@u
\chardef\ET@clast\ET@za
\fi
\fi
}
%---------------------------------------
%% \ET@prepare@answer{<k>}: prepare_answer(k)
% updates: \E!an/*/*
\def\ET@prepare@answer#1{%
\ET@k=#1\relax
\ET@j\m@ne \loop \ifnum\ET@j<\ET@k
\advance\ET@j\@ne
\ifnum\ET@iscsdef{an/\the\ET@j/\ET@the@zero}=\z@
\global\ET@csdef{an/\the\ET@j/\ET@the@zero}{{0}{0}{0}}%
\fi
\repeat
}
%% \ET@solve@core: solve_core(t, k)
% updates: \ET@xcost, \ET@lastk, \ET@lastm, \E!an/*/*
\def\ET@solve@core{%
%\ET@debug{CALL:\the\ET@k/\ET@the@t}%
\def\ET@zb{an/\the\ET@k/\ET@the@t}%
\ET@letcs\ET@answer\ET@zb
\ifx\ET@answer\relax
%\ET@debug{ENTER}%
\begingroup
\mathchardef\ET@xcost\ET@HUGE
\chardef\ET@lastk\z@
\chardef\ET@lastm\z@
\ET@do@tail \chardef\ET@d\ET@r
\chardef\ET@mmax\ET@cs{mm/\the\ET@k}%
\ET@do@to@value
\ifnum \ET@r<\ET@mmax \chardef\ET@mmax\ET@r \fi
\chardef\ET@kmax\ET@k
\ET@tui\ET@tu \ET@tli\ET@tl
\ET@m\ET@d
\ET@solve@core@a
%\ET@k\ET@kmax
\xdef\ET@g@next{%
\edef\noexpand\ET@answer
{{\the\ET@xcost}{\the\ET@lastk}{\the\ET@lastm}}%
}%
\endgroup
\ET@g@next
\global\ET@cslet\ET@zb\ET@answer
\fi
%\ET@debug{RETURN:\ET@zb->\ET@answer}%
}
\def\ET@solve@core@a{%
\ifnum\ET@m>\ET@mmax\else
\ET@k\ET@cs{cc/\the\ET@m}%
\ET@solve@core@b
\advance\ET@m\ET@ten
\expandafter\ET@solve@core@a
\fi
}
\def\ET@solve@core@b{%
\ifnum\ET@k>\ET@kmax\else
%\ET@debug{<\the\ET@m/\the\ET@k>}%
\ET@do@residue
\ET@solve@core
\expandafter\ET@solve@core@c\ET@answer
\ET@tu\ET@tui \ET@tl\ET@tli
\ET@u\ET@xcosti \advance\ET@u\ET@k
\ifnum\ET@u<\ET@xcost
\mathchardef\ET@xcost\ET@u
\chardef\ET@lastk\ET@k
\chardef\ET@lastm\ET@m
\fi
\advance\ET@k\@ne
\expandafter\ET@solve@core@b
\fi
}
\def\ET@solve@core@c#1#2#3{%
\mathchardef\ET@xcosti#1\relax
}
%---------------------------------------
%% \ET@solve@main{<t>}: solve_main(t)
% updates: \ET@xcost, \ET@lastk, \ET@lastm, (\ET@expr)
\def\ET@solve@main#1{%
\def\ET@expr{ERROR!}%
\ifET@dserror\else
\ET@errorfalse
\edef\ET@next{\noexpand\ET@do@to@internal{#1}}%
\ET@next
\ifET@error\else
\ET@kk\z@
\mathchardef\ET@xcost\ET@HUGE
\chardef\ET@lastk\z@
\mathchardef\ET@lastm\z@
\ET@solve@main@a
\ET@k\ET@lastk
\ET@get@expr
\fi
\fi
}
\def\ET@solve@main@a{%
\advance\ET@kk\@ne
\ET@u\ET@kk \multiply\ET@u\tw@
\ifnum\ET@u<\ET@xcost
\ET@get@ccol@seq\ET@kk
\ET@prepare@answer\ET@kk
\ET@k\ET@kk
\ET@solve@core
\expandafter\ET@solve@main@c\ET@answer
\ET@u\ET@xcosti
\ifnum\ET@kk>\@ne \advance\ET@u\ET@kk \fi
%\ET@debug{[\the\ET@kk]->\the\ET@u/\the\ET@lastki/\the\ET@lastmi}%
\ifnum\ET@u<\ET@xcost
\mathchardef\ET@xcost\ET@u
\chardef\ET@lastk\ET@lastki
\mathchardef\ET@lastm\ET@lastmi
\fi
\expandafter\ET@solve@main@a
\fi
}
\def\ET@solve@main@c#1#2#3{%
\mathchardef\ET@xcosti#1\relax
\chardef\ET@lastki#2\relax
\mathchardef\ET@lastmi#3\relax
}
%---------------------------------------
%% \ET@get@dset{<m>}: get_dset(m)
% updates: \ET@set
\def\ET@get@dset#1{%
\ET@u#1\relax
\let\ET@set\empty
\ET@get@dset@a
}
\def\ET@get@dset@a{%
\ifnum\ET@u>\z@
\chardef\ET@d\ET@cs{cl/\the\ET@u}%
\advance\ET@u-\ET@d
\edef\ET@set{\do{\the\ET@d}\ET@set}%
\expandafter\ET@get@dset@a
\fi
}
%% \ET@get@expr: get_expr(t, k)
% updates: \ET@expr
\def\ET@get@expr{%
\let\do\relax \let\ET@cdo\relax
\global\let\ET@dsetl\empty
\begingroup
\ET@get@expr@a
\endgroup
\begingroup
\let\do\ET@get@expr@e
\let\ET@cdo\ET@get@expr@c
\ET@dsetl
\ET@j\z@ \let\ET@expr\empty
\ET@get@expr@f
\xdef\ET@g@next{\def\noexpand\ET@expr{\ET@expr}}%
\endgroup
\global\let\ET@dsetl\empty
\ET@g@next
}
\def\ET@get@expr@a{%
\edef\ET@za{\ET@the@t}%
\ifx\ET@za\ET@the@zero\else
\ET@letcs\ET@answer{an/\the\ET@k/\ET@the@t}%
\expandafter\ET@get@expr@b\ET@answer
\ET@get@dset\ET@m
\xdef\ET@dsetl{\ET@cdo{\ET@set}\ET@dsetl}%
\ET@do@residue
\expandafter\ET@get@expr@a
\fi
}
\def\ET@get@expr@b#1#2#3{%
\chardef\ET@k#2\relax
\mathchardef\ET@m#3\relax
}
\def\ET@get@expr@c#1{%
\ET@j\z@
#1%
\ET@get@expr@d
}
\def\ET@get@expr@d{%
\ifnum\ET@j<\ET@k
\advance\ET@j\@ne
\ET@letcs\ET@za{num/\the\ET@j}%
\ifx\ET@za\relax\else
\ET@csedef{num/\the\ET@j}{\ET@za0}%
\fi
\expandafter\ET@get@expr@d
\fi
}
\def\ET@get@expr@e#1{%
\advance\ET@j\@ne
\ET@letcs\ET@za{num/\the\ET@j}%
\ifx\ET@za\relax \let\ET@za\empty \fi
\ET@csedef{num/\the\ET@j}{\ET@za#1}%
}
\def\ET@get@expr@f{%
\ifnum\ET@j<\ET@k
\advance\ET@j\@ne
\edef\ET@za{\ifnum\ET@j<\ET@k +\else\ifnum\ET@k>\@ne =\fi\fi}%
\edef\ET@expr{\ET@expr\ET@cs{num/\the\ET@j}\ET@za}%
\expandafter\ET@get@expr@f
\fi
}
%---------------------------------------
%% \ET@read@set{<digit-seq>}: read_set(s)
% updates: \E!d/*, \ET@digits, \ET@dmax
\def\ET@read@set#1{%
\global\ET@dserrorfalse
\edef\ET@za{#1}%
\expandafter\ET@read@set@a\ET@za\ET@end
\global\let\ET@read@set\ET@read@set@inv
}
\def\ET@read@set@a#1{%
\ifx#1\ET@end
\let\ET@next\ET@read@set@c
\else\ifnum2<1\noexpand#1\relax
\global\ET@cslet{d/#1}t%
\let\ET@next\ET@read@set@a
\else
\let\ET@next\ET@read@set@b
\fi\fi \ET@next
}
\def\ET@read@set@b#1\ET@end{%
\global\ET@dserrortrue
}
\def\ET@read@set@c{%
\global\ET@cslet{d/1}t%
\let\do\relax
\global\let\ET@digits\empty
\ET@j\@ne \loop
\ifnum\ET@iscsdef{d/\the\ET@j}=\@ne
\xdef\ET@digits{\ET@digits\do\the\ET@j}%
\global\chardef\ET@dmax\ET@j
\fi
\advance\ET@j\@ne
\ifnum\ET@j<\ET@ten \repeat
}
\def\ET@read@set@inv#1{%
\errmessage{Digit set cannot be altered}%
}
%---------------------------------------
\def\Main{%
\begingroup
\endlinechar\m@ne
\read\m@ne to\ET@za
\expandafter\ET@read@set\expandafter{\ET@za}%
\read\m@ne to\ET@tnum
\ET@solve@main\ET@tnum
\immediate\write16{\ET@expr}%
\endgroup
}
%---------------------------------------
\catcode`\@=12
\immediate\write16{--------}%===========
\Main
\immediate\write16{--------}%===========
\bye入力例 4。(input4.txt)
019 2727
これを標準入力から読み込んでソースを実行すると以下の出力を得る。(見易くするために区切り線を出力させている。*1)
C>tex arc005_4.tex < input4.txt This is TeX, Version 3.1415926 (TeX Live 2012/W32TeX) encTeX v. Jun. 2004, reencoding enabled. (./arc005_4.tex -------- 909+909+909= -------- ) No pages of output. Transcript written on arc005_4.log.
入力例 5。(input5.txt)
01457 245723852196245230
実行すると次のようになる。
C>tex arc005_4.tex < input5.txt This is TeX, Version 3.1415926 (TeX Live 2012/W32TeX) encTeX v. Jun. 2004, reencoding enabled. (./arc005_4.tex -------- 175711751155145110+70011701041100110+400000000010= -------- ) No pages of output. Transcript written on arc005_4.log.