Proposta: Desafios!

67 respostas
A

Olá,

sou estudante de Java (por conta própria) e estava pensando aqui que podemos propor desafios aqui no fórum para os outros participantes. Entrei em contato com o [color=blue]ViniGodoy[/color] e ele disse que não tem problema, exceto quando é aquele pessoal que vem aqui esperando que outros façam a lição de casa deles.

Então penso assim, podemos nos focar nos algoritmos. Não fazer desafios (nada impede também) que o indivíduo tenha que conhecer bibliotecas de ponta a ponta. E sim, usar apenas métodos e classes prontas quando for para exibição de informações. Como JOptionPane, System.out.println, JTextArea, etc. Até porque estamos na seção Java Básico. Então os iniciantes (como eu) tem que poder participar dos desafios…

Pensei inicialmente assim: alguém propõe um desafio e qualquer interessado vem e posta o código para resolução do problema. O prazo é de 24 horas. Depois de um dia, o proponente volta e avalia quem apresentou primeiro a resposta certa. Aquele que acertou primeiro, cria o próximo desafio. Se o proponente não voltar ao fórum em 24h, o pessoal que participou ou até mesmo algum moderador, decide quem acertou primeiro e vai lançar o próximo desafio. Simples assim.

Alguém tem alguma outra ideia? Podemos inclusive criar algum sistema de ranking, avaliando quem escreveu o código mais reutilizável (bônus) e assim por diante.

Quem mais se interessa? Tem alguma ideia? Opine.

:slight_smile:

67 Respostas

A

Gostei!

*assim seria legal algo que ajudasse os iniciantes naquelas provinhas chatas de algoritmo quando se procura estagio.

Desafio:

1- criar uma classe Carro que contem cor, placa, e velocidade maxima
2-criar uma classe estacionamento que possua varios carros
3-criar 7 carros
4-coloca-los no estacionamento
5-imprimir uma lista com todos os carros estacionados contendo(cor, placa e velocidade maxima)

D

Não estou querendo jogar um balde de água fria na sua proposta Alberto, mas esses tipos de desafios que você está propondo podem ser encontrados aos montes no link http://uva.onlinejudge.org/

Além de poder consultar os problemas, vc pode tbm enviar sua solução para ser verificada.

[]´s

A

Sim David, eu sei. Tem outros sites, como estes aqui:

http://www.coderanch.com/forums/f-71/Programming

http://codingbat.com/java

https://br.spoj.pl/problems/seletivas/all/lang=JAVA

http://projecteuler.net/

Ou para quem for bom de verdade e quiser ganhar alguma coisa programando, pode ir no [color=red]TopCoder[/color]:

Mas a ideia aqui é muito simples; duas, em realidade:

[b][color=darkblue]1) Aprendizado

  1. Interação[/color][/b]

O GUJ é uma comunidade enorme de programadores em Java de todos os níveis. Os únicos dois motivos de eu ter entrado aqui é porque sei que tem muita gente melhor do que eu, disposta a trocar informação, e também porque eu estou disposto a ajudar quem sabe menos do que eu. Uma comunidade que fala a mesma língua inclusive, nem todos são tão bons em inglês ainda para se aventurar em comunidades internacionais.

E depois, se alguém achar um desafio muito fácil ou muito básico, basta não participar. Participa quem quer, naquilo que quer. E vamos aprendendo juntos. Bastam alguns interessados e já podemos começar a nos divertir… Existem até livros de puzzles de programação e outros que podemos usar ou então criar os nossos próprios desafios… :wink:

V

Que tal esse mega desafio?

Crie um programa que imprima o próprio código fonte que foi usado para gera-lo.
Ele deve fazer isso sem usar o arquivo .java ou qualquer outro arquivo externo.

R

vc ja tem solução para isto? existe isto? se o programa for pequeno até quem sabe, mas é para qualquer um ?

J

ViniGodoy:
Que tal esse mega desafio?

Crie um programa que imprima o próprio código fonte que foi usado para gera-lo.
Ele deve fazer isso sem usar o arquivo .java ou qualquer outro arquivo externo.

Interessante o desafio Vini, mas não acha muito pra quem tá começando?

E mesmo que isso seja feito, o código deve ser fiel ao .java? Todos os decompilers que ví até hoje perdem os comentários ao transformar o .class em .java e o compilador faz uns “ajustes no código” na compilação.

V

