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:
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.
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.
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.
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ô.
A etapa 3 tem três mudanças importantes:
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
Crie sua conta no Exercism para aprender e dominar Go com 34 conceitos165 exercícios e mentoria humana de verdade, tudo de graça.