「回文の発掘」をErlangでやってみました。他の実装は 第15回オフラインリアルタイムどう書くの参考問題 から辿れます。
subpalin.erl
-module(subpalin).
-compile(export_all).
%% 解く
solve(Data) -> integer_to_list(palinnum(Data)).
%% 回文の最大長を返す
palinnum([]) -> 0;
palinnum(L) -> lists:max([palinnum2(S) || S <- tailcombi(L)]).
palinnum2([]) -> 0;
palinnum2([H | T]) ->
F = fun % 先頭と同じ文字を探し、その間に含まれる回文の最大長を返す関数
([H2 | T2]) when H2 =:= H -> palinnum(lists:reverse(T2)) + 1;
(_) -> 0
end,
lists:max([0 | [F(X) || X <- tailcombi(lists:reverse(T))]]) + 1.
%% "abc" -> ["abc", "bc", "c"]
tailcombi(L) -> tailcombi(L, []).
tailcombi([], Acc) -> lists:reverse(Acc);
tailcombi(L = [_ | T], Acc) -> tailcombi(T, [L | Acc]).
%% テスト
test(Data, Expected) ->
Result = solve(Data),
OkNg = case Result =:= Expected of true -> ok; false -> ng end,
io:fwrite("~s: ~s -> ~s~n", [OkNg, Data, Result]).
tests() ->
test("I_believe_you_can_solve", "9"), %0
test("a", "1"), %1
test("aa", "2"), %2
test("aaa", "3"), %3
test("ab", "1"), %4
test("aabb", "2"), %5
test("ABBA", "4"), %6
test("Abba", "2"), %7
test("1234567890", "1"), %8
test("1234567890987654321", "19"), %9
test("abcdcba", "7"), %10
test("0a1b2c3d4c5b6a7", "7"), %11
test("abcdcba0123210", "7"), %12
test("abcdcba_123210", "7"), %13
test("_bcdcba0123210", "7"), %14
test("abcddcba0123210", "8"), %15
test("abcdcba01233210", "8"), %16
test("a0bc1dc2ba3210a", "9"), %17
test("a0bc1ddc2ba3210", "8"), %18
test("3a0bc1ddc2ba3210", "10"), %19
test("11oooo1111o1oo1o111ooooooooooo", "20"), %20
test("11o1111o1111oo11ooo11111ooo1oo", "20"), %21
test("111111oo11o111ooo1o1ooo11ooo1o", "21"), %22
test("11o1o1o11oo11o11oo111o1o1o11oo", "27"), %23
test("oo111o1o11o1oo1ooo11o1o11o1o1o", "27"), %24
test("1o1oo11111o1o1oo1o1o1111oo1o1o", "28"), %25
test("QQooooQooooQQyQoyQQQyyyyQQoyoy", "15"), %26
test("oQoooQooooQyoyQoyoyyyQQyQQQQoQ", "16"), %27
test("yyyyyooyQyyyoyyQyyooyQoQoQQoQy", "17"), %28
test("yyQoyQoyyQyQQoyooooyyQQyQyooQy", "24"), %29
test("oQQooQoQyQQoyoQQoQyQyQyQoQoooo", "24"), %30
test("oQQyQQyyQyQQoooyQQyyyQQQyyQQoy", "25"), %31
test("WAk9iHI4jVDlStyudwTNqE138kwan2", "3"), %32
test("c43fIu1Mlz0K9hEVOgGcUdbeB5ksa7", "3"), %33
test("CAbYcW5VqHjzFdIkH_61PM0TsyRuie", "3"), %34
test("jInQnUvSayrJTsQWujovbbqW0STvoj", "10"), %35
test("iZDrvpUKgtj3FrZsZ4CLjrEgUdZzQG", "11"), %36
test("ROgYUOu6er_DA7nB6UGquO1GUHC62R", "11"), %37
test("Oh_be_a_fine_girl_kiss_me", "9"), %38
test("8086_6502_6809_Z80", "11"), %39
test("xcode_visualstudio_eclipse", "11"), %40
test("word_excel_powerpoint_outlook", "9"), %41
test("abcdefghijklmnopqrstuvwxyz0123", "1"). %42