Tempo de leitura: menos de 1 minuto
E aí Pessoal, topa mais um desafio?
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



Link permanente
Link permanente
Link permanente