This is a tool created to aid crossword constructors in selecting a grid shape for their puzzle, that is, which cells in the crossword will be black and which will be white. Currently, this is a part of the process that involves a lot of guesswork, and serves as a barrier to entry for new constructors. There exist many tools to aid in other stages of crossword construction, which have been a great boon to the hobby. These include massive word lists with ranked word scores, autofill algorithms, and grid libraries. The goal of this tool is not to generate a whole puzzle from nothing, as I believe human guided construction and fill is essential to an interesting and entertaining puzzle.
Most crosswords include what are termed "spanners", long answers that cross the grid either horizontally or vertically. In a themed puzzle, these share a common theme, while in an unthemed puzzle they are usually unrelated. Either way, it is easy to see that these answers restrict the rest of the words in the grid, or "fill", more than any other aspect of the puzzle. Likewise, these are generally the first answers placed in the grid, which is then designed around them. A constructor may test out dozens of grid shapes before settling on one which works well for their spanners. This is the part of the process which I believe can be improved upon.
To use this tool, a constructor simply inputs their spanners, which serve as seeds for the algorithm, and will be returned a ranked list of "least constrained grid shapes." These are the grid shapes which provide the most different options in filling the puzzle, providing the constructor with more choices in doing so. This should result in puzzles with less "crosswordese" (words or abbreviations found almost exclusively in or vastly overrepresented in crosswords) and a greater variety of fill, meaning more fun for solvers!
The algorithm works by first stochastically generating grid shapes that will accept spanners of the given lengths. While it would be easier to simply choose these from a library, I believe stochastic generation of grid shapes should result in a wider variety of such, as a very small fraction of all possible legal grid shapes have been published. This group serves as the initial generation in an evolutionary algorithm. Fitness is measured by brute force filling grids at random, timing the length and counting number of attempts to successful fill, and then averaging this metric over multiple trials. This should serve as a proxy for the magnitude of the number of different ways to fill the given grid shape, as actually enumerating all possible fills would be extremely computationally intensive. The best performing grid shapes are then selected to give rise to subsequent generations.
This tool aims to create playlists based on a user's listening habits. To do this, it pulls the user's listening history from Last.fm, a site which tracks each instance of a listen to a song. These instances are referred to as "scrobbles." At their core, playlists are a grouping of tracks related to each other in some way. Often, playlists are designed to be cohesive in terms of mood, genre, and sound. This is the kind of playlist whose creation I have sought to automate with this project.
The underlying premise is that on average, tracks played in relative proximity to each other are more likely to be related in this way than tracks that are not played in relative proximity to each other. Over time, listeners are naturally building up a network of these track relationships by the way they listen to music. An auto-generated playlist can then be created by the user simply by seeding it with the selection of a few tracks. Tracks which are most closely linked by the network to these seed tracks are then used to fill out the rest of the playlist.
The playlist can also be tuned simply by tweaking several hyperparameters such as node distance and pruning, or filtered by different track characteristics such as genre or tempo. In the future, I hope to expand this tool to explore other users track proximity webs, which would increase network breadth and density, allowing for more diverse playlist generation. The trade-off with this approach is that playlists would not be as tuned to a user's personal listening habits.
This project is under early development but aims to automate skipping ads in Spotify podcasts. Many Spotify podcasts have ads embedded directly into the track, as opposed to playing over it as a pop-up. This allows the user to trivially skip ahead to the point where the podcast content resumes. This is not a big deal, but can be annoying when listening to a podcast while driving, in the shower, doing chores, or any activity where either the user's hands are both engaged or the device is not easily accessible.
Through the Spotify API, by randomly sampling the podcast content, a model can be trained to detect when an ad is playing, and search in the vicinity of the ad to find the start and end points. The API can then be used to seek to the endpoint of the ad once the startpoint of the ad is reached, providing a seamless listening experience.