Resolviendo el #TuentiContest: Problema 10 – Key Combos

Volvemos a Java y a otro problema facilongo. Con ustedes, el problema 10. Aquí nos enseñan primero una serie de secuencia de teclas y qué se ejecuta en cada caso. Luego nos preguntan, dada una secuencia, qué ocurre. “Pero suena un poco tonto” me dirás, y sí, pero es que no hay más. Recuerda que también puedes ver mis soluciones a los otros problemas de la competición. Sinceramente no se quién fue el que eligió el orden de las preguntas en esta competencia. Estoy casi seguro de haber leído en alguna parte (ahora no encuentro la página) que las preguntas irían aumentando su dificultad conforme se avanzara. Sin embargo, luego de problemas tan interesantes como el lechero, y la distancia mínima de edición, nos ponen estos. En fin, a lo nuestro. Análisis del problema La entrada es sencilla, una primera línea con la secuencia de teclas separadas por espacios en blanco y luego otra línea para indicar la acción que ejecuta dicha secuencia. Luego, una serie de líneas que nos indica una secuencia de teclas aleatorias y nos piden devolver la acción correspondiente. La gracia está en que el orden de teclas en la secuencia puede no ser el mismo que durante su definición y es igualmente válida, e.g. CTRL+ALT+SUPR = ALT+SUPR+CTRL Para guardar todas las secuencias con sus respectivas acciones utilicé un diccionario, ordenando la secuencia de teclas alfabéticamente. Luego para la consulta, ordenaba alfabéticamente la petición e iba directamente al diccionario. Solución enviada En este caso, la elección de Java como lenguaje para resolver el problema no es la mejor. En realidad mi primera solución fue en Perl pero por alguna razón en mi laptop el script de test no pasaba las pruebas. Luego, en el Ubuntu de la uni no tuve inconvenientes pero eso fue dos días después y ya se había acabado el concurso. Mi segunda opción luego de Perl fue usar C++ para seguir obligándome al lenguaje y a familiarizarme con el API, pero mi disgusto natural al lenguaje me ganó la partida en esta oportunidad. Finalmente mi solución enviada fue en Java, a pesar de no ser la mejor opción (lo ideal era que mi Mac se llevara bien con Perl).

import java.util.*;
public class KeyCombos {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int combos = Integer.parseInt(scan.nextLine().trim());
    HashMap<String,String> keyCombos = new HashMap<String, String>();
    while(combos-->0){
      String combo = getCombo(scan);
      String app = scan.nextLine().trim();
      keyCombos.put(combo, app);
    }

    int cases = Integer.parseInt(scan.nextLine().trim());
    while(cases-- > 0){
      String combo = getCombo(scan);
      System.out.println(keyCombos.get(combo));
    }
  }

  private static String getCombo(Scanner scan){
    String combo = scan.nextLine().trim();
    String[] sortedCombo = combo.split("\s+");
    Arrays.sort(sortedCombo);
    combo = join(sortedCombo);
    return combo;
  }

  private static String join(String[] array){
    StringBuilder sb = new StringBuilder();
    for(String s:array){
      sb.append(s).append(" ");
    }
    return sb.toString();
  }
}

Como ven, a pesar de ser bastante legible es sumamente engorrosa de programar la solución aquí. Tuve que escribir la función getCombo para la lectura de secuencia de teclas e implementar un join (join es parte del Apache Commons Lang pero que yo sepa no existe una implementación propia en el SDK). Solución mejorada Definitivamente la mejor opción es NO USAR JAVA. Mi solución en Perl es nueve veces más corta y por Twitter publicaron completa otra solución, es decir, menos de 140 caracteres (porque hasta el hashtag de la competencia le dejó). Les dejo esa como “Solución Mejorada” la cual está incluso mucho más ofuscada que mi “solución mejorada” del problema anterior.

foreach(1..<>){$t=join" ",(sort split" ",<>);($a{$t})=(<>=~/(S+)/)}foreach(1..<>){print${a{join" ",sort split" ",<>}},"n"}

Y tú, ¿cómo lo resolviste?

3 thoughts on “Resolviendo el #TuentiContest: Problema 10 – Key Combos

  1. Yo hice lo mismo solo que en vez de meter en el HashMap la combinación de teclas ordenadas -> comando, metí el hash MD5 del string de teclas ordenadas -> comando, a fin de optimizar el Map.
    Total para lo que me sirvió….

    Estoy deacuerdo en lo que comentas de la dificultad, yo este lo hubiese puesto como 2º challenge.

    1. En verdad aquí no hay mucho que inventar. Tu aproximación me gusta, así mantienes las claves cortas. Siempre me agrada ver cómo pueden hacerse cosas de maneras distintas, inclusos las más sencillas. Gracias por la aportación.

Deja un comentario