def next_permutation(L):
'''
Permute the list L in-place to generate the next lexicographic permutation.
Return True if such a permutation exists, else return False.
'''
n = len(L)
#------------------------------------------------------------
# Step 1: find rightmost position i such that L[i] < L[i+1]
i = n - 2
while i >= 0 and L[i] >= L[i+1]:
i -= 1
if i == -1:
return False
#------------------------------------------------------------
# Step 2: find rightmost position j to the right of i such that L[j] > L[i]
j = i + 1
while j < n and L[j] > L[i]:
j += 1
j -= 1
#------------------------------------------------------------
# Step 3: swap L[i] and L[j]
L[i], L[j] = L[j], L[i]
#------------------------------------------------------------
# Step 4: reverse everything to the right of i
left = i + 1
right = n - 1
while left < right:
L[left], L[right] = L[right], L[left]
left += 1
right -= 1
return True
#-------------------------------------------------------------------
#-------------------------------------------------------------------
def example():
count_in_church = 0
total_permutations = 0
k = 10
L = k*[0] + k*[1]
while True:
total_permutations += 1
# check if bride steps into church by checking if
# the number of ones exceeds the number of zeros
cnt_0 = 0
cnt_1 = 0
for c in L:
if c == 0: cnt_0 += 1
else: cnt_1 += 1
if cnt_1 > cnt_0:
count_in_church += 1
break
if not next_permutation(L):
break
print("number of times bride entered church: ", count_in_church)
print("total permutations:", total_permutations)
print("probability:", count_in_church / total_permutations)
#----------------------------------------------------------------
if __name__ == "__main__":
example()
CmRlZiBuZXh0X3Blcm11dGF0aW9uKEwpOgogICAgJycnCiAgICBQZXJtdXRlIHRoZSBsaXN0IEwgaW4tcGxhY2UgdG8gZ2VuZXJhdGUgdGhlIG5leHQgbGV4aWNvZ3JhcGhpYyBwZXJtdXRhdGlvbi4KICAgIFJldHVybiBUcnVlIGlmIHN1Y2ggYSBwZXJtdXRhdGlvbiBleGlzdHMsIGVsc2UgcmV0dXJuIEZhbHNlLgogICAgJycnCiAgICAgCiAgICBuID0gbGVuKEwpCiAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIyBTdGVwIDE6IGZpbmQgcmlnaHRtb3N0IHBvc2l0aW9uIGkgc3VjaCB0aGF0IExbaV0gPCBMW2krMV0KICAgIGkgPSBuIC0gMgogICAgd2hpbGUgaSA+PSAwIGFuZCBMW2ldID49IExbaSsxXToKICAgICAgICBpIC09IDEKICAgICAKICAgIGlmIGkgPT0gLTE6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIyBTdGVwIDI6IGZpbmQgcmlnaHRtb3N0IHBvc2l0aW9uIGogdG8gdGhlIHJpZ2h0IG9mIGkgc3VjaCB0aGF0IExbal0gPiBMW2ldCiAgICBqID0gaSArIDEKICAgIHdoaWxlIGogPCBuIGFuZCBMW2pdID4gTFtpXToKICAgICAgICBqICs9IDEKICAgIGogLT0gMQogICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAjIFN0ZXAgMzogc3dhcCBMW2ldIGFuZCBMW2pdCiAgICBMW2ldLCBMW2pdID0gTFtqXSwgTFtpXQogICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAjIFN0ZXAgNDogcmV2ZXJzZSBldmVyeXRoaW5nIHRvIHRoZSByaWdodCBvZiBpCiAgICBsZWZ0ID0gaSArIDEKICAgIHJpZ2h0ID0gbiAtIDEKIAogICAgd2hpbGUgbGVmdCA8IHJpZ2h0OgogICAgICAgIExbbGVmdF0sIExbcmlnaHRdID0gTFtyaWdodF0sIExbbGVmdF0KICAgICAgICBsZWZ0ICs9IDEKICAgICAgICByaWdodCAtPSAxCiAgICAgICAgICAgICAKICAgIHJldHVybiBUcnVlCgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpkZWYgZXhhbXBsZSgpOgogICAgY291bnRfaW5fY2h1cmNoID0gMAogICAgdG90YWxfcGVybXV0YXRpb25zID0gMAogICAgayA9IDEwCiAgICBMID0gaypbMF0gKyBrKlsxXQogCiAgICB3aGlsZSBUcnVlOgogICAgICAgIHRvdGFsX3Blcm11dGF0aW9ucyArPSAxCgogICAgICAgICMgY2hlY2sgaWYgYnJpZGUgc3RlcHMgaW50byBjaHVyY2ggYnkgY2hlY2tpbmcgaWYKICAgICAgICAjIHRoZSBudW1iZXIgb2Ygb25lcyBleGNlZWRzIHRoZSBudW1iZXIgb2YgemVyb3MKICAgICAgICBjbnRfMCA9IDAKICAgICAgICBjbnRfMSA9IDAKICAgICAgICAgIAogICAgICAgIGZvciBjIGluIEw6CiAgICAgICAgICAgIGlmIGMgPT0gMDogY250XzAgKz0gMQogICAgICAgICAgICBlbHNlOiBjbnRfMSArPSAxCgogICAgICAgICAgICBpZiBjbnRfMSA+IGNudF8wOgogICAgICAgICAgICAgICAgY291bnRfaW5fY2h1cmNoICs9IDEKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgCiAgICAgICAgaWYgbm90IG5leHRfcGVybXV0YXRpb24oTCk6CiAgICAgICAgICAgIGJyZWFrCgogICAgcHJpbnQoIm51bWJlciBvZiB0aW1lcyBicmlkZSBlbnRlcmVkIGNodXJjaDogIiwgY291bnRfaW5fY2h1cmNoKQogICAgcHJpbnQoInRvdGFsIHBlcm11dGF0aW9uczoiLCB0b3RhbF9wZXJtdXRhdGlvbnMpCiAgICBwcmludCgicHJvYmFiaWxpdHk6IiwgY291bnRfaW5fY2h1cmNoIC8gdG90YWxfcGVybXV0YXRpb25zKQogCiAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgZXhhbXBsZSgpCg==