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

Simulador de robô

Médio

Instruções

Escreva um simulador de robô.

A instalação 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 posicionados em uma grade infinita hipotética, virados para uma direção específica (norte, leste, sul ou oeste), em um conjunto de coordenadas {x,y}, por exemplo, {3,8}, com as coordenadas aumentando para o norte e para o leste.

Em seguida, o robô recebe uma série de instruções, e então a instalação de testes verifica a nova posição do robô e para qual direção ele está apontando.

  • A string de letras "RAALAL" significa:
    • Virar à direita
    • Avançar duas vezes
    • Virar à esquerda
    • Avançar uma vez
    • Virar à esquerda mais uma vez
  • Digamos que um robô comece em {7, 3} virado para o norte. Então, executar essa sequência de instruções deve deixá-lo em {9, 4} virado para o oeste.

Notas de implementação

Os testes estão separados em 3 etapas.

Rode todos os testes com go test ou rode 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

Você recebe o arquivo fonte defs.go, que define várias coisas de que o programa de teste precisa. Ele está organizado em três seções, uma por etapa.

Etapa 1

Para completar a etapa 1, você vai definir Right, Left, Advance, N, S, E, W e Dir. Complete a etapa 1 antes de passar para a etapa 2.

Etapa 2

Na etapa 1, você implementou os movimentos do robô, mas isso não é bem uma simulação. Por exemplo, onde está "o robô" no código-fonte? Onde está "a grade"? Onde ficam os cálculos que transformam as ações do robô em posições na grade: no robô ou na grade? O mundo físico é diferente.

A etapa 2 apresenta uma "sala". Parece uma adição pequena, mas vamos fazer mudanças grandes para deixar claro o papel da "sala", do "robô" e do "programa de teste" e começar a esclarecer a física da simulação. Você vai definir Room e Robot como funções que o programa de teste "traz à existência" ao iniciá-las como goroutines. As informações circulam entre o programa de teste, o robô e a sala por canais do Go.

Pense em Room como um "motor de física", algo que modela e simula uma sala física com paredes e um robô. Ele 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 atravesse paredes. Queremos que Robot seja um agente que executa ações, mas queremos que Room mantenha uma verdade coerente.

O programa de teste cria os canais e inicia tanto Room quanto Robot. Em seguida, o programa de teste envia comandos para Robot. Quando termina de enviar comandos, ele fecha o canal de comandos. Robot deve aceitar comandos e informar a Room as ações que está tentando executar. Ao perceber que o canal de comandos está fechando, ele deve se encerrar. A sala deve interpretar as consequências físicas das ações do robô. Ao perceber que o robô está se encerrando, ela envia um relatório final de volta ao programa de teste, informando a posição e a direção finais do robô.

Etapa 3

A etapa 3 tem três mudanças importantes:

  • Os robôs executam scripts em vez de responder a comandos individuais.
  • Um canal de log permite que os robôs e a sala registrem mensagens.
  • A sala permite que vários robôs existam e operem ao mesmo tempo.

Para o relatório de posição final enviado por Room3, você pode retornar o mesmo slice recebido do canal de robôs, apenas com as posições e direções atualizadas. As mensagens devem ser enviadas no canal de log para

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

Fonte

Inspirado em uma pergunta de entrevista em uma empresa famosa.
Editar via GitHub O link abre em uma nova janela ou aba
Go Exercism

Tudo pronto para começar Simulador de robô?

Crie sua conta no Exercism para aprender e dominar Go com 34 conceitos165 exercícios e mentoria humana de verdade, tudo de graça.