Por Nacho Cabanes
Nivel de dificultad aproximado (1 a 5): 3
El alfabeto inglés contiene 26 caracteres y los teléfonos móviles sólo tienen diez dígitos en el teclado. Varias letras se mapean en cada tecla numérica, como se muestra en la imagen inferior, de forma que se pueda escribir un mensaje con pulsaciones repetitivas. Por ejemplo, para insertar el carácter B, se deberá presionar 22. Para introducir una secuencia de dos caracteres a partir de la misma tecla, el usuario debe hacer una pausa antes de pulsar el botón una segunda vez. Por ejemplo, 2 2 indica AA mientras que 22 indica B (se muestra un "carácter de espacio" para indicar una pausa).
Debe crear un programa que calcule la secuencia de teclas que hay que pulsar para escribir un cierto mensaje.
Entrada
La primera línea de entrada contiene un único entero N, el número de casos de prueba.Cada caso es una línea de texto con formato
mensaje_deseado
Cada mensaje consta sólo de minúsculas de la "a" la "z" y el carácter " " (espacio, que se emite presionando cero).
Salida
Para cada caso de prueba, la salida de una línea que contiene "Caso # x:", seguido por el mensaje traducido en la secuencia de pulsaciones de teclas.
(Asegúrate de que has leído las preguntas frecuentes antes de plantear tu solución)
Ejemplo
Entrada
4
hi
yes
foo bar
hello worldSalida
Caso #1: 44 444
Caso #2: 999337777
Caso #3: 333666 6660 022 2777
Caso #4: 4433555 555666096667775553
<?php // Ejemplo de solución para el reto 011 // Por Morfeo, 28-05-2012 function teclado_movil($mensaje_deseado){ //Inicializar el teclado $key = array(); $char = ord('a'); // Guardo las teclas que corresponden a cada letra for($tecla = 2; $tecla <=9; $tecla++){ //Todas las teclas tienen 3 letras excepto la 7 y la 9 que tienen 4 $hasta = ($tecla == 7 || $tecla == 9)? 4 : 3 ; for($pulsar = 1; $pulsar <= $hasta; $pulsar){ $key[$char++] = array('tecla' => $tecla, 'pulsar' => $pulsar++); } } //Para el espacio (tecla 0) $tecla = 0; $pulsar = 1; $key[ord(' ')] = array('tecla' => $tecla, 'pulsar' => $pulsar++); //Transformar string en array $letras = str_split ($mensaje_deseado); foreach($letras as $letra){ //Obtengo la tecla que le corresponde y la cantidad de pulsaciones $tecla = $key[ord($letra)]['tecla']; $pulsar = $key[ord($letra)]['pulsar']; //Si es la misma tecla que la anterior va espacio if($tecla == $tecla_anterior) $respuesta .= ' '; //Presiono la tecla la cantidad de veces necesaria for($i = 0; $i < $pulsar; $i++){ $respuesta .= $tecla; } //Antes de seguir recuerdo a esta tecla como la anterior $tecla_anterior = $tecla; } return $respuesta; } //Cantidad de casos $N = $_REQUEST['N']; //Mensajes $mensajes = $_REQUEST['mensajes']; for($i = 1; $i <= $N; $i++){ $mensaje_deseado= $mensajes[$i]; $respuesta = teclado_movil($mensaje_deseado); echo "Caso #$i: $respuesta <br/>"; } ?>