1

I am currently working on a dice game programme agent in which the rules include that if there are two or more dice with the same value these values are flipped to the opposite numbers contributing to the overall score.

Currently I am trying to take the values from the dice as a tuple (e.g. 1,1,2), and return those same duplicates to the agent in the form of a dictionary at the same indexes provided to return the dice to be flipped.

I have hard coded in the values at the moment with the following function:

    
    if state[0] == state[1] == state[2]:
        duplicates = {}
        duplicates[0] = state[0]
        duplicates[1] = state[1]
        duplicates[2] = state[2]
        return duplicates
    elif state[0] == state[1]:
        duplicates = {}
        duplicates[0] = state[0]
        duplicates[1] = state[1]
        return duplicates
    elif state[1] == state[2]:
        duplicates = {}
        duplicates[1] = state[1]
        duplicates[2] = state[2]
        return duplicates
    elif state[0] == state[2]:
        duplicates = {}
        duplicates[0] = state[0]
        duplicates[2] = state[2]
        
    duplicates = {}
    return duplicates

Where state is the current dice. However I am trying to make a more general function which would account for e.g. 2 or 5 dice. Does anyone know how I can extract this info and store it in the duplicates dict at the same indexes a bit better please?

Thank you so much:)

nidorina
  • 13
  • 2

1 Answers1

0

There are many ways to find duplicates in a tuple/list, see How do I find the duplicates in a list and create another list with them?

in your particular case you can do, among many other things

count_reps = {}
for s in state:
    count_reps[s] = count_reps.get(s,0)+1

duplicates = {n:s for n,s in enumerate(state) if count_reps[s] > 1}

we use a helper dictionary count_reps where for each value in the tuple we store how many times it appears. Than we use it to populate duplicates from state

eg for state = (2,2,3,3,1,2) count_reps looks like this:

{2: 3, 3: 2, 1: 1}

and duplicates looks like

{0: 2, 1: 2, 2: 3, 3: 3, 5: 2}
piterbarg
  • 8,089
  • 2
  • 6
  • 22
  • Ahh thank you so much @piterbarg, I actually had seen this question and answer but your response really helped me to understand what was going on and where. I was getting so many errors to do with not being able to iterate over tuples etc. that I thought there was a specific way to do this. I really really appreciate you taking the time to help me, I have been puzzling over it for days :) – nidorina Jan 30 '22 at 16:44