Retos - 011: Teclado de móvil

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.

Teclado de móvil

 

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 world

Salida
Caso #1: 44 444
Caso #2: 999337777
Caso #3: 333666 6660 022 2777
Caso #4: 4433555 555666096667775553

Aportar una solución

Tu nombre (si quieres que aparezca):
Tu web/blog (si quieres que incluyamos un enlace a ella):
Tu e-mail (no se mostrará; si quieres que te avisemos cuando esté publicado):
¿Eres humano? ¿Cuánto es 2 más 3?
Lenguaje
Fuente:

<?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/>";
 }
?>