文字列を先頭から見て同じところまで除去

お久しぶりです。

No Programming, No Lifeで見掛けた表題のお題をErlangでやってみます。

まず、文字列が2つのときを考えます。これは文字列のパターンマッチングを使えば問題なさそうですね。

-module(ahya).
-compile(export_all).

ahya([H1|T1], [H1|T2]) ->
    ahya(T1, T2);

ahya(L1, L2) ->
    [L1, L2].

どれどれ...

50> ahya:ahya("abcdef", "abc123").
["def","123"]
51> ahya:ahya("12345", "67890").
["12345","67890"]
52>

大丈夫そうですね。では3つ以上の場合を考えてみましょう。上記の文字列2つバージョンを繰り返し呼ぶようにしてあげようかと思ったのですが、無修正では無理なような気がしましたので、あらためて考えてみます。

1分ほど考えた結果、文字列のリストを貰って、各要素の先頭1文字を取り出して、一致したら除去して...というのが単純でいいかなと思いました。

ahya2(L) ->
    ahya2(L, []).
ahya2([[]|L], _) ->
    [[]|L];
ahya2([H|TL], Acc) ->
    [Head|_] = H,
    case lists:all(fun([X|_]) -> X =:= Head end, TL) of
	false ->
	    [H|TL];
	true ->
	    ahya2(lists:map(fun([_|X]) -> X end, [H|TL]), [H|Acc])
    end.

こんな感じでしょうか?では早速動かしてみましょう...

52> ahya:ahya2(["abcdef", "abc123"]).
["def","123"]
53> ahya:ahya2(["あいうえお", "あいさんさん", "あいどる"]).
[[164,130,166,130,168],
 [179,130,241,130,179,130,241],
 [199,130,233]]
54> ahya:ahya2(["12345", "67890", "12abc"]).
["12345","67890","12abc"]
55> 

あれ、なんか2つ目が...???

69> erlang:display("あいさんさん").
[130,160,130,162,130,164,130,166,130,168]
true
70> erlang:display("あいどる").
[130,160,130,162,130,179,130,241,130,179,130,241]
true
71> erlang:display("あいどる").
[130,160,130,162,130,199,130,233]
true
72> 

うーん、動作としては合っていますが、期待する答えではありませんね。
そもそもUTF-8じゃないし...