Mini-Poker

Resolvi fazer uma pausa nos algoritmos de ordenação para mostrar como podemos usar os conhecimentos já adquiridos de maneira prática. Vamos neste artigo resolver o problema Mini-Poker, que caiu na prova da Programação Nível 2 (categoria para pessoas até 19 anos ou primeiro ano da faculdade) da Olimpíada Brasileira de Informática de 2005.

Esse post ficou gigante, mas é muito simples. Leia com atenção e acho que você não terá problemas… ;)

Objetivos

Com esta resolução de problema, espero treinar com vocês o conceito de:

  • Interpretação do Probema
  • Entrada e Saída
  • Ordenação por Inserção
  • Pseudocódigo

Acho que será legal para pôrmos em prática o que já estudamos sobre algoritmos.

O problema é bem simples, mas é só pra iniciar. Depois vamos resolvendo problemas cada vez mais difíceis… ;)

Enunciado

Mini-Poker é o nome do jogo de cartas que é uma simplificação de Poker, um dos mais famosos jogos de cartas do mundo. Mini-Poker é jogado com um baralho normal de 52 cartas, com quatro naipes (copas, paus, espadas e ouro), cada naipe compreendendo treze cartas (Ás, 2, 3, 4, 5, 6, 7, 8, 9, 10, Valete, Dama, Rei).

No início do jogo, cada jogador recebe cinco cartas. O conjunto de cinco cartas vale um certo número de pontos, de acordo com as regras descritas abaixo. Diferentemente do jogo de Poker normal, em Mini-poker o naipe das cartas é desconsiderado. Assim, para simplificar a descrição do jogo, vamos utilizar os números de 1 a 13 para identificar as cartas do baralho, na ordem dada acima. Uma outra diferença é que pode ocorrer empate entre mais de um vencedor; nesse caso os vencedores dividem o prêmio.

As regras para pontuação em Mini-Poker são as seguintes:

  1. Se as cinco cartas estão em seqüência a partir da carta [tex]x[/tex] (ou seja, os valores das cartas são [tex]x[/tex], [tex]x+1[/tex], [tex]x+2[/tex], [tex]x+3[/tex] e [tex]x+4[/tex]), a pontuação é [tex]x+200[/tex] pontos. Por exemplo, se as cartas recebidas são 10, 9, 8, 11 e 12, a pontuação é 208 pontos.
  2. Se há quatro cartas iguais [tex]x[/tex] (uma quadra, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]x[/tex], [tex]x[/tex] e [tex]y[/tex]), a pontuação é [tex]x+180[/tex] pontos. Por exemplo, se as cartas recebidas são 1, 1, 1, 10 e 1, a pontuação é 181 pontos.
  3. Se há três cartas iguais [tex]x[/tex] e outras duas cartas iguais [tex]y[/tex] (uma trinca e um par, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]x[/tex], [tex]y[/tex] e [tex]y[/tex]), a pontuação é [tex]x+160[/tex] pontos. Por exemplo, se as cartas recebidas são 10, 4, 4, 10 e 4, a pontuação é 164 pontos.
  4. Se há três cartas iguais [tex]x[/tex] e duas outras cartas diferentes [tex]y[/tex] e [tex]z[/tex] (uma trinca, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]x[/tex], [tex]y[/tex] e [tex]z[/tex]), a pontuação é [tex]x+140[/tex] pontos. Por exemplo, se as cartas recebidas são 2, 3, 2, 2 e 13, a pontuação é 142 pontos.
  5. Se há duas cartas iguais [tex]x[/tex], duas outras cartas iguais [tex]y[/tex] ([tex]x \neq{} y[/tex]) e uma outra carta distinta [tex]z[/tex] (dois pares, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]y[/tex], [tex]y[/tex] e [tex]z[/tex]), a pontuação é [tex]3 \times{} x + 2 \times{} y + 20[/tex] pontos, em que [tex]x > y[/tex]. Por exemplo, se as cartas recebidas são 12, 7, 12, 8 e 7, a pontuação é 70 pontos.
  6. Se há apenas duas cartas iguais [tex]x[/tex] e as outras são distintas (um par, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]y[/tex], [tex]z[/tex] e [tex]t[/tex]), a pontuação é [tex]x[/tex] pontos. Por exemplo, se as cartas recebidas são 12, 13, 5, 8 e 13, a pontuação é 13 pontos.
  7. Se todas as cartas são distintas, não há pontuação.

