2023 NLL Off-season Report, Part II

This has been a very busy off-season in the NLL. I wrote back in August about a whole bunch of changes, and now only a month later, there are a whole bunch more. And that’s not even considering the 2023 entry draft which just happened. Let’s have a look at the big deals and changes across the league, and one thing that’s not part of the NLL but affects a lot of NLL people: the Mann Cup.

We still have a couple of months until training camps start, so don’t be surprised if there’s an Off-season report, Part III.

Continue reading

The NLL Immaculate Grid

About a week ago, someone asked me if my NLL stats database could help create an “immaculate grid” game for the NLL. I had never heard of an immaculate grid, so I looked it up. For those of you who are as uninformed as I was, it’s a game where you have a grid of three columns and three rows, and each column and row has a “category”, like players who played for a specific team, or players who have accomplished some statistical feat. The idea is to find a player who matches the categories for both the column he is in and the row he is in, and to do this for all nine combinations of row and column categories.

For example, say we have a column with the category “Played for Colorado Mammoth” and a row that says “Played for Halifax Thunderbirds”, you need to find players who have played for both of these teams. In this case, there are only six matches so you could enter Rhys Duch, Connor Watson, Ryan Benesch, Mike Burke, Stephen Keogh, or Chet Koneczny and you’d be right. For things like “Played with Buffalo Bandits” and “Played with Toronto Rock”, there are 51 players who match both, and there are an amazing 76 players who have played for both the Bandits and the original Knighthawks.

There are nine squares to fill in, and you get nine guesses before you are done. You can fill in any number of player names and then click “Guess”, and you are told how many you got right. Note that you are not told which ones you got right, just the number. The fewer guesses you take to get all nine correct, the better. Of course, there are no prizes except bragging rights.

Like I said, I’d never heard of the game but it’s pretty easy to understand. I knew my database contains enough information to create this game, so I did. It was actually quite simple. Here’s how it works.

I created a Javascript program that reads the database and creates one category for each team it finds. I limited it to those teams who played at least one season after 2000 since the data on older teams (teams like the Washington Wave, Detroit Turbos, Baltimore Thunder, etc.) isn’t always complete. I also added some statistical categories in there, like 1000 points or 400 goals in a career, 100 points or 50 goals in a season, and 6 goals or 10 points in a game. This program picks six random categories (three rows and three columns). For each row/column pair, we make a list of players who match the first category and a separate list of players who match the second category. Then we find the players who appear in both lists. If there is any row/column pair that has no players in common, we throw this option out and start over. For example, the intersection of “Played for Columbus Landsharks” and “Played for Georgia Swarm” contains no players, so any grid containing that combination is thrown out.

Screenshot of NLL Grid

I believe for a baseball immaculate grid game, you are also required to pick different players for each of the nine grid spots, even if one player qualifies more than once. However I relaxed that restriction because the NLL only has 30-odd seasons and a total of a little over 1700 players. One of the grids created while I was testing this contained a column for “Played for Vancouver Warriors” and two of the rows were “Scored 100 points in a season” and “Scored 1000 career points”. The only player who matches both* is Shawn Evans, so the “unique player” restriction would make this grid impossible to solve.

* – This is not true. Mitch Jones played for the Warriors and also scored 100 points in a season, but his 100 points was split over two different teams. This doesn’t negate his accomplishment, but it means that the way I match the categories won’t find it. I could fix it but it’s a lot of work (not for me – the extra work would have to be done every time the site loads which would make it slower for everyone) and Jones is literally the only player in NLL history who falls into that category. I have some ideas on other ways to fix it but for now, we have this restriction.

Back to Javascript. I generate a grid of 6 categories and save the categories in a file, along with a date. I generate grids and dates for each of the next 30 days, making sure we don’t have any repeat grids. I make sure that no grid cells will contain zero players, but we don’t actually store the matches in this file. This is all done on my laptop. I upload this file to the web site. Every 30 days, I’ll need to do this again.

When you go to the web site, I load this file, find the categories for today, and display the grid. You enter the player names, and there’s an autofill feature to help you. When you click Guess, I check how many of the names match the list for that grid cell, and tell you how many matching names you have. If that number is 9, you win. Otherwise I reduce the number of guesses you have left (starting at 9). If that number is now zero, you lose, otherwise we keep going.

If the game is over (you win, you lose, or you click the “Give up” button), we show you which cells contain a correct guess, and display the list of matching players for each cell. We also display a little mini-grid of green and white squares and a Copy button so you can post your results to social media, showing everyone how NLL-savvy you are.

The site uses local storage to keep track of your guesses and whether you completed the game today. If you refresh the page, we’ll remember how many guesses you’ve taken and the names you’ve already entered. We also keep track of how many wins and losses you have, and if you have a winning streak. This is browser- and machine-specific, so if you start the game on your desktop and then move to your phone, it won’t remember your guesses. The only way to fix that is to have some sort of universal login, and force users to authenticate before playing. But that’s a lot of work for me and I suspect there’s not enough benefit for you. Many people would not bother to create a user account and log in every time they want to play, so they just wouldn’t play at all.

But remember that in a few months if someone shows you a screenshot of “50 wins, 0 losses”, or even a fully-green grid for one particular day – they could easily have clicked “Give up” on one browser or machine to get the answers, and then played again on a different browser or machine.

Strategy

The one thing that gets me when dealing with the statistical categories is that the second category is not always as related as you might think. For example, if the column is “Played for Toronto Rock” and “Scored 400 career goals”, I think “OK, Colin Doyle and Josh Sanderson are easy, but no other Rock players come to mind. I don’t think Blaine Manning got to 400 goals in his career, did he?” (Answer: no, he ended up with 307.) But while the “Played for the Rock” thing is important, don’t overthink it. We’re actually looking for players who did two separate things: (1) scored 400 career goals and (2) played for the Rock at some point in their career. We’re not necessarily looking for players who scored 400 with the Rock. So Dan Dawson, Lewis Ratcliff, Ryan Benesch, and Shawn Williams also qualify.

Relocations and rebrandings are ignored, so the Albany Attack, San Jose/Washington/Vancouver Stealths, and Vancouver Warriors are considered five distinct teams. Similarly for the two Swarms, the two Rushes, the original Knighthawks and the Thunderbirds, the Wings/Black Wolves/FireWolves, and so on. Also the “original Philadelphia Wings” and “original Rochester Knighthawks” are distinct from the current Wings and Knighthawks.

“Played for” a team means that a player appeared in at least one regular season or playoff game with that team. Anthony Cosmo was traded to the Minnesota Swarm at one point in his career, but he never actually played a game with them, so that doesn’t count. Similarly, Ryan Benesch was drafted by the San Jose Stealth, but he was traded to the Rock before playing a game with them so he won’t match the “Played for San Jose Stealth” category.

The game is more challenging than you might expect. If you’re trying to think of players who played for both the Saskatchewan Rush and Buffalo Bandits, you may remember Alex Buque or Dan Lintner, but it may also bring up some “Oh right!” moments, like Jeff Shattler and Chris Corbeil. But the older teams can be very tough. There are six players who played for both the Ottawa Rebel and New Jersey Storm – do you remember them? Do the names Mike Benedict, Paul Talmo, or Joe Finstad ring any bells? If you’ve been around the league long enough they might, but I started watching the NLL in 2001 and I don’t recognize those names. On some days, 9/9 won’t be that bad, but on other days, you may struggle to get 5/9.

Good luck!