FSA: Divisible por tres

Crea una función que compruebe si un número binario es divisible por tres implementando el siguiente autómata finito:

La función debe implementar los siguientes comandos:

  • 0, 1 ➞ El siguiente dígito del número.
  • "state" ➞ El estado actual del autómata: "S0", "S1" o "S2".
  • "stop" ➞ Si el autómata acepta o rechaza el número proporcionado. La función debe devolver "accept" o "reject".

Ejemplos

divisible(1)(1)(0)(1)(0)("stop") ➞ "reject"
# 26 is not divisible by 3, and 26 == 0b11010

divisible("state") ➞ "S0"
# The automaton should start at S0

divisible(1)(0)(1)("state") ➞ "S2"

Notas

  • La función debe poder manejar números binarios de longitud arbitraria.
  • A la función solo se le proporcionarán entradas válidas.
  • La función debe terminar después de un comando "state" o "stop".
  • En este caso, la aceptación ocurre si el estado al terminar es "S0", mientras que el rechazo ocurre si el estado al terminar es "S1" o "S2".
  • La función int está deshabilitada para evitar la conversión de binario a decimal.