Tarefa

Escreva um programa que, fornecidas as cartas dadas a um jogador, calcule a pontuação do jogador naquela jogada.

Entrada

A entrada é composta por vários casos de teste, cada um correspondendo a uma jogada. A primeira linha da entrada contém um número inteiro [tex]N[/tex] que indica o número de casos de teste ([tex]1 \leq{} N \leq{} 100[/tex]). Cada uma das [tex]N[/tex] linhas seguintes contém cinco números inteiros [tex]C_{1}[/tex], [tex]C_{2}[/tex], [tex]C_{3}[/tex], [tex]C_{4}[/tex] e [tex]C_{5}[/tex], representando as cinco cartas recebidas por um jogador ([tex]1 \leq{} C_{1}, C_{2}, C_{3}, C_{4}, C_{5} \leq{} 13[/tex]).

A entrada deve ser lida do dispositivo de entrada padrão (normalmente o teclado).

Saída

Para cada caso de teste da entrada, seu programa deve produzir três linhas na saída. A primeira linha deve conter um identificador do caso de teste, no formato “Teste n”, onde n é numerado seqüencialmente a partir de 1. A segunda linha deve conter a pontuação do jogador considerando as cinco cartas recebidas. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

A saída deve ser escrita no dispositivo de saída padrã (normalmente a tela).

Restrições

[tex]1 \leq{} N \leq{} 100[/tex]

[tex]1 \leq{} C_{1}, C_{2}, C_{3}, C_{4}, C_{5} \leq{} 13[/tex]

Exemplo de Entrada

2
12 3 10 3 12
1 2 3 5 4

Saída para o Exemplo de Entrada

Teste 1
62

Teste 2
201

Comentários sobre os problemas de olimpíadas

Todos os problemas passados em competições de programação tem um enunciado parecido com o desse. São especificados todos os limites (restrições), é dito exatamente como será a entrada e como deve ser a saída e geralmente tem uma historinha no começo… :D

Bom… Todos esses dados são fundamentais. Alguns limites nem vamos usar, não tem importância para a nossa solução, mas pode ter importância para outra pessoa que queira implementar um algoritmo diferente. A sintaxe da entrada e da saída são extremamente importantes. Na prova da Seletiva IOI do ano passado, eu quase perdi 60 pontos (6 casos de teste) na solução de um problema simples porque meu programa desprezava um espaço no início de uma frase quando imprimia uma saída. E mesmo a historinha do começo é fundamental. Ela sempre dá boas dicas e algumas vezes até ilustra o problema (às vezes a gente nem lê o enunciado e já sabe que é um problema de grafos!)

Mas vamos a solução deste problema…

Por onde começar?

Com o tempo você pode decidir fazer um caminho diferente, mas eu sugiro começar sempre pelo recebimento da entrada. Aliás, acho que isto é atípico, porque a maioria das pessoas prefere ler bastante o problema e desenvolver todo o algoritmo a mão antes de botar a mão na massa. Eu acho que depois que a gente recebe a entrada, fica bem mais fácil fazer o resto e a gente pode ir pensando enquanto a gente recebe a entrada! Então, depois que lemos o problema e já entendemos tudo o que ele quer, vamos fazer a entrada!

O problema fala que começa nos dando um número N que será o número de casos de teste que teremos que receber depois. Sem dificuldade podemos escrever o pseudocódigo a seguir:

recebe N
para nteste [tex]\leftarrow{}[/tex] 1 até N, faça
fim-para

Já chamo a variável que loopa como nteste, porque já li a saída do problema e sei que vou precisar imprimir o número de caad caso de teste… ;)

Aí o enunciado diz que Cada uma das [tex]N[/tex] linhas seguintes contém cinco números inteiros [tex]C_{1}[/tex], [tex]C_{2}[/tex], [tex]C_{3}[/tex], [tex]C_{4}[/tex] e [tex]C_{5}[/tex], representando as cinco cartas recebidas por um jogador ([tex]1 \leq{} C_{1}, C_{2}, C_{3}, C_{4}, C_{5} \leq{} 13[/tex]). Então, vamos receber os cinco números em cada iteração e colocá-los num vetor, é claro!

