Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Uncategorized category for Unfair Dice by Rounin
def isAWinner(enemy_die, own_die):
if sum(enemy_die) != sum(own_die) or len(enemy_die) != len(own_die):
return False
wins = 0
losses = 0
halfoftotalthrows = len(own_die)*len(enemy_die) // 2
for digit1 in enemy_die:
for digit2 in own_die:
if digit2 > digit1:
wins += 1
elif digit1 > digit2:
losses += 1
if abs(wins-losses) > halfoftotalthrows:
break
if abs(wins-losses) > halfoftotalthrows:
break
return wins > losses
def winning_die(enemy_die, own_die=[], ownlength=0, last_digit=1):
if own_die == []:
own_die = [0]*len(enemy_die)
if len(enemy_die) - ownlength == 1:
final_digit = sum(enemy_die)-sum(own_die[0:ownlength])
if final_digit < last_digit:
own_die[ownlength] = 0
return []
else:
own_die[ownlength] = final_digit
ownlength += 1
halflen1 = len(enemy_die)//2
halflen2 = len(enemy_die) - halflen1
if ownlength == halflen2+1:
median = (own_die[halflen1] + own_die[halflen2]) / 2.0
enemedian = (enemy_die[halflen1] + enemy_die[halflen2]) / 2.0
if enemedian > median:
return []
if ownlength >= len(enemy_die):
return (own_die if isAWinner(enemy_die, own_die) else [])
for digit in range(last_digit, sum(enemy_die)-sum(own_die)-len(enemy_die)+ownlength+2):
own_die[ownlength] = digit
new_die = winning_die(enemy_die, own_die, ownlength+1, digit)
if new_die != []:
return new_die
own_die[ownlength] = 0
return []
if __name__ == '__main__':
#These are only used for self-checking and not necessary for auto-testing
def check_solution(func, enemy):
player = func(enemy)
total = 0
for p in player:
for e in enemy:
if p > e:
total += 1
elif p < e:
total -= 1
return total > 0
assert check_solution(winning_die, [3, 3, 3, 3, 6, 6]), "Threes and Sixes"
assert check_solution(winning_die, [4, 4, 4, 4, 4, 4]), "All Fours"
assert check_solution(winning_die, [1, 1, 1, 4]), "Unities and Four"
assert winning_die([1, 2, 3, 4, 5, 6]) == [], "All in row -- No die"
Oct. 13, 2017