Alex Martelli ben tamlığı için buraya ekleriz bir cebirsel çözümü ima etmektedir. Bu eşzamanlı denklemler kullanılarak dışarı çalışılabilir. Basit bir matematiksel çözümü olmak, en azından için, muhtemelen daha hızlı büyük :-) bacak ve kafalarının numaralar
edelim:
H kafaları sayısı,;
L bacakların sayısı,;
CCivcivlerin sayı; ve
P domuz sayısı olabilir.
Verilen Cve Pbiz diğer iki değişken ile hesaplayabilirsiniz:
H = C + P (1)
L = 2C + 4P (2)
Ayrıntılı olarak veriyoruz her aşağıda hesaplamalarda adımı. Matematiksel olarak eğimli şüphesiz adımlar kombine edilebileceğini işaret edebilir ama açık olmasını tercih ederim. (1), biz hesaplayabilirsiniz:
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)
ve ikame olduğu içerisine (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)
Şimdi iki formül, baş ve bacaklar civcivlerin sayısını hesaplayabilir tane var (4), civciv ve başlardan domuzların sayısını hesaplamak hangi diğer (3).
Yani burada uygun kontroller ile yapmak Python kodu, bize bir domuz ve yarım piliç ile birlikte bir yarısını yani 1 baş veren 2 kafaları ve 7 bacakları gibi, daha tuhaf matematiksel çözümlerin bazı izin vermez sağlamak için var ve 5 domuzlar ve -4 civciv veren 12 bacak :-)
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]
Eğer başın veya bacakların fraksiyonel sayıda geçmesi Tabii ki, eğer, tüm bahisler geçersiz. Burada iki yöntem de aynı değerleri dönmelerini sağlamak için çeşitli değerler deneyebilirsiniz böylece tam bir test programı var:
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)