recebe N
para nteste [tex]\leftarrow{}[/tex] 1 até N, faça
	recebe [tex]C_{1}, C_{2}, C_{3}, C_{4}, C_{5}[/tex]
fim-para

E a entrada está pronta.

Desenvolvimento

O programa se baseia em encontrarmos valores iguais nos elementos do vetor. O que podemos fazer para facilitar essa tarefa?

Isso mesmo: A ordenação! :D Se os elementos estiverem ordenados, ficará bem mais fácil para procurarmos quatro números iguais, porque eles não poderão ser qualquer uma das possibilidades, mas somente [tex]C_{1}, C_{2}, C_{3}, C_{4}[/tex] ou [tex]C_{2}, C_{3}, C_{4}, C_{5}[/tex].

Aí que algoritmos devemos implementar para ordenar? Isso é uma conclusão que vamos chegar no final de nossa série, mas para este algoritmo não tem solução melhor que a Ordenação por Inserção. É um caso pequeno (n=5) e a Ordenação por Inserção é mais rápida que a por Seleção, porque o seu melhor caso é uma função linear. Então, vamos implementar o Insertion Sort no nosso algoritmo:

recebe N
para nteste [tex]\leftarrow{}[/tex] 1 até N, faça
	recebe [tex]C_{1}, C_{2}, C_{3}, C_{4}, C_{5}[/tex]
	início da ordenação por inserção
	para j [tex]\leftarrow{}[/tex] 2 até 5
		elemento [tex]\leftarrow{}[/tex] [tex]C_{j}[/tex]
		i [tex]\leftarrow{}[/tex] j-1
		enquanto i > 0 e [tex]C_{i}[/tex] > elemento, faça
			[tex]C_{i+1}[/tex] [tex]\leftarrow{}[/tex] [tex]C_{i}[/tex]
			[tex]i[/tex] [tex]\leftarrow{}[/tex] [tex]C_{i-1}[/tex]
		fim-enquanto
		[tex]C_{i+1}[/tex] [tex]\leftarrow{}[/tex] elemento
	fim-para
	fim da ordenação por inserção
fim-para

O bom desses algoritmos de ordenação é que sua lógica é muito simples e por isso é fácil decorá-los… Ao menos o Insertion Sort e o Selection Sort são algoritmos básicos que todo programador deve conhecer bem. Bom… Acredito que vocês não tenham tido dificuldade pra entender até aqui. A cor vermelha no pseudocódigo eu vou usar daqui pra frente para um comentário, que aliás, é uma excelente prática de boa programação.

O resto do problema precisa calcular quantos pontos o cara fez, baseado em suas cartas, agora já ordenadas. Para isto vamos criar uma função para testar vários se e retornar o resultado.

Eu poderia tirar os se aninhados, mas assim fica mais fácil a compreensão.

Como vamos ver com os pseudocódigos a seguir, é fácil testar cada uma das regras com o vetor ordenado:

Primeira Regra – Seqüência

Se as cinco cartas estão em seqüência a partir da carta [tex]x[/tex] (ou seja, os valores das cartas são [tex]x[/tex], [tex]x+1[/tex], [tex]x+2[/tex], [tex]x+3[/tex] e [tex]x+4[/tex]), a pontuação é [tex]x+200[/tex] pontos. Por exemplo, se as cartas recebidas são 10, 9, 8, 11 e 12, a pontuação é 208 pontos.

se [tex]C_{1} = C_{2}-1[/tex] e [tex]C_{2} = C_{3}-1[/tex] e [tex]C_{3}=C_{4}-1[/tex] e [tex]C_{4}=C_{5}-1[/tex], então
 	retorna [tex]C_{1}+200[/tex]
fim-se

Segunda Regra – Quadra

Se há quatro cartas iguais [tex]x[/tex] (uma quadra, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]x[/tex], [tex]x[/tex] e [tex]y[/tex]), a pontuação é [tex]x+180[/tex] pontos. Por exemplo, se as cartas recebidas são 1, 1, 1, 10 e 1, a pontuação é 181 pontos.

se [tex]C_{1} = C_{2} = C_{3} = C_{4}[/tex] ou [tex]C_{2} = C_{3} = C_{4} = C_{5}[/tex], então
	retorna [tex]C_{2}+180[/tex]
fim-se

Aqui retornamos [tex]C_{2}[/tex] porque ele será sempre parte da quadra (ela começando em [tex]C_{1}[/tex] ou [tex]C_{2}[/tex]).

Terceira e Quarta Regra – Trinca

Se há três cartas iguais [tex]x[/tex] e outras duas cartas iguais [tex]y[/tex] (uma trinca e um par, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]x[/tex], [tex]y[/tex] e [tex]y[/tex]), a pontuação é [tex]x+160[/tex] pontos. Por exemplo, se as cartas recebidas são 10, 4, 4, 10 e 4, a pontuação é 164 pontos.

se [tex]C_{1} = C_{2} = C_{3}[/tex] ou [tex]C_{2} = C_{3} = C_{4}[/tex] ou [tex]C_{3} = C_{4} = C_{5}[/tex], então
	se ( [tex]C_{1} \neq{} C_{3}[/tex] e [tex]C_{1} = C_{2}[/tex] ) ou ( [tex]C_{3} \neq{} C_{5}[/tex] e [tex]C_{4} = C_{5}[/tex] ), então
		retorna [tex]C_{3}+160[/tex]

Se há três cartas iguais [tex]x[/tex] e duas outras cartas diferentes [tex]y[/tex] e [tex]z[/tex] (uma trinca, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]x[/tex], [tex]y[/tex] e [tex]z[/tex]), a pontuação é [tex]x+140[/tex] pontos. Por exemplo, se as cartas recebidas são 2, 3, 2, 2 e 13, a pontuação é 142 pontos.

	senão
		retorna [tex]C_{3} + 140[/tex]
	fim-se
fim-se

Note que aqui retornamos [tex]C_{3}[/tex] porque ele será sempre parte da trinca (o mesmo motivo que retornarmos [tex]C_{2}[/tex] para a quadra).

Quinta Regra – Duas Duplas

Se há duas cartas iguais [tex]x[/tex], duas outras cartas iguais [tex]y[/tex] ([tex]x \neq{} y[/tex]) e uma outra carta distinta [tex]z[/tex] (dois pares, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]y[/tex], [tex]y[/tex] e [tex]z[/tex]), a pontuação é [tex]3 \times{} x + 2 \times{} y + 20[/tex] pontos, em que [tex]x > y[/tex]. Por exemplo, se as cartas recebidas são 12, 7, 12, 8 e 7, a pontuação é 70 pontos.

se [tex]C_{1} = C_{2}[/tex] ou [tex]C_{2} = C_{3}[/tex], então
	se [tex]C_{3} = C_{4}[/tex] ou [tex]C_{4} = C_{5}[/tex], então
		retorna [tex]3 \times{} C_{4} + 2 \times{} C_{2} +20[/tex]
	fim-se
fim-se

[tex]C_{2}[/tex] será sempre elemento da menor dupla e [tex]C_{4}[/tex] será sempre elemento da maior dupla. Por isso usamos eles como [tex]y[/tex] e [tex]x[/tex], respectivamente.

Sexta Regra – Dupla

Se há apenas duas cartas iguais [tex]x[/tex] e as outras são distintas (um par, ou seja, os valores das cartas são [tex]x[/tex], [tex]x[/tex], [tex]y[/tex], [tex]z[/tex] e [tex]t[/tex]), a pontuação é [tex]x[/tex] pontos. Por exemplo, se as cartas recebidas são 12, 13, 5, 8 e 13, a pontuação é 13 pontos.

se [tex]C_{1} = C_{2}[/tex] ou [tex]C_{2} = C_{3}[/tex], então
	retorna [tex]C_{2}[/tex]
senão se [tex]C_{3} = C_{4}[/tex] ou [tex]C_{4} = C_{5}[/tex],
então
	retorna [tex]C_{4}[/tex]
fim-se

Separei em dois SEs porque senão não saberíamos que valor retornar.

Sétima Regra

Se todas as cartas são distintas, não há pontuação.

retorna 0

Função Inteira

Juntando todos os SEs, temos:

função pontua (C)

primeira regra
se [tex]C_{1} = C_{2}-1[/tex] e [tex]C_{2} = C_{3}-1[/tex] e [tex]C_{3}=C_{4}-1[/tex] e [tex]C_{4}=C_{5}-1[/tex], então
 	retorna [tex]C_{1}+200[/tex]
fim-se

