Proposta: Desafios!

Esse é um exercício clássico. Aliás, o entanglement já postou uma solução incrivelmente otimizada aqui no fórum.

Aqui tem um tópico inteiro sobre o assunto, com dicas com e sem usar o crivo:
http://www.guj.com.br/posts/list/143046.java

Desculpa ai Vini, não ai voltar a acontecer, e desculpe aos demais, é que eu precisava para um trabalho de faculdade.

Eu já consegui o que eu queria: JSF, eu dei uma olhada na apostila da Talita, inclusive foi de grande ajuda!

Obrigado a todos e desculpe mais uma vez!

A ideia do tópico era discutir como faríamos, definir as coisas por aqui, mas o pessoal quis sair tocando desafios… por mim tudo bem.

Adriano a ideia do blog foi sua, então sinta-se livre para fazê-lo se quiser. Podemos ainda criar um sistema de ranking, algo como:
50 pontos para quem resolver o problema
70 pontos para quem fizer primeiro
30 pontos de bônus por item (caso haja mais de um)

ou algo assim… e aí eu atualizo a msg principal neste tópico uma vez por semana com os nomes e a pontuação de quem for resolvendo os desafios.

Outra coisa é saber se existe a possibilidade (ou interesse) dos responsáveis pelo [color=blue]GUJ[/color] de oferecer brindes de final de ano para os 3 ou 5 ou 10 mais pontuados nos desafios, como forma de incentivo. Existe? Algum moderador ou administrador, pode nos dizer alguma coisa? Podemos desenvolver melhor ainda a ideia. :slight_smile:

Opiniões?

Esse é um exercício clássico. Aliás, o entanglement já postou uma solução incrivelmente otimizada aqui no fórum.

Aqui tem um tópico inteiro sobre o assunto, com dicas com e sem usar o crivo:
http://www.guj.com.br/posts/list/143046.java[/quote]

Hum… sim, é um exercício bem legal e clássico.
Ainda não tinha nem procurado isso no forum, mas o que vale é o desafio, como já tem resposta, então que anunciem o próximo…

pessoal, desculpe a demora.

Bom, como não postaram um desafio válido, vou postar um ok? (um bem simples)

Vamos lá, quero que criem um programa que me gere aleatoriamente 1000 strings, receba uma expreg e me conte quantas strings são validadas pela expreg.

Entre os 3 primeiros que responder corretamente, ganha quem tiver o código mais rápido. (hehehe, assim também aprendo sobre otimização de tratamento de string em java)

Segue uma resolução que fiz aqui. Mas não me preocupei muito com desempenho, OO e muito menos com o tratamento dos erros. :XD:

[code]public class Teste {

public static String gerarString(int tamanho) {
	char[] caracteres = new char[tamanho];
	
	// Gera os caracteres entre 32 (espaço) e 126 (~)
	while (tamanho > 0) {
		tamanho--;
		caracteres[tamanho] = (char) ((Math.random() * 95) + 32);
	}
	
	return new String(caracteres);
}

public static String[] gerarArrayDeStrings(int tamanho) {
	String[] palavras = new String[tamanho];
	
	// Gera palavras com tamanho entre 3 e 10 caracteres.
	for (int i = 0; i < tamanho; i++){
		palavras[i] = gerarString((int) ((Math.random() * 8) + 3));
	}
	
	return palavras;
}

public static int contarOcorrencias(String regex, String[] palavras) {
	int cont = 0;
	
	// Verifica se a palavra bate com a expressão e incrementa o contador.
	for (String palavra : palavras) {
		if (palavra.matches(regex))
			cont++;
	}
	
	return cont;
}

public static void main(String[] args) {
	String[] palavras = gerarArrayDeStrings(1000);
	System.out.println(contarOcorrencias(".+", palavras)); // Conta tudo
	System.out.println(contarOcorrencias(".{5}", palavras)); // Conta as palavras de cinco letras
	System.out.println(contarOcorrencias("[Aa].+", palavras)); // Conta as palavras começadas por A ou a
	System.out.println(contarOcorrencias("A.+", palavras)); // Conta as palavras começadas por A
	System.out.println(contarOcorrencias("a.+", palavras)); // Conta as palavras começadas por a
}

}[/code]

Querem um desafio?

Tenho dois que eu já tentei e não consegui, vou postar o primeiro aqui, espero que consigam!

[size=18][color=blue]DESAFIO 1: [/color][/size] [color=red]Faça um Teclado Virtual em JAVA.[/color]

Simples né? Nem tanto.

