Hice la parte 1 de hoy dia 21, pero la parte 2 estoy estancado... tendré que darle una pensada y volver a intentarlo mas tarde.
edit:
Claramente el dia mas dificil de 2024 hasta ahora...
Primero precalculé todos los posibles movimientos entre tecla y tecla tanto para el teclado de numeros como el de flechas. Habia que ir con cuidado de no poner que "de 7 a 0" pudiese ir con "vvv>" ya que caerias en el hueco prohibido.
A lo guarro me hice un blacklist de prefijos por cada par de teclas (origen, destino):
NUMPAD_DISALLOWED_PREFIX = {
"0": {"1": "<", "4": "<", "7": "<"},
"A": {"1": "<<", "4": "<<", "7": "<<"},
"1": {"0": "v", "A": "v"},
"4": {"0": "vv", "A": "vv"},
"7": {"0": "vvv", "A": "vvv"}
}
DIR_KEYPAD_DISALLOWED_PREFIX = {
"<": {"^": "^", "A": "^"},
"^": {"<": "<"},
"A": {"<": "<<"}
}
Un truco (que no hice hasta parte2) era que siempre es mejor alternar el minimo. Por ejemplo de 8 a A hay 1 > y 3 v, por lo que realmente solo interesa ">vvv" y "vvv>" (uno u otro sera mejor, dependiendo de la posicion anterior del robot).
Me hice 2 funciones:
- numeric_keypad_possible_moves -> te da posibles movimientos de A a B. Por ejemplo: 4 a 6=">>>", 7 a A=[">>vvv"] (solo 1 posibilidad ya que las otras en zigzag siempre son mas largas de ejecutar)
- directional_keypad_possible_moves -> lo mismo pero para el teclado de flechas
Luego 2 funciones (para teclado numerico y de flechas) que a partir de un string ("023A" o "vvv>><<<") te devuelve los movimientos que hay que hacer para pulsar eso a partir de un robot.
Con esas 2 funciones, me hice triple-nested for y calcule todas los posibles movimientos (para el humano) y me quede con el mas corto.
Todas las funciones con cache y tal obviamente.
Tenia que buscar una solucion mas optima para la part1 que permita extender a 25 robots. Sabia que tendria que hacer algun tipo de llamada recursiva con memoization pero no tenia claro que parametros utilizar. Despues de 1h lo dejé y me fui al Zoo con la familia xD
Lo que tenia claro es que, al poder pulsar las teclas de formas diferentes, siempre habia almenos 1 que te aseguraba la secuencia mas corta. La diferencia entre ir de "8 a A" con ">vvv" y "vvv>" es que despues del movimiento, el robot1 apuntando a A en ambos casos, pero el robot2 que controla a robot1 acaba apuntando en un lugar diferente. Si el siguiente movimiento de robot2 es un "v" entonces es mejor que robot1 se mueva con ">vvv" para ahorrarnos pasos.
Me costö un buen rato darme cuenta que siempre que un robotX tiene que moverse (1 caracter), el robot superior tiene que acabar en A, lo que implica que 'como mover a robotX' no depende del estado de los robots superiores ya que estos siempre estan en "A". (Para quien lo lea: Si no lo entiendes no te preocupes, yo tampoco lo tengo 100% claro xdd...)
Me puse a hacer prototipos que simplemente resolvieran "0A" y con mil prints/trazas de todo lo que ocurre, y finalmente me dió correcto con "0A" y con el enunciado de la parte1 y mi input. Luego le puse 25 robots y no acababa... menos mal que era porque tenia comentado el decorador de "@cache" de python jajaj... Al ponerle @cache ahi ya me daba bien.
Sorprendentemente, tarda 0.83ms (830μ ms) en calcularlo todo!
buff habia escrito un tocho y mediavida me dio error de "sesion ha expirado" y me devolvio al editor de texto pero vacio, casi me pego un tiro xDD por suerte al darle a "atras" en chrome recupere el texto...