#!/usr/bin/env python3 import sys def test(): assert(dash_to_seq("") == "") assert(dash_to_seq("1") == "1") assert(dash_to_seq("1,2") == "1,2") assert(dash_to_seq("1-2") == "1,2") assert(dash_to_seq("1,5-9,11") == "1,5,6,7,8,9,11") assert(get_range_pairs("") == []) assert(get_range_pairs([1]) == [(1, 1)]) assert(get_range_pairs([1, 3]) == [(1, 1), (3, 3)]) assert(get_range_pairs([1, 2]) == [(1, 2)]) assert(get_range_pairs([1, 5, 6, 7, 8, 9, 11]) == [(1, 1), (5, 9), (11, 11)]) assert(range_pairs_to_dash_line([]) == "") assert(range_pairs_to_dash_line([(1, 1)]) == "1") assert(range_pairs_to_dash_line([(1, 2)]) == "1-2") assert(range_pairs_to_dash_line([(1, 1),(3,11)]) == "1,3-11") assert(seq_to_dash("") == "") assert(seq_to_dash("1,3") == "1,3") assert(seq_to_dash("1,5,6,7,8,9,11") == "1,5-9,11") print("All tests passed") def main(): line = sys.argv[-1] if '-' in line: print(dash_to_seq(line)) else: print(seq_to_dash(line)) def dash_to_seq(range_line): ranges = range_line.split(",") result = "" for item in ranges: if(len(result)): result += "," if '-' in item: result += dash_convert(item) else: result += str(item) return result def dash_convert(dash_line): dash = "" start, end = dash_line.split('-') for num in range(int(start), int(end) + 1): if len(dash): dash += "," dash += str(num) return dash def seq_to_dash(seq_line, dash = ""): seq_list = seq_line_to_seq_list(seq_line) range_pairs = get_range_pairs(seq_list) return range_pairs_to_dash_line(range_pairs) def get_range_pairs(seq_list): result = [] for num in seq_list: begin, end = get_last_range(result) if end + 1 == num: result[-1] = (begin, num) else: result.append((num, num)) return result def get_last_range(range_list): try: return range_list[-1] except IndexError: return (-2, -2) def range_pairs_to_dash_line(range_list): result = "" for begin, end in range_list: if result: result += "," if begin == end: result += str(begin) else: result += str(begin) + "-" + str(end) return result def seq_line_to_seq_list(seq_line): if seq_line: return [int(item) for item in seq_line.split(',')] else: return [] def usage(): print("{} [-t] range\n -t run optional tests".format(sys.argv[0])) if __name__ == "__main__": if len(sys.argv) > 1: if sys.argv[1] == "-t": test() main() else: usage()