from math import floor as MF
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
#Inputs and outputs are the same.
#unslappedSeq = A list of unslapped sequences each being a list of length seqlen, and integers from 1 to n.
#slappedSeq = A dictionary of integers from 1 to n, where the values are the number of slapped sequences that occur of that length.
#n = Number of values of cards in deck, from 1 to n.
#seqlen = Current sequence length of the iteration.
def produceAllSeq(unslappedSeq, slappedSeq, n, seqlen) :
#Sequences will add a new rightmost digit.
seqlen += 1
#Create an empty list for new unslapped sequences.
newUnslappedSeq = []
#For each sequence that has so far been unslapped...
for seq in unslappedSeq:
#Append any of the numbers being used to create a new sequence.
for i in range(1, n+1) :
nSeq = seq + [i]
#The new sequence is unslapped.
slapped = False
#But...
while not slapped:
#Looking at the top j cards.
for j in range(1, seqlen) :
#Looking at the top k cards under the top j cards.
for k in range(1, seqlen-j+1) :
#See if their sums are the same.
if np.array(nSeq[(seqlen-j):seqlen]).sum() == np.array(nSeq[(seqlen-j-k):(seqlen-j)]).sum() :
#Slap 'em! Breaks out of loop.
slapped = True
#This new sequence is unslapped. Break out of loop.
break
#The new sequence is either slapped or not.
if slapped:
slappedSeq.append(nSeq)
# l = len(nSeq)
# if l in slappedSeq.keys() :
# slappedSeq[l] += 1
# else :
# slappedSeq[l] = 1
else:
newUnslappedSeq.append(nSeq)
#As long as there are unslapped sequences, keep going.
if len(newUnslappedSeq) > 0 :
return(produceAllSeq(newUnslappedSeq, slappedSeq, n, seqlen))
#Return.
else:
return(newUnslappedSeq, slappedSeq, n, seqlen)
stats = {}
for i in range(1, 8):
data = produceAllSeq([[]], {}, i, 0)
stats[i] = data[1]
print("A deck of cards with values from 1 to " + str(i) + " produce a maximum unslapped sequence length of " + str(data[3]-1) + ".")
A deck of cards with values from 1 to 1 produce a maximum unslapped sequence length of 1. A deck of cards with values from 1 to 2 produce a maximum unslapped sequence length of 3. A deck of cards with values from 1 to 3 produce a maximum unslapped sequence length of 7. A deck of cards with values from 1 to 4 produce a maximum unslapped sequence length of 9. A deck of cards with values from 1 to 5 produce a maximum unslapped sequence length of 15. A deck of cards with values from 1 to 6 produce a maximum unslapped sequence length of 21. A deck of cards with values from 1 to 7 produce a maximum unslapped sequence length of 31.
stats
{1: {2: 1}, 2: {2: 2, 3: 2, 4: 4}, 3: {2: 3, 3: 10, 4: 20, 5: 8, 6: 8, 7: 8, 8: 12}, 4: {2: 4, 3: 20, 4: 64, 5: 121, 6: 204, 7: 260, 8: 234, 9: 23, 10: 4}, 5: {2: 5, 3: 36, 4: 156, 5: 471, 6: 1167, 7: 2148, 8: 3002, 9: 2929, 10: 2573, 11: 1990, 12: 1746, 13: 1446, 14: 1364, 15: 1169, 16: 555}, 6: {2: 6, 3: 54, 4: 310, 5: 1342, 6: 4708, 7: 12895, 8: 28752, 9: 54525, 10: 93410, 11: 143939, 12: 195384, 13: 226855, 14: 223362, 15: 172482, 16: 91070, 17: 26133, 18: 7680, 19: 2661, 20: 1050, 21: 283, 22: 30}, 7: {2: 7, 3: 78, 4: 556, 5: 3047, 6: 13601, 7: 49325, 8: 151935, 9: 411215, 10: 979439, 11: 2025789, 12: 3650947, 13: 5699102, 14: 7606116, 15: 8572973, 16: 8192625, 17: 6875468, 18: 5336302, 19: 3761643, 20: 2353005, 21: 1298837, 22: 655673, 23: 316419, 24: 145537, 25: 58154, 26: 21686, 27: 8837, 28: 4353, 29: 2121, 30: 1233, 31: 608, 32: 154}}
produceAllSeq([[]], [], 3, 0)[1][-12:]
[[1, 3, 2, 3, 1, 3, 2, 1], [1, 3, 2, 3, 1, 3, 2, 2], [1, 3, 2, 3, 1, 3, 2, 3], [2, 3, 1, 3, 2, 3, 1, 1], [2, 3, 1, 3, 2, 3, 1, 2], [2, 3, 1, 3, 2, 3, 1, 3], [3, 1, 3, 2, 3, 1, 3, 1], [3, 1, 3, 2, 3, 1, 3, 2], [3, 1, 3, 2, 3, 1, 3, 3], [3, 2, 3, 1, 3, 2, 3, 1], [3, 2, 3, 1, 3, 2, 3, 2], [3, 2, 3, 1, 3, 2, 3, 3]]
produceAllSeq([[]], [], 4, 0)[1][-4:]
[[1, 4, 3, 4, 2, 4, 3, 4, 1, 1], [1, 4, 3, 4, 2, 4, 3, 4, 1, 2], [1, 4, 3, 4, 2, 4, 3, 4, 1, 3], [1, 4, 3, 4, 2, 4, 3, 4, 1, 4]]