Tem que ser fiel sim. E a solução não é fazendo um decompiler do .class.
Como eu falei, o programa não deve processar arquivos para gerar a saída, exceto os que ele mesmo gere.

E sim, é um mega-desafio. Eu mesmo não tenho nem noção de como fazer.

M

ViniGodoy:

E sim, é um mega-desafio. Eu mesmo não tenho nem noção de como fazer.

idem… eu até imaginaria como seria isso se pudesse encontrar o arquivo java e le-lo para imprimir (ai beleza). mas sem poder ler do próprio arquivo ai não tenho a menor idéia…

J

Tem que ser fiel sim. E a solução não é fazendo um decompiler do .class.
Como eu falei, o programa não deve processar arquivos para gerar a saída, exceto os que ele mesmo gere.

E sim, é um mega-desafio. Eu mesmo não tenho nem noção de como fazer.

Achei que vc estava falando sério…

Sem ler nenhum arquivo… nem mesmo o .class!. Seria realmente um prodígio fazer isso.

E

vini, vale uma coisa como essa? huahuah, ri muito com essa ideia “de gênio”(leia-se ridícula) que eu tive

public class MostraCodigo {

	public static String code = 
"public class MostraCodigo {\n"+

"	public static String code = \"{valor}\";\n"+
"	public static String retornarCodigo(int index){\n"+
"		\n"+
"		return (index<2)?code.replace(\"{valor}\", retornarCodigo(index++)):\"\";\n"+
"	}\n"+
"	\n"+
"	public static void main(String[] args) {\n"+
"		System.out.println(retornarCodigo(0));\n"+

"	}\n"+

"}\n";
	public static String retornarCodigo(int index){
		
		return (index<2)?code.replace("{valor}", retornarCodigo(1+index)):"";
	}
	
	public static void main(String[] args) {
		System.out.println(retornarCodigo(0));

	}

}

(obs, ainda não funciona, teria que mexer um pouco para funcionar corretamente, mas foi só a ideia aqui.

A

pensei também que poderias jogar isso num Blog extra GUJ e só anuncia aqui o novo desafio… a Galera posta as soluções e o(s) moderador(es) votam pela melhor ou a mais rápida, ou a mais elegante, sei lá…

Em um Blog extra fica mais fácil controlar o Ranking…

Abs []

V

Opa, vale sim. Se funcionar, tá valendo.

A

adriano_si:
pensei também que poderias jogar isso num Blog extra GUJ e só anuncia aqui o novo desafio… a Galera posta as soluções e o(s) moderador(es) votam pela melhor ou a mais rápida, ou a mais elegante, sei lá…

Em um Blog extra fica mais fácil controlar o Ranking…

Abs []

Grande ideia, Adriano!

Quanto mais gente se interessar, mais podemos desenvolver a proposta. Agora como saber se os desafios são “básicos” e ao mesmo tempo [color=blue]desafiantes[/color]? Por exemplo, tem coisa que é fácil demais, que são os exercícios geralmente passados nos livros, como a série de Fibonacci, números primos e encontre o maior e o menor nos valores de um array, etc. O que precisamos é de algo divertido, interessante e que possa ser feito por iniciantes… alguma ideia?

G

Pow mto fera esse desafio então, deve ser mto #$@%# de fazer isso, ainda mais sem ler os aquivos.

tipo eu posso dar CTRL + C, copiar o código e CTRL +V, colar num System out

M

Um desafio, dado qualquer vetor de numeros inteiros, inverte-lo sem usar APIs especificas.

Bonus para quem fazer isso sem variaveis auxiliares.

(Se não me engano eu mesmo já escrevi um código desse aqui no fórum)

L

Marky.Vasconcelos:
Um desafio, dado qualquer vetor de numeros inteiros, inverte-lo sem usar APIs especificas.

Bonus para quem fazer isso sem variaveis auxiliares.

(Se não me engano eu mesmo já escrevi um código desse aqui no fórum)

mas, precisa retornar esse vetor ? ou somente imprimilos na tela ?
porem, penssando bem, se for para retornalo invertido sem usar nem uma variavel auxiliar fica dificil.(ja me disseram que impossivel na computação não existe, hehehehe…)

mas enfim:

public class Desafio{
    public void inverterVetor(int vetor[]){
    	for(int i = vetor.length();i >=0;i--){
  	        System.out.print(vetor[i]+" ");
        }
    }
}

caso o codigo esteja correto, la vai o proximo desafio:

fazer um metodo que imprima na tela todos os numeros primos de 1 a 1000.

J

leofaka:
Marky.Vasconcelos:
Um desafio, dado qualquer vetor de numeros inteiros, inverte-lo sem usar APIs especificas.

Bonus para quem fazer isso sem variaveis auxiliares.

(Se não me engano eu mesmo já escrevi um código desse aqui no fórum)

mas, precisa retornar esse vetor ? ou somente imprimilos na tela ?
porem, penssando bem, se for para retornalo invertido sem usar nem uma variavel auxiliar fica dificil.(ja me disseram que impossivel na computação não existe, hehehehe…)

mas enfim:

public class Desafio{
    public void inverterVetor(int vetor[]){
    	for(int i = vetor.length();i >=0;i--){
  	        System.out.print(vetor[i]+" ");
        }
    }
}

caso o codigo esteja correto, la vai o proximo desafio:

fazer um metodo que imprima na tela todos os numeros primos de 1 a 1000.

Vou melhorar esse seu desafio…

Dado um número N, achar todos os números primos até N no menor tempo possível.

G

Já que só tem rato no tópico, rsrs.

dá uma olhada ai rapaziada, fazendo favor, tenho que implementar um exemplo pro professor pra ganhar uns pontos.

http://www.guj.com.br/posts/list/224200.java#1148358

Desculpa atropelar ai!!!

M

leofaka:
Marky.Vasconcelos:
Um desafio, dado qualquer vetor de numeros inteiros, inverte-lo sem usar APIs especificas.

Bonus para quem fazer isso sem variaveis auxiliares.

(Se não me engano eu mesmo já escrevi um código desse aqui no fórum)

mas, precisa retornar esse vetor ? ou somente imprimilos na tela ?
porem, penssando bem, se for para retornalo invertido sem usar nem uma variavel auxiliar fica dificil.(ja me disseram que impossivel na computação não existe, hehehehe…)

mas enfim:

public class Desafio{
    public void inverterVetor(int vetor[]){
    	for(int i = vetor.length();i >=0;i--){
  	        System.out.print(vetor[i]+" ");
        }
    }
}

caso o codigo esteja correto, la vai o proximo desafio:

fazer um metodo que imprima na tela todos os numeros primos de 1 a 1000.

Voce não tem nem que imprimir, voce só precisa inverter todas as posições do vetor.

E é possivel sem auxiliares sim.

A
Marky.Vasconcelos:
Um desafio, dado qualquer vetor de numeros inteiros, inverte-lo sem usar APIs especificas.

Bonus para quem fazer isso sem variaveis auxiliares.

(Se não me engano eu mesmo já escrevi um código desse aqui no fórum)

Inverter o array em si sem usar uma variável auxiliar, não sei mesmo como. Porque se tentasse inverter os valores de um array usando duas variáveis como índices num for, (a segunda variável já não seria considerada auxiliar?) chegando na metade do array, ele já copiaria os dados novos na outra metade do array, se é que isto é possível.

Já para imprimir somente, fazendo um pouco diferente do leofaka:

public class InverterArray {

    public static void main (String[] args) {

        int array[] = new int [50];
        
        for (int indice = array.length - 1; indice > -1; indice--)
        {
            System.out.println(array[indice]);
        }

    }

}

O problema de se fazer uma comparação <= ou = a array.length ele não compila. Isso é uma coisa que estou curioso pra saber, como que se faz para obter o último índice do array (uma vez que vc não sabe o tamanho dele), já que com o array.length vc não consegue?

A

Claro que se tu colocar um System.out.println(array.length); depois do for, no código acima, ele vai retornar o tamanho do array. Me refiro à uma comparação booleana dentro de uma estrutura de seleção ou de repetição, por exemplo.

L
import java.util.*;     
class Primo {     
    private BitSet bs;     
    int a = 15000;     
    public void findPrimes (int a) {     
        bs = new BitSet (n+1);     
        int sq = (int) Math.sqrt (n);     
                bs.set (0, n, true);   
        int x = 2;     
        while (x <= sq) {     
            for (int i = x + x; i <= n; i += x) {     
                bs.clear (i);     
            }     
              
            x = bs.nextSetBit (x + 1);     
        }     
    }     
    public boolean isPrime (int n) {     
        return bs.get (n);     
    }     
    public static void main(String[] args) {     
	    long inicio = System.currentTimeMillis(); 
        Primo s = new Primo();     
        s.findPrimes (775146822);     
        for (int i = 1; i <= 101; ++i) {     
            System.out.println (i + " is " + (s.isPrime(i) ? "prime" : "not prime"));     
		System.out.printf("Tempo gasto: %d ms%n",  (System.currentTimeMillis() - inicio));
        }     
    }     
}
acho que funciona dadu um numero primo ache todos os primos atte não testei.
M

Se ninguém postar a resposta correta amanhã eu coloco.

E realmente é preciso inverter o array, e o indice não é considerado variavel auxiliar.

A

for(int i=0; i<vector.length; i++) { if(i == (int)vector.length/2) break; int aux = vector[i]; vector[i] = vector[vector.length-(i+1)]; vector[vector.length-(i+1)] = aux; }

Não testei… quando chegar em casa de noite vou em busca do Bônus de tirar o aux… Isso se essa bagaça aí em cima funcionar…

A
import javax.swing.JOptionPane;


public class InverterArray
{
    public static void main( String[] args )
    {

        int x;

        x = Integer.parseInt( JOptionPane.showInputDialog( "Digite o índice do array em inteiros: " ) );

        int[] array1 = new int[x],
              array2 = new int[x];

        // vai preencher até array1[ x - 1 ]
        for ( int index = 0; index < array1.length; index++ )
        {
            array1[index] = index; //colocando números no array1
        }

        // vai decrescer o array1 ao mesmo tempo em que aumenta o índice do array2
        for ( int index1 = array1.length - 1, index2 = 0; index1 > 0; index1--, index2++ )
        {
            array2[index2] = array1[index1]; /* índice 0 do array2 vai ter o valor
            do último índice de array1 */
        }


        for ( int index = 0; index < array2.length; index++ )
        {
            // vai imprimir os valores invertidos do array1
            System.out.println( array2[index] );
        }


        // info final
        System.out.println( "O tamanho do array é de: " + array1.length );


    }


}

Usando 2 vetores, cada um com seu índice. A variável x serve apenas para entrar com o tamanho do índice. Pode-se também retirar o JOptionPane e a variável x, se der algum valor manualmente para os dois vetores.

E eu já sei a resposta para minha pergunta mesmo, acima. Claro! O método length, diz o tamanho do array, que sempre vai ser array[índice - 1] porque ele sempre começa a contagem em 0 e não em 1. Logo o último índice do vetor sempre vai ser [color=blue]array.length - 1[/color].

Eu tinha me confundido aqui antes... :)

Ah e pra não dizer que minha teoria não estava correta, testei o código das linhas 23 a 27 usando somente um vetor, assim:

for ( int index1 = array1.length - 1, index2 = 0; index1 > 0; index1--, index2++ )
        {
            array1[index2] = array1[index1]; /* índice 0 do array1 vai receber o valor
            do último índice de array1, porém o que acontece quando chegar na metade do array? */
        }

E depois imprimindo este array... se o valor digitado pelo usuário for 50, ele vai de 49 até 26 e depois sobe novamente até 49. Neste caso usando duas variáveis como índice e somente um array/vetor.

E

Bom, se é vetor de inteiros, podemos fazer isso:

int i = v.length;
        for(int cont = 0;cont<i/2;cont++){  
            v[cont] = v[cont]+ v[i-cont-1];
            v[i-cont-1] = v[cont] - v[i-cont-1];
            v[cont] = v[cont] - v[i-cont-1];
        }  
        return v;
A
for(int i=0; i<vector.length; i++) {
			if(i == (int)(vector.length/2)) break;
			vector[i] = vector[i] + vector[vector.length-(i+1)];
			vector[vector.length-(i+1)] = vector[i] - vector[vector.length-(i+1)];
			vector[i] -= vector[vector.length-(i+1)];
		}

Antes de chegar em casa… não sei se funfa…

[EDIT] - Ops… não tinha visto seu POST…

Acho que resolveu… lance o próximo desafio evefuj

E

adriano_si:
for(int i=0; i<vector.length; i++) { if(i == (int)(vector.length/2)) break; vector[i] = vector[i] + vector[vector.length-(i+1)]; vector[vector.length-(i+1)] = vector[i] - vector[vector.length-(i+1)]; vector[i] -= vector[vector.length-(i+1)]; }

Antes de chegar em casa… não sei se funfa…

[EDIT] - Ops… não tinha visto seu POST…

Acho que resolveu… lance o próximo desafio evefuj

vc resolveu primeiro, resolveu com uma variável auxiliar, mas resolveu primeiro. Posta um desafio aí.

T

Marky.Vasconcelos:
Um desafio, dado qualquer vetor de numeros inteiros, inverte-lo sem usar APIs especificas.

Bonus para quem fazer isso sem variaveis auxiliares.

(Se não me engano eu mesmo já escrevi um código desse aqui no fórum)


Dá pra fazer usando recursão, aí não escrevemos um laço. Porém, em Java ainda seria necessário uma variável auxiliar para trocar a posição dos elementos do array.

A

evefuji:
adriano_si:
for(int i=0; i<vector.length; i++) { if(i == (int)(vector.length/2)) break; vector[i] = vector[i] + vector[vector.length-(i+1)]; vector[vector.length-(i+1)] = vector[i] - vector[vector.length-(i+1)]; vector[i] -= vector[vector.length-(i+1)]; }

Antes de chegar em casa… não sei se funfa…

[EDIT] - Ops… não tinha visto seu POST…

Acho que resolveu… lance o próximo desafio evefuj

vc resolveu primeiro, resolveu com uma variável auxiliar, mas resolveu primeiro. Posta um desafio aí.

Pow, sei lá… embora tenha sido primeiro, acho o desafio real era sem a var auxiliar…

Desafia aí…

A

Já que foi o Marky que lançou o desafio deixem ele vir dizer (até amanhã, no máximo) quem de vcs ele acha que acertou primeiro, e aí lança o próximo. :slight_smile:

M

Adriano_si foi o primeiro a resolver, mas usou variaveis auxiliares, mesmo assim parabéns.

A resposta que eu queria era:

evefuji:
Bom, se é vetor de inteiros, podemos fazer isso:

int i = v.length; for(int cont = 0;cont<i/2;cont++){ v[cont] = v[cont]+ v[i-cont-1]; v[i-cont-1] = v[cont] - v[i-cont-1]; v[cont] = v[cont] - v[i-cont-1]; } return v;

Congratz!

A sacada sem auxiliar é o:

v[cont] = v[cont]+ v[i-cont-1];
            v[i-cont-1] = v[cont] - v[i-cont-1];
            v[cont] = v[cont] - v[i-cont-1];

Bem, o desafio era inverter, o bonus era sem auxiliares, agora não sei quem realmente venceu, pra mim, foi os dois.

Postem o próximo desafio.

Depois eu vou ter outro que vai ser mais avançado.

A

Adriano e evefuji, lancem os próximos desafios… :slight_smile:

A

Acho básico, mas tá valendo pra galera iniciante:

Vamos criar o Blog pra postar os desafios… Fica mais fácil organizar…

Abs []

G

Está em C, fiquei com preguiça de passar pro JAVA, sexta é foda:

/* rand example: guess the number */  
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
  
int main ()  
{  
  int iSecret, iGuess, cont = 1;  
  
  /* initialize random seed: */  
  srand ( time(NULL) );  
  
  /* generate secret number: */  
  iSecret = rand() % 10 + 1;  
  
  do {  
    printf ("Guess the number (1 to 10): ");  
    scanf ("%d",&iGuess);  
    if(cont == 3){
            printf("Osso!\n");
            system("pause");
            return 0;
    }
    if (iSecret<iGuess) puts ("The secret number is lower");  
    else if (iSecret>iGuess) puts ("The secret number is higher");
    cont ++;     
  } while (iSecret!=iGuess);  
  
  puts ("Congratulations!");  
  system("pause");  
  return 0;  
}

Bom feriado a todos!

[]'s

E

mal ter ficado um tempo off, hehehe, estudando spring.

juro que entendi que é “sortear um número de 1 a 10, e retornar o número 3”

L

@evefuji
Posta o seu desafio. ^^

A

Implemente um programa que sorteia um número de 1 a 10 e dá ao usuário 3

tentativas de acertá-lo. A cada tentativa errada, o programa informa se o número a adivinhar está abaixo ou acima

Desenvolvi esse codigo um tanto porco, no meu ver, mas foi em meu tempo record… entonce… ta ai.

package br.com.desafio;

/*
 Implemente um programa que sorteia um número de 1 a 10 e dá ao usuário 3

 tentativas de acertá-lo. A cada tentativa errada, o programa informa se o número a adivinhar está abaixo ou acima 

 */
import java.util.Random;
import java.util.Scanner;

public class Sorteia {
	int segredo;
	Random ramdom = new Random();

	public Sorteia() {
		segredo = 1 + ramdom.nextInt(10);
	}

	public void adivinha() {
		for (int i = 0; i < 3; i++) {
			Scanner input = new Scanner(System.in);
			System.out.println("\nAdvinhe Qual numero o progama gerou");
			int firstTry = input.nextInt();
			if (firstTry == segredo) {
				System.out.println("Parabens, Voce Acertou");
				break;
			} else {
				guessNumber(firstTry);
				System.out.println("\nTente Novamente");
			}

		}
	}

	public void guessNumber(int x) {
		if (x < segredo) {
			System.out.println("O numero esta Acima");
		} else if (x > segredo) {
			System.out.println("O numero esta Abaixo");
		}
	}
V

getAdicted:
Já que só tem rato no tópico, rsrs.

dá uma olhada ai rapaziada, fazendo favor, tenho que implementar um exemplo pro professor pra ganhar uns pontos.

http://www.guj.com.br/posts/list/224200.java#1148358

Desculpa atropelar ai!!!

getAdicted, já é o segundo tópico que você tenta “pegar carona” que eu vejo.
Por favor, trata o seu problema no seu tópico, e pare de criar links para ele no tópico dos outros!

V

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

G

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

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?

J

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

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…

E

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)

E
evefuji:
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.
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:
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
	}
	
}
P

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]

E

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.

V

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).
E

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.

D

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.

M

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

A

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).

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 [email removido], só pra recebermos as respostas… enfim… vamos fechar a idéia que eu crio o Blog…

Abs []

V

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.

A

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. …

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[]

J

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.

A

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.

G

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

G

Caras,

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

Paz!

A

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

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:

L

Querem um desafio??? Façam um algoritmo utilizando IA que reconheça imagens… que reconheça uma pera no meio das maçãs, e vice versa… que reconheça a face de uma pessoa em especial em um determinado senário… faça este sistema aprender… Se fizerem isso…vcs ficam ricos

A

Seu comentário foi tão sem propósito… Você leu do que se trata o desafio leopoldof ???

Quanto a questão de incluir desafios para a certificação, não sei, acho que vamos fugir ao foco… se não focarmos em algo logo agora pra começar, vai ser que nem o tópico da Copa que você teve medo… inchou de tanta idéia e nunca saiu do papel…

Foco galera… Foco… senão dauqi a pouco teremos que fazer um sistema pra gerenciar os desafios…

A

adriano_si:
Seu comentário foi tão sem propósito… Você leu do que se trata o desafio leopoldof ???

Quanto a questão de incluir desafios para a certificação, não sei, acho que vamos fugir ao foco… se não focarmos em algo logo agora pra começar, vai ser que nem o tópico da Copa que você teve medo… inchou de tanta idéia e nunca saiu do papel…

Foco galera… Foco… senão dauqi a pouco teremos que fazer um sistema pra gerenciar os desafios…

Te enviei mp, Adriano. Sim… sobre o Java Avançado e etc que citei, me referia a outros desafios nos devidos subfóruns e não tudo aqui. Aqui é para nós iniciantes… Mas nada impede que outros usuários lancem outros tópicos de desafios em outros subfóruns.

Inclusive cada subfórum poderia ter o seu específico. É só se organizarem e ver quem vai fazer isso… :slight_smile:

J

Olha leopoldo, acho dificil ficar rico simplesmente por desenvolver isso.

Existem diversos livros inclusive que ensinam a desenvolver algoritmos como esse.

São os chamados algoritmos de Data Mining. Muitos deles baseados em métodos matriciais.

Para reconhecimento facial existem técnicas como Tensor SDV que obtem um resultado muito bom. Vários sites como o Orkut e Facebook inclusive já utilizam técnicas como essas para identificar rostos em fotografias. Mas ele pode ser extendido para identificar rostos de pessoas em especial sim.

Mas acho que não é essa a idéia do tópico como nosso amigo disse.

A

Outra ideia…

podemos criar batalhas de Robocode aqui. O que acham? Cada participante desenvolve um mini-tanque por um período, tipo 1 mês e depois metemos bronca aqui! :slight_smile:

J

Explica melhor como que funciona isso Alberto! Achei interessante!

L

Pô, seria legal os moderadores postarem os desafios eles tem mais experiência e já não precisam fazer tarefa de casa.

eee alguém dá uma luz para o desafio das placas? :oops:

V

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

Resolvido aqui: http://www.guj.com.br/posts/list/225210.java#1153833

Criado 10 de novembro de 2010
Ultima resposta 21 de nov. de 2010
Respostas 67
Participantes 22