Este script Python imita o mecanismo de diferença de Babbage
Python mais uma vez assume o mecanismo de diferença de Charles Babbage.
Em Use este script Python para simular o mecanismo diferencial de Babbage, Python ofereceu uma solução alternativa para o problema de Babbage de determinar o número de bolinhas de gude em uma pirâmide bidimensional. A Máquina Diferencial de Babbage resolveu isso usando uma tabela mostrando o número de linhas de bolinhas de gude e o número total de bolinhas de gude.
Depois de alguma contemplação, o fantasma de Charles Babbage respondeu: "Está tudo muito bem, mas aqui você apenas pega o número de linhas e dá o número de bolinhas de gude. Com minha tabela, também posso dizer o tamanho da pirâmide que você pode construir dada um certo número de bolinhas de gude; simplesmente procure na mesa."
Python teve que concordar que esse era realmente o caso, mas sabia que certamente isso também deveria ser resolvido. Com pouco atraso, Python voltou com outro script curto. A solução envolve pensar na matemática ao contrário.
MarbNum = (N * (N + 1))/2
Com o qual posso começar a resolver:
N * (N + 1) = MarbNum * 2
Da qual uma solução aproximada pode ser:
N = int(sqrt(MarbNum * 2))
Mas o número inteiro N que resolve isso pode ser muito grande em um, então preciso testar isso. Em outras palavras, o número correto de linhas será N ou N-1. Aqui está o roteiro final:
#!/usr/bin/env python
# babbage2.py
"""
Using Charles Babbage's conception of a marble-counting operation for a regular
pyramid of marbles, starting with one at the top with each successive row having
one more marble than the row above it.
Will give you the total number of rows possible for a pyramid, given a total number
of marbles available.
As a bonus, you also learn how many are left over.
"""
import math
MarbNum = input("Enter the number of marbles you have: ")
MarbNum = int(MarbNum)
firstguess = int(math.sqrt(MarbNum*2))
if (firstguess * (firstguess + 1) > MarbNum*2):
correctNum = firstguess - 1
else:
correctNum = firstguess
MarbRem = int(MarbNum - (correctNum * (correctNum + 1)/2))
# some grammatical fixes
if MarbRem == 0:
MarbRem = "no"
if MarbRem == 1:
marbleword = "marble"
else:
marbleword = "marbles"
print ("You can have",correctNum, "rows, with",MarbRem, marbleword, "remaining.")
A saída será mais ou menos assim:
Enter the number of marbles you have: 374865
You can have 865 rows, with 320 marbles remaining.
E o fantasma do Sr. Babbage ficou impressionado. "Ah, seu mecanismo Python é realmente impressionante! Certamente poderia rivalizar com meu mecanismo analítico, se eu tivesse tempo para concluir esse projeto."