Resoluções da etapa 3

Desafio 1 – Fórmula dos Anéis

Enunciado
Resolução
import java.util.Scanner;

public class FormulaFinal{
	
	public static int fat(int n){
		int total = 1;

		if(n==0)
			return 1;

		for(int i=1; i<=n; i++){
			total *= i;
		}
		return total;
	}


	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		sc.nextLine();
		for(int i=0; i<n; i++){
			int total = 1;
			String[] num = sc.nextLine().split(" ");
			int f = 0;
			for(String snum : num){
				f = Integer.parseInt(snum);
				total += fat(f);
			}
			System.out.println(f);
		}

	}
}

Desafio 2 – Batalha dos Campos de Pelennor

Enunciado
Resolução
import java.util.Scanner;

class Catapulta{
    public static void main(String[] args) {
        Scanner sc1 = new Scanner(System.in);
        int N = sc1.nextInt();
        int g = 10;

        for(int i = 0; i < N; i++){

            int d1 = sc1.nextInt();
            int d2 = sc1.nextInt();
            int vx = sc1.nextInt();
            int vy = sc1.nextInt();

            int t = vy/g;
            int distancia = 2 * t * vx;
            if(distancia >= d1 && distancia <= d2) System.out.println("YEEEET");
            else System.out.println("F on the chat");
        }
    }
}

Desafio 3 – Gandalf, o Saxofonista Épico

Enunciado
Resolução
import java.util.Scanner;

public class Gandalf{
	public static String[] desembaralha(String[] embaralhada){
		int tam = embaralhada.length;
		String[] original = new String[tam];

		for(int i = 0; i<tam/2; i++){
			original[i] = embaralhada[i*2];
			original[tam/2 + i] = embaralhada[i*2 + 1];
		}
		return original;
	}

	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		sc.nextLine();

		for(int i=0; i<n; i++){
			String[] embaralhada = sc.nextLine().split(" ");

			String[] original = desembaralha(embaralhada);

			for(String nota : original)
				System.out.print(nota + " ");

			System.out.println();

		}
		
	}

}

Desafio 4 – Exército de Saruman

Enunciado
Resolução
import java.util.*;

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

		Scanner input = new Scanner(System.in);

		int n = Integer.parseInt(input.nextLine());

		for(int i = 0; i < n; i++){

			String s = input.nextLine();
			
			// Os numeros estao em formato de String para os casos 012 ficar 210
			String[] nums = input.nextLine().split(" ");
			System.out.println(substituir(s, inverter(nums[0]), inverter(nums[1])));
		}
	}


	// Metodo para inverter a String (os numeros)
	public static String inverter(String n){

		String resp = "";

		// Vai pegando o char do final e colocando no comeco
		for(int i = 0; i < n.length(); i++)
			resp = n.charAt(i) + resp;

		return resp;
	}

	public static String substituir(String s, String n1, String n2){

		// Funcao de String que substitui uma sequencia de char por outra
		s = s.replace("(x)", n2);
		s = s.replace("(y)", n1);

		return s;
	}
}

Desafio 5 – Reis e Rainhas de Númenor

Enunciado
Resolução
// Atencao: Nao eh necessario utilizar objetos. So utilizei para ficar mais bacaninha 

import java.util.Scanner;

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

		Scanner input = new Scanner(System.in);

		String registro = input.nextLine();

		// Separando os itens do registro e criando um array de Governante
		String[] infos = registro.split("/n");
		Governante[] govs = new Governante[infos.length];

		// Criando e inserindo objetos do tipo Governante no array de Governante
		for(int i = 0; i < infos.length; i++){
			String[] anos = pegarAnos(infos[i]);
			govs[i] = new Governante(pegarNome(infos[i]), anos[0], anos[1], anos[2], anos[3]);
		}

		// Nessa parte ele recebe os comandos de busca ou encerramento
		while(true){

			String nome = input.nextLine();

			if(nome.equalsIgnoreCase("Fim"))
				System.exit(0);

			Governante encontrado = buscar(govs, nome);

			if(encontrado == null)
				System.out.println("Erro => " + nome + " nao encontrado(a)");
			
			else
				System.out.println(encontrado);
		}
	}

	public static String pegarNome(String s){

		// Acha as posicoes do '<' e '>'
		int ini = s.indexOf('<');
		int fim = s.indexOf('>');

		// Retorna a substring entre '<' e '>'
		return s.substring(ini + 1, fim);
	}

	public static String[] pegarAnos(String s){

		// Posicao no array: 0 = idade / 1 = inicio reinado / 2 = fim reinado / 3 = tempo reinando
		String[] anos = new String[4];

		// Acha a posicao da primeira aparicao do '+'
		int mais = s.indexOf('+');

		// Se o '+' fizer parte do nome, acha a posicao da primeira aparicao do '+' depois do '>'
		if(s.indexOf('<') < mais && mais < s.indexOf('>'))
			mais = s.indexOf('+', s.indexOf('>'));

		// Acha a primeira aparicao do '-' depois da posicao do '+'
		int primeiroTraco = s.indexOf('-', mais);

		// Vai pegando os numeros entre cada traco
		anos[0] = s.substring(mais+1, primeiroTraco);
		anos[1] = s.substring(primeiroTraco+1, primeiroTraco+5);
		anos[2] = s.substring(primeiroTraco+6, primeiroTraco+10);
		anos[3] = "" + (Integer.parseInt(anos[2]) - Integer.parseInt(anos[1]));

		return anos;
	}

	public static Governante buscar(Governante[] govs , String nome){

		// Busca sequencial izi de implementar
		for(Governante g : govs)
			if(g.nome.equalsIgnoreCase(nome))
				return g;

		return null;
	}
}

