(別解で)「続柄」をjavascriptで解いてみた

javascriptの勉強がてら過去のどう書くを解かせてもらっています。

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord6kinship/

「第6回オフラインリアルタイムどう書くの問題」
http://qiita.com/Nabetani/items/5e1c944541f09f0f9711

今回もみなさんの回答をいくつか先に拝見してから、違う方法を探して解いてみました。
（全部は拝見していないので一緒の解法のものがあるかもしれませんが）

```js:kinship.js

var solve = function (input) {
    'use strict';
        // 一人が産む子の数
    var ex = 3
        // 番号を血筋配列に変換
      , lineage = function lineage (num, ex) {
            num--;
            var x  = num.toString(ex)
              , y
                // 桁下がり
              , rp = function (x) {
                    return x.replace(/[^0]0/, function(m) {
                        var r = m * 1 - (10 - ex);
                        return r < 10 ? '0' + r : '' + r;
                    });
                };
            do {
                y = x;
                x = rp(y);
            } while(x !== y);
            return x.replace(/^0/, '').split('');
        }
      , matches = input.match(/(\d{1,2})->(\d{1,2})/)

        // それぞれの血筋
      , from = lineage(matches[1], ex)
      , to   = lineage(matches[2], ex);

    // 同じ血筋まで省略する
    while(true) {
        if (!from.length || !to.length || from[0] !== to[0]) {
            break;
        }
        from.shift();
        to.shift();
    }

    // それぞれの長さの組み合わせによって続柄決定
    switch('up:' + from.length + ' down:' + to.length) {

    //本人。
    case 'up:0 down:0':
        return 'me';

    //母。
    case 'up:1 down:0':
        return 'mo';

    //娘。
    case 'up:0 down:1':
        return 'da';

    //姉妹。本人は姉妹ではないことに注意。
    case 'up:1 down:1':
        return 'si';

    //おば。母の姉妹。
    case 'up:2 down:1':
        return 'au';

    //姪。姉妹の娘。
    case 'up:1 down:2':
        return 'ni';

    //いとこ。おばの娘。
    case 'up:2 down:2':
        return 'co';
    
    //上記のいずれにも該当しない場合。はとこ、曾祖母など。
    default:
        return '-';
    }
};

// テスト
var test = function (input, output) {
    'use strict';
    console.log(solve(input) === output);
};

/*#0*/ test( "5->2", "mo" );
/*#1*/ test( "28->10", "au" );
/*#2*/ test( "1->1", "me" );
/*#3*/ test( "40->40", "me" );
/*#4*/ test( "27->27", "me" );
/*#5*/ test( "7->2", "mo" );
/*#6*/ test( "40->13", "mo" );
/*#7*/ test( "9->3", "mo" );
/*#8*/ test( "4->1", "mo" );
/*#9*/ test( "1->3", "da" );
/*#10*/ test( "12->35", "da" );
/*#11*/ test( "3->8", "da" );
/*#12*/ test( "6->19", "da" );
/*#13*/ test( "38->40", "si" );
/*#14*/ test( "9->8", "si" );
/*#15*/ test( "4->2", "si" );
/*#16*/ test( "15->16", "si" );
/*#17*/ test( "40->12", "au" );
/*#18*/ test( "10->4", "au" );
/*#19*/ test( "21->5", "au" );
/*#20*/ test( "8->2", "au" );
/*#21*/ test( "3->5", "ni" );
/*#22*/ test( "11->39", "ni" );
/*#23*/ test( "2->13", "ni" );
/*#24*/ test( "13->32", "ni" );
/*#25*/ test( "14->22", "co" );
/*#26*/ test( "40->34", "co" );
/*#27*/ test( "5->8", "co" );
/*#28*/ test( "12->10", "co" );
/*#29*/ test( "1->27", "-" );
/*#30*/ test( "8->1", "-" );
/*#31*/ test( "12->22", "-" );
/*#32*/ test( "2->40", "-" );
/*#33*/ test( "32->31", "-" );
/*#34*/ test( "13->14", "-" );
```

みなさんの回答の方がすっきりしていますが、今更解くのであれば違う解法をと。。
やっぱり思いつくまでに時間がかかりますね。
結構無理矢理です（泣）

うーーん。この解法のメリットは、後から祖母・孫とかを
分かりやすく追加しやすいことかな？
逆にexが9までしか対応出来ないデメリットがありますが。