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;}