FSA: Divisível por três

Crie uma função que verifique se um número binário é divisível por três implementando o seguinte autômato finito:

A função deve implementar os seguintes comandos:

  • 0, 1 ➞ O próximo dígito do número.
  • "state" ➞ O estado atual do autômato: "S0", "S1" ou "S2".
  • "stop" ➞ Se o autômato aceita ou rejeita o número fornecido. A função deve retornar "accept" ou "reject".

Exemplos

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

  • A função deve ser capaz de lidar com números binários de comprimento arbitrário.
  • A função receberá apenas entradas válidas.
  • A função deve terminar após um comando "state" ou "stop".
  • Neste caso, a aceitação ocorre se o estado no momento do término for "S0", enquanto a rejeição ocorre se o estado no momento do término for "S1" ou "S2".
  • A função int está desabilitada para evitar a conversão de binário para decimal.