PKU 2719

Faulty Odometer
要は、012356789の9文字を使った9進数を読み込むだけ。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int map[] = { 0, 1, 2, 3, 0, 4, 5, 6, 7, 8 };

    string s;
    while ( cin >> s  &&  s[0] != '0' )
    {
        int mile = 0;

        for ( int i=0; i<(int)s.length(); i++ )
        {
            mile *= 9;
            mile += map[s[i]-'0'];
        }

        cout << s << ": " << mile << endl;
    }

    return 0;
}

GCC, 89B

main(n,t){for(char*s;gets(s=t);n&&printf("%s: %d\n",t,n))
for(n=0;*s;)n=n*9+*s++*.9-42.8;}

こんな感じで4を飛ばせる。最短の方とは6バイトも違うのだが、どんな手を使っているのだろうか。

'0' * 0.9 - 42.8 = 0.40
'1' * 0.9 - 42.8 = 1.30
'2' * 0.9 - 42.8 = 2.20
'3' * 0.9 - 42.8 = 3.10
'5' * 0.9 - 42.8 = 4.90
'6' * 0.9 - 42.8 = 5.80
'7' * 0.9 - 42.8 = 6.70
'8' * 0.9 - 42.8 = 7.60
'9' * 0.9 - 42.8 = 8.50

――――

getchar()/putchar()で1文字ずつ処理するようにして、読み込んだ時点で'0'を引くようにして、forを1つにした。

GCC, 83B

n;main(s){for(;s=getchar()-48,s|n;putchar(s+48))
n=s<0?!printf(": %d",n):n*9+s-s/5;}