Another week, another riddler. Here is this week’s problem:

*In Santa’s workshop, elves make toys during a shift each day. On the overhead radio, Christmas music plays, with a program randomly selecting songs from a large playlist.*

*During any given shift, the elves hear 100 songs. A cranky elf named Cranky has taken to throwing snowballs at everyone if he hears the same song twice. This has happened during about half of the shifts. One day, a mathematically inclined elf named Mathy tires of Cranky’s sodden outbursts. So Mathy decides to use what he knows to figure out how large Santa’s playlist actually is.*

*Help Mathy out: How large is Santa’s playlist?*

So to do this we used minimized N for the following

Each term represents the chance that the song is not a repeat — so the first song has a 0/N chance, so the chance that it is *not* that song is 1. This gets multiplied by the (1-1/N) for the second song, etc. etc.

This results in **7176 when our shift length is 100.** Next, we vary the shift length and find the resulting playlist length:

This, interestingly, follows the following equation for a playlist length of l and playlist length of N:

Now we know why the shift length is 100, its likely the total number of Christmas songs 🙂

import matplotlib.pyplot as plt
def num_songs_in_playlist(goal_prob,shift_len_in_songs):
prob = 0
songs_in_playlist = 200
while prob < goal_prob:
prob = 1
for i in range(shift_len_in_songs): prob = (1-(i/songs_in_playlist)) * prob
songs_in_playlist += 1
return songs_in_playlist
x = [i for i in range(50,200)]
y = [num_songs_in_playlist(0.5,i) for i in range(50,200)]
plt.xlabel("Shift Length (songs)")
plt.ylabel("Playlist Length")
plt.scatter(x,y)
plt.title("Santa's playlist length to ensure repeating\n probability 0.5 over various shift lengths")