Plataforma: URI (BEECROWD)
Problema: 3159
Linguagens: C e C++
Enunciado:
Durante essa quarentena Amélia estava lembrando do que gostava de fazer na infância. De maneira nostálgica ela se lembrou do quanto gostava de jogar Snake no celular da sua mãe. Era o famoso 'tijolão', da marca Aikon. Ela até conseguiu encontrar um aplicativo para Android que simulava o joguinho, mas ela começou a se perguntar: "Como eu conseguia escrever mensagens com aquele teclado mesmo?".
Ela lembrou como o teclado era utilizado para escrever mensagens. Nesse problema, para simplificar, iremos considerar um celular no idioma inglês (não há acentos).
As teclas de 2 a 9 são usadas para digitar as letras de ‘a’ a ‘z’, e funcionam assim: se quisermos obter uma das letras associadas a uma das teclas, precisamos pressioná-la um número de vezes igual a posição da letra desejada. Por exemplo, pressionando a tecla 6 uma vez obtemos ‘m’. Se pressionarmos novamente, obteremos ‘n’ e depois ‘o’. Se continuarmos pressionando-a obteremos o número ‘6’ e depois reiniciamos em ‘m’, assim sucessivamente. A tecla 0 é utilizada para inserir espaços na mensagem; a tecla 1 era apenas o dígito '1' e algumas pontuações (que não serão usadas nesse problema) e a tecla # é usada para colocar a próxima letra em maiúsculo, por exemplo, se apertar #2 obteremos 'A', se apertar #27 obteremos 'Ap'.
No caso de termos duas letras consecutivas na mensagem que são formadas pela mesma tecla era necessário esperar um tempinho para continuar digitando, neste problema vamos considerar que tecla * represente esse intervalo de tempo, ou seja, a função da tecla * no nosso caso é separar as sequências de pressionamentos de duas letras na mesma tecla. Por exemplo, para digitar a palavra ‘cafe’, a sequência de teclas pressionadas seria a seguinte: 222*2333*33. Mas se a segunda letra na mesma tecla for maiúscula não é necessário pressionar ‘*’ pois você terá de pressionar ‘#’ entre elas. Por exemplo, a palavra 'cAfe' corresponde à sequência 222#2333*33.
Como o teclado era bem duro, Amélia odiava cometer erros, por isso ela quer saber a sequência mínima de teclas que deve apertar para digitar cada mensagem.
Solução:
Código em C:
#include <ctype.h> #include <stdio.h> #include <string.h> int pegaVezes(int c) { int vezes; switch (c) { case '1': case 'a': case 'd': case 'g': case 'j': case 'm': case 'p': case 't': case 'w': case ' ': vezes = 1; break; case '0': case 'b': case 'e': case 'h': case 'k': case 'n': case 'q': case 'u': case 'x': vezes = 2; break; case '2': case '3': case '4': case '5': case '6': case '8': case 's': case 'z': vezes = 4; break; case '7': case '9': vezes = 5; break; default: vezes = 3; } return vezes; } int pegaTecla (int c) { int tecla; switch (c) { case '1': tecla = 1; break; case '2': case 'a': case 'b': case 'c': tecla = 2; break; case '3': case 'd': case 'e': case 'f': tecla = 3; break; case '4': case 'g': case 'h': case 'i': tecla = 4; break; case '5': case 'j': case 'k': case 'l': tecla = 5; break; case '6': case 'm': case 'n': case 'o': tecla = 6; break; case '7': case 'p': case 'q': case 'r': case 's': tecla = 7; break; case '8': case 't': case 'u': case 'v': tecla = 8; break; case '9': case 'w': case 'x': case 'y': case 'z': tecla = 9; break; default: tecla = 0; } return tecla; } int main() { int n, i, j, tecla, teclaAnterior, maiuscula, vezes; char frase[150], codigo; scanf("%d", &n); getchar(); while (n--) { fgets(frase, 150, stdin); for (i = 0; i < strlen(frase); i++) { codigo = frase[i]; if (codigo == '\n') continue; maiuscula = (codigo <= 90 && codigo >= 65? 1 : 0); tecla = pegaTecla(tolower(codigo)); if (i > 0) teclaAnterior = pegaTecla(tolower(frase[i-1])); if (maiuscula) { printf("#"); codigo += 32; } else if (tecla == teclaAnterior && !maiuscula && i) printf("*"); vezes = pegaVezes(codigo); for (j = 0; j < vezes; j++) printf("%i", tecla); } printf("\n"); } return 0; }
Código em C++:
#include <cstring> #include <iostream> using namespace std; int pegaVezes(char c) { int vezes; switch (tolower(c)) { case '1': case 'a': case 'd': case 'g': case 'j': case 'm': case 'p': case 't': case 'w': case ' ': vezes = 1; break; case '0': case 'b': case 'e': case 'h': case 'k': case 'n': case 'q': case 'u': case 'x': vezes = 2; break; case '2': case '3': case '4': case '5': case '6': case '8': case 's': case 'z': vezes = 4; break; case '7': case '9': vezes = 5; break; default: vezes = 3; } return vezes; } int pegaTecla (char c) { int tecla; switch (tolower(c)) { case '1': tecla = 1; break; case '2': case 'a': case 'b': case 'c': tecla = 2; break; case '3': case 'd': case 'e': case 'f': tecla = 3; break; case '4': case 'g': case 'h': case 'i': tecla = 4; break; case '5': case 'j': case 'k': case 'l': tecla = 5; break; case '6': case 'm': case 'n': case 'o': tecla = 6; break; case '7': case 'p': case 'q': case 'r': case 's': tecla = 7; break; case '8': case 't': case 'u': case 'v': tecla = 8; break; case '9': case 'w': case 'x': case 'y': case 'z': tecla = 9; break; default: tecla = 0; } return tecla; } int main() { int n, i, tecla, teclaAnterior, vezes, codigo; string frase; cin >> n; cin.ignore(); while (n--) { getline(cin, frase); string resposta = ""; int tam = frase.size(); teclaAnterior = '.'; for (i = 0; i < tam; i++) { codigo = frase[i]; if (codigo == '\n') continue; tecla = pegaTecla(codigo); if (codigo <= 90 && codigo >= 65) resposta += '#'; else if (tecla == teclaAnterior) resposta += '*'; vezes = pegaVezes(codigo); while (vezes--) resposta += to_string(tecla); teclaAnterior = tecla; } cout << resposta << endl; } return 0; }
Nenhum comentário:
Postar um comentário