Desafío 12 de ESET

Androide de ESET

Dos androides se encuentran en diferentes puntos de una línea de longitud infinita. Cuando ellos son ubicados por primera vez, cada uno deja caer una cantidad de aceite para marcar sus puntos de partida.
Se debe programar cada androide para asegurarse que eventualmente se chocaran entre sí. El programa podrá utilizar las siguientes instrucciones:

  • Moverse a la izquierda un espacio
  • Moverse a la derecha un espacio
  • Evitar la siguiente instrucción si existe aceite en donde estoy
  • Ir a la etiqueta X

Nota: una etiqueta es un nombre que se refiera a una línea del código. Por ejemplo, podríamos crear una etiqueta que se llame [DERECHATRESVECES] entonces la instrucción “Ir a la etiqueta [DERECHATRESVECES]” haría que se ejecute el contenido de la misma, para seguir luego con el próximo ciclo. Este tipo de referencia se la conoce con la nomenclatura GO TO y es utilizada en programación de bajo y alto nivel.

El androide ejecutará una instrucción por segundo y ambos utilizarán el mismo programa. Además no sabemos qué androide esta a la izquierda y cuál a la derecha de la línea.

Pista: la primera intuición para resolver este problema suele ser la incorrecta.

Juan Sacco
Analista de Malware

Autor , ESET

  • Respuesta: Ir a la etiqueta X

  • Alvaro

    Se permiten infinitas etiquetas?
    Se permite algún tipo de pila?

    Esto huele demasiado a máquina de turing :P

    • Hola Alvaro,

      No son necesarias infinitas etiquetas, pilas ni colas.

      Cristian

  • Ivan

    Se me ocurren varias soluciones, importa el lenguaje en el que se escriba?

    • Hola

      Se debe respetar el lenguaje e instrucciones dadas, se pueden usar esas y solo esas instrucciones, es decir:
      # Moverse a la izquierda un espacio
      # Moverse a la derecha un espacio
      # Evitar la siguiente instrucción si existe aceite en donde estoy
      # Ir a la etiqueta X

      Cristian

  • Jose

    Hola, se puede usar una instruccion del tipo:

    if (! (existe aceite en donde estoy) )

    o sea “si (NO existe aceite en donde estoy)”

    Además se podrian utilizar variables?

    O tampoco eso?

    Saludos!

  • Ramses

    Me acabo de dar cuenta que los comentarios tienen que pasar antes por una verificación, Asi que os adjunto la solución:

    [Main]
    Moverse a la izquierda un espacio
    Ir a la etiqueta volver_derecha
    Ir a la etiqueta volver_izquierda
    Ir a la etiqueta Main
    end

    [volver_derecha]
    Moverse a la derecha un espacio
    Evitar la siguiente instrucción si existe aceite en donde estoy
    Ir a la etiqueta volver_derecha
    Moverse a la derecha un espacio
    end

    [volver_izquierda]
    Moverse a la izquierda un espacio
    Evitar la siguiente instrucción si existe aceite en donde estoy
    Ir a la etiqueta volver_izquierda
    Moverse a la izquierda un espacio
    end

    • Ramses, por favor analiza tu código. La idea es correcta pero le faltan algunos ajustes para funcionar.

      Cristian

  • Seria algo asi en MASM o assembler:

    .code
    Camina Proc _hwnd:DWORD

    Paso:
    invoke Izquierda_uno
    cmp existe_aceite,1
    je evita_instruccion
    invoke Derecha_uno
    cmp existe_aceite,1
    je evita_instruccion

    evita_instruccion:
    jmp Paso

    Camina EndP

  • Ramses

    A ver que tal ahora, me obsesione con que el robot hiciera zigzag y se me paso el echo de que iban a la par.

    [Main]
    Moverse a la izquierda un espacio
    Evitar la siguiente instrucción si existe aceite en donde estoy
    Ir a la etiqueta zigzag
    Ir a la etiqueta chocar
    end
    [chocar]
    Moverse a la izquierda un espacio
    Ir a la etiqueta chocar
    end
    [zigzag]
    Ir a la etiqueta volver_derecha
    Ir a la etiqueta volver_izquierda
    Ir a la etiqueta Main
    end
    [volver_derecha]
    Moverse a la derecha un espacio
    Evitar la siguiente instrucción si existe aceite en donde estoy
    Ir a la etiqueta volver_derecha
    Moverse a la derecha un espacio
    end
    [volver_izquierda]
    Moverse a la izquierda un espacio
    Evitar la siguiente instrucción si existe aceite en donde estoy
    Ir a la etiqueta volver_izquierda
    Moverse a la izquierda un espacio
    end

  • Raul

    Propongo este programa para ambos androides:

    [Loop]
    Moverse a la derecha un espacio
    Moverse a la derecha un espacio
    Moverse a la izquierda un espacio
    Evitar la siguiente instrucción si existe aceite en donde estoy
    Ir a la etiqueta [Loop]
    Ir a la etiqueta [CATCH-UP]
    [CATCH-UP]
    Moverse a la derecha un espacio
    Moverse a la derecha un espacio
    Ir a la etiqueta [CATCH-UP]

    Saludos,
    Raúl

  • Aldo Oshiro

    Hola, me parece que la solución podría ser esta:

    [repetir_izquierda]
    Moverse a la izquierda un espacio
    Evitar la siguiente instrucción si existe aceite en donde estoy
    Ir a la etiqueta [repetir_izquierda]
    [repetir derecha]
    Evitar la siguiente instrucción si existe aceite en donde estoy
    Moverse a la derecha un espacio
    Ir a la etiqueta [repetir derecha]

  • David

    Hola :D

    Ir a la etiqueta [derecha-izquierda]
    Ir a la etiqueta [derecha]

    [derecha-izquierda]
    Moverse a la derecha un espacio
    Moverse a la derecha un espacio
    Moverse a la izquierda un espacio
    Evitar la siguiente instruccion si existe aceite en donde estoy
    Ir a la etiqueta [derecha-izquierda]

    [derecha]
    Moverse a la derecha un espacio
    Ir a la etiqueta [derecha]

  • [main]
    moverse a la derecha un espacio
    evitar la siguiente instrucción si existe aceite en donde estoy
    ir a etiqueta main
    ir a etiqueta derecharapido
    [main]

    [derecharapido]
    moverse a la derecha un espacio
    ir a la etiqueta derecharapido
    [derecharapido]

    El robot avanza 1 posición cada 3 segundos mientras no encuentra aceite y luego de ubicarlo avanza 1 posición cada 2 segundos por lo que en algún instante de tiempo colisionaran.

Síguenos