Skip to content

Feature de projetos #49

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions Extras/Projetos.md
Original file line number Diff line number Diff line change
@@ -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**
10 changes: 10 additions & 0 deletions Extras/projetos/MaquinaTuring.md
Original file line number Diff line number Diff line change
@@ -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)
96 changes: 96 additions & 0 deletions Extras/projetos/resolucao/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package Extras.projetos.resolucao;

import java.util.*;

public class Main {
public static void main(String[] args) {
Map<String, Transicao> 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<String> estadosFinais = new HashSet<>(Collections.singletonList("qf"));

MaquinaTuring maquina = new MaquinaTuring("0010_", tabelaTransicao, "q0", estadosFinais);
maquina.rodar();
}
}

class MaquinaTuring {
private List<Character> fita;
private int cabeca;
private String estadoAtual;
private Map<String, Transicao> tabelaTransicao;
private Set<String> estadosFinais;
private Set<String> historicoEstados = new HashSet<>();

public MaquinaTuring(String entrada, Map<String, Transicao> tabelaTransicao, String estadoInicial, Set<String> 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;
}
}
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down