fork download
  1. -module(tested).
  2. -export([main/0]).
  3.  
  4. main() ->
  5. {ok, [N]} = io:fread("", "~d"),
  6. init(N).
  7.  
  8. init(0) ->
  9. initdone;
  10. init(N) ->
  11. {ok, [S]} = io:fread("", "~s"),
  12. R = doit(S),
  13. io:format("~s~n", [R]),
  14. init(N-1).
  15.  
  16. doit(SS) ->
  17. S = incl(SS),
  18. L = string:len(S),
  19. D = L div 2,
  20. SL = string:left(S, D),
  21. RSL = lists:reverse(SL),
  22. SR = string:right(S, D),
  23. case L rem 2 of
  24. 0 ->
  25. doit(RSL, SR, SL);
  26. 1 ->
  27. doit(RSL, SR, SL, string:centre(S, 1))
  28. end.
  29.  
  30. doit([], [], SL, SC) ->
  31. SL ++ [SC] ++ lists:reverse(SL);
  32. doit([HL|TL], [HR|TR], SL, SC) when HL == HR ->
  33. doit(TL, TR, SL, SC);
  34. doit([HL|_TL], [HR|_TR], SL, SC) when HL > HR ->
  35. SL ++ [SC] ++ lists:reverse(SL);
  36. doit([_HL|_TL], [_HR|_TR], SL, "9") ->
  37. INCSL = incl(SL),
  38. INCSL ++ [$0] ++ lists:reverse(INCSL);
  39. doit([_HL|_TL], [_HR|_TR], SL, SC) ->
  40. INCSC = incl(SC),
  41. SL ++ [INCSC] ++ lists:reverse(SL).
  42.  
  43. doit([], [], SL) ->
  44. SL ++ lists:reverse(SL);
  45. doit([HL|_TL], [HR|_TR], SL) when HL > HR ->
  46. SL ++ lists:reverse(SL);
  47. doit([HL|TL], [HR|TR], SL) when HL == HR ->
  48. doit(TL, TR, SL);
  49. doit([_HL|_TL], [_HR|_TR], SL) ->
  50. INCSL = incl(SL),
  51. INCSL ++ lists:reverse(INCSL).
  52.  
  53. incl(S) ->
  54. {H, T} = incl(lists:reverse(S), []),
  55. lists:reverse(H) ++ T.
  56. incl([$9|T], SS) ->
  57. incl(T, [$0|SS]);
  58. incl([T|H], SS) ->
  59. {[T+1|H], SS};
  60. incl([], SS) ->
  61. {"1", SS}.
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty