This was supposed to be posted last night, but I was trying to make it work properly. This problem reproduces a few Python division problems and took me some time to figure it out. Actually I only knew about this when I checked the winner’s solution (also written in Python).
Without the “gotcha”, the problem is quite easy to solve, if you know how to work with feet and inches. As a metric system native, it was my first time. 😀 It’s called Baby Height, and it says, yo!
Every parent wants to know how tall their child will grow.
Dr. Spaceman’s algorithm, which we describe below
Accurately calculates, with errors very low,
Adult height of any child, with just genetics, yo!Take the mother’s height and add it to the father’s height.
For a girl, subtract five inches; this I will highlight.
For a boy, you add five inches, or it won’t be right.
Then divide by two, and get your target in plain sight.Dr. Spaceman is convinced that target is precise.
Plus or minus four, in inches, truly will suffice.
When a parent asks the question, looking for advice,
Dr. Spaceman’s answer is this range, and it’s concise.
Also, a minor problem gotcha is found on the Output rules:
Output
For each test case, output one line containing “Case #x: A to B“, where x is the case number (starting from 1), A is the smallest and B is the largest baby height, according to Dr. Spaceman’s algorithm. If the algorithm produces a range whose endpoints fall on fractional inches, your program should shrink the range until both endpoints can be expressed in whole inches.
I’ve overlooked that at first. 😛 Anyway, here’s the final code, validated:
from __future__ import division #Get python3 revised division operator
def asInches(strFeetInches): #Function converting Foot/inches string to inches
nums = strFeetInches[:-1].split("\'") #Split string on ' and remove " marks
return int(nums[0])*12 + int(nums[1]) #1 foot = 12 inches, convert
for case in range(1,int(raw_input())+1): #For all test cases
vector = []
boy = False
father = -1
mother = -1
for i in raw_input().split(" "): #Split the case values by spaces
if i == "B": #Is it a boy?
boy = True
elif i == "G": #Is it a girl?
boy = False
elif father == -1: #If father is not yet known, get it
father = asInches(i) #Store his height in inches
else: #Father is known, so get mother this time
mother = asInches(i) #Store in inches
height = (mother + father + (5 if boy else -5))/2 #Baby height math
inc = 4.0 #Range default value
lower = height-inc #Get lower range
if lower != int(lower): #If number is a fraction
lower += 0.5 #Reduce range size
higher = height+inc #Get higher range
if higher != int(higher): #If number is a fraction
higher -= 0.5 #Reduce range size
print "Case #%d: %1d'%1d\" to %1d'%1d\"" % (case, lower/12, lower%12, higher/12, higher%12)
This problem represents what CodeJam is about. Not only knowing how to code, but also knowing about programming “gotchas” and avoiding them.
Happy jammin’!
Comment this