diff --git a/interactive_sort.py b/interactive_sort.py index e8f63a526a6df85c69c38c7fcd23d97e32e53d37..b5e1ee0874e23d4bd55eb81fc1709627e13c0949 100755 --- a/interactive_sort.py +++ b/interactive_sort.py @@ -11,21 +11,13 @@ import json import curses import locale -input_file = "testjmena.txt" -output_file = "result.txt" -comparison_file = "comparisons.pickle" -comparisons = {} -count_full = 0 -count = 0 -win = None - -def mergeSort(toSort): - if len(toSort) <= 1: - return toSort +def merge_sort(to_sort): + if len(to_sort) <= 1: + return to_sort - mIndex = len(toSort) / 2 - left = mergeSort(toSort[:mIndex]) - right = mergeSort(toSort[mIndex:]) + mIndex = len(to_sort) / 2 + left = merge_sort(to_sort[:mIndex]) + right = merge_sort(to_sort[mIndex:]) result = [] while len(left) > 0 and len(right) > 0: @@ -35,65 +27,88 @@ def mergeSort(toSort): result.append(left.pop(0)) if len(left) > 0: - result.extend(mergeSort(left)) + result.extend(merge_sort(left)) else: - result.extend(mergeSort(right)) + result.extend(merge_sort(right)) return result + +def get_key(): + key = 0 + while not key in [97, 98]: + key = win.getch() + + def compare(a, b): global comparisons global count global count_full + # Human is the slowest part and we want to be reasonably sure + # to have all choices saved on disk, so let's read and write + # everything every time - what the heck try: fctx = open(comparison_file, "r") except IOError: - pass + pass # First time else: with fctx as f: comparisons = pickle.load(f) count_full += 1 - if a==b: + if a==b: # Keep multiples close return True + # Human is the slowest part and mergesort may compare the same + # items multiple times, so let's use cached choices if (a, b) in comparisons: return comparisons[(a, b)] if (b, a) in comparisons: - return comparisons[(b, a)] + return not comparisons[(b, a)] - # Comparison + # Comparison - ask human win.addstr(("%s(a) nebo %s(b)?\n" % (a, b)).encode("utf-8")) - key = 0 - while not key in [97, 98]: - key = win.getch() - res = key==97 + res = get_key()==97 + # Cache progress comparisons[(a, b)] = res comparisons[(b, a)] = not res + # And save for sure with open(comparison_file, "w") as f: pickle.dump(comparisons, f) count += 1 return res + def __main__(): - locale.setlocale(locale.LC_ALL, "cs_CZ.UTF-8") - sys.stdout = codecs.getwriter("utf-8")(sys.stdout) - global win - win = curses.initscr() - win.scrollok(True) - win.idlok(True) - curses.noecho() - curses.cbreak() - l = [''.join(random.choice(string.ascii_lowercase) for y in range(1)) for x in range(76)] with io.open(input_file, "r", encoding="utf-8") as f: l = [line for line in f.read().split("\n") if not line.startswith("\\")] win.addstr((u", ".join(l)).encode("utf-8")) win.addstr("\n\n") - r = mergeSort(l) + r = merge_sort(l) with io.open(output_file, "w", encoding="utf-8") as f: for n in reversed(r): f.write(n) f.write(u"\n") + +comparisons = {} +count_full = 0 +count = 0 +win = None + +if len(sys.argv)!=4: + print "Use: interactive_sort.py source.txt result.txt comparisoncache.pickle" + +input_file = sys.argv[1] +output_file = sys.argv[2] +comparison_file = sys.argv[3] + +locale.setlocale(locale.LC_ALL, "cs_CZ.UTF-8") +sys.stdout = codecs.getwriter("utf-8")(sys.stdout) +win = curses.initscr() +win.scrollok(True) +win.idlok(True) +curses.noecho() +curses.cbreak() try: __main__() except KeyboardInterrupt: @@ -101,6 +116,5 @@ except KeyboardInterrupt: curses.nocbreak() curses.echo() curses.endwin() -print comparisons -print count_full -print count +print "Total comparisons: ", count_full +print "Human comparisons: ", count