Someone in my office decided to setup a table-tennis tournament recently. This got us all talking about various tournament types. I’ve been interested in ladder tournaments since I learned about them, but have never had the opportunity to actually take part in one. The basic idea is that you get a list of participants and you initially rank them in whatever way you like (random is fine). Once you have your ranked list, then the games begin. Players lower on the list can challenge players above them as frequently as they want (as long as they don’t challenge the same person two times in a row). If a challenger beats a defender, their ranks swap. That’s the gist.

Ultimately our office decided to go with a standard bracket that’s seeded by preliminary pseudo-random challenge groups. And that’s fine, but I was still curious about ladder tournaments. So this got me thinking it’d be a fun thing to model in python. So I did that.

I assumed that given enough time/games, players would sort out and the ‘best’ player would filter to the top. What I discovered was that this is not the case at all.

Full disclosure: I am not a statistician and I’m mostly talking out of my ass here, but I think the basic stuff I’m working with is sound (I welcome any and all corrections and comments at @samteebee on Twitter).

The basic rules by which the script operates are these:

The game is played over a specified number of rounds provided to the script.
A random challenger is chosen each round.
Challengers can only challenge players ranked higher than them (first place player can’t challenge anyone).
A challenger may not challenge the same defender two times in a row.
If a challenger defeats a defender, they swap ranks (ties go to the defender).
Both players roll a 10 sided die (0-9) then multiply that value by their current strength value to determine their fight value.
Challenger gains 10 strength for winning.
Both challenger and defender always gain 1 strength for match participation.
Player ranking is initialized in reverse-player order (Player1 == rank 1, Player2 == rank 2, etc…)
All players start with a Strength value of 1

What strikes me here is how uniform the numbers are. There are no significant spikes. The “strongest” player does not end in first place. The first place ‘winner’ doesn’t even have the highest tally of rounds ending in 1st place. The most potentially useful info here: the strongest player also has the largest 1st place tally (though they ended in next-to-last place!)

My wife, Steff, gave me the idea of having challengers default to challenging first position by default (and only challenging someone else if they’d just previously lost to that defender). The theory being that strong players might filter up to (and stay at) the top position more rapidly/consistently. Surprisingly, these are the results of that experiment:

the weakest player who’d played the fewest games and had the fewest turns in 1st place ended the tournament in first. And the strongest, arguably best player, who kept 1st place for the greatest number of rounds ended up in 5th place.

This has convinced me that a ladder tournament is probably not a very good way of sorting a group of competitors into anything meaningful (Wikipedia agrees with me here).

I’ve played around a bit more with the script, too, trying to force it to resolve to something that resembles a best-to-worst sorting device, but I’ve not made much headway.

2015 was all over the place. It began with a mountain of snow and ended with breakfast on the deck in December. But over all it was a pretty great year.

Steff and I vacationed in New Orleans

We discovered kayaking and camping with friends.

We visited dear friends in San Francisco.

I did a bunch of woodworking.

Wooden Christmas gifts – salad tongs, boxes, spoons, herb strippers.

A tiny spoon made from a purple heart pen blank

The game of Tak from the Patrick Rothfuss Kingkiller Chronicles books as designed by Cheapass Games

An oak dice tray

A playing card deck box made of oak.

A Big Green Egg table

A douglas fir outdoor table top with oak screw plugs

I also made a couple of new twitter bots this year:@omgcheckthisout – a linkbait article title generator@MartyMcflyDay – a bot that tells you whether or not today is the day Marty McFly travels to in Back to the Future II – this one was made with help from @WhatTheKit

2014 was a good year! It feels odd saying it. It felt like an uphill battle a lot of the time. I think that battle was mostly in my head though, as some really great stuff happened. So I wanted to take a moment to acknowledge all the good stuff.

The good stuff in brief: I started a new job. I started (and finished!) a bunch of projects in python, woodworking and writing. I was generally quite healthy. I started biking to work. Over all I’m feeling like I’m finishing the year on an upswing.

The details:

Woodworking
I built a bench
A child’s seat
A stool

I also built a bat house, a gate and some shelves, none of which I have decent pictures of though.

Writing
I wrote somewhere around 12 short stories. Most of them were as part of a class I took, but I also wrote some after the class. I’m really happy about that.
Here’s one of the stories: Olivia’s Good Morning

Coding
I spent a lot of time this year trying to improve my coding skills – most of that time was spent on Python. This lead to some cool projects:

