broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(max_run, samples):
    mode = None
    since = 0
    out = []
    for minute, calls in enumerate(samples):
        heat = sorted(z for z, c in calls.items() if c == 'heat')
        cool = sorted(z for z, c in calls.items() if c == 'cool')
        want = {'heat': heat, 'cool': cool}
        if mode is not None:
            other = 'cool' if mode == 'heat' else 'heat'
            if not want[mode]:
                mode = None
            elif want[other] and minute - since >= max_run:
                mode = other
        if mode is None and (heat or cool):
            mode = 'heat' if len(heat) >= len(cool) else 'cool'
            since = minute
        out.append([mode, want[mode] if mode else []])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: scenario 3',
   [2,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': None},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z3': 'heat'}]],
   [['cool', ['z1', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z4']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z1']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [5,
    [{'z1': 'cool', 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': None, 'z4': 'cool'},
     {'z2': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'}]],
   [['cool', ['z1']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['cool', ['z2', 'z3', 'z4']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z4']],
    ['heat', ['z3', 'z4']]]],
  ['regression: scenario 2',
   [5,
    [{'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'heat'},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': None}]],
   [['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z3']]]]],
 [['regression: scenario 2',
   [3,
    [{'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z3': 'cool'},
     {'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'}]],
   [['heat', ['z3', 'z4']],
    ['heat', ['z3', 'z4']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z1']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']]]],
  ['regression: scenario 10',
   [2,
    [{'z1': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z3': 'heat'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None}]],
   [['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z1', 'z4']],
    ['heat', ['z1', 'z3']],
    ['cool', ['z1']],
    ['cool', ['z1']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z1']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['control: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool'}]],
   [['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2', 'z3']],
    ['cool', ['z3']]]]],
 [['regression: scenario 2',
   [2,
    [{'z1': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z2': 'cool', 'z4': 'heat'},
     {'z3': None}]],
   [['cool', ['z3', 'z4']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['heat', ['z4']],
    [None, []]]],
  ['regression: scenario 11',
   [2,
    [{'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'cool'}]],
   [['heat', ['z1', 'z2', 'z3']],
    ['heat', ['z1', 'z2', 'z3']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z2', 'z3']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None},
     {'z1': 'heat', 'z2': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': None}]],
   [['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z1', 'z2', 'z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z2']]]]],
 [['regression: scenario 4',
   [5,
    [{'z1': None, 'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': None, 'z3': 'cool'},
     {'z3': 'cool'},
     {'z3': 'cool'},
     {'z2': None, 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat'},
     {'z2': 'cool', 'z3': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None},
     {'z2': 'cool', 'z3': None}]],
   [['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z2', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z2']],
    ['cool', ['z2']]]],
  ['regression: scenario 23',
   [3,
    [{'z1': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z2': None, 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': None}]],
   [['heat', ['z1']],
    ['heat', ['z1']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1', 'z4']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['heat', ['z1', 'z2', 'z3']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [5,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z2': 'heat', 'z3': 'heat', 'z4': 'cool'}]],
   [['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z3']],
    ['cool', ['z1']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z3']]]]],
 [['regression: scenario 4',
   [5,
    [{'z1': None, 'z3': None, 'z4': None},
     {'z1': None, 'z3': None, 'z4': None},
     {'z3': 'cool'},
     {'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': 'heat', 'z2': None, 'z3': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'}]],
   [[None, []],
    [None, []],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3', 'z4']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']]]],
  ['regression: scenario 25',
   [2,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': None},
     {'z2': 'heat', 'z3': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat'},
     {'z1': 'cool', 'z2': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': None, 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': None, 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'}]],
   [['heat', ['z2', 'z3']],
    ['heat', ['z2', 'z3']],
    ['heat', ['z2', 'z3']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z1', 'z2']],
    ['heat', ['z4']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z1', 'z2', 'z4']],
    ['heat', ['z4']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat'},
     {'z2': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': None, 'z4': 'heat'},
     {'z2': 'heat', 'z3': None, 'z4': 'heat'}]],
   [['heat', ['z1', 'z2', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z3']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']]]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(max_run, samples):
    mode = None
    since = 0
    out = []
    for minute, calls in enumerate(samples):
        heat = sorted(z for z, c in calls.items() if c == 'heat')
        cool = sorted(z for z, c in calls.items() if c == 'cool')
        want = {'heat': heat, 'cool': cool}
        if mode is not None:
            other = 'cool' if mode == 'heat' else 'heat'
            if not want[mode]:
                mode = None
            elif want[other] and minute - since >= max_run:
                mode = other
                since = since + max_run
        if mode is None and (heat or cool):
            mode = 'heat' if len(heat) >= len(cool) else 'cool'
            since = minute
        out.append([mode, want[mode] if mode else []])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: scenario 3',
   [2,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': None},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z3': 'heat'}]],
   [['cool', ['z1', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z4']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z1']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [5,
    [{'z1': 'cool', 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': None, 'z4': 'cool'},
     {'z2': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'}]],
   [['cool', ['z1']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['cool', ['z2', 'z3', 'z4']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z4']],
    ['heat', ['z3', 'z4']]]],
  ['regression: scenario 2',
   [5,
    [{'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'heat'},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': None}]],
   [['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z3']]]]],
 [['regression: scenario 2',
   [3,
    [{'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z3': 'cool'},
     {'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'}]],
   [['heat', ['z3', 'z4']],
    ['heat', ['z3', 'z4']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z1']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']]]],
  ['regression: scenario 10',
   [2,
    [{'z1': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z3': 'heat'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None}]],
   [['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z1', 'z4']],
    ['heat', ['z1', 'z3']],
    ['cool', ['z1']],
    ['cool', ['z1']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z1']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['control: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool'}]],
   [['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2', 'z3']],
    ['cool', ['z3']]]]],
 [['regression: scenario 2',
   [2,
    [{'z1': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z2': 'cool', 'z4': 'heat'},
     {'z3': None}]],
   [['cool', ['z3', 'z4']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['heat', ['z4']],
    [None, []]]],
  ['regression: scenario 11',
   [2,
    [{'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'cool'}]],
   [['heat', ['z1', 'z2', 'z3']],
    ['heat', ['z1', 'z2', 'z3']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z2', 'z3']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None},
     {'z1': 'heat', 'z2': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': None}]],
   [['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z1', 'z2', 'z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z2']]]]],
 [['regression: scenario 4',
   [5,
    [{'z1': None, 'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': None, 'z3': 'cool'},
     {'z3': 'cool'},
     {'z3': 'cool'},
     {'z2': None, 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat'},
     {'z2': 'cool', 'z3': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None},
     {'z2': 'cool', 'z3': None}]],
   [['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z2', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z2']],
    ['cool', ['z2']]]],
  ['regression: scenario 23',
   [3,
    [{'z1': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z2': None, 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': None}]],
   [['heat', ['z1']],
    ['heat', ['z1']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1', 'z4']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['heat', ['z1', 'z2', 'z3']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [5,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z2': 'heat', 'z3': 'heat', 'z4': 'cool'}]],
   [['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z3']],
    ['cool', ['z1']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z3']]]]],
 [['regression: scenario 4',
   [5,
    [{'z1': None, 'z3': None, 'z4': None},
     {'z1': None, 'z3': None, 'z4': None},
     {'z3': 'cool'},
     {'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': 'heat', 'z2': None, 'z3': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'}]],
   [[None, []],
    [None, []],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['cool', ['z3', 'z4']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']]]],
  ['regression: scenario 25',
   [2,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': None},
     {'z2': 'heat', 'z3': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat'},
     {'z1': 'cool', 'z2': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': None, 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': None, 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'}]],
   [['heat', ['z2', 'z3']],
    ['heat', ['z2', 'z3']],
    ['heat', ['z2', 'z3']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z1', 'z2']],
    ['heat', ['z4']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z1', 'z2', 'z4']],
    ['heat', ['z4']]]],
  ['control: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['control: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['control: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['control: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat'},
     {'z2': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': None, 'z4': 'heat'},
     {'z2': 'heat', 'z3': None, 'z4': 'heat'}]],
   [['heat', ['z1', 'z2', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z3']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']]]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
After the first forced changeover the system flips between heat and cool every minute.

Zoned single-unit system arbitration per minute; each sample maps zone -> heat, cool or None. When idle the system picks the mode with more calling zones (ties go to heat). A mode ends when no zone calls for it, and a new mode may be chosen in the same minute. If zones call for the opposite mode, the system switches once the current mode has run max_run minutes, restarting the run timer. Dampers open only for zones calling the active mode. Return [mode, sorted open zones] per minute.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(max_run, samples):
    mode = None
    since = 0
    out = []
    for minute, calls in enumerate(samples):
        heat = sorted(z for z, c in calls.items() if c == 'heat')
        cool = sorted(z for z, c in calls.items() if c == 'cool')
        want = {'heat': heat, 'cool': cool}
        if mode is not None:
            other = 'cool' if mode == 'heat' else 'heat'
            if not want[mode]:
                mode = None
            elif want[other] and minute - since >= max_run:
                mode = other
                since = minute
        elif heat or cool:
            mode = 'heat' if len(heat) >= len(cool) else 'cool'
            since = minute
        out.append([mode, want[mode] if mode else []])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [5,
    [{'z1': 'cool', 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': None, 'z4': 'cool'},
     {'z2': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'}]],
   [['cool', ['z1']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['cool', ['z2', 'z3', 'z4']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z4']],
    ['heat', ['z3', 'z4']]]],
  ['regression: scenario 2',
   [5,
    [{'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'heat'},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': None}]],
   [['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z3']]]],
  ['regression: scenario 3',
   [2,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': None},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z3': 'heat'}]],
   [['cool', ['z1', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z4']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z1']]]]],
 [['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool'}]],
   [['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2', 'z3']],
    ['cool', ['z3']]]],
  ['regression: scenario 2',
   [3,
    [{'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z3': 'cool'},
     {'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'}]],
   [['heat', ['z3', 'z4']],
    ['heat', ['z3', 'z4']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z1']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']]]],
  ['regression: scenario 3',
   [3,
    [{'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'}]],
   [['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['heat', ['z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2']]]]],
 [['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None},
     {'z1': 'heat', 'z2': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': None}]],
   [['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z1', 'z2', 'z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z2']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 2',
   [2,
    [{'z1': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z2': 'cool', 'z4': 'heat'},
     {'z3': None}]],
   [['cool', ['z3', 'z4']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['heat', ['z4']],
    [None, []]]],
  ['regression: scenario 3',
   [2,
    [{'z1': 'heat', 'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': None, 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': None, 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'}]],
   [['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z3', 'z4']],
    ['heat', ['z2', 'z4']]]]],
 [['regression: scenario 2',
   [2,
    [{'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool'},
     {'z1': None, 'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': None, 'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z2': None, 'z3': 'cool'}]],
   [['heat', ['z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z3']]]],
  ['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [5,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z2': 'heat', 'z3': 'heat', 'z4': 'cool'}]],
   [['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z3']],
    ['cool', ['z1']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z3']]]],
  ['regression: scenario 3',
   [5,
    [{'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'}]],
   [['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z1', 'z4']],
    ['cool', ['z2', 'z3']]]]],
 [['regression: scenario 6',
   [2,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'cool'}]],
   [['heat', ['z2', 'z3']],
    ['heat', ['z2', 'z3']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1', 'z4']],
    ['heat', ['z2', 'z3']],
    ['heat', ['z2']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1', 'z4']],
    ['heat', ['z2']],
    ['cool', ['z1', 'z3']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat'},
     {'z2': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': None, 'z4': 'heat'},
     {'z2': 'heat', 'z3': None, 'z4': 'heat'}]],
   [['heat', ['z1', 'z2', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z3']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']]]],
  ['regression: scenario 2',
   [5,
    [{'z1': 'cool', 'z2': None, 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': None, 'z2': 'cool', 'z3': 'heat'},
     {'z2': 'cool', 'z3': 'heat'},
     {'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z2': 'cool', 'z3': 'heat', 'z4': None}]],
   [['cool', ['z1', 'z4']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3']],
    ['cool', ['z2']]]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

meaning: Fixture-count band, not measured model difficulty

deps: stdlib

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(max_run, samples):
    mode = None
    since = 0
    out = []
    for minute, calls in enumerate(samples):
        heat = sorted(z for z, c in calls.items() if c == 'heat')
        cool = sorted(z for z, c in calls.items() if c == 'cool')
        want = {'heat': heat, 'cool': cool}
        if mode is not None:
            other = 'cool' if mode == 'heat' else 'heat'
            if not want[mode]:
                mode = None
            elif want[other] and minute - since >= max_run:
                mode = other
                since = minute
        if mode is None and (heat or cool) and minute > 0:
            mode = 'heat' if len(heat) >= len(cool) else 'cool'
            since = minute
        out.append([mode, want[mode] if mode else []])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [5,
    [{'z1': 'cool', 'z3': None, 'z4': None},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': None, 'z4': 'cool'},
     {'z2': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'}]],
   [['cool', ['z1']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['cool', ['z4']],
    ['cool', ['z2', 'z3', 'z4']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z4']],
    ['heat', ['z3', 'z4']]]],
  ['regression: scenario 2',
   [5,
    [{'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'heat'},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': None, 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': None}]],
   [['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1']],
    ['heat', ['z1', 'z3']]]],
  ['regression: scenario 3',
   [2,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': None},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z3': 'heat'}]],
   [['cool', ['z1', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z4']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['cool', ['z1']]]]],
 [['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': None, 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool'}]],
   [['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2', 'z3']],
    ['cool', ['z3']]]],
  ['regression: scenario 2',
   [3,
    [{'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'cool'},
     {'z3': 'cool'},
     {'z2': None, 'z3': 'cool', 'z4': None},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'}]],
   [['heat', ['z3', 'z4']],
    ['heat', ['z3', 'z4']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z1']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z1', 'z2']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']]]],
  ['regression: scenario 3',
   [3,
    [{'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'}]],
   [['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['heat', ['z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2']]]]],
 [['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None},
     {'z1': 'heat', 'z2': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'heat', 'z2': 'heat', 'z3': None, 'z4': None}]],
   [['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z1', 'z2', 'z4']],
    ['heat', ['z1', 'z2']],
    ['heat', ['z1', 'z2']],
    ['cool', ['z4']],
    ['heat', ['z1', 'z2']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 2',
   [2,
    [{'z1': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z1': None, 'z2': 'cool', 'z3': None, 'z4': 'heat'},
     {'z2': 'cool', 'z4': 'heat'},
     {'z3': None}]],
   [['cool', ['z3', 'z4']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['heat', ['z4']],
    [None, []]]],
  ['regression: scenario 3',
   [2,
    [{'z1': 'heat', 'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': None, 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z1': None, 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'}]],
   [['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z3', 'z4']],
    ['heat', ['z2', 'z4']]]]],
 [['regression: scenario 2',
   [2,
    [{'z1': 'cool', 'z2': None, 'z3': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool'},
     {'z1': None, 'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z1': None, 'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool'},
     {'z2': 'cool', 'z3': 'cool', 'z4': None},
     {'z2': None, 'z3': 'cool'}]],
   [['heat', ['z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z2', 'z3']],
    ['cool', ['z3']]]],
  ['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: scenario 1',
   [5,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': None, 'z3': 'cool', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z4': 'heat'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z2': 'heat', 'z3': 'cool', 'z4': 'cool'},
     {'z2': 'heat', 'z3': 'heat', 'z4': 'cool'}]],
   [['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['cool', ['z3']],
    ['cool', ['z1']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z3']]]],
  ['regression: scenario 3',
   [5,
    [{'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'cool', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'cool', 'z3': 'cool', 'z4': 'heat'}]],
   [['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z2', 'z3']],
    ['cool', ['z1', 'z3']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z4']],
    ['heat', ['z1', 'z4']],
    ['cool', ['z2', 'z3']]]]],
 [['regression: scenario 6',
   [2,
    [{'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z2': 'heat', 'z3': None, 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'cool'}]],
   [['heat', ['z2', 'z3']],
    ['heat', ['z2', 'z3']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1', 'z4']],
    ['heat', ['z2', 'z3']],
    ['heat', ['z2']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1', 'z4']],
    ['heat', ['z2']],
    ['cool', ['z1', 'z3']]]],
  ['regression: first minute call',
   [3, [{'a': 'cool'}, {'a': 'cool'}, {}]],
   [['cool', ['a']], ['cool', ['a']], [None, []]]],
  ['regression: majority then forced switch',
   [3,
    [{'a': 'heat', 'b': 'cool', 'c': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat'},
     {}]],
   [['cool', ['b', 'c']], ['cool', ['b']], ['cool', ['b']], ['heat', ['a']], ['heat', ['a']], [None, []]]],
  ['regression: tie goes to heat',
   [2, [{'a': 'heat', 'b': 'cool'}, {'a': 'heat', 'b': 'cool'}, {'b': 'cool'}]],
   [['heat', ['a']], ['heat', ['a']], ['cool', ['b']]]],
  ['regression: ping pong guard',
   [2,
    [{'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'},
     {'a': 'heat', 'b': 'cool'}]],
   [['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']],
    ['cool', ['b']],
    ['heat', ['a']],
    ['heat', ['a']],
    ['cool', ['b']]]],
  ['regression: satisfied then opposite',
   [5, [{'a': 'cool'}, {'a': 'cool', 'b': 'heat'}, {'b': 'heat'}, {'b': 'heat'}]],
   [['cool', ['a']], ['cool', ['a']], ['heat', ['b']], ['heat', ['b']]]],
  ['regression: scenario 1',
   [3,
    [{'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'heat', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z1': 'heat', 'z2': 'heat', 'z3': 'cool', 'z4': 'heat'},
     {'z2': 'heat'},
     {'z2': 'heat', 'z4': 'heat'},
     {'z1': None, 'z2': 'heat', 'z3': None, 'z4': 'heat'},
     {'z2': 'heat', 'z3': None, 'z4': 'heat'}]],
   [['heat', ['z1', 'z2', 'z3', 'z4']],
    ['heat', ['z1', 'z2', 'z3']],
    ['heat', ['z1', 'z2', 'z3', 'z4']],
    ['cool', ['z3']],
    ['cool', ['z3']],
    ['heat', ['z2']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']],
    ['heat', ['z2', 'z4']]]],
  ['regression: scenario 2',
   [5,
    [{'z1': 'cool', 'z2': None, 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': 'cool'},
     {'z1': 'cool', 'z3': 'heat', 'z4': None},
     {'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': None, 'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': None, 'z2': 'cool', 'z3': 'heat'},
     {'z2': 'cool', 'z3': 'heat'},
     {'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'heat'},
     {'z1': 'heat', 'z2': 'cool', 'z3': 'heat', 'z4': None},
     {'z2': 'cool', 'z3': 'heat', 'z4': None}]],
   [['cool', ['z1', 'z4']],
    ['cool', ['z1', 'z4']],
    ['cool', ['z1']],
    ['cool', ['z2']],
    ['cool', ['z2']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z3']],
    ['heat', ['z1', 'z3']],
    ['heat', ['z1', 'z3']],
    ['cool', ['z2']]]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
Zones waiting for the opposite mode lose a minute every time the current mode finishes.

Zoned single-unit system arbitration per minute; each sample maps zone -> heat, cool or None. When idle the system picks the mode with more calling zones (ties go to heat). A mode ends when no zone calls for it, and a new mode may be chosen in the same minute. If zones call for the opposite mode, the system switches once the current mode has run max_run minutes, restarting the run timer. Dampers open only for zones calling the active mode. Return [mode, sorted open zones] per minute.

split: open-access