LoginSignup
0
0

More than 5 years have passed since last update.

「回文の発掘」をErlangで(横へな15参考)

Posted at

回文の発掘」を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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0