『Keitai Message』
Problem A: Keitai Message
こちらの問題をときました。
循環するキーボタンを作って、各番号に対応。
ただし同じキーボタンが連続で押された場合、最後に0を押すことと、
0ボタンの単体入力では何もしないことから、
入力より0を取り除いて、1から9の各ボタンのみ対応しました。
◆実行結果
44033055505550666011011111090666077705550301110
helo,worlf
◆ソース
#import <Foundation/Foundation.h> #include<string.h> @interface Key : NSObject { char c[10]; size_t csize; int i; } -(id)init:(char[])s; -(char)getpushed; @end @implementation Key -(id)init:(char [])s { if((self = [super init]) == nil){ } strncpy(c, s, strlen(s)); csize = strlen(s); i = 0; return(self); } -(char)getpushed { char w = [self get]; i = (i + 1) % csize; return(w); } -(char)get{return(c[i]);} @end int main(int argc, const char * argv[]) { @autoreleasepool { char keys[][10] = { {""}, {".,!? "}, {"abc"}, {"def"}, {"ghi"}, {"jkl"}, {"mno"}, {"pqrs"}, {"tuv"}, {"wxyz"}, }; char input[1030]; int i, j, c; Key *keybord[10]; for(i = 0; i < sizeof(keys)/sizeof(keys[0]); i++){ keybord[i] = [[Key alloc] init:keys[i]]; } i = 0; while((c = getchar()) != '\n'){ if(c != '0'){ input[i++] = c; } } input[i] = '\0'; j = (int)strlen(input); for(i = 0; i < j - 1; i++){ c = [keybord[input[i] - '0'] getpushed]; if(input[i] != input[i + 1]){ printf("%c", c); } } printf("%c\n", [keybord[input[i] - '0'] getpushed]); } return 0; }