Problem:
Problem A: Keitai Message

Alice さんは Miku さんに携帯電話でメールを送ろうとしている。

携帯電話には入力に使えるボタンは数字のボタンしかない。 そこで、文字の入力をするために数字ボタンを何度か押して文字の入力を行う。携帯電話の数字ボタンには、次の文字が割り当てられており、ボタン 0 は確定ボタンが割り当てられている。この携帯電話では 1 文字の入力が終わったら必ず確定ボタンを押すことになっている。

1: . , ! ? (スペース)

2: a b c

3: d e f

4: g h i

5: j k l

6: m n o

7: p q r s

8: t u v

9: w x y z

0: 確定ボタン

例えば、ボタン 2、ボタン 2、ボタン 0 と押すと、文字が 'a' → 'b' と変化し、ここで確定ボタンが押されるので、文字 b が出力される。
同じ数字を続けて入力すると変化する文字はループする。すなわち、ボタン 2 を 5 回押して、次にボタン 0 を押すと、文字が 'a' → 'b' → 'c' → 'a' → 'b' と変化し、ここで確定ボタンを押されるから 'b' が出力される。

何もボタンが押されていないときに確定ボタンを押すことはできるが、その場合には何も文字は出力されない。

あなたの仕事は、Alice さんが押したボタンの列から、Alice さんが作ったメッセージを再現することである。

Input

最初の行にテストケースの数が与えられる。 続いて各テストケースについて、最大で長さ 1024 の数字列が1行で与えられる。

Output

Alice さんが作ったメッセージの文字列をそれぞれのテストケースについて 1 行ごとに出力せよ。
ただし、出力は 1 文字以上 76 文字未満であると仮定してよい。

Sample Input

5
20
220
222220
44033055505550666011011111090666077705550301110
000555555550000330000444000080000200004440000

Output for the Sample Input

a
b
b
hello, world!
keitai

Solution in C (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>

int s();

int main(void){
	int i, fig;
	char str[100];
	char string;
	char* string_p;
	
	/*
	string = '7';
	string_p = "7";//&string;
	printf("%p\n", string_p);
	printf("%d\n", atoi(string_p));
	return 0;
	*/

	s();
	return 0;

	scanf("%s", str);
	for(i=0; i<100; i++){
		if(str[i] == '\0') break;
		printf("%c\n", str[i]);
		string = str[i];
		fig = atoi(&string);
		printf("=>%d\n", fig);
	}
	return 0;
}

int s(){
	char no1[] = {'.', ',', '!', '?', ' '};
	char no2[] = {'a', 'b', 'c'};
	char no3[] = {'d', 'e', 'f'};
	char no4[] = {'g', 'h', 'i'};
	char no5[] = {'j', 'k', 'l'};
	char no6[] = {'m', 'n', 'o'};
	char no7[] = {'p', 'q', 'r', 's'};
	char no8[] = {'t', 'u', 'v'};
	char no9[] = {'w', 'x', 'y', 'z'};
	char in[1025];  // 入力文字
	int times=0;  // 何回押されたか
	int length;  // テストケースの数
	int i, n=0;
	int no, now, pressed=-1;
	char str[2], mess, string;
	char message[76];  // 最終的なメッセージ
	int m;

	// テストケースの数
	scanf("%d", &length);
	// メッセージ入力
	for(i=0; i<length; i++){
		scanf("%s", in);
		// in = [5,5,5,5,,0,8,0,5,0]
		// メッセージの解析
		n = 0;  // 解析元の何文字目か
		now = 0;  // 事後のメッセージの何文字目か
		str[0] = in[n];
		str[1] = '\0';
		sprintf(str, "%s", str);
		while(str[0] != '\0'){
			printf("%s\n", str);
			printf("%p\n", str);
			no = atoi(str);
			printf("=>%d\n", no);
			if(no == 0){
				if(pressed == 1){
					times %= 6;
					mess = no1[times -1];
				}else if(pressed == 2){
					times %= 4;
					mess = no2[times -1];
				}else if(pressed == 3){
					times %= 4;
					mess = no3[times -1];
				}else if(pressed == 4){
					times %= 4;
					mess = no4[times -1];
				}else if(pressed == 5){
					times %= 4;
					mess = no5[times -1];
				}else if(pressed == 6){
					times %= 4;
					mess = no6[times -1];
				}else if(pressed == 7){
					times %= 5;
					mess = no7[times -1];
				}else if(pressed == 8){
					times %= 4;
					mess = no8[times -1];
				}else{
					times %= 5;
					mess = no9[times -1];
					times = 0;
					pressed = -1;
				}
				message[now] = mess;
				printf("%c\n", mess);
				now++;
			}else{
				pressed = no;
			}
			times += 1;
			n++;
			str[0] = in[n];
			str[1] = '\0';
			sprintf(str, "%s", str);
		}
		printf("=========================\n");
			printf("%c\n", message[0]);
		printf("=========================\n");
		message[now] = '\0';
		printf("%s\n", message);
	}

	return 0;
}