NextFloor

すきな物やモノに囲まれて生きていく!

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