Skip to content

Instantly share code, notes, and snippets.

@arpruss
Created February 6, 2021 23:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arpruss/014617df262098d7b1797df0ae87e465 to your computer and use it in GitHub Desktop.
Save arpruss/014617df262098d7b1797df0ae87e465 to your computer and use it in GitHub Desktop.
from time import time
import sys
import random
players = ["A","M","R"]
random.shuffle(players)
decode1 = [ (0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0) ]
serves = [ 0 for i in range(3*6) ]
singles = [ 2 for i in range(6) ] + [ 0 for i in range(6) ] + [ 2 for i in range(6) ]
def checkSet(x):
s = set()
for i in range(6):
z = x % 6
if z in s:
return False
s.add(z)
x //= 6
return True
def decode(x):
s = []
for i in range(6):
s.append(decode1[x % 6])
x //= 6
return s
def nextComboForceStart(start):
for i in range(6**5):
x = i * 6 + start
if checkSet(x):
yield x
def nextCombo():
for i in range(6**6):
if checkSet(i):
yield i
fullCombos = [x for x in nextCombo()]
t = time()
count = 0
def inRow(check, n):
c = 0
for i in range(6*3):
if check(i):
c += 1
if c >= n:
return True
else:
c = 0
return False
def singleServeSingle(sequence, player):
c = 0
for i in range(6*3-2):
if sequence[i][player] == singles[i] and sequence[i+1][player] == serves[i+1] and sequence[i+2][player] == singles[i+2]:
return True
return False
def dumpGame(s,players):
out = [None,None,None]
for i in range(3):
out[s[i]] = players[i]
print(",".join(out))
def dump(sequence, players):
print("Server,Server's Partner,Receiver")
for i in range(6):
dumpGame(sequence[i],players)
print("Server,Receiver-Deuce,Receiver-Ad")
for i in range(6):
dumpGame(sequence[6+i],players)
print("Server,Server's Partner,Receiver")
for i in range(6):
dumpGame(sequence[12+i],players)
for a in nextComboForceStart(0):
for b in fullCombos:
for c in fullCombos:
sequence = decode(a) + decode(b) + decode(c)
for player in range(3):
if ( inRow(lambda pos: sequence[pos][player] == serves[pos], 2) or
inRow(lambda pos: sequence[pos][player] == singles[pos], 2) or
singleServeSingle(sequence, player) or
inRow(lambda pos: sequence[pos][player] == serves[pos] or sequence[pos][player] == singles[pos], 4)
):
break
else:
dump(sequence,players)
sys.exit(0)
print(sequence)
count += 1
print(count)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment