「続柄」をErlangでやってみました。他の皆様による実装は 第6回オフラインリアルタイムどう書くの問題 から辿れます。
zokugara.erl
-module(zokugara).
-compile(export_all).
solve(Data) -> relation(
[moms(list_to_integer(X)) || X <- string:tokens(Data, "->")]).
relation([X, Y | _]) -> relation(X, Y).
relation({X, _, _}, {X, _, _}) -> "me";
relation({_, X, _}, {X, _, _}) -> "mo";
relation({X, _, _}, {_, X, _}) -> "da";
relation({_, X, _}, {_, X, _}) -> "si";
relation({_, _, X}, {_, X, _}) -> "au";
relation({_, X, _}, {_, _, X}) -> "ni";
relation({_, _, X}, {_, _, X}) -> "co";
relation(_, _) -> "-".
moms(X) -> {X, mom(X), mom(mom(X))}.
mom(X) when X =< 1 -> 0;
mom(X) -> (X - 2) div 3 + 1.
test(Data, Expected) -> test(Data, solve(Data), Expected).
test(Data, Result, Expected) -> io:fwrite("~s: ~s -> ~s~n",
[case Result =:= Expected of true -> ok; false -> ng end,
Data, Result]).
tests() ->
test("5->2", "mo"), %0
test("28->10", "au"), %1
test("1->1", "me"), %2
test("40->40", "me"), %3
test("27->27", "me"), %4
test("7->2", "mo"), %5
test("40->13", "mo"), %6
test("9->3", "mo"), %7
test("4->1", "mo"), %8
test("1->3", "da"), %9
test("12->35", "da"), %10
test("3->8", "da"), %11
test("6->19", "da"), %12
test("38->40", "si"), %13
test("9->8", "si"), %14
test("4->2", "si"), %15
test("15->16", "si"), %16
test("40->12", "au"), %17
test("10->4", "au"), %18
test("21->5", "au"), %19
test("8->2", "au"), %20
test("3->5", "ni"), %21
test("11->39", "ni"), %22
test("2->13", "ni"), %23
test("13->32", "ni"), %24
test("14->22", "co"), %25
test("40->34", "co"), %26
test("5->8", "co"), %27
test("12->10", "co"), %28
test("1->27", "-"), %29
test("8->1", "-"), %30
test("12->22", "-"), %31
test("2->40", "-"), %32
test("32->31", "-"), %33
test("13->14", "-"). %34
relation関数の引数には「{A本人, Aの母, Aの祖母}, {B本人, Bの母, Bの祖母}」が渡されます。引数パターンマッチングによって、これらのうちどの値が同じかを判定しています。Erlangの(パターンマッチングが使える言語の)本領発揮です。