import sys
from itertools import permutations
from itertools import combinations_with_replacement
good = set()
bad = set()
uniquerolls = set()
def looptest(o, i, j, k , l):
# firstdice are the only possible solutions for the first two dice
firstdice = ["43", "34", "52", "25", "61", "16", "51", "15", "62", "26", "53", "35", "44"]
flag = 0
# see if the first two die add to 5, 6, 7 or 8
# if they do, test the other two dice
case = o[i] + o[j]
if case in firstdice:
flag = check(o, int(o[k]), int(o[l]), int(o[i]) + int(o[j]))
return(flag)
def check(o, i,j,pair):
# these are the rules for determining if you can deal to the aces depending on the sum of the first two dice
if pair == 6:
# if the first two dice add to 6, then one of the other two must be six to work
if i == 6 or j == 6:
return(1)
elif pair == 7:
# if the first two dice add to 7 then then one of the other two must be a 5 or a 6 to work
if i == 5 or i == 6 or j == 5 or j == 6:
return (1)
elif pair == 8:
if (i + j == 6) or (i + j) == 7 or (i + j == 8):
return (1)
return(0)
def main():
# uniquerolls equals all possible combinations with replacemenst of four die (126)
uniquerolls = list(p for p in combinations_with_replacement("123456",4))
# there are permutations of the dice to test
for i in uniquerolls:
roll = [i[0],i[1],i[2],i[3]] # convert the string into a list of charactes
perms = (p for p in permutations("0123")) # set up all permutations of the four dice so we can look at each pair
for j in perms:
# check the permutations of this roll looking for a solution
flag = looptest(roll, int(j[0]), int(j[1]), int(j[2]), int(j[3]))
if (flag == 1):
roll.sort() # sort the roll and add it to the good set. Sorting makes sure we only add one roll
good.add(str(roll[0]) + str(roll[1]) + str(roll[2]) + str(roll[3]))
break # found a good roll so don't check any more permutations
if (flag == 0):
roll.sort()
bad.add(str(roll[0]) + str(roll[1]) + str(roll[2]) + str(roll[3]))
print("bad", len(bad))
print("good", len(good))
print("unique rolls", len(list(uniquerolls)))
print(sorted(good))
print(sorted(bad))
over, under = 0,0
for i in bad:
if int(i[0])+int(i[1])+int(i[2])+int(i[3]) > 13:
over = over + 1
else:
under = under + 1
print("over",over,"under",under)
main()