From 9de22a1c6ebb96c3b6dc547659e9fe83fecee588 Mon Sep 17 00:00:00 2001 From: Lucas Alves Date: Sun, 21 Jan 2024 23:14:30 -0300 Subject: [PATCH] =?UTF-8?q?Solu=C3=A7=C3=A3o=20do=20desafio=2012=20em=20py?= =?UTF-8?q?thon.=20(#1019)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Solução do desafio 12. * Correção do erro trailing spaces no pylint * lida com exceções caso o arquivo d12.txt não exista ou ocorra algum erro durante a leitura do arquivo. * arquivo de validação d12.txt * requisitos e instruções para executar o programa; detalhes sobre a lógica usada na implementação do programa. --- desafio-12/Lkzeu/python/.valid | 1 + desafio-12/Lkzeu/python/README.md | 16 +++++++++++++ desafio-12/Lkzeu/python/d12.txt | 13 ++++++++++ desafio-12/Lkzeu/python/d12_potencia.py | 32 +++++++++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 desafio-12/Lkzeu/python/.valid create mode 100644 desafio-12/Lkzeu/python/README.md create mode 100644 desafio-12/Lkzeu/python/d12.txt create mode 100644 desafio-12/Lkzeu/python/d12_potencia.py diff --git a/desafio-12/Lkzeu/python/.valid b/desafio-12/Lkzeu/python/.valid new file mode 100644 index 000000000..db15eafec --- /dev/null +++ b/desafio-12/Lkzeu/python/.valid @@ -0,0 +1 @@ +1501ac401545d469cad644ef132758d3b diff --git a/desafio-12/Lkzeu/python/README.md b/desafio-12/Lkzeu/python/README.md new file mode 100644 index 000000000..d2b62751e --- /dev/null +++ b/desafio-12/Lkzeu/python/README.md @@ -0,0 +1,16 @@ +## Requisitos +1. ter o python 3.3+ instalado; +2. ter o arquivo de validação d12.txt (que pode ser localizado na seção Validação da página do [desafio 12](https://osprogramadores.com/desafios/d12/)) na mesma pasta do programa d12_potencia.py; + +## Como executar? +para executar basta rodar o seguinte comando: +```python d12_potencia.py``` + +## Como funciona o programa? +O programa abre o arquivo d12.txt e lê todas as linhas, depois itera por cada linha e verifica se o número contido nela é par ou não. + - Caso o número não seja par (com exceção do número 1) ele irá mostrar na tela o número lido seguido da palavra *false* pois este número não é uma potência de 2. + + - Caso o número seja par ou 1 iremos contar qual o expoente *n* necessário para que $2^n$ seja igual ao número lido, para isso foi usado um operador binário que desloca 1 bit para direita do número (que é equivalente a dividir o número por 2). Esse processo é repetido até o número ser igual a 1 e o contador de expoentes é incrementado cada vez que o número é dividido por 2. + - Por exemplo, o número 16 é representado em binário por `0b10000` se o deslocarmos 4 bits para direita chegaremos em 1 que em binário é `0b00001` e $2^4=16$. + + - Contudo, nem todo número par é potência de 2 e pode ser escrito perfeitamente como $2^n$ devido a isso após contar os expoentes o programa irá verificar se $2^n$ é igual ao número lido na linha, caso seja irá repetir o número lido seguido da palavra *true* e o expoente *n* ao qual se deve elevar para obter o número lido. diff --git a/desafio-12/Lkzeu/python/d12.txt b/desafio-12/Lkzeu/python/d12.txt new file mode 100644 index 000000000..0b3d0e516 --- /dev/null +++ b/desafio-12/Lkzeu/python/d12.txt @@ -0,0 +1,13 @@ +0 +1 +12 +14 +16 +127 +128 +4096 +281454976710656 +18446744073709551616 +124500856567997039162129486884668395826812296992228481815365968142027128693051035028556205264925665657626403178505809645412871055386757088573364745122357043975109693592036962311310957686231579579642781020624154356286086897778238385399858317893098189532376278484559500702772623150362802638348099921178582788310878154859755967372286990903647058081576759032347615874174439483053568007465887053932454054557542271600400386609821070961296169053055271224915561091922407311082889683446299274961215323332902442010587545631362959076396586324429133634232055167395681288399516683383956617143869197417777155025314769088291480186439336051135732033936004087935401036990026744627678180016656996927023729705272326460079719945226356402013780463595287258622978986906959003423961532930270921061548338446592277866576070108835043557312878258394587753736138596887993298504695766978337288786524018635728722878890320915557899639681702363838688960875075203948108011233803260538752766069558125766188271033739566336965497637006595709051901086265523344299594053086414269586271143861797076055019661581144918539466895753979973903491128787296817908097735620084164364020702558529749642122149622728045843807062294064940349054684732167486361991196132267515707392 +2314185985457235618750807518439255791483119493422352165787546559868302409470291988575173224557300164810106522966939501900008715682938541479296551906945268505494352328324962697410609146185837888624615394715751608361830174152668676685019554381084438256327940596950085415756850584051133638909936449121476155111848437638289434513051098058148766039925664598040553910799633187829038108494673696217223889194847860141141616167272532283281917137315913651635713035451870996621006105657734634768397695199754209427149410156216464802998980146041068468812087800447307275314433204031772094762825683433916947174313944195242784290715608624920851346534036216803377455400331531976914555740925572268183555577086251039249862581450558394624212793134260404983611153808582038013855988240023623859288161549661250430035972851088046256534797262027839281833388856556590408681122440101603282236776025617384765397482364985048946716514383069164198492238687724894380008654689066545045000046462078654842525755231974092149407623683192306000065828548331962708855323362755245047019609402663165433437326257876866296807248324323257704871990374670145427029442813542365005738236992444119908554245927169807751472052293057527879230557530783067631846347466225869034173948838659508877336299382631495863563272151952427776281308917845597700628071691023661487252765739046292860016677411879686640010212118278745955285294417841329620599337984110101243656456776913453090422463741362827898131829598115227203371863118321606346869377387503848146385587272243216384 +60702011246939035062687380680906305837142319313464061388891140591593089538654121918830296653594623864246878483558330608438096796425782639375183382556074597215979408709784194672508413305216789409418100705664952663177612750510231572483130375153310339598506419035697574297728380258159928663455935627476012474222471027006872324831776009258180124697674047980941466699719946879732254830155916883808410253233743521813647055645507911355426225890745048148394319807823782001447859163577867785403819865804774267099818223711406345304313381560740976869916334378275052323146373096895131451880333513652825520707625534451879660923061724541177563964007723527941501080847411992425892654176631560130935566054287853139921832999739575043504907886228120383532500247233797674257525565499680389206269196240162155222100997689730319240285979944612467169767002825773294385516861479034914493741586905100660928039019764360954203652104488749412449891358785187346020029510226399683789949132645976073131594003194105035215945839472654844346337939567198901204475690701015901568512309041487764987297548864591049904456364235670421246498946015626760720374204265834234994709030823084740371789734652763905931230636080463771021481812101955450955920262905736116606247837842309906432 diff --git a/desafio-12/Lkzeu/python/d12_potencia.py b/desafio-12/Lkzeu/python/d12_potencia.py new file mode 100644 index 000000000..ade2fcf72 --- /dev/null +++ b/desafio-12/Lkzeu/python/d12_potencia.py @@ -0,0 +1,32 @@ +def main(): + try: + with open("d12.txt", "r") as f: + numbers = f.readlines() + for n in numbers: + number = int(n) + e_par = not number & 1 + + if e_par or number == 1: + expoentes = contar_exp(number) + if (1 << expoentes) == number: # ou if (2 ** expoentes) == number: + print(f"{number} true {expoentes}") + continue + print(f"{number} false") + + except FileNotFoundError: + print("d12.txt não encontrado!\n" + + "Verifique se o arquivo d12.txt está na mesma pasta do programa.\n" + + "você pode baixa-lo em: https://osprogramadores.com/desafios/d12/") + + except OSError as e: + print(f"{type(e).__name__}: {e}") + +def contar_exp(number: int) -> int: + counter = 0 + while number > 1: + counter += 1 + number >>= 1 + return counter + +if __name__ == "__main__": + main()