-
Notifications
You must be signed in to change notification settings - Fork 265
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Solução do desafio 12 em python. (#1019)
* 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.
- Loading branch information
Showing
4 changed files
with
62 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
1501ac401545d469cad644ef132758d3b |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
0 | ||
1 | ||
12 | ||
14 | ||
16 | ||
127 | ||
128 | ||
4096 | ||
281454976710656 | ||
18446744073709551616 | ||
124500856567997039162129486884668395826812296992228481815365968142027128693051035028556205264925665657626403178505809645412871055386757088573364745122357043975109693592036962311310957686231579579642781020624154356286086897778238385399858317893098189532376278484559500702772623150362802638348099921178582788310878154859755967372286990903647058081576759032347615874174439483053568007465887053932454054557542271600400386609821070961296169053055271224915561091922407311082889683446299274961215323332902442010587545631362959076396586324429133634232055167395681288399516683383956617143869197417777155025314769088291480186439336051135732033936004087935401036990026744627678180016656996927023729705272326460079719945226356402013780463595287258622978986906959003423961532930270921061548338446592277866576070108835043557312878258394587753736138596887993298504695766978337288786524018635728722878890320915557899639681702363838688960875075203948108011233803260538752766069558125766188271033739566336965497637006595709051901086265523344299594053086414269586271143861797076055019661581144918539466895753979973903491128787296817908097735620084164364020702558529749642122149622728045843807062294064940349054684732167486361991196132267515707392 | ||
2314185985457235618750807518439255791483119493422352165787546559868302409470291988575173224557300164810106522966939501900008715682938541479296551906945268505494352328324962697410609146185837888624615394715751608361830174152668676685019554381084438256327940596950085415756850584051133638909936449121476155111848437638289434513051098058148766039925664598040553910799633187829038108494673696217223889194847860141141616167272532283281917137315913651635713035451870996621006105657734634768397695199754209427149410156216464802998980146041068468812087800447307275314433204031772094762825683433916947174313944195242784290715608624920851346534036216803377455400331531976914555740925572268183555577086251039249862581450558394624212793134260404983611153808582038013855988240023623859288161549661250430035972851088046256534797262027839281833388856556590408681122440101603282236776025617384765397482364985048946716514383069164198492238687724894380008654689066545045000046462078654842525755231974092149407623683192306000065828548331962708855323362755245047019609402663165433437326257876866296807248324323257704871990374670145427029442813542365005738236992444119908554245927169807751472052293057527879230557530783067631846347466225869034173948838659508877336299382631495863563272151952427776281308917845597700628071691023661487252765739046292860016677411879686640010212118278745955285294417841329620599337984110101243656456776913453090422463741362827898131829598115227203371863118321606346869377387503848146385587272243216384 | ||
60702011246939035062687380680906305837142319313464061388891140591593089538654121918830296653594623864246878483558330608438096796425782639375183382556074597215979408709784194672508413305216789409418100705664952663177612750510231572483130375153310339598506419035697574297728380258159928663455935627476012474222471027006872324831776009258180124697674047980941466699719946879732254830155916883808410253233743521813647055645507911355426225890745048148394319807823782001447859163577867785403819865804774267099818223711406345304313381560740976869916334378275052323146373096895131451880333513652825520707625534451879660923061724541177563964007723527941501080847411992425892654176631560130935566054287853139921832999739575043504907886228120383532500247233797674257525565499680389206269196240162155222100997689730319240285979944612467169767002825773294385516861479034914493741586905100660928039019764360954203652104488749412449891358785187346020029510226399683789949132645976073131594003194105035215945839472654844346337939567198901204475690701015901568512309041487764987297548864591049904456364235670421246498946015626760720374204265834234994709030823084740371789734652763905931230636080463771021481812101955450955920262905736116606247837842309906432 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() |