Skip to content

Instantly share code, notes, and snippets.

@jiffyclub
Created April 5, 2012 23:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jiffyclub/2314940 to your computer and use it in GitHub Desktop.
Save jiffyclub/2314940 to your computer and use it in GitHub Desktop.
Check helmet test data for Software Carpentry. See http://software-carpentry.org/2012/04/solution-to-data-checking-problem/.
"""
Check helmet test data for Software Carpentry.
"""
import sys
from collections import namedtuple
HelmetTest = namedtuple('HelmetTest', ['temp', 'time', 'brittle'])
def read_data_file(filename):
"""
Get data from a text file.
"""
test_results = []
with open(filename, 'r') as f:
f.readline()
f.readline()
for line in f:
temp, time, brittle = line.split()
h = HelmetTest(float(temp), float(time), float(brittle))
test_results.append(h)
return test_results
def read_data_stdin():
"""
Get data from stdin.
"""
test_results = []
line = raw_input('temp time brittle: ')
while line.strip():
temp, time, brittle = line.split()
h = HelmetTest(float(temp), float(time), float(brittle))
test_results.append(h)
line = raw_input('temp time brittle: ')
return test_results
def format_error(test, prev_test):
"""
Make the string reporting the error.
"""
err_str = 'Error: ({}, {}, {}) inconsistent with ({}, {}, {})'
return err_str.format(test.temp, test.time, test.brittle,
prev_test.temp, prev_test.time, prev_test.brittle)
def check_data(data):
"""
Check data for consistency.
"""
for i,test in enumerate(data):
for prev_test in data[:i][::-1]:
if test.time >= prev_test.time and test.brittle < prev_test.brittle:
print format_error(test, prev_test)
return
if test.temp == prev_test.temp and test.brittle < prev_test.brittle:
print format_error(test, prev_test)
return
def main(filename=None):
if filename:
data = read_data_file(filename)
else:
data = read_data_stdin()
check_data(data)
if __name__ == '__main__':
if len(sys.argv[1:]) > 1:
print 'helmet.py takes at most one argument.'
sys.exit()
if len(sys.argv[1:]) == 1:
filename = sys.argv[1]
else:
filename = None
sys.exit(main(filename))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment