Proposta: Desafios!

[quote=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)[/quote]

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:

[code]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]);
    }

}

}[/code]

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?

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.

[code]
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));
    }     
}     

} [/code]
acho que funciona dadu um numero primo ache todos os primos atte não testei.

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

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

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…

[code]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 );


}

}[/code]

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… :slight_smile:

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.

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;
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

[quote=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[/quote]vc resolveu primeiro, resolveu com uma variável auxiliar, mas resolveu primeiro. Posta um desafio aí.

[quote=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)[/quote]
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.

[quote=evefuji][quote=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[/quote]vc resolveu primeiro, resolveu com uma variável auxiliar, mas resolveu primeiro. Posta um desafio aí.[/quote]

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

Desafia 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:

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

A resposta que eu queria era:

[quote=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; [/quote]

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.

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

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

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

Abs []

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

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”

@evefuji
Posta o seu 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

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");
		}
	}

[quote=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!!![/quote]

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!

1 curtida