I participated in NaNoGenMo this year. NaNoGenMo is like NaNoWriMo (National Novel Writing Month) only the goal is instead of writing a novel during the month of November, one attempts to write a program to generate a novel. My entry was a python script that generated a book titled “A Full and Complete Reckoning of Uncommon Mythical and Monstrous Creatures.
You can see the code here: creatures.py
You can see the full-book output here: creatures.txt.
The full list of NaNoGenMo entries is here, if you’re curious: https://github.com/dariusk/NaNoGenMo-2014/issues

I made a python script that calculates the distances between frets on a stringed instrument (hopefully I’ll actually build a stringed instrument sometime so I can use this calculator)https://github.com/samtb/FretCalculator

I also made a little script that pokes me every day to do something productive/creative – it auto tweets to my twitter account https://twitter.com/samteebee every morning at 7am.

Reading
Man, this was a good year for me and reading. I read 40 books this year (some were quite short, indeed). That’s more than twice as many as last year. Goodreads claims I read 10,858 pages this year (4600 last year). Here are this year’s books, in the order in which I read them:The Summer is Ended and We Are Not Yet Saved – by Joey ComeauLockpick Pornography – by Joey ComeauLife After Life – by Kate AtkinsonCreative Thinkering: Putting Your Imagination to Work – by Michael MichalkoSand Omnibus (Sand, #1-5) – by Hugh HoweyThe Fault in Our Stars – by John GreenClaire DeWitt and the City of the Dead – by Sara GranThe Encyclopedia of Early Earth – by Isabel GreenbergThe Night Circus – by Erin MorgensternShow Your Work! – by Austin KleonAshfall (Ashfall, #1) – by Mike MullinDivergent – by Veronica RothThe Cat Who Walked a Thousand Miles – by Kij JohnsonA Man Came Out of a Door in the Mountain – by Adrianne HarunUnclean Jobs for Women and Girls – by Alissa NuttingThe King of Limbo: Stories – by Adrianne HarunForty Stories – by Donald BarthelmeAshen Winter (Ashfall, #2) – by Mike MullinMoonwalking with Einstein – by Joshua FoerThe Devil in the White City – by Erik LarsonThe Martian – by Andy WeirZZT (Boss Fight Books, #3) – by Anna AnthropyBy the Silver Water of Lake Champlain – by Joe HillCandyfreak – by Steve AlmondBoy Proof – By Cecil CastellucciUglies – by Scott WesterfeldBlue is the Warmest Color – by Julie MarohRogues – Various authorsThe Magicians (re-read) – by Lev GrossmanThe Magician King (re-read) – by Lev GrossmanThe Magician’s Land – by Lev GrossmanThe Slow Regard of Silent Things – by Patrick RothfussThe End of Everything – by Megan AbbottSunrise (Ashfall, #3) – by Mike MullinThe Lies of Locke Lamora – by Scott LynchRight Body, Wrong Junk – by Avery EdisonThe Enchanted – by Rene DenfeldThe Shell Collector – by Hugh HoweyClipping Through – by Leigh AlexanderWe Were Ugly So We Made Beautiful Things – by David Barringer
This list, with ratings and short reviews I wrote for each book is here, if you’re interested:https://www.goodreads.com/review/list/4660461-sam?utf8=%E2%9C%93&order=a&read_at=2014&sort=date_read&per_page=50

Health
I got better at running this year, too. It wasn’t exactly a conscious effort to improve, but I think it was simply a result of my efforts to run more/consistently throughout the year. I did have one goal: to run a sub-20-minute 5k. I got very close (20:21, I believe), and I’m blown away by that.

This seems like it would be a good time to make some resolutions or plans for next year, but I’m not going to do that. I’ve gotten into the habit of keeping a rolling list of projects I want to do and/or skills I want to gain or improve on. I’m going to keep that up. Maybe I’ll do another review like this next December. We’ll see how next year goes. You can keep up with me on twitter if you’re at all curious.

Before making the plot generator I had been spending time jotting down “bad plots” as a writing exercise in my notebook, hoping they might get the creative juices flowing and lead to actual good ideas. It got me thinking about Emma Coats’ advice on story structure. So I cobbled together some Python and made a funny command-line script that popped out insane plots. I enjoyed it so much that I ported it over to JavaScript and put it online. I tweeted about it and at some point Emma Coats caught wind. That was fun:

As for the game idea generator, I was talking to a friend about our addiction to funding Kickstarters for video games and board games. I said that I think the likelihood of my funding a Kickstarter game is directly proportional to the absurdity of the theme. Later that afternoon the Game Idea Generator was born