diff --git a/Extras/Projetos.md b/Extras/Projetos.md new file mode 100644 index 0000000..bfc33fc --- /dev/null +++ b/Extras/Projetos.md @@ -0,0 +1,19 @@ +# Projetos + +Depois de tanto estudo você deve estar pensando, *"certo, e agora?"*. +Aqui, vou escrever algumas ideias de projetos para que você possa aprimorar seus conhecimentos de forma prática (e adicionar alguns projetos a mais no seu Github ksks). + +## Menções +Já existe vários lugares onde oferecem tutoriais para a criação de projetos, mas a maioria é um guia passo a passo, aqui eu vou apenas estruturar requisitos que você deve atender no seu programa. **Projetos do Build-your-own-x costumam ser mais complicados, não recomendo você começar por eles**. + +* **Projetos no *build-your-own-x*** + * [Render 3D](http://blog.rogach.org/2015/08/how-to-create-your-own-simple-3d-render.html) + * [Blockchain](https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa) + * [Jogo 2D](https://www.youtube.com/watch?v=025QFeZfeyM) +* **Projetos no *[Roadmap.sh](https://roadmap.sh/java/projects)*** + +## Projetos por Java4Noobs +1. **Básicos** + * [Máquina de Turing](/Extras/projetos/MaquinaTuring.md) +2. **Intermediário** +3. **Avançado** diff --git a/Extras/projetos/MaquinaTuring.md b/Extras/projetos/MaquinaTuring.md new file mode 100644 index 0000000..ccd6168 --- /dev/null +++ b/Extras/projetos/MaquinaTuring.md @@ -0,0 +1,10 @@ +# Máquina de Turing + +> Uma Máquina de Turing é um modelo teórico de computação criado por Alan Turing em 1936. Ela foi projetada para formalizar o conceito de algoritmo e demonstrar os limites do que pode ser computado. + +## Objetivo +Crie uma máquina de Turing que faça a soma de `'Número em binário' + 1` + +## Resolução +**O propósito do tópico de projetos é para que você crie sua própria lógica e se desafie, então abra a resolução do projeto apenas se você tiver certeza.** +[Resolução da Máquina de Turing](/Extras/projetos/resolucao/Main.java) \ No newline at end of file diff --git a/Extras/projetos/resolucao/Main.java b/Extras/projetos/resolucao/Main.java new file mode 100644 index 0000000..4a6fd51 --- /dev/null +++ b/Extras/projetos/resolucao/Main.java @@ -0,0 +1,96 @@ +package Extras.projetos.resolucao; + +import java.util.*; + +public class Main { + public static void main(String[] args) { + Map tabelaTransicao = new HashMap<>(); + + tabelaTransicao.put("q0_1", new Transicao('1', 'D', "q0")); + tabelaTransicao.put("q0_0", new Transicao('0', 'D', "q0")); + tabelaTransicao.put("q0__", new Transicao('_', 'E', "q1")); + + tabelaTransicao.put("q1_0", new Transicao('1', 'E', "qf")); + tabelaTransicao.put("q1_1", new Transicao('0', 'E', "q1")); + tabelaTransicao.put("q1_", new Transicao('_', 'N', "qf")); + + Set estadosFinais = new HashSet<>(Collections.singletonList("qf")); + + MaquinaTuring maquina = new MaquinaTuring("0010_", tabelaTransicao, "q0", estadosFinais); + maquina.rodar(); + } +} + +class MaquinaTuring { + private List fita; + private int cabeca; + private String estadoAtual; + private Map tabelaTransicao; + private Set estadosFinais; + private Set historicoEstados = new HashSet<>(); + + public MaquinaTuring(String entrada, Map tabelaTransicao, String estadoInicial, Set estadosFinais) { + this.fita = new ArrayList<>(); + for (char c : entrada.toCharArray()) { + fita.add(c); + } + + this.cabeca = 0; + this.estadoAtual = estadoInicial; + this.tabelaTransicao = tabelaTransicao; + this.estadosFinais = estadosFinais; + } + + public void rodar() { + while (!estadosFinais.contains(estadoAtual)) { + char simboloAtual = (cabeca < fita.size()) ? fita.get(cabeca) : '_'; + String chave = estadoAtual + "_" + simboloAtual; + System.out.println("Processando chave: " + chave); + + if (historicoEstados.contains(chave + cabeca)) { + System.out.println("Loop detectado! Encerrando execução."); + break; + } + historicoEstados.add(chave + cabeca); + + Transicao transicao = tabelaTransicao.get(chave); + if (transicao == null) { + System.out.println("Nenhuma transição encontrada para: " + chave); + break; + } + + fita.set(cabeca, transicao.simboloParaEscrever); + + if (transicao.direcaoMover == 'D') { + cabeca++; + if (cabeca >= fita.size()) { + fita.add('_'); + } + } else if (transicao.direcaoMover == 'E') { + cabeca = Math.max(0, cabeca - 1); + } + + estadoAtual = transicao.proximoEstado; + mostrarFita(); + } + } + + private void mostrarFita() { + for (char c : fita) { + System.out.printf("%s", c); + } + System.out.println("\nEstado: " + estadoAtual + " | Cabeça: " + cabeca); + } +} + +class Transicao { + char simboloParaEscrever; + char direcaoMover; + String proximoEstado; + + public Transicao(char simboloParaEscrever, char direcaoMover, String proximoEstado) { + this.simboloParaEscrever = simboloParaEscrever; + this.direcaoMover = direcaoMover; + this.proximoEstado = proximoEstado; + } +} diff --git a/README.md b/README.md index 08b1e98..7e4783b 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,8 @@ 1. ✔️ [Boas Práticas](/Extras/BoasPraticas.md) 2. 📖 [Livros](/Extras/Livros.md) -3. 🛄 [Requisições](/Extras/Requisicoes.md) +3. [Projetos](/Extras/Projetos.md) +4. 🛄 [Requisições](/Extras/Requisicoes.md) ## Como Contribuir