Skip to content

Commit

Permalink
Solução do desafio 12 em python. (#1019)
Browse files Browse the repository at this point in the history
* 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
Lkzeu authored Jan 22, 2024
1 parent c7078e7 commit 9de22a1
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 0 deletions.
1 change: 1 addition & 0 deletions desafio-12/Lkzeu/python/.valid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1501ac401545d469cad644ef132758d3b
16 changes: 16 additions & 0 deletions desafio-12/Lkzeu/python/README.md
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.
13 changes: 13 additions & 0 deletions desafio-12/Lkzeu/python/d12.txt
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
32 changes: 32 additions & 0 deletions desafio-12/Lkzeu/python/d12_potencia.py
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()

0 comments on commit 9de22a1

Please sign in to comment.