{"id":21301210,"url":"https://github.com/adrianomonteiroweb/python-algorithms-project","last_synced_at":"2025-03-15T18:24:32.005Z","repository":{"id":109834621,"uuid":"518109511","full_name":"adrianomonteiroweb/python-algorithms-project","owner":"adrianomonteiroweb","description":"Projeto em Python de algoritimos.","archived":false,"fork":false,"pushed_at":"2022-07-26T15:11:23.000Z","size":17,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-22T08:12:19.415Z","etag":null,"topics":["algorithms","algorithms-and-data-structures","complexity-algorithm","data-science","data-structures","python3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adrianomonteiroweb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-26T15:07:03.000Z","updated_at":"2022-07-26T15:12:46.000Z","dependencies_parsed_at":"2023-05-03T11:16:26.064Z","dependency_job_id":null,"html_url":"https://github.com/adrianomonteiroweb/python-algorithms-project","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrianomonteiroweb%2Fpython-algorithms-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrianomonteiroweb%2Fpython-algorithms-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrianomonteiroweb%2Fpython-algorithms-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrianomonteiroweb%2Fpython-algorithms-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adrianomonteiroweb","download_url":"https://codeload.github.com/adrianomonteiroweb/python-algorithms-project/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243771867,"owners_count":20345538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithms","algorithms-and-data-structures","complexity-algorithm","data-science","data-structures","python3"],"created_at":"2024-11-21T15:44:29.083Z","updated_at":"2025-03-15T18:24:31.841Z","avatar_url":"https://github.com/adrianomonteiroweb.png","language":"Python","readme":"# Projeto Algorithms\n\nProjeto em Python de algoritimos. 🚀\n\n# Sumário\n\n- [Boas vindas ao repositório do projeto de Algorithms!](#boas-vindas-ao-repositório-do-projeto-de-algorithms)\n- [Sumário](#sumário)\n- [Habilidades](#habilidades)\n  - [Entregáveis](#entregáveis)\n    - [⚠️ É importante que seus arquivos tenham exatamente estes nomes! ⚠️](#️-é-importante-que-seus-arquivos-tenham-exatamente-estes-nomes-️)\n  - [O que deverá ser desenvolvido](#o-que-deverá-ser-desenvolvido)\n  - [Desenvolvimento](#desenvolvimento)\n    - [Data de Entrega](#data-de-entrega)\n  - [Instruções para entregar seu projeto:](#instruções-para-entregar-seu-projeto)\n    - [ANTES DE COMEÇAR A DESENVOLVER:](#antes-de-começar-a-desenvolver)\n    - [Durante o desenvolvimento](#durante-o-desenvolvimento)\n  - [Linter](#linter)\n  - [Testes](#testes)\n  - [Requisitos do projeto](#requisitos-do-projeto)\n    - [1 - Número de estudantes estudando no mesmo horário (Algoritmo de busca)](#1---número-de-estudantes-estudando-no-mesmo-horário-algoritmo-de-busca)\n    - [2 - Palíndromos (Recursividade)](#2---palíndromos-recursividade)\n    - [3 - Anagramas (Algoritmo de ordenação)](#3---anagramas-algoritmo-de-ordenação)\n    - [Requisitos bônus:](#requisitos-bônus)\n      - [4 - Encontrando números repetidos (Algoritmo de busca)](#4---encontrando-números-repetidos-algoritmo-de-busca)\n      - [5 - Palíndromos (Iteratividade)](#5---palíndromos-iteratividade)\n    - [Depois de terminar o desenvolvimento](#depois-de-terminar-o-desenvolvimento)\n    - [Revisando um pull request](#revisando-um-pull-request)\n- [Avisos Finais](#avisos-finais)\n\n  `Requisitos obrigatórios:`\n\n  - [1 - Número de estudantes estudando no mesmo horário (Algoritmo de busca)](#1---número-de-estudantes-estudando-no-mesmo-horário-algoritmo-de-busca)\n  - [2 - Palíndromos (Recursividade)](#2---palíndromos-recursividade)\n  - [3 - Anagramas (Algoritmo de ordenação)](#3---anagramas-algoritmo-de-ordenação)\n\n  `Requisitos bônus:`\n\n  - [4 - Encontrando números repetidos (Algoritmo de busca)](#4---encontrando-números-repetidos-algoritmo-de-busca)\n  - [5 - Palíndromos (Iteratividade)](#5---palíndromos-iteratividade)\n\n- [Depois de terminar o desenvolvimento](#depois-de-terminar-o-desenvolvimento)\n- [Revisando um pull request](#revisando-um-pull-request)\n- [Avisos Finais](#avisos-finais)\n\n# Habilidades\n\n- Estrutura de dados\n\n- Complexidade de algoritimos\n\n- Capacidade de interpretação do problema;\n\n- Capacidade de resolução do problema, de forma otimizada;\n\n- Analisar corretamente a ordem de complexidade de um algoritmo.\n\n- Recursividade\n\n- Algoritmos de ordenação e algoritmos de busca\n\n---\n\n## Entregáveis\n\nPara entregar o seu projeto você deverá criar um _Pull Request_ neste repositório. Este _Pull Request_ deverá conter os arquivos `challenge_anagrams.py`, `challenge_find_the_duplicate.py`, `challenge_palindromes_iterative.py`, `challenge_palindromes_recursive.py` e `challenge_study_schedule.py`, que conterão seu código `Python`, respectivamente.\n\n### ⚠️ É importante que seus arquivos tenham exatamente estes nomes! ⚠️\n\nVocê pode adicionar outros arquivos se julgar necessário. Qualquer dúvida, procure a monitoria.\n\nLembre-se que você pode consultar nosso conteúdo sobre [Git \u0026 GitHub](https://course.betrybe.com/intro/git/) sempre que precisar!\n\n---\n\n## O que deverá ser desenvolvido\n\nPara fixar os conteúdos de algoritmos e estrutura de dados vistos até agora, você fará um projeto que tem como principal objetivo resolver problemas e otimizar algoritmos do tipo que aparecem em inúmeros processos de entrevista por _whiteboard_ e que vão acelerar muito a sua capacidade de resolver problemas!\n\nPessoas desenvolvedoras de software, além de serem muito boas em implementações, devem, também, ser boas resolvendo problemas e otimizando algoritmos. No projeto de hoje, vamos treinar, ainda mais, a sua capacidade de resolução de problemas e otimização de código, que envolve algumas habilidades:\n\n- Lógica;\n\n- Capacidade de interpretação do problema;\n\n- Capacidade de interpretação de um código legado;\n\n- Capacidade de resolução do problema, de forma otimizada;\n\n- Resolver o problemas/Otimizar algoritmos mesmo sob pressão.\n\nTendo essas habilidades descritas acima, junto com algumas outras, farão de você uma pessoa desenvolvedora que terá muita facilidade em diversas situações problemáticas do dia-a-dia.\n\n---\n\n## Desenvolvimento\n\nEste repositório é composto por uma pasta, `challenges`. Essa pasta contém todos os arquivos que você utilizará nesse projeto.\n\nCada arquivo `.py`, dentro da pasta `challenges`, representa um requisito. Ou seja, os arquivos não tem ligação uns com os outros. Logo, os problemas devem ser resolvidos de forma separada.\n\nEste repositório já contém um _template_ com a estrutura de diretórios e arquivos,. Veja abaixo:\n\n```md\n.\n├── challenges\n│ ├── challenge_anagrams.py\n│ ├── challenge_find_the_duplicate.py\n│ ├── challenge_palindromes_iterative.py\n│ ├── challenge_palindromes_recursive.py\n│ └── challenge_study_schedule.py\n├── README.md\n├── requirements.txt\n└── setup.cfg\n```\n\nApesar do projeto já possuir uma estrutura base, você quem deve implementar as funções. Novos arquivos podem ser criados conforme a necessidade.\n\nLembre-se de primeiro **criar e ativar o ambiente virtual**, além de também instalar as dependências do projeto. Isso pode ser feito através dos comandos:\n\n```bash\n$ python3 -m venv .venv\n\n$ source .venv/bin/activate\n\n$ python3 -m pip install -r dev-requirements.txt\n```\n\nO arquivo `requirements.txt` contém todos as dependências que serão utilizadas no projeto, ele está agindo como se fosse um `package.json` de um projeto `Node.js`.\n\nSe quiser saber mais sobre a instalação de dependências com `pip`, veja esse artigo: https://medium.com/python-pandemonium/better-python-dependency-and-package-management-b5d8ea29dff1\n\nPara verificar se você está seguindo o guia de estilo do Python corretamente, execute o comando:\n\n```bash\n$ python3 -m flake8\n```\n\nPara executar cada arquivo separadamente, execute o comando:\n\n```bash\n$ python3 nome_do_arquivo.py\n```\n\n---\n\n## Linter\n\nPara garantir a qualidade do código, vamos utilizar neste projeto o linter `Flake8`.\nAssim o código estará alinhado com as boas práticas de desenvolvimento, sendo mais legível\ne de fácil manutenção! Para rodá-lo localmente no projeto, execute o comandos abaixo:\n\n```bash\npython3 -m flake8\n```\n\n⚠️ **PULL REQUESTS COM ISSUES DE LINTER NÃO SERÃO AVALIADAS.\nATENTE-SE PARA RESOLVÊ-LAS ANTES DE FINALIZAR O DESENVOLVIMENTO!** ⚠️\n\n---\n\n## Testes\n\nCom as dependências já instaladas basta executar o comando:\n\n```bash\npython3 -m pytest\n```\n\nCom esse comando irá executar todos os testes do projeto.\n\nCaso o teste falhe e você queira ter um print melhor do erro basta executar o seguinte comando:\n\n```bash\npython3 -m pytest -s -vv\n```\n\nCaso precise executar apenas um arquivo de testes basta executar o comando:\n\n```bash\npython3 -m pytest tests/nomedoarquivo.py\n```\n\n## Requisitos do projeto\n\n#### 1 - Número de estudantes estudando no mesmo horário (Algoritmo de busca)\n\nVocê trabalha na maior empresa de educação do Brasil. Um certo dia, sua/seu `PM` quer saber qual horário tem a maior quantidade de pessoas acessando o conteúdo da plataforma ao mesmo tempo. Com esse dado em mãos, o/a PM saberá qual é o melhor horário para disponibilizar os materiais de estudo para ter o maior engajamento possível no sistema.\n\nToda vez que uma pessoa estudante abre o sistema, é cadastrado no banco de dados o horário de entrada. Da mesma forma funciona quando o estudante sai do sistema, é cadastrado no banco de dados o horário de saída. Esses dados estarão contidos em uma lista de tuplas (`permanence_period`) onde cada tupla representa o período de permanência de uma pessoa estudante com seu horário de entrada e de saída\n\nSeu trabalho é descobrir qual o melhor horário para disponibilizar os conteúdos. Para achar o horário, será utilizada `força bruta`. Ou seja, para achar o melhor horário, a função que você desenvolver será chamada várias vezes com valores diferentes para a variável `target_time`, e serão analisados os retornos da função.\n\n_Dica:_ Quando vou saber qual o melhor horário? Quando o contador retornado pela função for o maior.\n\n**Exemplo:**\n\n```md\n# Nos arrays temos 6 estudantes\n\n# estudante 1 2 3 4 5 6\n\npermanence_period = [(2, 2), (1, 2), (2, 3), (1, 5), (4, 5), (4, 5)]\n\ntarget_time = 5 # saída: 3, pois a quarta, a quinta e a sexta pessoa estudante ainda estavam estudando nesse horário.\ntarget_time = 4 # saída: 3, pois a quinta e a sexta pessoa estudante começaram a estudar nesse horário e a quarta ainda estava estudando.\ntarget_time = 3 # saída: 2, pois a terceira e a quarta pessoa estudante ainda estavam estudando nesse horário.\ntarget_time = 2 # saída: 4, pois a primeira, a segunda, a terceira e a quarta pessoa estudante estavam estudando nesse horário.\ntarget_time = 1 # saída: 2, pois a segunda e a quarta pessoa estudante estavam estudando nesse horário.\n\nPara esse exemplo, depois de rodar a função para todos esses `target_times`, julgamos que o melhor horário é o `2`, pois esse retornou `4`, já que 4 estudantes estavam presentes nesse horário!\n```\n\n- Este requisito será testado executando 10.000 vezes sobre uma mesma entrada. Tais execuções, **no avaliador**, devem acontecer integralmente em menos de 0.02 segundos. O tempo de execução do código na sua máquina pode variar em relação ao avaliador, então é importante levar somente ele em consideração.\n\n**Dica:** use um algoritmo de, no máximo, complexidade `O(n)`\n\n- Algoritmo deve utilizar a solução iterativa;\n\n- Caso o `target_time` passado seja nulo, o valor retornado pela função deve ser `None` (considere o horário 0 como um horário válido);\n\n- Código deve ser feito dentro do arquivo `challenges/challenge_study_schedule.py`.\n\n**O que será verificado:**\n\n- 1.1 - Retorne, para uma entrada específica, a quantidade de estudantes presentes\n\n- 1.2 - Retorne `None` se em `permanence_period` houver alguma entrada inválida\n\n- 1.3 - Retorne `None` se `target_time` recebe um valor vazio\n\n- 1.4 - A função poderá, em menos que 0.02s, ser executada 10.000 vezes para uma entrada pequena (tempo da execução do avaliador no Pull Request)\n\n#### 2 - Palíndromos (Recursividade)\n\nDado uma _string_, determine se ela é um palíndromo ou não. Escreva uma função que irá determinar se uma _string_ é um palíndromo ou não. Um palíndromo é uma _string_, uma palavra, em que não faz diferença se ela é lida da esquerda para a direita ou vice-versa, pois ela mantêm o mesmo sentido. Por exemplo, `\"ABCBA\"`.\n\n_Curiosidade:_ Existem frases palíndromas também, porém nesse exercício iremos fazer uma função que identifique apenas as palavras palíndromas.\n\n**Exemplos:**\n\n```md\nword = \"ANA\"\n\n# saída: True\n\nword = \"SOCOS\"\n\n# saída: True\n\nword = \"REVIVER\"\n\n# saída: True\n\nword = \"COXINHA\"\n\n# saída: False\n\nword = \"AGUA\"\n\n# saída: False\n```\n\n- O algoritmo deve ser feito utilizando a solução recursiva;\n\n- Não se preocupe com a analise da complexidade desse algoritmo;\n\n- Se for passado uma _string_ vazia, retorne `False`;\n\n- Código deve ser feito dentro do arquivo `challenges/challenge_palindromes_recursive.py`.\n\n**O que será verificado:**\n\n- 2.1 - Retorne `True` se a palavra passada por parâmetro for um palíndromo\n\n- 2.2 - Retorne `False` se a palavra passada por parâmetro não for um palíndromo\n\n- 2.3 - Retorne `False` se nenhuma palavra for passada por parâmetro\n\n#### 3 - Anagramas (Algoritmo de ordenação)\n\nFaça um algoritmo que consiga comparar duas _strings_ e identificar se uma é um anagrama da outra. Ou seja, sua função irá receber duas strings de parâmetro e o retorno da função será um _booleano_, `True` ou `False`.\n\nO algoritmo deve considerar letras _maiúsculas_ e _minúsculas_ como iguais durante a comparação das entradas, ou seja, ser _case insensitive_.\n\nMas o que é um anagrama? Vamos ver sua definição para entendermos melhor:\n\n\u003e \"Um anagrama é uma espécie de jogo de palavras criado com a reorganização das letras de uma palavra ou expressão para produzir outras palavras ou expressões, utilizando todas as letras originais exatamente uma vez.\"\n\n**Exemplo:**\n\n```md\nfirst_string = \"amor\"\nsecond_string = \"roma\"\n\n# saída: True\n\n# Explicação: Nesse caso o retorno da função é True, pois a palavra \"roma\" é um anagrama de \"amor\".\n\nfirst_string = \"pedra\"\nsecond_string = \"perda\"\n\n# saída: True\n\n# Explicação: Nesse caso o retorno também é True. Na palavra \"pedra\", trocamos o \"d\" de lugar com o \"r\" e formamos \"perda\", sendo assim um anagrama.\n\nfirst_string = \"pato\"\nsecond_string = \"tapo\"\n\n# saída: True\n\nfirst_string = \"Amor\"\nsecond_string = \"Roma\"\n\n# saída: True\n\n# Explicação: Nesse caso o retorno da função é True, pois a palavra \"Roma\" é um anagrama de \"Amor\" independente da letra \"R\" e \"A\" serem maiúsculas.\n\n# Agora vamos pra um exemplo onde não existe um anagrama\n\nfirst_string = \"coxinha\"\nsecond_string = \"empada\"\n\n# saída: False\n```\n\n- Este requisito será testado executando 10.000 vezes sobre uma mesma entrada. Tais execuções, **no avaliador**, devem acontecer integralmente em menos de 2 segundos. O tempo de execução do código na sua máquina pode variar em relação ao avaliador, então é importante levar somente ele em consideração.\n\n**Dica:** use um algoritmo de, no máximo, complexidade `O(n log n)`\n\n- Utilize qualquer algoritmo que quiser (_Selection sort_, _Insertion sort_, _Bubble sort_, _Merge sort_, _Quick sort_ ou _TimSort_), desde que atinja a complexidade `O(n log n)`. Ou seja, preste bastante atenção na escolha do algoritmo e na implementação do mesmo;\n\n- ⚠ _Você deverá implementar sua própria função de ordenação_, ou seja, o uso de funções prontas não é permitido. **Exemplos de funções não permitidas:** _*sort*, *sorted* e *Counter*._\n\n- A função retorna `True` caso uma _string_ **seja** um anagrama da outra independente se as letras são maiúsculas ou minúsculas;\n\n- A função retorna `False` caso uma _string_ **não seja** um anagrama da outra;\n\n- Código deve ser feito dentro do arquivo `challenges/challenge_anagrams.py`.\n\n**O que será verificado:**\n\n- 3.1 - Retorne `True` se as palavras passadas forem anagramas\n\n- 3.2 - Retorne `False` se as palavras passadas por parâmetro não forem anagramas\n\n- 3.3 - Retorne `False` se alguma das palavras passadas por parâmetro for uma string vazia\n\n- 3.4 - Execute a função, somando 10.000 execuções para uma entrada pequena, em menos que 8.2s (tempo da execução do avaliador no Pull Request)\n\n- 3.5 - Retorne `True` se as palavras passadas forem anagramas sem diferenciar maiúsculas e minúsculas\n\n### Requisitos bônus:\n\n#### 4 - Encontrando números repetidos (Algoritmo de busca)\n\nDada um _array_ de números inteiros contendo `n + 1` inteiros, chamado de `nums`, onde cada inteiro está no intervalo `[1, n]`.\n\nRetorne apenas um número duplicado em `nums`.\n\n**Exemplo:**\n\n```md\nnums = [1, 3, 4, 2, 2]\n\n# saída: 2\n\nnums = [3, 1, 3, 4, 2]\n\n# saída: 3\n\nnums = [1, 1]\n\n# saída: 1\n\nnums = [1, 1, 2]\n\n# saída: 1\n\nnums = [3, 1, 2, 4, 6, 5, 7, 7, 7, 8]\n\n# saída: 7\n```\n\n- Caso não passe nenhum valor ou uma string ou não houver números repetidos retorne `False`;\n\n- Este requisito será testado executando 10.000 vezes sobre uma mesma entrada. Tais execuções, **no avaliador**, devem acontecer integralmente em menos de 0.01 segundos. O tempo de execução do código na sua máquina pode variar em relação ao avaliador, então é importante levar somente ele em consideração.\n\n**Dica:** use um algoritmo de, no máximo, complexidade `O(n log n)`\n\n- O array montado deve:\n\n  - Ter apenas números inteiros positivos maiores do que 1;\n\n  - Ter apenas um único número repetindo duas ou mais vezes, todos os outros números devem aparecer apenas uma vez;\n\n  - Ter, no mínimo, dois números.\n\n- Código deve ser feito dentro do arquivo `challenge_find_the_duplicate.py`.\n\n_Dica:_ Ordene o array.\n\n**O que será verificado:**\n\n- 4.1 - Retorne o número repetivo se a função receber, como parâmetro, uma lista com números repetidos\n\n- 4.2 - Retorne `False` se a função não receber nenhum parâmetro\n\n- 4.3 - Retorne `False` se a função receber, como parâmetro, uma string\n\n- 4.4 - Retorne `False` se a função receber, como parâmetro, uma lista sem números repetidos\n\n- 4.5 - Retorne `False` se a função receber, como parâmetro, apenas um valor\n\n- 4.6 - Retorne `False` se a função receber, como parâmetro, um número negativo\n\n- 4.7 - Execute a função, somando 10.000 execuções para uma entrada pequena, em menos que 0.01s (tempo da execução do avaliador no Pull Request)\n\n#### 5 - Palíndromos (Iteratividade)\n\nResolva o mesmo problema, apresentado no [requisito dois](\u003c####-2---Palíndromos-(Recursividade)\u003e), porém dessa vez utilizando a solução iterativa.\n\n- Este requisito será testado executando 10.000 vezes sobre uma mesma entrada. Tais execuções, **no avaliador**, devem acontecer integralmente em menos de 0.005 segundos. O tempo de execução do código na sua máquina pode variar em relação ao avaliador, então é importante levar somente ele em consideração.\n\n**Dica:** use um algoritmo de, no máximo, complexidade `O(n)`\n\n- Algoritmo deve utilizar a solução iterativa;\n\n- Código deve ser feito dentro do arquivo `challenge_palindromes_iterative.py`.\n\n**O que será verificado:**\n\n- 5.1 - Retorne `True` se a palavra passada como parâmetro for um palíndromo, executando uma função iterativa\n\n- 5.2 - Retorne `True` se a palavra passada como parâmetro for um palíndromo, executando uma função iterativa\n\n- 5.3 - Retorne `False` se nenhuma palavra for passada como parâmetro, executando uma função iterativa\n\n- 5.4 - Execute a função, somando 10.000 execuções para uma entrada pequena, em menos que 0.005s (tempo da execução do avaliador no Pull Request)\n\n---\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadrianomonteiroweb%2Fpython-algorithms-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadrianomonteiroweb%2Fpython-algorithms-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadrianomonteiroweb%2Fpython-algorithms-project/lists"}