segunda regra
se [tex]C_{1} = C_{2} = C_{3} = C_{4}[/tex] ou [tex]C_{2} = C_{3} = C_{4} = C_{5}[/tex], então
	retorna [tex]C_{2}+180[/tex]
fim-se

terceira e quarta regra
se [tex]C_{1} = C_{2} = C_{3}[/tex] ou [tex]C_{2} = C_{3} = C_{4}[/tex] ou [tex]C_{3} = C_{4} = C_{5}[/tex], então
	se ( [tex]C_{1} \neq{} C_{3}[/tex] e [tex]C_{1} = C_{2}[/tex] ) ou ( [tex]C_{3} \neq{} C_{5}[/tex] e [tex]C_{4} = C_{5}[/tex] ), então
		retorna [tex]C_{3}+160[/tex]
	senão
		retorna [tex]C_{3} + 140[/tex]
	fim-se
fim-se

quinta regra
se [tex]C_{1} = C_{2}[/tex] ou [tex]C_{2} = C_{3}[/tex], então
	se [tex]C_{3} = C_{4}[/tex] ou [tex]C_{4} = C_{5}[/tex], então
		retorna [tex]3 \times{} C_{4} + 2 \times{} C_{2} +20[/tex]
	fim-se
fim-se

sexta regra
se [tex]C_{1} = C_{2}[/tex] ou [tex]C_{2} = C_{3}[/tex], então
	retorna [tex]C_{2}[/tex]
senão se [tex]C_{3} = C_{4}[/tex] ou [tex]C_{4} = C_{5}[/tex],
então
	retorna [tex]C_{4}[/tex]
fim-se

sétima regra
retorna 0

fim-função

Já que a função retorna assim que encontra um resultado, não há risco de ocorrer nada errado (por exemplo, uma quadra é sempre uma trinca, que é sempre uma dupla). Agora basta colocarmos esta função no nosso código e adaptar para a saída ser igual a que o problema pede.

Saída

Para chegar a saída, basta fazermos o programa imprimir Teste nteste e depois o retorno da função pontua. Com isto, temos:

recebe N
para nteste [tex]\leftarrow{}[/tex] 1 até N, faça
	recebe [tex]C_{1}, C_{2}, C_{3}, C_{4}, C_{5}[/tex]
	início da ordenação por inserção
	para j [tex]\leftarrow{}[/tex] 2 até 5
		elemento [tex]\leftarrow{}[/tex] [tex]C_{j}[/tex]
		i [tex]\leftarrow{}[/tex] j-1
		enquanto i > 0 e [tex]C_{i}[/tex] > elemento, faça
			[tex]C_{i+1}[/tex] [tex]\leftarrow{}[/tex] [tex]C_{i}[/tex]
			[tex]i[/tex] [tex]\leftarrow{}[/tex] [tex]C_{i-1}[/tex]
		fim-enquanto
		[tex]C_{i+1}[/tex] [tex]\leftarrow{}[/tex] elemento
	fim-para
	fim da ordenação por inserção

	imprime "Teste "
	imprime linha testen
	imprime linha pontua(C)
	imprime linha
fim-para

Fiz essa saída assim pra se parecer com Pascal, mas para cada linguagem ela pode ser bem diferente… Vejamos dois exemplos…

C

printf("Teste %d\n%d\n\n", nteste, pontua(C));

PHP

echo "Teste ".$nteste."\n".pontua($C)."\n\n";

Programa Completo

função pontua (C)

primeira regra
se [tex]C_{1} = C_{2}-1[/tex] e [tex]C_{2} = C_{3}-1[/tex] e [tex]C_{3}=C_{4}-1[/tex] e [tex]C_{4}=C_{5}-1[/tex], então
 	retorna [tex]C_{1}+200[/tex]
fim-se

segunda regra
se [tex]C_{1} = C_{2} = C_{3} = C_{4}[/tex] ou [tex]C_{2} = C_{3} = C_{4} = C_{5}[/tex], então
	retorna [tex]C_{2}+180[/tex]
fim-se

terceira e quarta regra
se [tex]C_{1} = C_{2} = C_{3}[/tex] ou [tex]C_{2} = C_{3} = C_{4}[/tex] ou [tex]C_{3} = C_{4} = C_{5}[/tex], então
	se ( [tex]C_{1} \neq{} C_{3}[/tex] e [tex]C_{1} = C_{2}[/tex] ) ou ( [tex]C_{3} \neq{} C_{5}[/tex] e [tex]C_{4} = C_{5}[/tex] ), então
		retorna [tex]C_{3}+160[/tex]
	senão
		retorna [tex]C_{3} + 140[/tex]
	fim-se
