SRM 155 DIV2 Level One - キープ

こういう問題好きだな。


インカ帝国では文字を持ってなくて、数を表すのに「縄の結び目の形で数で表す」という手法(キープ)を使っていたらしい。

へぇぇ。


で、問題。Xで結び目、-が結び目と結び目の間を表して、

  • -XX-XXXX-XXX-で、1の位が3。10の位が4。100の位が2で243
  • -XX--XXXX---XXX-何も結び目が無い場合は0、-XX-_-XXXX-_-_-XXX-と分けて、204003

として、キープを表現する。


後ろから読んでいく方針。

  • 最初の一個が邪魔なので取ってやる。
    • -XX-XXXX-XXX
  • -が来るまで読んで、expt(10,桁数) * 結び目数。で畳み込む。
  • 繰り返す。

以上!!

#include <string>
using namespace std;

class Quipu
{
    public:
        static int readKnots(string knots)
        {
            int sum = 0;

            for (int i = knots.length() - 2, k = 1; i >= 0; i--, k *= 10) {
                int n;

                for (n = 0; knots[i] == 'X'; i--, n++)
                    ;

                sum += k * n;
            }

            return sum;
        }
};


順次足していく方針を取れば、もうちょっと短くなる。

class Quipu
{
    public:
        static int readKnots(string knots)
        {
            int sum = 0;

            for (int i = knots.length() - 2, k = 1; i >= 0; i--, k *= 10)
                for (; knots[i] == 'X'; i--, sum += k)
                    ;

            return sum;
        }
};

イイネ。