test_cases = [[True], [False],
[True, False],
[True, False, False],
[True, True, True, False],
[False, True],
[True, False, True]]
expected_output = [True, True, True, True, True, False, False]
def check0(x):
n_trues = sum(x)
should_be_true = x[:n_trues] # get the first n items
should_be_false = x[n_trues:len(x)] # get the remaining items
# return True only if all of the first n elements are True and the remaining
# elements are all False
return all(should_be_true) and all([not element for element in should_be_false])
def check1a(x):
status = list(k for k, g in groupby(x))
return len(status) <= 2 and (status[0] is True or status[-1] is False)
def check1b(x):
status = list(k for k, g in groupby(map(book, x)))
return status and len(status) <= 2 and (status[0] or not status[-1])
def check1c(x):
status = list(k for k, g in groupby(map(book, x)))
return not status or (len(status) <= 2 and (status[0] or not status[-1]))
def check2(x):
iterator = iter(x)
# process the true elements
all(iterator)
# check that there are no true elements left
return not any(iterator)
assert list(map(check0, test_cases)) == expected_output
assert list(map(check1a, test_cases)) == expected_output
assert list(map(check1b, test_cases)) == expected_output
assert list(map(check1c, test_cases)) == expected_output
assert list(map(check2, test_cases)) == expected_output
dGVzdF9jYXNlcyA9IFtbVHJ1ZV0sIFtGYWxzZV0sCiAgICAgICAgICAgICAgW1RydWUsIEZhbHNlXSwKICAgICAgICAgICAgICBbVHJ1ZSwgRmFsc2UsIEZhbHNlXSwKICAgICAgICAgICAgICBbVHJ1ZSwgVHJ1ZSwgVHJ1ZSwgRmFsc2VdLAogICAgICAgICAgICAgIFtGYWxzZSwgVHJ1ZV0sCiAgICAgICAgICAgICAgW1RydWUsIEZhbHNlLCBUcnVlXV0KCmV4cGVjdGVkX291dHB1dCA9IFtUcnVlLCBUcnVlLCBUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2VdCgoKZGVmIGNoZWNrMCh4KToKICAgIG5fdHJ1ZXMgPSBzdW0oeCkKICAgIHNob3VsZF9iZV90cnVlID0geFs6bl90cnVlc10gICMgZ2V0IHRoZSBmaXJzdCBuIGl0ZW1zCiAgICBzaG91bGRfYmVfZmFsc2UgPSB4W25fdHJ1ZXM6bGVuKHgpXSAgIyBnZXQgdGhlIHJlbWFpbmluZyBpdGVtcwogICAgIyByZXR1cm4gVHJ1ZSBvbmx5IGlmIGFsbCBvZiB0aGUgZmlyc3QgbiBlbGVtZW50cyBhcmUgVHJ1ZSBhbmQgdGhlIHJlbWFpbmluZwogICAgIyBlbGVtZW50cyBhcmUgYWxsIEZhbHNlCiAgICByZXR1cm4gYWxsKHNob3VsZF9iZV90cnVlKSBhbmQgYWxsKFtub3QgZWxlbWVudCBmb3IgZWxlbWVudCBpbiBzaG91bGRfYmVfZmFsc2VdKQoKCmRlZiBjaGVjazFhKHgpOgogICAgc3RhdHVzID0gbGlzdChrIGZvciBrLCBnIGluIGdyb3VwYnkoeCkpCiAgICByZXR1cm4gbGVuKHN0YXR1cykgPD0gMiBhbmQgKHN0YXR1c1swXSBpcyBUcnVlIG9yIHN0YXR1c1stMV0gaXMgRmFsc2UpCgoKZGVmIGNoZWNrMWIoeCk6CiAgICBzdGF0dXMgPSBsaXN0KGsgZm9yIGssIGcgaW4gZ3JvdXBieShtYXAoYm9vaywgeCkpKQogICAgcmV0dXJuIHN0YXR1cyBhbmQgbGVuKHN0YXR1cykgPD0gMiBhbmQgKHN0YXR1c1swXSBvciBub3Qgc3RhdHVzWy0xXSkKCgpkZWYgY2hlY2sxYyh4KToKICAgIHN0YXR1cyA9IGxpc3QoayBmb3IgaywgZyBpbiBncm91cGJ5KG1hcChib29rLCB4KSkpCiAgICByZXR1cm4gbm90IHN0YXR1cyBvciAobGVuKHN0YXR1cykgPD0gMiBhbmQgKHN0YXR1c1swXSBvciBub3Qgc3RhdHVzWy0xXSkpCgoKZGVmIGNoZWNrMih4KToKICAgIGl0ZXJhdG9yID0gaXRlcih4KQogICAgIyBwcm9jZXNzIHRoZSB0cnVlIGVsZW1lbnRzCiAgICBhbGwoaXRlcmF0b3IpCiAgICAjIGNoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIHRydWUgZWxlbWVudHMgbGVmdAogICAgcmV0dXJuIG5vdCBhbnkoaXRlcmF0b3IpCgoKYXNzZXJ0IGxpc3QobWFwKGNoZWNrMCwgdGVzdF9jYXNlcykpID09IGV4cGVjdGVkX291dHB1dAphc3NlcnQgbGlzdChtYXAoY2hlY2sxYSwgdGVzdF9jYXNlcykpID09IGV4cGVjdGVkX291dHB1dAphc3NlcnQgbGlzdChtYXAoY2hlY2sxYiwgdGVzdF9jYXNlcykpID09IGV4cGVjdGVkX291dHB1dAphc3NlcnQgbGlzdChtYXAoY2hlY2sxYywgdGVzdF9jYXNlcykpID09IGV4cGVjdGVkX291dHB1dAphc3NlcnQgbGlzdChtYXAoY2hlY2syLCB0ZXN0X2Nhc2VzKSkgPT0gZXhwZWN0ZWRfb3V0cHV0