CodeKata #4: Jogo de Dominó

Tempo de leitura: menos de 1 minuto

E aí Pessoal, topa mais um desafio?

Jackie Chan

O último desafio (CodeKata #3: Restaurante) teve a maior quantidade de participantes já registrada, foram 5 no total (veja o resultado). E o aproveitamento dos participantes foi o melhor até agora, tendo dois dos participantes (Lucas Angelino e Flávio Pimenta), que se não fossem os testes de restrições teriam 100% de assertividade. Por tanto, não se esqueçam das restrições, pois as mesmas são testadas!

Este último, alguns cenários de teste estavam errados, foram 4 no total, isto poderia ter mudado o resultado do jogo, no entanto o erro foi bem observado pelo Flávio Pimenta e corrigido.

Na edição passada, divulguei também o ranking com a pontuação dos participantes. Será legal acompanhar rodada a rodada a evolução dos pontos de cada um dos participantes.

Regras

  • O desafio será dado, e qualquer leitor poderá participar.
  • O participante terá 15 dias para dar uma solução para o problema.
  • A solução deverá ser escrita em Java ou Groovy.
  • A solução deverá ser enviada por e-mail.
  • As soluções e seus autores serão divulgadas em um post no dia previamente fixado.
  • Na edição anterior, recebi duas sugestões para melhorar a pontuação, achei-as interessante, vou tentar aplica-las:
    • Cenário tem penalização de (- 0,5 por cenário).
    • Bonificação (+ 0,5 por cenário) ou penalização (- 0,5 por cenário) por performance (válidos apenas para cenários que passarem, ficarem verdes).

Desafio: Jogo de dominó

Enviar a solução até: 11/04/2016
Divulgação do resultado até dia: 15/04/2016

Todos conhecem o jogo de dominó, em que peças com dois valores devem ser colocadas na mesa em seqüência, de tal forma que os valores de peças imediatamente vizinhas sejam iguais. O conjunto tradicional de dominós, é formado por 28 peças, ou pedras. Cada face retangular de dominó é dividida em duas partes quadradas, ou “pontas”, que são marcadas por um número de pontos de 1 a 6 ou deixadas em branco, para representar o zero.

Escreva um programa que, receba uma lista de PecaDomino, e ordene de forma a não sobrar peças. O retorno deverá ser uma instância de Tabuleiro, com a lista de PecaDomino “encaixadas”, ou seja, devidamente ordenada e uma lista de PecaDomino que sobraram (nesta lista a ordem não é requerida).

Exemplo 1: Dado que receba a seguinte lista de peças [[0|1], [2|1], [2|0]], o resultado esperado será: Tabuleiro.pecasEncaixadas=[[0|1], [1|2], [2|0]] (Note que a 2ª peça [2|1], foi invertida no resultado) e Tabuleiro.pecasSobraram=[] (lista vazia).

Exemplo 2: Dado que receba a seguinte lista de peças [[1|1], [0|1], [2|2]], o resultado esperado será: Tabuleiro.pecasEncaixadas=[[1|1], [1|0]] e Tabuleiro.pecasSobraram=[[2|2]].

Importante: Os resultados apresentados a cima são apenas exemplo, pois existem outras formas de apresentar, que também podem estar corretas. No Exemplo 1 se sua implementação retornar o seguinte resultado Tabuleiro.pecasEncaixadas=[[2|0], [0|1], [1|2]], também estará correta.

Restrições

  • 1 ≤ N ≤ 100 (N = Tamanho da lista)
  • As peças podem se repetirem

Interface a ser implementada e TOs

Implemente a interface:

[code language=”java”]
public interface IJogoDominoService {
/**
* CodeKata #4: Jogo de Dominó
* Método responsável resolver a sequência das peças de Domino.
* Será informado uma lista de peças de dominó, e o retorno esperado é uma instância de tabuleiro,
* contendo uma lista ordenada de peças devidamente encaixadas e uma lista de peças que sobraram,
* ou seja, não foi possível o uso.
* Caso a alguma regra de restrição seja infringida então lançar IllegalArgumentException.
*
* @param pPecas
* @throws IllegalArgumentException
*/
public Tabuleiro jogar(List<PecaDomino> pPecas)
throws IllegalArgumentException;
}
[/code]

TO PecaDomino:

[code language=”java”]
public class PecaDomino {
private Integer pontaA;
private Integer pontaB;

public PecaDomino() {}

public PecaDomino(final Integer pPontaA, final Integer pPontaB) {
pontaA = pPontaA;
pontaB = pPontaB;
}

public Integer getPontaA() {
return pontaA;
}

public Integer getPontaB() {
return pontaB;
}

public void inverterLado() {
final Integer auxLado = this.pontaA;
pontaA = pontaB;
pontaB = auxLado;
}

public void setPontaA(final Integer pPontaA) {
pontaA = pPontaA;
}

public void setPontaB(final Integer pPontaB) {
pontaB = pPontaB;
}

@Override
public String toString() {
return "[" + pontaA + "|" + pontaB + "]";
}
}
[/code]

TO Tabuleiro:

[code language=”java”]
public class Tabuleiro {
private List<PecaDomino> pecasEncaixadas = new ArrayList<PecaDomino>();
private List<PecaDomino> pecasSobraram = new ArrayList<PecaDomino>();

public void adicionarSobra(final PecaDomino pPeca) {
pecasSobraram.add(pPeca);
}

public void encaixarPeca(final PecaDomino pPeca) {
pecasEncaixadas.add(pPeca);
}

public List<PecaDomino> getPecasEncaixadas() {
return pecasEncaixadas;
}

public List<PecaDomino> getPecasSobraram() {
return pecasSobraram;
}

public void setPecasEncaixadas(final List<PecaDomino> pPecasEncaixadas) {
pecasEncaixadas = pPecasEncaixadas;
}

public void setPecasSobraram(final List<PecaDomino> pPecasSobraram) {
pecasSobraram = pPecasSobraram;
}

@Override public String toString() {
return "Peças encaixadas: " + StringUtils.join(pecasEncaixadas, "") +
"\nSobra de peças=" + StringUtils.join(pecasSobraram, "");
}
}
[/code]

Nota: Projeto disponível no GitHub.

Espero que gostem!!

Convide seus amigos para o CodeKata #4.

Já ia me esquecendo, caso você crie um cenário de teste e queria submete-lo para validação das implementações, me mande um e-mail, assim todos podem testar a implementação de todos.

Enquete: Qual o nível de dificuldade do CodeKata #4?

[polldaddy poll=9365463]

Formulário de envio

Período para envio de implementação esgotado.

Abraços

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *