commit 6ff999e4c5fdfdb6c17197c40ad32eafe169ed05 Author: olari Date: Wed Aug 11 16:24:51 2021 +0300 initial diff --git a/data b/data new file mode 100644 index 0000000..3fe7374 --- /dev/null +++ b/data @@ -0,0 +1,3 @@ +2021-08-11 16:22:19 15-1 lh pass +2021-08-11 16:22:35 34-3 rh fail +2021-08-11 16:22:36 12-1 ht pass diff --git a/script.py b/script.py new file mode 100644 index 0000000..0be8ab6 --- /dev/null +++ b/script.py @@ -0,0 +1,85 @@ +import random +from datetime import datetime + +keys = { + 'C major': [1, 4, 7, 19, 50, 59, 73, 75, 98, 116, 117, 128, 136], + 'C minor': [24, 36, 83, 90, 111], + 'D major': [10, 39, 40, 54, 56, 57, 97, 105, 107, 121, 127, 143], + 'D minor': [14, 18, 31, 32, 37, 126, 130, 134], + 'E major': [45, 104, 120, 149], + 'E minor': [8, 26, 58, 67, 91, 95, 99, 109], + 'E-flat major': [70, 84, 124, 133, 140, 145], + 'F major': [20, 25, 28, 29, 64, 68, 76, 79, 82, 92, 118, 119, 122, 123, 129, 146, 148], + 'F minor': [53], + 'F-sharp minor': [44, 135], + 'G major': [11, 12, 21, 30, 35, 42, 43, 46, 52, 60, 101, 103, 106, 112, 114, 132], + 'G minor': [2, 6, 16, 27, 38, 41, 49, 55, 65, 77, 80, 81, 86, 89, 96, 102, 131, 150], + 'A major': [3, 34, 69, 78, 85, 88, 93], + 'A minor': [5, 9, 13, 15, 22, 63, 71, 72, 108, 110, 125, 138, 139, 141, 144], + 'B minor': [17, 66, 74, 100, 113, 137, 147], + 'B-flat major': [33, 47, 48, 51, 61, 62, 94, 115, 142], + 'B-flat minor': [23, 87], +} + +key_reverse = {} +for key, lines in keys.items(): + for line in lines: + key_reverse[line] = key + +three_four_time = [4, 21, 27, 31, 33, 42, 44, 52, 54, 61, 62, 75, 76, 77, 79, 82, 89, 115, 117, 128, 131, 151, 159] + +def extract(l, k): + r = [] + + for kk in k: + r.extend(l.get(kk, [])) + + return r + +no_accidentals = extract(keys, ['C major', 'A minor']) +one_sharp = extract(keys, ['G major', 'E minor']) +one_flat = extract(keys, ['F major', 'D minor']) +two_sharps = extract(keys, ['D major', 'B minor']) +two_flats = extract(keys, ['B-flat major', 'G minor']) +three_four_or_five_sharps_or_flats = extract(keys, [ + 'E-flat major', 'C minor', + 'A-flat major', 'F minor', + 'D-flat major', 'B-flat minor', + + 'A major', 'F-sharp minor', + 'E major', 'C-sharp minor', + 'B major', 'G-sharp minor', +]) + +while True: + selection = [ + random.choice(l) + for l in [no_accidentals, one_sharp, one_flat, two_sharps, two_flats, three_four_or_five_sharps_or_flats] + ] + + num_minor = 0 + num_major = 0 + + for line in selection: + if key_reverse[line].endswith('minor'): + num_minor += 1 + else: + num_major += 1 + + if num_minor == 3 and num_major == 3: + break + +print('Example exam:', selection) + +data = [] + +for line in open('data'): + ts1, ts2, line, hands, result = line.split() + line, diff = map(int, line.split('-')) + result = 1 if result == 'pass' else 0 + key = key_reverse[line] + ts = int(datetime.strptime(ts1 + ts2, '%Y-%m-%d%H:%M:%S').timestamp()) + data.append([ts, line, diff, key, hands, result]) + +print('Num entries:', len(data)) +