OneCompiler

Hat Problem

1638

Example heading with h2 size

Example heading with h3 size

Following is sample java code.

import numpy as np
def createCheatSheet(k=10):  # create cheat sheet for the players
    lst=[(2,1,1),(1,2,1),(2,3,1),(1,1,2),(2,1,3),(1,2,3),(2,3,5)]   #build list of all sets groud up
    lstSz = [1,3,7] # how many elements of cheat sheet have been eliminated with each 'I don't know'
    lstSz_prev = 4
    lstSz_prevprev = 2
    
    for num in range(3,k): #count the number of elements in cheat sheet after each 'I don't know'
        newNums = lstSz_prev + lstSz_prevprev
        lstSz_prevprev = lstSz_prev
        lstSz_prev = newNums
        lstSz.append(lstSz[-1]+newNums)
    
    cheatSheet = np.zeros((lstSz[-1],3),dtype=int)
    for i in range(7):
        cheatSheet[i,:] = lst[i]
        
    for num in range(3,k):   # Build all sets - number of I don't know  
        pos = num % 3
        prevSz = lstSz[num-1]
        currSz = lstSz[num]
        newNums = currSz - prevSz
        for i in range(newNums):   # each I dont know adds new sets = previous 2 turns
            prevtp = cheatSheet[prevSz-newNums+i,:]
            newtp = [prevtp[0],prevtp[1],prevtp[2]]
            newtp[pos] = newtp[(pos+1)%3] + newtp[(pos+2)%3]
            cheatSheet[prevSz+i,:] = newtp
        print("CheatSheet Size (i,sz) "+str(num)+","+str(newNums))

    return (cheatSheet,lstSz)
    
def player(num1,num2,k,refData):
    if k==0:
        if num1==1 and num2==1:
            return 2
        else:
            return 0
        
    #create Tuple
    pos = (k % 3)
    newtp = [num1,num1,num2]
    newtp[pos] = num1+num2
    if pos==2: 
        newtp[1]=num2
    
    cheatSheet = refData[0]
    newSetIdx = refData[1]
    tempSheet = cheatSheet[newSetIdx[k-1]:newSetIdx[k],:]
    if np.any(np.all(tempSheet == newtp,axis=1)):
        return newtp[pos]
    return 0

def arbitor(num1,num2,num3):
    refData = createCheatSheet(20)  #create cheat sheet before starting the game
    tp = tuple([num1,num2,num3])
    for i in range(max(tp)+3):
        pos1 = min((i+1)%3,(i+2)%3)
        pos2 = max((i+1)%3,(i+2)%3)
        out = player(tp[pos1],tp[pos2],i,refData)
        if out:
            print("Player"+str(i%3)+" declares:"+str(out))
            return 0
        else:
            print("Player"+str(i%3)+": Dont Know (i):" + str(i+1))
    ValueError("should have finished")


arbitor(17,7,10)