fim-se

quinta regra
se [tex]C_{1} = C_{2}[/tex] ou [tex]C_{2} = C_{3}[/tex], então
	se [tex]C_{3} = C_{4}[/tex] ou [tex]C_{4} = C_{5}[/tex], então
		retorna [tex]3 \times{} C_{4} + 2 \times{} C_{2} +20[/tex]
	fim-se
fim-se

sexta regra
se [tex]C_{1} = C_{2}[/tex] ou [tex]C_{2} = C_{3}[/tex], então
	retorna [tex]C_{2}[/tex]
senão se [tex]C_{3} = C_{4}[/tex] ou [tex]C_{4} = C_{5}[/tex],
então
	retorna [tex]C_{4}[/tex]
fim-se

sétima regra
retorna 0

fim-função

recebe N
para nteste [tex]\leftarrow{}[/tex] 1 até N, faça
	recebe [tex]C_{1}, C_{2}, C_{3}, C_{4}, C_{5}[/tex]
	início da ordenação por inserção
	para j [tex]\leftarrow{}[/tex] 2 até 5
		elemento [tex]\leftarrow{}[/tex] [tex]C_{j}[/tex]
		i [tex]\leftarrow{}[/tex] j-1
		enquanto i > 0 e [tex]C_{i}[/tex] > elemento, faça
			[tex]C_{i+1}[/tex] [tex]\leftarrow{}[/tex] [tex]C_{i}[/tex]
			[tex]i[/tex] [tex]\leftarrow{}[/tex] [tex]C_{i-1}[/tex]
		fim-enquanto
		[tex]C_{i+1}[/tex] [tex]\leftarrow{}[/tex] elemento
	fim-para
	fim da ordenação por inserção

	imprime "Teste "
	imprime linha testen
	imprime linha pontua(C)
	imprime linha
fim-para

Comentários sobre o problema

Este problema é muito chato. É trivial, mas perdemos um tempo enorme escrevendo ses. Ninguém gosta de um problema como esse, mas quando cai numa olimpíada somos obrigados a resolver… hehehe… Mas, para a felicidade geral de todos, saibam que a maioria dos problemas de olimpíadas não são assim. Exigem mais lógica e menos código. Com o tempo, vamos pegando problemas mais difíceis. Espero só ter cumprido meu objetivo dando uma utilidade pra ordenação, entrada e saída e que vocês tenham entendido tudo.

Espero que tenham gostado da solução. Eu implementei este programa em C há seis meses e se você estiver interessado, sua solução está aqui: poker.c.

Sugiro que quem esteja aprendendo algoritmos com meus artigos e já saiba programar um pouquinho, resolva alguns problemas simples do site da OBI, que separei especialmente pra vocês!

E, gostaria de fixar, mais importante é a interpretação e o seu pensamento… Programar é fácil! :D

