Alex Martelli face aluzie la o soluție algebrică care voi include aici pentru completare. Acesta poate fi elaborat cu utilizarea de ecuații simultane. Fiind o soluție matematice simple, este posibil mai rapid, cel puțin pentru mare număr de picioare și capete :-)
Lăsa:
H fie numărul de capete;
L este numărul de picioare;
Cfie numărul de pui; și
P este numărul de porci.
Având în vedere Cși P, putem calcula celelalte două variabile cu:
H = C + P (1)
L = 2C + 4P (2)
Vom detalia fiecare pas în calculele de mai jos. Înclinat matematic poate , fără îndoială , subliniază faptul că măsurile ar putea fi combinate , dar aș prefera să fie explicit. De la (1), putem calcula:
H = C + P
=> 0 = C + P - H [subtract H from both sides]
=> 0 = H - C - P [multiply both sides by -1]
=> P = H - C [add P to both sides] (3)
și substitut că în (2):
L = 2C + 4P
=> L = 2C + 4(H - C) [substitute H-C for P]
=> L = 2C + 4H - 4C [expand 4(H-C) to 4H-4C]
=> L = 4H - 2C [combine 2C-4C into -2C]
=> 0 = 4H - 2C - L [subtract L from both sides]
=> 2C = 4H - L [add 2C to both sides]
=> C = 2H - L/2 [divide both sides by 2] (4)
Acum aveți două formule, una care se poate calcula numărul de pui de la cap și picioare (4), celălalt care se poate calcula numărul de porci de la pui și capete (3).
Deci, aici este codul Python pentru a face acest lucru, cu controale adecvate pentru a se asigura că nu permit unele dintre cele mai bizare solutii matematice, cum ar fi 2 capete si 7 picioare oferindu-ne un porc și jumătate, împreună cu o jumătate de pui, sau 1 cap și 12 picioare dau 5 porci și pui -4 :-)
def solve (numLegs, numHeads):
# Use the formulae (these make integers).
chicks = numHeads * 2 - int (numLegs / 2)
pigs = numHeads - chicks
# Don't allow negative number of animals.
if chicks < 0 or pigs < 0:
return [None, None]
# Don't allow fractional animals.
if chicks * 2 + pigs * 4 != numLegs:
return [None, None]
if chicks + pigs != numHeads:
return [None, None]
return [pigs, chicks]
Desigur, dacă treci în numere fractionare de cap sau de picioare, toate pariurile sunt oprite. Iată un program complet de testare, astfel încât să puteți încerca diverse valori pentru a asigura ambele metode returnează aceleași valori:
import sys
def usage (reason):
print "Error: %s"%(reason)
print "Usage: solve <numHeads> <numLegs>"
sys.exit (1);
def solve1 (numLegs, numHeads):
for numChicks in range (0, numHeads + 1):
numPigs = numHeads - numChicks
totLegs = 4 * numPigs + 2 * numChicks
if totLegs == numLegs:
return [numPigs, numChicks]
return [None, None]
def solve2 (numLegs, numHeads):
chicks = numHeads * 2 - int (numLegs / 2)
pigs = numHeads - chicks
if chicks < 0 or pigs < 0: return [None, None]
if chicks * 2 + pigs * 4 != numLegs: return [None, None]
if chicks + pigs != numHeads: return [None, None]
return [pigs, chicks]
if len (sys.argv) != 3:
usage ("Wrong number of parameters (%d)"%(len (sys.argv)))
try: heads = int (sys.argv[1])
except: usage ("Invalid <numHeads> of '%s'"%(sys.argv[1]))
try: legs = int (sys.argv[2])
except: usage ("Invalid <numLegs> of '%s'"%(sys.argv[2]))
print "[pigs, chicks]:"
print " ", solve1 (legs, heads)
print " ", solve2 (legs, heads)