Percursos
/
Go
Go
/
Exercícios
/
Simulador de robô
Simulador de robô

Simulador de robô

Médio

Instruções

Escreve um simulador de robôs.

O centro de testes de uma fábrica de robôs precisa de um programa para verificar os movimentos dos robôs.

Os robôs têm três movimentos possíveis:

  • virar à direita
  • virar à esquerda
  • avançar

Os robôs são colocados numa grelha infinita hipotética, virados para uma direção específica (north, east, south ou west), num conjunto de coordenadas {x,y}, por exemplo, {3,8}, com as coordenadas a aumentar para north e east.

Depois, o robô recebe várias instruções e, nesse momento, o centro de testes verifica a nova posição do robô e a direção para a qual está virado.

  • A string de letras "RAALAL" significa:
    • Vira à direita
    • Avança duas vezes
    • Vira à esquerda
    • Avança uma vez
    • Vira à esquerda mais uma vez
  • Suponhamos que um robô começa em {7, 3} virado para north. Nesse caso, executar esta sequência de instruções deve deixá-lo em {9, 4} virado para west.

Notas de implementação

Os testes estão divididos em 3 passos.

Corre todos os testes com go test ou corre testes específicos com a opção -tags.

Exemplos:

go test                      # run all tests
go test -tags step1          # run just step 1 tests.
go test -tags 'step1 step2'  # run step1 and step2 tests

É-te fornecido o ficheiro de código defs.go, que define várias coisas de que o programa de teste precisa. Está organizado em três secções, uma por passo.

Passo 1

Para completar o passo 1, vais definir Right, Left, Advance, N, S, E, W e Dir. Completa o passo 1 antes de avançares para o passo 2.

Passo 2

No passo 1 implementaste os movimentos do robô, mas não é grande simulação. Por exemplo, onde está "o robô" no código-fonte? Onde está "a grelha"? Onde estão os cálculos que transformam as ações do robô em posições na grelha, no robô ou na grelha? O mundo físico é diferente.

O passo 2 introduz uma "sala". Parece uma pequena adição, mas vamos fazer grandes alterações para clarificar os papéis de "sala", "robô" e "programa de teste", e começar a clarificar a física da simulação. Vais definir Room e Robot como funções que o programa de teste "traz à existência" ao lançá-las como goroutines. A informação circula entre o programa de teste, o robô e a sala através de canais Go.

Pensa na Room como um "motor de física", algo que modela e simula uma sala física com paredes e um robô. Deve, de alguma forma, modelar o espaço de coordenadas da sala, a localização do robô e das paredes e garantir, por exemplo, que o robô não atravessa paredes. Queremos que o Robot seja um agente que executa ações, mas queremos que a Room mantenha uma verdade coerente.

O programa de teste cria os canais e arranca tanto a Room como o Robot. O programa de teste envia depois comandos ao Robot. Quando termina de enviar comandos, fecha o canal de comandos. O Robot tem de aceitar comandos e informar a Room das ações que está a tentar executar. Quando deteta que o canal de comandos está a fechar, tem de se desligar. A sala tem de interpretar as consequências físicas das ações do robô. Quando deteta que o robô se está a desligar, envia um relatório final ao programa de teste, indicando a posição e a direção finais do robô.

Passo 3

O passo 3 tem três grandes alterações:

  • Os robôs executam scripts em vez de responder a comandos individuais.
  • Um canal de registo permite que os robôs e a sala registem mensagens.
  • A sala permite que existam e operem vários robôs em simultâneo.

Para o relatório de posição final enviado pela Room3, podes devolver a mesma slice recebida do canal dos robôs, apenas com as posições e direções atualizadas. Têm de ser enviadas mensagens para o canal de registo nos seguintes casos:

  • Um robô sem nome
  • Nomes de robôs duplicados
  • Robôs colocados no mesmo lugar
  • Um robô colocado fora da sala
  • Um comando indefinido num script
  • Uma ação de um robô desconhecido
  • Um robô a tentar avançar contra uma parede
  • Um robô a tentar avançar contra outro robô

Fonte

Inspirado numa pergunta de entrevista numa empresa famosa.
Editar via GitHub A ligação abre numa nova janela ou separador
Go Exercism

Estás pronto para começar Simulador de robô?

Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos165 exercícios, e mentoria humana real, tudo grátis.