Projetos para experimentar linguagens
Published: 2024-04-27 23:03:39

No momento que estou escrevendo isso ainda sou um estudante da 42, e como uma escola que te ensina a programar, a 42 tem uma variedade de projetos, grande parte deles pode ser utilizado para experimentar as capacidades de uma linguagem de programação, por motivos óbvios **eu não vou descrever o projeto inteiro**, só o esperado, de resto:

> "Por Thor, por Odin, use seu cérebro." -PDF 2013-2024

# FT_Philosophers 🍴

Esse é bem simples, simplesmente resolva [o problema do jantar dos filósofos](https://www.wikiwand.com/en/Dining_philosophers_problem), seu programa deve receber argumentos na chamada do programa:

- Número de filósofos;
- Tempo de vida em milissegundos;
- Duração de um jantar em milissegundos;
- Duração do sono deles em milissegundos;
- Opcionalmente o número de jantares de cada um;

O programa deve ter uma [thread](https://www.wikiwand.com/en/Thread_(computing)) para cada filósofo e deve trabalhar com [mutex](https://www.wikiwand.com/en/Lock_(computer_science)) (ou qualquer coisa similar na sua linguagem).
Outra opção é fazer o projeto com [forks](https://www.wikiwand.com/en/Fork_(system_call)) e [semáforos](https://www.wikiwand.com/en/Semaphore_(programming)).

# FT_Minitalk 👂🗨️

Fazer uma simples comunicação entre 2 programas, um cliente que recebe um [PID](https://www.wikiwand.com/en/Process_identifier) e uma [string](https://www.wikiwand.com/en/String_(computer_science)) e deve enviar o texto dessa string para o servidor via [sinais](https://www.wikiwand.com/en/Signal_(computing)) (SIGUSR1 e SIGUSR2 de preferência), e o servidor vai exibir seu PID, receber uma string por [bits](https://www.wikiwand.com/en/Bit) e imprimir essa string.

# FT_Pushswap 🔄️⤴️⤵️

Um programa baseado na [Torre de Hanói](https://www.wikiwand.com/en/Tower_of_Hanoi), onde você deve ordenar uma sequência numérica usando 2 [stacks](https://www.wikiwand.com/en/Stack_(abstract_data_type)), como você só tem 2 "torres" ao invés de 3, você tem mais liberdade com os movimentos para a stack A e B, desde empurrar um número do topo da stack A para o topo da B e vice-versa, rotacionar eles 1 posição para baixo, rotacionar eles 1 posição para cima, até trocar os 2 números do topo da stack A ou B. A regra de números grandes não poderem ficar em cima de números pequenos é descartada por motivos óbvios.

# FT_Minishell 🔥

Simplesmente recrie o [bash](https://www.wikiwand.com/en/Bash_(Unix_shell))... Não ele inteiro, mas sim:

- executar comandos baseados no `PATH`, caminho relativo e absoluto;
- expandir variáveis de ambiente;
- refazer as [builtins](https://www.wikiwand.com/en/Shell_builtin) `env`, `export`, `cd`, `echo`, `pwd`, `unset` e `exit`;
- lidar com `Ctrl+D`, `Ctrl+\` e `Ctrl+C`;
- redirecionamentos e [heredoc](https://www.wikiwand.com/en/Here_document);
- Histórico de comandos;

Para facilitar um pouco, você pode usar uma biblioteca de [readline](https://www.wikiwand.com/en/GNU_Readline), aspas abertas podem ser um erro, a única opção de builtin que precisa ser feito é o `-n` do `echo` e o heredoc não precisa ser parte do histórico... De resto, boa sorte (você vai precisar).

# FT_Solong 🕹️

Um simples jogo 2D onde o jogador deve coletar itens e depois ir até a saída. O programa deve ler o mapa a partir de um arquivo onde caracteres representam:

- `1` parede;
- `0` espaço vazio;
- `c` coletável;
- `e` saída;
- `p` posição inicial do personagem;

# FT_Fdf 🪢

A simples renderização de um [modelo de arame](https://www.wikiwand.com/en/Wire-frame_model), o programa deve ler de um arquivo a configuração de cada ponto e vértice desse modelo, onde a posição horizontal e vertical no arquivo é igual à posição x e y e o valor de cada posição representa a altura no eixo z.

# FT_Fractol ❄️

A renderização de [fractais](https://www.wikiwand.com/en/Fractal) sendo só obrigatório o [conjunto Mandelbrot](https://www.wikiwand.com/en/Mandelbrot_set) e o [conjunto Julia](https://www.wikiwand.com/en/Julia_set).

# FT_Cub3d 🎮

Similar ao solong, porém a renderização é feita com [raycasting](https://www.wikiwand.com/en/Ray_casting), não há coletáveis nem saída e a posição inicial agora é representada por `N`, `S`, `W` ou `E`.

# FT_Minirt 🩻

Renderização de objetos com luz e sombra com [raytracing](https://www.wikiwand.com/en/Ray_tracing_(graphics)), os objetos são apenas uma esfera, um plano e um cilindro.
Um arquivo possui informações sobre cada objeto da cena, a posição da câmera, a rotação de cada objeto, a origem da luz, a força da luz ambiente e a direção da câmera.

# FT_Irc 💬🗨️

Criação de um servidor que recebe e responde requisições do protocolo [IRC](https://www.wikiwand.com/en/IRC).

# FT_Webserv 🛜

Criação de um servidor que recebe e responde requisições do protocolo [HTTP](https://www.wikiwand.com/en/HTTP).

# IN CONCLUSION

Existe mais um projeto que pode ser interessante, mas vou optar por ocultá-lo.
Escolhi os projetos anteriores por explorarem conceitos como threads, processos, [bibliotecas gráficas](https://www.wikiwand.com/en/Graphics_library), [parsing](https://www.wikiwand.com/en/Parsing) e [sockets](https://www.wikiwand.com/en/Network_socket), creio que esses são conceitos que toda linguagem deve permitir e logo te fazem explorar todas as capacidades de uma linguagem... Ou a falta delas.