SamuelsSantos / pokemon

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Pokemon

Go

Problema:

O Ash está a apanhar pokémons num mundo que consiste numa grelha bidimensional infinita de casas. Em cada casa há exatamente um pokémon. O Ash começa por apanhar o pokémon que está na casa onde começa. A seguir, move-se para a casa imediatamente a norte, sul, este ou oeste de onde se encontra e apanha o pokémon que aí se encontrar, e assim sucessivamente. Atenção: se ele passar numa casa onde já passou (e, portanto, onde já apanhou um pokémon), já lá não está um pokémon para ele apanhar! O que queremos saber é: começando com um mundo cheio de pokémons (um em cada casa!), quantos pokémons o Ash apanha para uma dada sequência de movimentos?

Formato do input

O programa deve ler uma linha do stdin, que contém uma sequência de movimentos. Cada movimento é descrito por uma letra N, S, Eou O(respetivamente: norte, sul, este, oeste).

Formato do output

O programa deve escrever uma linha para o stdout, apenas com um número: quantos pokémons o Ash apanhou?

Input: E -> Output: 2
Dado uma tabela bidimensional *E*   
Onde cada casa possui exatamente um pokemon
Então quando o sistema contar 
então o sistema de deve retornar 2

Input: NESO -> Output: 4

Dado uma tabela bidimensional *NESO*   
Onde cada casa possui exatamente um pokemon
Então quando o sistema contar 
então o sistema de deve retornar 4

Input: NSNSNSNSNS -> Output: 2

Dado uma tabela bidimensional *NSNSNSNSNS*   
Onde cada casa possui exatamente um pokemon
Então quando o sistema contar 
então o sistema de deve retornar 4

Solução:

Para contar a quantidade de pokemons capturados durante o percurso do Ash, devemos levar em consideração que ele pode passar pelo mesmo ponto durante o trajeto. Para identificarmos isso, podemos afirmar que cada ponto (X,Y), ou seja, linha e coluna é único.

Pensando no plano cartesiano, o ponto de partida é o encontro dos eixos x e y, ou seja X: 0, Y: 0. Para avaliar seu deslocamento devemos seguir os cenários descritos abaixo:

Ao movimentar-se sentido *NORTE* então a coordenada *X* deve se manter com o último valor atribuido e a coordenada *Y* deve ser incrementada. (X, Y++)

Ao movimentar-se sentido *SUL* então a coordenada *X* deve-se manter com o último valor atribuido e a coordenada *Y* deve ser decrementada. (X, Y--)

Ao movimentar-se sentido *LESTE* então a coordenada *X* deve ser incrementada e a coordenada *Y* deve-se manter com o último valor atribuido. (X++, Y)

Ao movimentar-se sentido *OESTE* então a coordenada *X* deve ser decrementada e a coordenada *Y* deve-se manter com o último valor atribuido. (X--, Y)

Ao movimentar-se os pontos serão adicionados ao mapa para garantir que eles serão únicos.

Validações:

  • Se a jornada digitada conter caracteres diferentes de N,S,E,O então o valor será 0 e vai aparecer uma mensagem de erro no stdOut.

    Erro: "A jornada possui characteres inválidos."

  • Se a jornada informa for vazia então o valor será 0 e vai aparecer uma mensagem de erro no stdOut.

    Erro: "A jornada não foi informada."

Setup

  • Os passos para a configuração/instalação do Golang encontra-se neste link.

  • Configurar o workspace.

  • Clonar o repositório no seu workspace e acessar a pasta do projeto.

       git clone https://github.com/desafios-job/pokemon.git && pokemon

E então seguir os passos abaixo:

Build

   # Build Unix
   go build

   # Build Windows
   env GOOS=windows GOARCH=amd64 go build

run

   # Run Unix/Linux
   ./pokemon

   # Run Windows
   pokemon.exe

tests

   go test ./... -v

   # Ouput coverage std out
   go test ./... -v -cover  

   # Generate coverage file out
   go test ./...  -coverprofile=./coverage/tests.out

   # Generate coverage HTML file out
   go tool cover -html=./coverage/tests.out -o ./coverage/coverage-report.html

Benchnmark

   go test ./...  -run=XXX -bench=.

Resultado:

Alt Text

About


Languages

Language:Go 97.6%Language:Shell 2.4%