Created
April 5, 2012 23:11
-
-
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/.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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