Alex Martelli は、完全を期すためにここに含める代数的ソリューションをほのめかしています。連立方程式を使えば解けます。単純な数学的解であるため、少なくとも多数の脚と頭の場合は、おそらくより高速です:-)
させて:
H
頭の数です。
L
脚の数です。
C
ひよこの数です。と
P
豚の数になります。
と が与えられるC
とP
、他の 2 つの変数は次のように計算できます。
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)
これで、頭と脚からヒナの数を計算できる式と、ヒヨコと頭から豚の数を計算できる式の 2 つの式ができ(3)
ました。
これを実行するための Python コードは次のとおりです。適切なチェックを行って、頭が 2 つ足が 7 本の場合、豚と半分、ひよこが半分、または頭が 1 つと5匹の豚と4匹のひよこを与える12本の足:-)
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)