class Governante {

	String nome;
	String iniReino;
	String fimReino;
	String idade;
	String tempoReinando;

	// Construtor
	public Governante(String nome, String idade, String iniReino, String fimReino, String tempoReinando){

		this.nome = nome;
		this.idade = idade;
		this.iniReino = iniReino;
		this.fimReino = fimReino;
		this.tempoReinando = tempoReinando;
	}

	// Lembre-se que o toString eh chamado quando tento imprimir um objeto.
	// Entao o System.out.println(encontrado); ira imprimir tudo que esse metodo retorna
	public String toString(){

		return "Nome => " + this.nome + ", Tempo de Vida => " + this.idade + " anos, Reinado => " + 
		this.iniReino + "-" + this.fimReino + ", Tempo Reinando => " + this.tempoReinando + " anos";
	}
}

Desafio 6 – Portas de Durin

Enunciado
Resolução
// OBS: Essa nao eh a melhor solucao possivel. Porem, ela eh a que julguei que seria mais facil de entender com somente o conhecimento de IP

/* Para As Portas de Durin se abrirem, a frase falada deve conter mellon, porem tem alguns detalhes para se atentar:

	- Pode conter letras maiusculas e minusculas
	- Mellon pode ter varias variacoes na sua forma de escrita, podendo conter repeticao de letras e espacos. Exemplo:
		. meeeeeeeeeeeeeellllllooooooooooooooooooonnnnnnnnnn
		. mmm m m m m m  e e e e e e eeeeee l l l l llll oooo n n n
	- Porem nao pode faltar letra e nem conter outras letras no meio, isso seria invalido. Exemplo:
		. melon
		. meeeeeeeeeeeeeee l oooooooooon
		. m aaaaa ellon
	- Mellon nao pode estar grudado em outras palavras, ou seja, tem que ter um espaco antes de 'm' e um espaco depois de 'n' se nao forem o primeiro ou o ultimo char
		. marshmellon (Invalido)
		. melloncolia (Invalido)
		. carammmm m eeeellon (Valido)
		. mellonnnnn n nnn nnnnncia (Valido)
	 */

import java.util.Scanner;

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

		Scanner input = new Scanner(System.in);

		int casos = Integer.parseInt(input.nextLine());
		System.out.println(casos + " tentativas");

		for(int casoAtual = 0; casoAtual < casos; casoAtual++){
			
			String frase = input.nextLine();

			if(contemMellon(frase))
				System.out.println("As Portas de Durin se abrem");

			else
				System.out.println("Nada acontece");
		}
	}

	public static boolean contemMellon(String entrada){

		entrada = entrada.toLowerCase();
		char[] s = entrada.toCharArray();

		// Coloquei mellon num array de char, assim o programa funcionara
		// para qualquer palavra (teoricamente)
		char[] palavra = {'m', 'e', 'l', 'l', 'o', 'n'};

		// taIndo eh para verificacao
		// p eh para navegacao
		boolean taIndo = false;
		int p = 1;

		char anterior = ' ';
		char atual = palavra[0];
		char prox = palavra[1];

		for(int i = 0; i < s.length; i++){

			// Se o char na posicao i eh a primeira letra e antes tem um espaco
			// Comeca a analisar a palavra em si com o "taIndo"
			if(s[i] == palavra[0] && anterior == ' ')
				taIndo = true;

			// Se entramos no estado taIndo, esse else if checa se pode mudar de letra para verificar,
			// se chegou no final ou se teve uma interrupcao
			else if(taIndo){

				// Se o char na posicao i nao for a letra atual, nem a proxima letra e nem o espaco, reseta tudo
				if(s[i] != atual && s[i] != prox && s[i] != ' '){
					taIndo = false;
					atual = palavra[0];
					prox = palavra[1];
					p = 1;
					continue;
				}

				// Se chegarmos na ultima letra da palavra analisada e o essa letra ja eh o final da frase ou tem um espaco depois dessa letra
				// Retorna true, indicando que lemos toda a seuqeuncia de variacoes da palavra analisada
				if((anterior == palavra[palavra.length-1] && s[i] == ' ') || (i == (s.length - 1) && s[i] == palavra[palavra.length-1]))
					return true;

				// Se o char na posicao i for a proxima letra da palavra analisada ('e' eh a proxima letra de 'm')
				// Mude a letra atual (atual se torna a proxima) e a proxima da proxima se torna a proxima (gracas ao p)
				if(s[i] == prox){
					p++;
					if(p < palavra.length){
						atual = prox;
						prox = palavra[p];
					}
				}
			}

			// Atualiza o char anterior lido
			anterior = s[i];
		}

		return false;
	}
}

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *