Alex Martelli παραπέμπει σε μια αλγεβρική λύση που θα περιλαμβάνουν εδώ για λόγους πληρότητας. Μπορεί να επεξεργαστεί με τη χρήση των εξισώσεων. Όντας μια απλή μαθηματική λύση, είναι ενδεχομένως πιο γρήγορα, τουλάχιστον για μεγάλους αριθμούς από τα πόδια και το κεφάλι :-)
Αφήνω:
H είναι ο αριθμός των κεφαλών?
L είναι ο αριθμός των ποδιών?
Cείναι ο αριθμός των νεοσσών? και
P είναι ο αριθμός των χοίρων.
Λαμβάνοντας υπόψη Cκαι P, μπορούμε να υπολογίσουμε τις άλλες δύο μεταβλητές με:
H = C + P (1)
L = 2C + 4P (2)
Εγώ θα λεπτομέρεια σε κάθε βήμα παρακάτω υπολογισμούς. Η μαθηματική κλίση να επισημάνω καμία αμφιβολία ότι τα βήματα θα μπορούσαν να συνδυαστούν, αλλά θα προτιμούσα να είναι ρητή. Από την (1), μπορούμε να υπολογίσουμε:
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)
και υποκατάστατο αυτό σε (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)
Τώρα έχετε δύο τύπους, μια που μπορεί να υπολογίσει τον αριθμό των νεοσσών από το κεφάλι και τα πόδια (4), το άλλο που μπορεί να υπολογίσει τον αριθμό των χοίρων από νεοσσούς και τα κεφάλια (3).
Έτσι, εδώ είναι ο κώδικας Python για να το κάνει, με κατάλληλους ελέγχους για να διασφαλιστεί ότι δεν επιτρέπουν μερικές από τις πιο παράξενες μαθηματικές λύσεις, όπως η 2 κεφάλια και 7 πόδια μας δίνει ένα γουρούνι και ένα μισό μαζί με μισό γκόμενα, ή 1 κεφάλι και 12 πόδια δίνοντας 5 χοίρους και -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]
Φυσικά, αν έχετε περάσει σε κλασματική αριθμούς από το κεφάλι ή τα πόδια, όλα τα στοιχήματα είναι ανοικτά. Εδώ είναι ένα πλήρες πρόγραμμα δοκιμών ώστε να μπορείτε να δοκιμάσετε διάφορες τιμές για να εξασφαλίσουν οι δύο μέθοδοι επιστρέφουν τις ίδιες αξίες:
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)