(defun correct (a b)
(if (= a b) nil a))
(defun make-unbiased-coin (biased-coin)
(lambda ()
(loop for a = (funcall biased-coin) then (funcall biased-coin)
and b = (funcall biased-coin) then (funcall biased-coin)
while (null (correct a b))
finally (return (correct a b)))))
(let* ((bc (lambda () (if (< 7 (random 10)) 0 1)))
(uc (make-unbiased-coin bc)))
(pprint (loop repeat 10 collecting
(loop repeat 1000 summing (funcall uc)))))
KGRlZnVuIGNvcnJlY3QgKGEgYikKICAoaWYgKD0gYSBiKSBuaWwgYSkpCiAgCihkZWZ1biBtYWtlLXVuYmlhc2VkLWNvaW4gKGJpYXNlZC1jb2luKQogIChsYW1iZGEgKCkKICAgIChsb29wIGZvciBhID0gKGZ1bmNhbGwgYmlhc2VkLWNvaW4pIHRoZW4gKGZ1bmNhbGwgYmlhc2VkLWNvaW4pCiAgICAgICAgICBhbmQgYiA9IChmdW5jYWxsIGJpYXNlZC1jb2luKSB0aGVuIChmdW5jYWxsIGJpYXNlZC1jb2luKQogICAgICAgICAgd2hpbGUgKG51bGwgKGNvcnJlY3QgYSBiKSkKICAgICAgICAgIGZpbmFsbHkgKHJldHVybiAoY29ycmVjdCBhIGIpKSkpKQoKKGxldCogKChiYyAobGFtYmRhICgpIChpZiAoPCA3IChyYW5kb20gMTApKSAwIDEpKSkKICAgICAgICh1YyAobWFrZS11bmJpYXNlZC1jb2luIGJjKSkpCiAgKHBwcmludCAobG9vcCByZXBlYXQgMTAgY29sbGVjdGluZwogICAgICAgICAgICAobG9vcCByZXBlYXQgMTAwMCBzdW1taW5nIChmdW5jYWxsIHVjKSkpKSk=