OBS.: O teclado virtual deverá funcionar para [color=red]todo e qualquer aplicativo[/color], não somente para a sua própria aplicação Java.
Ex.: Com ele você poderá digitar um endereço de web no seu navegador e clicar enter para entrar no site.

Tentem fazer, vão se surpreender com o que vão deparar… Bem chatinho de fazer!
[color=red]DEVE SER FEITO EM JAVA![/color]

Rapaz, eu tinha feito um teclado virtual em Java. Estava funcionando tudo certinho, para digitar em qualquer lugar.

Para poder digitar em qualquer tela, eu tinha usado o JWindow como container, pois ele não segura o foco para ele, assim eu poderia ir apertando os botões que o foco continuava onde estava antes. Mas eu acabei desistindo por que eu não consegui colocar uma barra de título e fazer ele parecer uma janela, assim como eu não consegui fazer o JFrame não segurar o foco.

Quem sabe um dia eu não tente fazer de novo.

Acho que está faltando algumas regras aqui:

  1. O desafio deveria ser verificável. Por exemplo, como vamos testar que o teclado funciona “em todo e qualquer aplicativo”?
  2. O desafio, como o nome diz, deve ser desafiador (sortear numeros é bastante elementar, mesmo pro fórum de java básico);
  3. Não deveria depender de APIs. Por exemplo, o que pede para gerar String e usar Regex: Isso nem sequer é desafiador, basta saber como a API funciona. Note que o enunciado nem da margem que use-se outra coisa, pois ele disse que quer passar uma regex qualquer. Poucos aqui implementariam o próprio parser de regex para tentar fazer algo mais eficiente (ele poderia ser tornado um desafio se apenas o problema da busque fosse fornecido, e tivéssemos que buscar por uma regex eficiente, ou montar um algoritmo próprio, sem regex);
  4. Deveria estimular que pessoas buscassem a melhor solução para um problema, não apenas uma solução. Se for uma solução, que seja algo que pareça simples, mas na hora do vamos ver, o povo não tenha nem idéia de como começar (como o caso que postei ali, ou do exemplo do Mark).

vini, a minha ideia aí era ver o melhor desempenho usando essas APIs (ou mesmo sem elas), mesmo que não fosse a mesma coisa que ver um problema de lógica em si. A ideia mesmo era ver quais formas de incluir caracteres na string de forma “massiva” (mas que nem foi tão massiva assim) e ter um bom desempenho.

Vocês estão querendo um desafio para iniciantes, certo?
então vai um bem legalzinho (pelo menos na minha opinião).

Dada uma placa qualquer de um veículo dizer a qual UF essa placa pertence.

Vamos ver quem posta a melhor solução e ver quem é o primeiro

para ajudar nesse desafio vou postar uma tabela com as series inicias e finais de cada estado

Combinação alfanumérica? UF?

AAA 0001 a BEZ 9999 Paraná (PR)

BFA 0001 a GKI 9999 São Paulo (SP)

GKJ 0001 a HOK 9999 Minas Gerais (MG)

HOL 0001 a HQE 9999 Maranhão (MA)

HQF 0001 a HTW 9999 Mato Grosso do Sul (MS)

HTX 0001 a HZA 9999 Ceará (CE)

HZB 0001 a IAP 9999 Sergipe (SE)

IAQ 0001 a JDO 9999 Rio Grande do Sul (RS)

JDP 0001 a JKR 9999 Distrito Federal (DF)

JKS 0001 a JSZ 9999 Bahia (BA)

JTA 0001 a JWE 9999 Pará (PA)

JWF 0001 a JXY 9999 Amazonas (AM)

JXZ 0001 a KAU 9999 Mato Grosso (MT)

KAV 0001 a KFC 9999 Goiás (GO)

KFD 0001 a KME 9999 Pernambuco (PE)

KMF 0001 a LVE 9999 Rio de Janeiro (RJ)

LVF 0001 a LWQ 9999 Piauí (PI)

LWR 0001 a MMM 9999 Santa Catarina (SC)

MMN 0001 a MOW 9999 Paraíba (PB)

MOX 0001 a MTZ 9999 Espírito Santo (ES)

MUA 0001 a MVK 9999 Alagoas (AL)

MVL 0001 a MXG 9999 Tocantins (TO)

MXH 0001 a MZM 9999 Rio Grande do Norte (RN)

MZN 0001 a NAG 9999 Acre (AC)

NAH 0001 a NBA 9999 Roraima (RR)

NBB 0001 a NEH 9999 Rondônia (RO)

NEI 0001 a NFB 9999 Amapá (AP)

NFC 0001 a NGZ 9999 Goiás (GO) 2ª sequência

