Soma de 100!

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

Soma de 100!

Mensagempor Bruno Oliveira em Sexta Jan 30, 2009 10:27 pm

Como sei que há aqui no Quark! muitos apreciadores de Python, vou deixar aqui um problema para quem está a começar a aprender Python:

Se considerarmos o número 8!, vemos que a soma dos seus dígitos é:

8!=40320\,\rightarrow\,4+0+3+2+0=9

Escrevam um programa em python que calcule a soma dos dígitos de 100! :)
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: Soma de 100!

Mensagempor jap em Sexta Jan 30, 2009 10:54 pm

Bruno Oliveira Escreveu:Como sei que há aqui no Quark! muitos apreciadores de Python, vou deixar aqui um problema para quem está a começar a aprender Python:

Se considerarmos o número 8!, vemos que a soma dos seus dígitos é:

8!=40320\,\rightarrow\,4+0+3+2+0=9

Escrevam um programa em python que calcule a soma dos dígitos de 100! :)


Trivial, em Python! :lol:

Basta 1 linha de código, bem pequenina! :wink:

Desafio: quem é o primeiro quarkiano a escrever aqui um programa de 1 só linha que faço o que o Bruno pediu?
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Soma de 100!

Mensagempor Ivo_Timóteo em Sexta Jan 30, 2009 11:24 pm

Código: Seleccionar Todos
print "648"


:D

Project Euler - Problem 20 :wink:
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Re: Soma de 100!

Mensagempor jap em Sexta Jan 30, 2009 11:38 pm

Quero um programa a sério, não uma linha que imprima o resultado do problema! :wink:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Soma de 100!

Mensagempor Ivo_Timóteo em Sexta Jan 30, 2009 11:45 pm

Agora mais a sério:

Código: Seleccionar Todos
reduce(lambda x, y: x + y, [int(i) for i in str(reduce(lambda x, y: x * y, range(1, 101)))])


Agora explico o código:

O que reduce(fun, ite) faz é aplicar a função fun aos dois primeiros elementos de ite sucessivamente até ite ficar reduzido a um elemento.

Por exemplo,
Código: Seleccionar Todos
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
calcula ((((1+2)+3)+4)+5)

O lambda permite definir uma função "local" que, dado que queremos uma linha, é necessário.

Assim,
Código: Seleccionar Todos
reduce(lambda x, y: x * y, range(1, 101))
vai aplicar a função x*y a todos os elementos da lista [1, 2, ..., 99, 100], ou seja, calcular o factorial de 100.


Depois criámos uma lista de todos os algarismos:
Código: Seleccionar Todos
[int(i) for i in str(reduce(lambda x, y: x * y, range(1, 101)))]
Os [] indicam que vai ficar sobre a forma de uma lista, o str() transforma o número (100!) em string e o int(i) transforma em inteiro todos os caracteres resultantes de percorrer a string.
Código: Seleccionar Todos
for i in str(...)
(Eu sei que esta parte não foi muito bonita :lol: )


Finalmente, somámos todos os digitos :)
Código: Seleccionar Todos
reduce(lambda x, y: x + y, [int(i) for i in str(reduce(lambda x, y: x * y, range(1, 101)))])
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Re: Soma de 100!

Mensagempor jap em Sexta Jan 30, 2009 11:51 pm

:lol: :lol:

Que linha tão *gigante* :D

Eu faço muito mais simples... :mock:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Soma de 100!

Mensagempor Ivo_Timóteo em Sexta Jan 30, 2009 11:54 pm

Acredito! Mas eu não gosto nada de one-liners... Quando vi que era mais um one-liner apeteceu-me sair logo do tópico :XD

Mas depois lá fiz...
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Re: Soma de 100!

Mensagempor jap em Sábado Jan 31, 2009 12:00 am

Ivo_Timóteo Escreveu:Acredito! Mas eu não gosto nada de one-liners... Quando vi que era mais um one-liner apeteceu-me sair logo do tópico :XD

Mas depois lá fiz...


Eu também não gosto particularmente, mas é um desafio. :wink:

Aliás os oneliners são altamente não pitónicos. Lembrem-se do Zen do Python:

explicit is better than implicit

:wink:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Soma de 100!

Mensagempor RicardoCampos em Sábado Jan 31, 2009 12:46 am

Exactamente.

Mas qual é a forma mais simples de calcular a soma dos algarismos de um número?
\emph{Ricardo Campos}\in \delta \bigcap q\overline{q}
O Matemático-Físico de 2008
Avatar do utilizador
RicardoCampos
top-Quark!
top-Quark!
 
Mensagens: 1280
Registado: Sexta Jun 01, 2007 3:49 pm
Localização: Figueira da Foz/Coimbra/DMUC/DFUC, Paris... E agora Zurique!

Re: Soma de 100!

Mensagempor jap em Sábado Jan 31, 2009 1:12 am

RicardoCampos Escreveu:Exactamente.

Mas qual é a forma mais simples de calcular a soma dos algarismos de um número?


Código: Seleccionar Todos
sum(map(int,str(n)))


ou, se o número for pequeno (not a L-number)


Código: Seleccionar Todos
sum(map(int,`n`))
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Soma de 100!

Mensagempor Bruno Oliveira em Sábado Jan 31, 2009 11:00 am

O prof. podia depois explicar o que faz a função map? :roll:

Agora estou curioso :) e percebi bem a função lambda e a reduce, obrigado ivo :wink:
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: Soma de 100!

Mensagempor Bruno Oliveira em Sábado Jan 31, 2009 11:03 am

Eu por acaso não tinha feito o meu programa numa única linha (também não sou grande apreciador, pois acho que o código perde legibilidade), mas cá vai o meu código:

Código: Seleccionar Todos
x=factorial(100);s=0
for n in range(1,len(str(x))):
    s=s+int(str(x)[n-1:n])
print s

e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: Soma de 100!

Mensagempor Tharis em Sábado Jan 31, 2009 1:11 pm

Bruno Oliveira Escreveu:O prof. podia depois explicar o que faz a função map? :roll:

Agora estou curioso :) e percebi bem a função lambda e a reduce, obrigado ivo :wink:


A função map recebe uma função e um objecto iterável (lista, tupla, string ...). Depois aplica a função passada a cada elemento do objecto iterável e retorna uma lista com cada retorno da função passada como argumento.

Código: Seleccionar Todos
>>> map( lambda x: x**2 , range(10) )
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


Aqui passamos uma função lambda que retorna o quadrado de um número e passamos uma lista com todos os números inteiros de 0 até 9 inclusive. Recebemos uma lista com o quadrado desses números. :)

CUmps
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Soma de 100!

Mensagempor jap em Sábado Jan 31, 2009 4:19 pm

É como o Tharys explicou.

A instrução

Código: Seleccionar Todos
map(int,str(n))


aplica a função int a todos os elementos (caracteres) da string que representa o número n e coloca o resultado (o digito corresponde a cada caracter) numa lista.

Por exemplo

Código: Seleccionar Todos
map(int,str(123))


dá como resultado

Código: Seleccionar Todos
[1,2,3]


Já agora, o código que escreveste, Bruno,

Código: Seleccionar Todos
for n in range(1,len(str(x))):
    s=s+int(str(x)[n-1:n])


é altamente não pitónico! :lol:


Para somar todos os digitos do número x deverás, pitonicamente, escrever

Código: Seleccionar Todos
s = 0
for c in str(x):
      s += int(c)


isto se não quiseres usar as ferramentas de programação funcional do Python (map, etc), claro!

Ou seja, não precisas de iterar usando um índice dos elementos da sequência,

Código: Seleccionar Todos
for n in range(1,len(str(x))):


mas antes iterar directamente sobre os elementos da sequência:

Código: Seleccionar Todos
for c in str(x):


(a menos que precises do índice para alguma coisa especial, para além da iteração... :wink:)
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Soma de 100!

Mensagempor Bruno Oliveira em Domingo Fev 01, 2009 11:36 am

Obrigado pelas correcções prof. :D
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa


Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante

cron