文字列を先頭から見て同じところまで除去
お久しぶりです。
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じゃないし...