Ricerca nel sito web

Questo script Python imita il motore delle differenze di Babbage


Python affronta ancora una volta il Difference Engine di Charles Babbage.

In Utilizza questo script Python per simulare il motore delle differenze di Babbage, Python ha offerto una soluzione alternativa al problema di Babbage di determinare il numero di biglie in una piramide bidimensionale. Il motore delle differenze di Babbage ha risolto questo problema utilizzando una tabella che mostra il numero di righe di biglie e il numero totale di biglie.

Dopo qualche riflessione, il fantasma di Charles Babbage rispose: "Va tutto bene, ma qui prendi solo il numero di file e fornisci il numero di biglie. Con la mia tabella, posso anche dirti quanto è grande una piramide che potresti costruire data un certo numero di biglie; basta cercarlo nella tabella."

Python dovette ammettere che le cose stavano effettivamente così, ma sapeva che sicuramente anche questo doveva essere risolvibile. Con poco ritardo, Python è tornato con un altro breve script. La soluzione consiste nel pensare ai calcoli al contrario.

MarbNum = (N * (N + 1))/2

Che posso iniziare a risolvere con:

N * (N + 1) = MarbNum * 2

Da cui una soluzione approssimata potrebbe essere:

N = int(sqrt(MarbNum * 2))

Ma il numero intero N che risolve questo problema potrebbe essere troppo grande per uno, quindi devo verificarlo. In altre parole, il numero corretto di righe sarà N o N-1. Ecco lo script finale:

#!/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.")

L'output sarà simile a questo:

Enter the number of marbles you have:  374865 
You can have 865 rows, with 320 marbles remaining.

E il fantasma del signor Babbage ne rimase impressionato. "Ah, il tuo motore Python è davvero impressionante! Sicuramente potrebbe rivaleggiare con il mio motore analitico, se avessi avuto il tempo di completare quel progetto."

Articoli correlati: