Here's some python code which goes through all the possibilities, spitting out the best solution found so far. It takes a little while to run through everything, as you might expect. It seems to pause for a while, and then have sudden bursts of activity. It's probably somewhat slow simply because it's having to print so many solutions. Mine's been running for 20 minutes or so, and has converged onto a bunch of solutions with a score of 13/18 (as @Timbo found).
The logic of the code (for those who are interested is):
- Generate all the possible dice (there are 462 of them)
- For each dice, generate a list of dice that are "above" them (ie has a >50% probability that it beats it) - this is oneAway in the code.
- For each dice, generate a list of dice are are twoAway (using the above list).
- Using the above find all the dice that are 4 away from themselves (using the above) - there are 398 dice that do that.
- Using the above we can systematically go through all the loops of four.
It took more than an hour to run, partly because it went through all the results 4 times, which is an obvious improvement opportunity (edit - fixed that with the two discard lines near the bottom)! And in the end it found 11 results that matched the above solution:
115555 222266 333333 333334 13/18
115555 222266 333333 333344 13/18
115555 222266 333333 333444 13/18
115555 222266 333333 334444 13/18
115555 222266 333333 344444 13/18
115555 222266 333333 444444 13/18
115555 222266 333334 444444 13/18
115555 222266 333344 444444 13/18
115555 222266 333444 444444 13/18
115555 222266 334444 444444 13/18
115555 222266 344444 444444 13/18
Python Code:
import numpy as np
from fractions import Fraction
import itertools as it
from collections import defaultdict
class dice:
def __init__(self,faces):
self.faces = faces #a numpy array of 6 numbers
def beats(self,other):
"probability that self beats other"
if np.all(self.faces==other.faces): return (0,1)
a = np.tile(self.faces,(6,1))
b = np.tile(other.faces.reshape(6,1),6)
return (np.sum(a>b),np.sum(a!=b))
def __repr__(self):
return "dice(%s)"%self.faces
def __str__(self):
return "%s%s%s%s%s%s"%tuple(self.faces)
def score(dice1,dice2,dice3,dice4):
n1,d1 = dice2.beats(dice1)
n2,d2 = dice3.beats(dice2)
n3,d3 = dice4.beats(dice3)
n4,d4 = dice1.beats(dice4)
return Fraction(n1,d1*4)+Fraction(n2,d2*4)+Fraction(n3,d3*4)+Fraction(n4,d4*4)
print("Generating a list of dice...",)
allDice = []
for a in it.combinations_with_replacement(range(1,7),6):
allDice.append(dice(np.array(a)))
print("done! %d dice generated"%len(allDice))
print("Generating oneAway...",)
oneAway = defaultdict(list)
for dice1 in allDice:
for dice2 in allDice:
n,d = dice2.beats(dice1)
if n*2<=d: continue
oneAway[dice1].append(dice2)
print("done! %d dice available"%len(oneAway))
print("Generating twoAway...",)
twoAway = defaultdict(set)
for dice1 in allDice:
for dice2 in oneAway[dice1]:
twoAway[dice1].update(oneAway[dice2])
print("done!")
print("Generating fourAway...",)
fourAway = defaultdict(set)
for dice1 in allDice:
for dice2 in twoAway[dice1]:
fourAway[dice1].update(twoAway[dice2])
print("done!")
print("Generating candidates...")
candidates=[]
for dice1 in allDice:
if dice1 in fourAway[dice1]:
candidates.append(dice1)
print("done!",len(candidates))
print("Searching for results...")
maxScore=0
for dice1 in candidates:
for dice3 in twoAway[dice1]:
if dice1 not in twoAway[dice3]: continue
for dice2 in oneAway[dice1]:
if dice3 not in oneAway[dice2]: continue
for dice4 in oneAway[dice3]:
if dice1 not in oneAway[dice4]: continue
s = score(dice1,dice2,dice3,dice4)
if s>=maxScore:
maxScore = s
print(dice1,dice2,dice3,dice4,s)
for a in oneAway: oneAway[a].discard(dice1)
for a in twoAway: twoAway[a].discard(dice1)
print("done!")
Update: I noticed that the OP allows for 0-6, so adjusted the relevant line in the code and re-ran it. This yields additional solutions (for a total of 220), but still nothing better than 13/18:
004444 111155 222222 333333 13/18
004444 111155 222222 222223 13/18
004444 111155 222222 222233 13/18
004444 111155 222222 222333 13/18
004444 111155 222222 223333 13/18
004444 111155 222222 233333 13/18
004444 111156 222222 333333 13/18
004444 111156 222222 222223 13/18
004444 111156 222222 222233 13/18
004444 111156 222222 222333 13/18
004444 111156 222222 223333 13/18
004444 111156 222222 233333 13/18
004444 111166 222222 333333 13/18
004444 111166 222222 222223 13/18
004444 111166 222222 222233 13/18
004444 111166 222222 222333 13/18
004444 111166 222222 223333 13/18
004444 111166 222222 233333 13/18
004444 111155 222223 333333 13/18
004444 111156 222223 333333 13/18
004444 111166 222223 333333 13/18
004444 111155 222233 333333 13/18
004444 111156 222233 333333 13/18
004444 111166 222233 333333 13/18
004444 111155 222333 333333 13/18
004444 111156 222333 333333 13/18
004444 111166 222333 333333 13/18
004444 111155 223333 333333 13/18
004444 111156 223333 333333 13/18
004444 111166 223333 333333 13/18
004444 111155 233333 333333 13/18
004444 111156 233333 333333 13/18
004444 111166 233333 333333 13/18
004445 111166 222222 333333 13/18
004445 111166 222222 222223 13/18
004445 111166 222222 222233 13/18
004445 111166 222222 222333 13/18
004445 111166 222222 223333 13/18
004445 111166 222222 233333 13/18
004445 111166 222223 333333 13/18
004445 111166 222233 333333 13/18
004445 111166 222333 333333 13/18
004445 111166 223333 333333 13/18
004445 111166 233333 333333 13/18
004455 111166 222222 333333 13/18
004455 111166 222222 222223 13/18
004455 111166 222222 222233 13/18
004455 111166 222222 222333 13/18
004455 111166 222222 223333 13/18
004455 111166 222222 233333 13/18
004455 111166 222223 333333 13/18
004455 111166 222233 333333 13/18
004455 111166 222333 333333 13/18
004455 111166 223333 333333 13/18
004455 111166 233333 333333 13/18
004555 111166 222222 333333 13/18
004555 111166 222222 222223 13/18
004555 111166 222222 222233 13/18
004555 111166 222222 222333 13/18
004555 111166 222222 223333 13/18
004555 111166 222222 233333 13/18
004555 111166 222223 333333 13/18
004555 111166 222233 333333 13/18
004555 111166 222333 333333 13/18
004555 111166 223333 333333 13/18
004555 111166 233333 333333 13/18
005555 111166 233334 444444 13/18
005555 111166 233344 444444 13/18
005555 111166 233444 444444 13/18
005555 111166 234444 444444 13/18
005555 111166 244444 444444 13/18
005555 111266 333333 333334 13/18
005555 111266 333333 333344 13/18
005555 111266 333333 333444 13/18
005555 111266 333333 334444 13/18
005555 111266 333333 344444 13/18
005555 111266 333333 444444 13/18
005555 122266 333333 333334 13/18
005555 122266 333333 333344 13/18
005555 122266 333333 333444 13/18
005555 122266 333333 334444 13/18
005555 122266 333333 344444 13/18
005555 122266 333333 444444 13/18
005555 112266 333333 333334 13/18
005555 112266 333333 333344 13/18
005555 112266 333333 333444 13/18
005555 112266 333333 334444 13/18
005555 112266 333333 344444 13/18
005555 112266 333333 444444 13/18
005555 222266 333333 333334 13/18
005555 222266 333333 333344 13/18
005555 222266 333333 333444 13/18
005555 222266 333333 334444 13/18
005555 222266 333333 344444 13/18
005555 222266 333333 444444 13/18
005555 111166 333333 333334 13/18
005555 111166 333333 333344 13/18
005555 111166 333333 333444 13/18
005555 111166 333333 334444 13/18
005555 111166 333333 344444 13/18
005555 111166 333333 444444 13/18
005555 111266 333334 444444 13/18
005555 122266 333334 444444 13/18
005555 112266 333334 444444 13/18
005555 222266 333334 444444 13/18
005555 111166 333334 444444 13/18
005555 111266 333344 444444 13/18
005555 122266 333344 444444 13/18
005555 112266 333344 444444 13/18
005555 222266 333344 444444 13/18
005555 111166 333344 444444 13/18
005555 111266 333444 444444 13/18
005555 122266 333444 444444 13/18
005555 112266 333444 444444 13/18
005555 222266 333444 444444 13/18
005555 111166 333444 444444 13/18
005555 111166 222222 233334 13/18
005555 111166 222222 233344 13/18
005555 111166 222222 233444 13/18
005555 111166 222222 234444 13/18
005555 111166 222222 244444 13/18
005555 111166 222222 333333 13/18
005555 111166 222222 333334 13/18
005555 111166 222222 333344 13/18
005555 111166 222222 333444 13/18
005555 111166 222222 222223 13/18
005555 111166 222222 222224 13/18
005555 111166 222222 222233 13/18
005555 111166 222222 222234 13/18
005555 111166 222222 222244 13/18
005555 111166 222222 222333 13/18
005555 111166 222222 222334 13/18
005555 111166 222222 222344 13/18
005555 111166 222222 222444 13/18
005555 111166 222222 223333 13/18
005555 111166 222222 223334 13/18
005555 111166 222222 223344 13/18
005555 111166 222222 223444 13/18
005555 111166 222222 224444 13/18
005555 111166 222222 233333 13/18
005555 111166 222222 334444 13/18
005555 111166 222222 344444 13/18
005555 111166 222222 444444 13/18
005555 111166 222223 333333 13/18
005555 111166 222223 333334 13/18
005555 111166 222223 333344 13/18
005555 111166 222223 333444 13/18
005555 111166 222223 334444 13/18
005555 111166 222223 344444 13/18
005555 111166 222223 444444 13/18
005555 111166 222224 444444 13/18
005555 111166 222233 333333 13/18
005555 111166 222233 333334 13/18
005555 111166 222233 333344 13/18
005555 111166 222233 333444 13/18
005555 111166 222233 334444 13/18
005555 111166 222233 344444 13/18
005555 111166 222233 444444 13/18
005555 111166 222234 444444 13/18
005555 111166 222244 444444 13/18
005555 111166 222333 333333 13/18
005555 111166 222333 333334 13/18
005555 111166 222333 333344 13/18
005555 111166 222333 333444 13/18
005555 111166 222333 334444 13/18
005555 111166 222333 344444 13/18
005555 111166 222333 444444 13/18
005555 111166 222334 444444 13/18
005555 111166 222344 444444 13/18
005555 111166 222444 444444 13/18
005555 111166 223333 333333 13/18
005555 111166 223333 333334 13/18
005555 111166 223333 333344 13/18
005555 111166 223333 333444 13/18
005555 111166 223333 334444 13/18
005555 111166 223333 344444 13/18
005555 111166 223333 444444 13/18
005555 111166 223334 444444 13/18
005555 111166 223344 444444 13/18
005555 111166 223444 444444 13/18
005555 111166 224444 444444 13/18
005555 111166 233333 333333 13/18
005555 111166 233333 333334 13/18
005555 111166 233333 333344 13/18
005555 111166 233333 333444 13/18
005555 111166 233333 334444 13/18
005555 111166 233333 344444 13/18
005555 111166 233333 444444 13/18
005555 111266 334444 444444 13/18
005555 122266 334444 444444 13/18
005555 112266 334444 444444 13/18
005555 222266 334444 444444 13/18
005555 111166 334444 444444 13/18
005555 111266 344444 444444 13/18
005555 122266 344444 444444 13/18
005555 112266 344444 444444 13/18
005555 222266 344444 444444 13/18
005555 111166 344444 444444 13/18
015555 222266 333333 333334 13/18
015555 222266 333333 333344 13/18
015555 222266 333333 333444 13/18
015555 222266 333333 334444 13/18
015555 222266 333333 344444 13/18
015555 222266 333333 444444 13/18
015555 222266 333334 444444 13/18
015555 222266 333344 444444 13/18
015555 222266 333444 444444 13/18
015555 222266 334444 444444 13/18
015555 222266 344444 444444 13/18
115555 222266 333333 333334 13/18
115555 222266 333333 333344 13/18
115555 222266 333333 333444 13/18
115555 222266 333333 334444 13/18
115555 222266 333333 344444 13/18
115555 222266 333333 444444 13/18
115555 222266 333334 444444 13/18
115555 222266 333344 444444 13/18
115555 222266 333444 444444 13/18
115555 222266 334444 444444 13/18
115555 222266 344444 444444 13/18
Each face of each die can contain any number from the set of integers 1-6
and the example set includes faces of value 0. $\endgroup$