1,426 thoughts on “Mini-Poker

  1. Hello. There is an issue for everyone who look for big quality posts. Will you try to find another site? If you consult me I will say absolutely no. This page is best for myself!

  2. Hey everybody! It really is very beneficial document. I really am amazed that you are so gifted. I failed to confidence you!

  3. I have got to confess that it can be one of the most fascinating content I have actually look over. It’s also expertly penned. I’m an British instructor so I know what I mean.

  4. In my viewpoint, not lots of blogers have so numerous concepts to develop brand new, intriguing posts. Many cheers for creating it and I wish you didn’t lose the motivation to make the new ones!

  5. This web site may be a walk-through for all of the details you wanted in regards to this and didn’t know who to question. Glimpse here, and you’ll definitely discover it.

  6. Wow, wonderful blog layout! How long have you been blogging for? you make blogging look easy. The overall look of your website is fantastic, as well as the content!

  7. Thanks a lot for providing individuals with remarkably pleasant chance to read critical reviews from this blog. It is always so enjoyable and stuffed with amusement for me and my office peers to visit the blog at least thrice in a week to study the newest things you have got. And lastly, I’m just usually fulfilled for the beautiful tips you give. Some 1 tips in this posting are ultimately the finest we’ve ever had.

  8. Awesome post. I’m a normal visitor of your site and appreciate you taking the time to maintain the excellent site. I’ll be a frequent visitor for a long time.

  9. Hiya, I am really glad I’ve found this information. Today bloggers publish only about gossip and net stuff and this is really annoying. A good website with exciting content, that’s what I need. Thank you for making this web site, and I’ll be visiting again. Do you do newsletters by email?

  10. Awesome post. I am a regular visitor of your web site and appreciate you taking the time to maintain the nice site. I will be a regular visitor for a long time.

  11. Hi there. I found your web site by the use of Google even as searching for a related subject, your website got here up. It appears to be great. I have bookmarked it in my google bookmarks to visit then.

  12. Thank you for your entire work on this blog. My mother really loves managing investigation and it is easy to see why. A number of us notice all relating to the lively way you give good solutions through your web site and in addition inspire contribution from some other people on that theme and my simple princess is now studying so much. Enjoy the rest of the year. You are conducting a great job.

  13. Hiya, I am really glad I’ve found this info. Nowadays bloggers publish just about gossip and web stuff and this is really frustrating. A good website with exciting content, that’s what I need. Thank you for making this website, and I will be visiting again. Do you do newsletters by email?

  14. Awesome post. I am a regular visitor of your website and appreciate you taking the time to maintain the excellent site. I will be a frequent visitor for a really long time.

  15. I do trust all of the concepts you have introduced to your post. They’re really convincing and will definitely work. Still, the posts are very quick for newbies. Could you please extend them a little from subsequent time? Thank you for the post.

  16. My husband and i ended up being very delighted Raymond managed to complete his investigations via the precious recommendations he had through the site. It’s not at all simplistic to simply continually be offering tips that many some people might have been selling. We really fully grasp we’ve got the writer to appreciate for this. Most of the explanations you’ve made, the straightforward web site menu, the friendships you help create – it is all wonderful, and it is letting our son in addition to our family understand that concept is exciting, and that is quite mandatory. Thanks for everything!

  17. Hiya, I am really glad I’ve found this information. Nowadays bloggers publish only about gossip and net stuff and this is actually irritating. A good web site with interesting content, that is what I need. Thank you for making this website, and I’ll be visiting again. Do you do newsletters by email?

  18. My spouse and i ended up being more than happy Albert could finish off his survey through the precious recommendations he got in your blog. It is now and again perplexing to just happen to be giving out key points which usually others have been trying to sell. We really acknowledge we now have the writer to appreciate because of that. All the illustrations you’ve made, the simple website navigation, the relationships you will help instill – it’s got mostly exceptional, and it’s really making our son in addition to us feel that that subject matter is thrilling, which is certainly highly indispensable. Many thanks for all the pieces!

  19. Hello there. I found your web site by means of Google even as searching for a similar topic, your website came up. It seems to be good. I have bookmarked it in my google bookmarks to visit then.

  20. Hi there. I found your web site by means of Google whilst looking for a similar matter, your web site came up. It appears great. I have bookmarked it in my google bookmarks to come back then.

  21. Hiya, I’m really glad I have found this info. Nowadays bloggers publish only about gossip and internet stuff and this is really frustrating. A good blog with interesting content, that’s what I need. Thanks for making this site, and I will be visiting again. Do you do newsletters by email?

  22. Awesome post. I am a regular visitor of your website and appreciate you taking the time to maintain the nice site. I will be a frequent visitor for a long time.

  23. Hiya, I’m really glad I have found this information. Nowadays bloggers publish just about gossip and web stuff and this is really annoying. A good web site with exciting content, that is what I need. Thanks for making this web-site, and I’ll be visiting again. Do you do newsletters by email?

  24. I would like to express some thanks to the writer just for rescuing me from this difficulty. After looking through the internet and meeting things which were not pleasant, I believed my life was over. Being alive minus the strategies to the problems you have fixed as a result of your short post is a critical case, as well as the ones which may have negatively affected my entire career if I had not come across your web blog. Your knowledge and kindness in controlling all the details was very helpful. I am not sure what I would’ve done if I had not discovered such a thing like this. I’m able to at this point relish my future. Thanks a lot so much for your specialized and result oriented help. I will not hesitate to recommend your web site to anyone who would like recommendations on this problem.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>