NHA 0001 a NHT 9999 Maranhão (MA) 2ª sequência

NHU 0001 a NIX 9999 Piauí (PI) 2ª sequência

NIY 0001 a NJW 9999 Mato Grosso (MT) 2ª sequência

NJX 0001 a NLU 9999 Goiás (GO) 3ª sequência

NLV 0001 a NMN 9999 Alagoas (AL) 2ª sequência

NMO 0001 a NNI 9999 Maranhão (MA) 3ª sequência

NNJ 0001 a NNX 9999 Rio Grande do Norte (RN) 2ª sequência

NNY 0001 a NOH 9999 Paraíba (PB) 2ª sequência

NOI 0001 a NPB 9999 Amazonas (AM) 2ª sequência

NPC 0001 a NPQ 9999 Mato Grosso (MT) 3ª sequência

NPR 0001 a NQK 9999 Paraíba (PB) 3ª sequência

NQL 0001 a NRE 9999 Ceará (CE) 2ª sequência

NRF 0001 a NSD 9999 Mato Grosso do Sul (MS) 2ª sequência

NSE 0001 a NTC 9999 Pará (PA) 2ª sequência

NTD 0001 a NTX 9999 Bahia (BA) 2ª sequência

NTY 0001 a NUL 9999 Mato Grosso (MT) 4ª sequência

NUM 0001 a NVF 9999 Ceará (CE) 3ª sequência

NVG 0001 a NVN 9999 Sergipe (SE) 2ª sequência

NVO 0001 a NWR 9999 Goiás (GO) 4ª sequência

NWS 0001 a NXT 9999 Sequências ainda não definidas

NXU 0001 a NXW 9999 Pernambuco (PE) 2ª sequência

NXX 0001 a PED 9999 Sequências ainda não definidas

PEE 0001 a PFQ 9999 Pernambuco (PE) 3ª sequência[5]

PFR 0001 a ZZZ 9999 Sequências ainda não definidas

para alguns esse desafio é fácil, mas para iniciantes como eu é um desafio interessante. Isso é, se tentarem aprimorar o algoritmo, tornando o mais eficaz, rápido e com um grau de complexidade não muito grande…
ainda não tenho a resposta, mas vou fazer aqui.

O problema desse desafio é que a parte numerica pode ser desprezada, voce podia modificar os intervalos só para tornar mais desafiador.

[quote=ViniGodoy]Acho que está faltando algumas regras aqui:

  1. O desafio deveria ser verificável. Por exemplo, como vamos testar que o teclado funciona “em todo e qualquer aplicativo”?
  2. O desafio, como o nome diz, deve ser desafiador (sortear numeros é bastante elementar, mesmo pro fórum de java básico);
  3. Não deveria depender de APIs. Por exemplo, o que pede para gerar String e usar Regex: Isso nem sequer é desafiador, basta saber como a API funciona. Note que o enunciado nem da margem que use-se outra coisa, pois ele disse que quer passar uma regex qualquer. Poucos aqui implementariam o próprio parser de regex para tentar fazer algo mais eficiente (ele poderia ser tornado um desafio se apenas o problema da busque fosse fornecido, e tivéssemos que buscar por uma regex eficiente, ou montar um algoritmo próprio, sem regex);
  4. Deveria estimular que pessoas buscassem a melhor solução para um problema, não apenas uma solução. Se for uma solução, que seja algo que pareça simples, mas na hora do vamos ver, o povo não tenha nem idéia de como começar (como o caso que postei ali, ou do exemplo do Mark).
    [/quote]

Boa Vini… mas aí acho que entendi errado, pois a idéia era desafios que iniciantes pudessem entrar e pra um iniciante, certas coisas que já nos são “básicas”, são mega ultra complicadas…

Por isso a idéia de sairmos do POST e irmos ao Blog… Porque aí poderíamos colocar os níveis e os desafios que não fossem resolvidos, ficariam na fila, quando aparecesse a solução, o Monstro que conseguisse seria premiado de forma honrosa… heueheueheueheehu sei lá… mais idéias ???

Alberto, posso criar o Blog, mas será complicado pra mim, manter o mesmo frequentemente… Tens conta no Wordpress ?? posso colocar você e outros que queiram ajudar como “Moderadores do desafio” colunistas mesmo, mas aí precisamos criar regras precisas, pra não avacalhar, não perder o foco e não lotar nossa caixa de e-mail…

Podemos até criar um email chamado desafiojava@gmail.com, só pra recebermos as respostas… enfim… vamos fechar a idéia que eu crio o Blog…

Abs []

Por isso mesmo, acho que exercícios do tipo “lição de casa” não constituem desafios. A menos, claro, que seja um exercício que dê margem a várias otimizações, até que a solução ótima seja encontrada (um caso clássico, por exemplo, é calcular o mais rápido possível uma sequência de primos sem usar o crivo, ou tentar implementar a sequencia de fibonacci com o menor número possível de linhas de código).

Dá para pelo menos assumir que o respondente tem um nível básico de programação. O algoritmo anterior, das placas, é um bom exemplo de desafio. Na minha cabeça, já pensei em umas 3 ou 4 formas de resolvê-lo. Desde coisas bem pouco elegantes, mas rápidas, quanto a uma solução matemática, mas que talvez não seja tão otimizada.

[quote=ViniGodoy]Por isso mesmo, acho que exercícios do tipo “lição de casa” não constituem desafios. A menos, claro, que seja um exercício que dê margem a várias otimizações, até que a solução ótima seja encontrada (um caso clássico, por exemplo, é calcular o mais rápido possível uma sequência de primos sem usar o crivo, ou tentar implementar a sequencia de fibonacci com o menor número possível de linhas de código).

Dá para pelo menos assumir que o respondente tem um nível básico de programação. …[/quote]

Perfeito… agora entendi a colocação… concordo… senão dauqi a pouco, quem quiser ter sua lição de casa pronta, lança o seu desafio aqui, aguarda a primeira resposta e tem tudo de mão beijada… rsrs

Enfim… acho que fechando as regras, podemos começar em um Blog, detalhar níveis de usuários e de desafios…

Pensei em algo como:

Cada um que quiser responder aos desafios, deve especificar qual nível quer entrar e não pode responder as perguntas dos demais… sei lá… fica a dica…

Isso tá dando um Sistema já… heuehue

Abs[]

Só reforçando o que o Vini falou, deve ter também uma equipe de moderadores para julgar os desafios como já foi falado,
se realmente são bons desafios ou não, caso contrário, qualquer um pode postar sua “lição de casa” aqui e esperar a resposta.

Sou a favor de se ter um blog.

Ontem mesmo eu estava fazendo uma pequena lista de regras pra colocar aqui, mas aí percebi que não tenho tanto tempo e interesse para me dedicar a esse tópico diariamente. Tenho muito trabalho e estudo pela frente. Então uma delas era a de colocar os desafios com duração de 7 dias pra não ficar uma coisa muito corrida e mal feita. De qualquer forma vou repassar as ideias ao Vini e ver se ele concorda. Inclusive porque vamos precisar da ajuda dos moderadores e quem sabe role uns brindes ainda? hehehehe

Vou mexer os pauzinhos aqui e ver o que acontece. Não quero que aconteça com esse tópico o mesmo que aconteceu com aquele da Copa Java 2010, que teve uma porrada de respostas e interessados (19 páginas inclusive, até agora) e não saiu da teoria e simplesmente morreu depois de um tempo. Vamos meter a cara pessoal! Quem quer participar dá um grito aí… depois de falar com o Vini e o Adriano volto aqui pra ver o que decidimos (já que ninguém mais se adiantou pra ajudar com a proposta…)

Abraços.

Opa!!!

Eu tenho acompanhado a idéia de todos sobre esse tópico, inclusive a criação de um blog, para que os desafios sejam subdividos, por exemplo, em desafios com um nível de dificuldade baixo, pois bem, haveria a possibilidade de haver um subgrupo com desafios (questões) que caiam em provas de certificação? :wink:. Claro, caso a construção de um blog se concretize! Eu teria muito interesse e acredito que muitos outros que tenham a pretenção de tirar uma certificação!

Obrigado, rapaziada!
[]'s

Caras,

Desculpem se pareceu aproveitadora essa minha sugestão, não era minha intenção.
:smiley:

Paz!

[quote=getAdicted]Opa!!!

Eu tenho acompanhado a idéia de todos sobre esse tópico, inclusive a criação de um blog, para que os desafios sejam subdividos, por exemplo, em desafios com um nível de dificuldade baixo, pois bem, haveria a possibilidade de haver um subgrupo com desafios (questões) que caiam em provas de certificação? :wink:. Claro, caso a construção de um blog se concretize! Eu teria muito interesse e acredito que muitos outros que tenham a pretenção de tirar uma certificação!

Obrigado, rapaziada!
[]'s[/quote]

Claro que sim! Inclusive de Java Avançado! Java Web, etc. Querendo é só se juntar, combinar e colocar a mão na massa! Lancem suas ideias aí… :smiley: