Havilering: a pointless game

13-09-26

Straight to business

The first thing to do when encountering a new card game is almost certainly to dive right in with analysing some numerical aspects of the game. Much easier than trying to find the requisite number of people to play it with.

If you are the sort of sicko who likes to play the game a bit before whipping out the programming language / pen and paper / abacus of choice to crunch some numbers around probabilities and distributions, then this blog post may not be for you. Read on at your own peril.

Now that we have filtered out the oddballs, we can agree that it is absolutely imperative to tease out some cold hard numerical facts from any given card game. Playing games leaves one faced with all sorts of subjective choices, uncertainties, psychological considerations, but analysing them leaves one able to strip that down to some lovely reassuring numbers.

When I devised the card game Havilering one of the first things I did was to start to try and understand the game, at least in part, through a numerical lens. In fact I suppose it was really before 'one of the first things', as I was looking a little at this kind of thing when the game was still taking shape, to help give me some extra information when tweaking the scoring system.

At some point [1] I will write up a full page chock full of numbers, charts, and maybe even the odd mathematical expression. To be honest, a lot of the legwork for that still needs doing, as there are plenty of questions I am interested in but have either not got round to looking into, or in many cases not figured out a way to get a convincing answer.

However there is one question to which I have an answer. Additionally the way I discovered this answer was incredibly surprising to me, so I couldn't resist sharing the details here.

An unusually out-of-place on-the-nose clue for the first answer there.

A pointless game of Havilering?

To understand the journey, first a little setup will be necessary to be able to follow what it is I was trying to do. You don't need to understand the game in very much detail to follow this (although perhaps you may find it interesting to read about the game in further detail another time, and perhaps even try it out šŸ™‚), but I'll provide just enough context for the rest of this to make sense.

Havilering is a trick-taking card game, for four players, playing in partnerships (teams of two). It is played with a standard 52-card deck of cards, dealt out entirely, so that each hand, all four players have 13 cards each. The game play of a hand consists of thirteen tricks. Each trick one designated player will play a card (lead to the trick), and the other three players, in turn, will play one of their cards (constrained by some rules), and then one of them will be determined the winner of that trick (according to some other rules). Then another trick happens in the same fashion, and this repeats until all thirteen have been played, and no player has any cards remaining.

In Havilering, when a trick is completed, the side winning the trick scores the points it is worth. The score depends on the cards contained within that trick, taken together (with a couple of small exceptions that I'll note in a moment), again according to some rules of the game. So if you look at any four cards from a deck, you could work out how much they would be worth if they comprised a trick played in a game of Havilering. But if you look at a set of eight cards, the score if they were two tricks would depend on how you split them into sets of four. In general it is not specific cards that have point values, but combinations that appear together in the same trick.

One of the first things I was interested in with this game was to understand the distribution of point values of single deals of the game. How many points would be scored typically? What kind of point values would be unusually high, or low? And what is the maximum, or minimum value of points that could occur?

It's this last one that I'll focus on — what is the minimum number of points that can be scored in a deal of Havilering. I'm only interested in this from a theoretical angle, so I am not concerned with it being 'realistic' play (as that brings in a level of subjectivity to the question). So simply, amongst all legal possible games, what is the smallest total that can be made (ignoring which side scores, so looking at the sum total of both sides' scores).

We can quickly get a lower bound, which relate to the exceptions I mentioned above. There are always two points for winning the final trick. And one of the Jacks (designated 'Jack Havel', whose suit depends on the time of year), is always worth points when won in a trick. This is generally three points, but it is instead six if the player winning it was the dealer for the hand. This gives at least five points per hand (two for last trick, and three for Jack Havel).

The question then is whether it is possible to have a game that attains this lower bound. It was not at all obvious to me beforehand whether this should be the case - there are various scoring combinations in the game, and it was not clear if it would be possible to avoid all of them for every trick of the deal.

Given the lower bound, I was interested in the possible points for a deal, when we discount the five for last + Jack Havel. In particular:

Dog will hunt

Before barrelling in to start to find a pointless game, it's worth at least a moment's thought about how it might be best to approach sniffing one out.

This is not a problem that can be brute-forced. The number of distinct possible deals is: $$\frac{52!}{\left(13!\right)^4} \approx 5.4 \times 10^{28}.$$

That's a pretty big number. We are treating each card as distinct, as the presence of Jack Havel breaks any symmetry between the suits (we can distinguish the suits as 'the seasonal suit', 'the suit above the seasonal suit', etc.). But even if we ignore Jack Havel (as will be sufficient for our purposes), this only decreases things by a factor of 4 (the symmetry of rotating the suits around the cycle), so doesn't really make a dent in things. If we don't care who gets which cards we can reduce this by the number of ways to rearrange the four hands (which probably won't make a huge difference), \(4! = 24\), but this is still small beer.

But that's just the number of deals. What about the number of possible games? This is harder to quantify, as it really depends on the rules of the game in an intricate way. Considering the number for a fixed deal, we can get a quick lower bound — certainly the player on lead will always have a free choice of their remaining cards to play. So even if no other player ever had a choice of what to play (not that this is possible), we would have: $$13! \approx 6.2 \times 10^9$$ games.

But that is a lower bound. At the other end of the spectrum, we can imagine the 'free game', where each player is never constrained about what card to play, and can play any of their remaining cards. Thus we get an upper bound of: $$\left(13!\right)^4 \approx 1.5 \times 10^{39}$$ games. So we have managed to constrain the number of games by thirty orders of magnitude. Not super informative.

The actual number will depend on the number of legal moves available to each player, on average. Specifically, let's consider the number of legal moves available for each (non-leading) player, across the entire hand. We take the geometric mean of these numbers, which we call \(b\). We know \(1 \leq b \leq \sqrt[13]{13!} \approx 5.67\) Then the number of possible games is: $$13! b^{3 \cdot 13} = 13! b^{39}.$$ This is obviously pretty fast-growing — for even a fairly conservative estimate of \(b = 2\) this number already reached \(\approx 3.4 \times 10^{21}\).

However, this is all somewhat by-the-by. It would be a pretty naĆÆve approach to just generate random games and hope to find a pointless one. We know that there can be no flushes in a pointless game, and so the suit distributions of the hands will need to be pretty extreme. Even without further number-crunching it seems likely that we would have to generate a pretty vast number of games to find something pointless without employing any kind of search strategy.

Instead, we can look at dividing the pack up into four-card tricks, which represent the set of tricks of a completed deal. In other words, we will be searching across partitions of the pack into sets of size 4. If we find a pointless partition, then we can see about reconstructing a game that would lead to it. If we don't find such a partition (or better, prove none exists), we needn't bother ourselves with the mucky details of play.

There are \(52!/(4!^{13} 13!) \approx 1.5 \times 10^{40}\) possible such partitions. That's roughly \(3 \times 10^{11}\) per deal. Again, we cannot brute-force this, and would probably not have much luck just grinding through some. We need, at a minimum, the next-least stupid thing.

Before looking at partitions, we can consider the individual tricks. There are $${52\choose 4} = 270,725$$ possible distinct sets of four cards. Of these, 64,512 have no scoring categories beyond Jack Havel. Continuing to abuse terminology we can call these 'pointless tricks'. It is quick to check that all 52 cards are represented in these sets, which keeps the door open for us to find a partition comprised of only pointless tricks.

My general approach to finding a pointless game was simple:

Pointless mistakes

I already had a big list of every possible trick, along with the scoring categories contained in a csv file, which I had made when trying out ideas during the development of the game. So getting the list of pointless tricks alone was just a straightforward extraction from this file — I would simply pick all the rows where the scoring category was at most Jack Havel alone.

I set to work implementing the algorithm in python. The function I wrote would check all possibilities with a given initial trick. That way I could easily start my search at any index of my trick list, and do it in bits and pieces. If I found a spanning set of pointless tricks, it wouldn't explore that tree any further; I didn't need all solutions (if there were any). Maybe a few if I could, as I still needed to figure out how to take the set of tricks and form a legal game from them.

Once I'd written this bit of code, and it seemed to be doing roughly the right thing, I set it running, and left it going while I did some writing. I checked back around twenty minutes later when I was finished, and found no solution as far as it had made in that time. Never mind. I noted down where I had got to (somewhere in the tenth level down — pick the first option in the list 9 times in a row, then the 17th, then 67th, then 5th) so I could pick it up again the next day from the exact point in the iteration — I wasn't certain exactly how correct it was, so felt wasteful leaving it overnight.

The next morning when I came to start things off again, however, I noticed an issue. I had been loading the data into memory by using DuckDB. I hadn't needed any of its analytical capability for this task, but I'd already been using it for other investigations in the same workspace, so it was very easy to just write a quick query to grab the data from the csv. The trouble is that, with it being SQL-based, there was no inherent notion of ordering, so there was no guarantee that the order of my trick-list would be the same from one run to the next [2]. That somewhat undermined my 'pick up where I left off' concept.

Now there are several ways to deal with this indeterminacy but, being in SQL land, the natural and wasy way for me was to slap an 'ORDER BY' on the query that loaded the data in. So I did just that, and set the script running.

To my surprise, I immediately surfaced a result. And I really mean immediately, as this happened in the very first iteration. Meaning it picked the first trick, eliminated overlapping tricks, picked the first trick of what remained, and so on until there were 13 tricks. Given that I had previously searched some number of thousands of branches of the tree, I had not expected results so quickly. I checked it over manually, and all seemed in order — all 52 cards were present, and indeed each trick had no scoring category beyond Jack Havel.

A pointless partition for Havilering.

It was only after getting this result that I spotted an error in my code. In my 'ORDER BY' clause, I was ordering by the score of the trick, rather than the cards that comprised it. The score is not fully distinguishing, as many different tricks have the same score, so in fact I had not fixed the determinacy at all. The order I had, which had immediately given results, was a complete fluke that could disappear the next time I ran the code, if the SQL Gods decided to give me the rows in a different order.

I corrected my code, so that the ordering was by the trick contents, and thus fully specified, and then once again I could find no solutions, the script just ran and ran. My mistake had clearly stumbled upon some magic! I reverted to the incorrect code, and ran it a few more times, from different starting tricks. I quickly found 5 more solutions, as well as a further 2 slightly more slowly while I frantically wrote down what happened so I wouldn't forget the details.

All the while I was trying to get as many solutions as I could before some variable changed and meant I started getting things in a different order. I was so surprised and excited that it wasn't until a while later that it occurred to me I could save this ordered list to a file so that I could then peruse it at leisure, which I later did. I had a little go at trying to understand if I could figure out how DuckDB had got me that particular ordering, to no avail.

All in all I found 14 pointless partitions before I stopped searching (although in writing this I discovered 2 were in fact duplicates, leaving only 12). There are probably many many more, but that was enough to be getting on with, and I was keen to move on to the next, crucial, stage.

The first partition, as pictured to the right, is the one I took going forward:

        
[
    ["2C", "4C", "5C", "AH"],
    ["2D", "3D", "5D", "6S"],
    ["2H", "8D", "9D", "QD"],
    ["2S", "5H", "7S", "9H"],
    ["3C", "9S", "JC", "QH"],
    ["3H", "5S", "8C", "9C"],
    ["3S", "7H", "JS", "TD"],
    ["4D", "6D", "7D", "TH"],
    ["4H", "8H", "JD", "KH"],
    ["4S", "KC", "QS", "TC"],
    ["6C", "7C", "AS", "QC"],
    ["6H", "AD", "JH", "KD"],
    ["8S", "AC", "KS", "TS"]
]
        
    

Event reconstruction

A pointless game of Havilering.
The hands for a pointless game of Havilering.

At this point, I have a pointless partition. But I am interested in a pointless game. Thus the task becomes: can I construct a legal game of Havilering that results in these set of tricks?

I'm not going to unleash another barrage of combinatorics upon you, as it seems cruel to punish you so for making it this far. But suffice it to say that, once again, there are many possible orderings one could try, if you were to attempt something like a 'pick an ordering and see if it is a valid game' approach.

There is probably some very clever algorithm one could use to build up constraints and find some solution. But where is the fun in that? I opted for a lower-tech approach, and one that is in keeping with the spirit of Havilering, and took a pack of cards to the pub.

Then it was really a process of trial and error. You can kind of roughly order tricks by how 'single-suity' they are — a trick with three Hearts and a Diamond is probably going to be earlier than one with two Clubs, a Spade, and a Heart. And then start to allocate the voids to each player, and figure out an order the tricks can be played based on who wins each one, and so on. It was quite fun, and made me think that this might be a fun puzzle format. But that is a thought for another time.

After a surprisingly short amount of time, I had constructed a valid game. I had thought it would be a lot more fiddly and painful, but it didn't prove too tricky. Maybe it was a particularly easy set of tricks to use. Or maybe I got lucky with my initial trials. Or maybe there are so many ways to make valid games that it's easy to stumble into one. Or it could be that it's just not that hard to do, in general. But for now that doesn't matter. I have my pointless game.

Practical Pointlessness

At this point, I have answered the question that I had originally considered: is a pointless game of Havilering possible? As demonstrated, clearly such a game is indeed possible, in terms of the rules of the game. There is a legal game of Havilering that leads to no scoring categories beyond the mandatory ones.

However, a more interesting, but much harder consideration, is whether a pointless game could every occur in practice. The general question is probably ill-defined: whenever we talk about card-play in practice, it supposes some notion of 'reasonable play', which is not really a rigorously-defined concept. But nevertheless let's explore this just a little.

Studying the above game even cursorily should make it apparent that actual play amongst even vaguely competent players would probably not play out this way. Dealer trumps the first (Diamond) trick with a Heart, choosing the 2, which leads to a pointless trick with the preceding 9, 8, and Queen. But choosing literally any other Heart in their hand would lead to a scoring trick - the 6 (15), 7 (3-run and 15), 8 (pair), 9 (pair), or 10 (3-run). It seems unlikely that, holding so many, saving all of these middling cards for later is sufficiently important compared to immediate points.

Furthermore, I suspect that a pointless game against moderately competent opponents would not occur in practice. Putting aside the fact that a deal that could lead to a legal pointless game is a rare event, I think the chances are that in practice the game would score additional points when players are acting in their own self-interest. The number of options you have to ensure a pointless game are relatively narrow (I claim without proof), and it seems rather unlikely that at every decision point this choice aligns with the best (or one of the best) options for the acting player.

For our example pointless game, we can actually test this, at least roughly. At the Queen and Widow there are some bot players which are implemented using a naĆÆve version of Information Set Monte Carlo Tree Search (ISMCTS). Giving the above reconstructed deal to players using 1,000 iterations per move, we can simulate the hand, with the net result being a total score of 31. So quite a bit larger than the 5 points we would get if it had played out in our pointless way.

But one nice feature of ISMCTS is that is very easy to change the reward, which is what is used to incentivise the players. In the standard bot, this is a zero-summed score, which is proportional to the score difference (my score - opponents score). We could instead have 'misere coƶp' bots, where this reward function is the negative of the total score. In other words, such players would attempt to minimise the total score. Simulating our pointless hand with these players ends up with a total score of 14, which is quite a bit closer. If we increase the number of iterations to 10,000, the total score is 8. Good, but still not quite 5. I did not attempt to throw any further computation at things, as I'm not sure what there was to gain.

So even playing coƶperatively to minimise their score, the players could not manage to actually play a pointless game, scoring 3 unnecessary points (three 15s). They of course were limited by the extent of the tree they could search, as well as the fact that they could not see each other's hands. But even so, it demonstrates just how hard it is to play a pointless game, even if you are trying to. (And for fun I checked the opposite, using 'standard coƶp' players who attempt to maximise the total score to see how far away you can get from a pointless game. With 10,000 iterations per move they managed an impressive total of 101 points!)

We could probably do something similar with the other pointless partitions. However, that would require reconstructing them into games (to get deals that could lead to them), and I don't really expect different results. Maybe I'll do it some day, but not for now.

So for now, that's as close as we'll get to pointlessness 'in the wild', if we can consider a contrived deal with specifically tailored bots playing a simulation to be in any sense 'wild'. What we can still investigate, though, is how close we can get to a pointless game with just 'ordinary' playing, which is perhaps a shade wilder.

Total score for 10,000 simulated hands of Havilering played by four 1000-iteration ISMCTS bots playing competitively.

Firstly, as the apparatus is readily available, we can just simulate some games with random deals amongst bot players. I did so, generating 10,000 hands with 1000-iteration ISMCTS bots. Doing so, the minimum total score I saw was 15 (six 15s, four flushes), with just 32 hands totalling less than 20. These were low scores — the mean was a little under 34, and one exceptional hand even reached 73. But it's quite a way off pointlessness. It's still quite a lot better than the score achieved playing competitively with our reconstructed pointless deal. It'd be interesting to see whether possible pointless games ever come from deals that also score low competitively (if we assume that pointless games cannot arise in such a way), but that's too much to get stuck into for now.

It may be stretching the limit of 'ordinary playing', but we can also do the same with the misere coƶp bots, i.e. ones that are working together to score as little as possible. Generating 10000 hands with 1000-iteration bots we get as low as 7 points, merely two flushes away from a pointless game. That deal may well provide the possibility of a pointless game if studied in more detail, or played with open hands, as then players would not accidentally hit singletons before they have the chance to be shed.

Total score for 10,000 simulated hands of Havilering played by four 1000-iteration ISMCTS bots playing coƶperatively to minimise the total score.

The other end of the spectrum is also of relevance in the misere coƶp case, as these are situations where, despite the aims of all players involved, they couldn't help but score many points. In this batch, the highest score was 30, which is in fact a very normal total in competitive play. I haven't looked in detail, but this is probably the result of bad luck, where players at the end of tricks are holding 'unusual' singletons, and thus have to slot in cards that give big scores.

This kind of scratches at data that I would love to have in detail: across all deals, what are the minimum and maximum possible total scores across all valid Havilering games. And then, across those distributions of minima and maxima, what are the minima and maxima. We already know that the minimum minimum is 5 (a.k.a. pointless!), but what about the maximum minimum? 30 is probably too high - I bet you could look at that deal and find a lower-scoring game. But what about 20? I just have no idea. Veering slightly out-of-scope for this blog post, I know that the maximum maximum is at least 101 (see above), but as I only set these score-maximising bots up on a single deal (which was constructed from a pointless partition) I would be astounded if that was the highest possible. But it is still very big - that is towards 8 points per trick, which is getting towards the high end of individual bonuses available, and in competitive play (simulated) the highest ever observed is 73.

All of that is well and good, for computer players. But really it would be nice to get at what kind of low scores human players get to. Unfortunately it is Widely Acknowledged that one of life's Great Tragedies is the fact that, despite having more humans available than ever, there is still no freely available data on Havilering games between all-human players (in both senses: all players are human, and each player is all-human). Not one single hand.

We do have one thing that is slightly better than nothing: a record of many games played on the Havilering web-app between one human and three bot players (I mean one human at a time, not necessarily one overall, although in all likelihood the vast majority, if not entirety, of them were indeed done by one single individual, whose identity I shall leave the most inferentially gifted readers to determine).

There have been a couple of different bots over the course of the data, but even so we can't expect the results to differ hugely from the pure simulations. But humans, even individuals, have a much greater variety of play than these bots, depending on all sorts of things like ability, attention, tiredness, and all sorts of other factors, that should help to poke around into a wider range of games. Of course the downside is that we cannot generate so many hands particularly quickly to explore more edge-case deals. Perhaps, if I continue to collect data, I can check back on what things look like in the coming years.

Total score, and 'reduced' score, where last and Jack Havel are removed. Data is human vs. 3 bots.

The results in practice are not disimilar to the pure simulations. There is some interesting structure to the various peaks, although it may be that these are really just an effect of a relatively small dataset. But at the bottom, the story is the same, with the minimum score achieved being 18, a whopping 13 extraneous points. Sheer human decadence on display. For this data I have also plotted a version with Jacks Havel and last trick stripped out. This is not just a simple shift of points, as it differentiates between Jack Havel to the dealer or not, but overall there is not a huge difference, and the lowest-totalled game is unaffected (i.e. dealer did not win Jack Havel).

We probably can't conclude anything too definitive. Although we have found that pointless games are possible, it seems likely that finding one occurring in practice would require collusion, or spectacularly correlated sloppiness. Nevertheless, it would be interesting to see quite how low a score will show up in 'genuine' play. There are also a host of other interesting questions on the numerics of Havilering, but these will have to wait for another time.

Appendix

While we're here, I might as well furnish you with a few facts relating to these pointless matters. Most of these things are things I have come across when writing up this blog post, rather than contemporaneously with the events herein.

When it comes to pointless tricks, a moments thought should convince you that suit is irrelevant aside from ensuring that not all four cards are the same suit. No runs can be present (or it wouldn't be pointless), and so the relative suits don't matter, as if you avoid runs, you avoid ruffles. There are no repeated ranks (as otherwise you would have pairs or worse), and so there is no symmetry to worry about. Thus you can analyse the ranks and the suits separately, as they are effectively independent for this purpose.

Suit-wise, the count is straightforward. Each card is one of four possible suits. The only combinations we exclude are the four configurations where all four cards are the same suit. Thus, for a given set of ranks, the number of ways to adorn them with suits is \(4^4 - 4 = 256 - 4 = 252\).

Rank-wise there are three things we need to take into account: no repeated ranks, no runs, and avoiding count categories (15s/31s). A simple count before any constraints gives us \(13^4 = 28,561\) (ignoring the issues around ordering, as this will not be relevant in the end). If we remove repeated ranks, and insist on a canonical ordering (so we can then use our full set of suit permutations) we are left with \(715\). Removing any runs leaves \(598\). Finally we strip out count categories - removing 31s we get to \(567\), and removing 15s leaves us with \(256\) pointless patterns. As far as I can tell this is just a coincidentally neat number, with no underlying reason to it.

So putting these together, we end up with our final count of pointless trick sets: $$252 \times 256 = 64,512.$$

It may have been simpler to work directly with the 256 rank patterns rather than the full set of trick patterns, although it does bring the complication of finding compatible suit arrangements. If I ever decide to try and tackle a full enumeration of pointless partitions, this will most likely be part of the recipe.

One interesting fact we can pull from this data straightaway is the frequency with which particular ranks appear. In other words, which ranks are most prone to pointlessness? You can see the results in the following table:

Frequency of the appearance of each rank in pointless tricks (ignoring Jacks Havel)
RankFrequency
513
871
974
278
483
A83
686
786
388
J90
Q90
K90
T92

This is probably not massively surprising to Havilering (or Cribbage) players. But it is useful to know for playing - if you don't want your opponents to score, and they may win the trick, then other things being equal it is better to play cards lower in this table. Probably in most instances additional factors and knowledge will be more important, but maybe as a rough rule-of-thumb. Note also that this table is not necessarily the same ordering as the one based on the expected number of points for each rank, which depends of course on actual play data, rather than the purely theoretical calculation in this table.

For completeness / reference, here are the 256 possible groupings of ranks

        
2 3 5 6
2 3 5 9
2 3 6 8
2 3 7 9
2 3 8 9
2 4 5 7
2 4 5 A
2 4 6 8
2 4 6 T
2 4 6 J
2 4 6 Q
2 4 6 K
2 4 6 A
2 4 7 T
2 4 7 J
2 4 7 Q
2 4 7 K
2 4 7 A
2 4 8 T
2 4 8 J
2 4 8 Q
2 4 8 K
2 4 T J
2 4 T Q
2 4 T K
2 4 J Q
2 4 J K
2 4 Q K
2 5 6 A
2 5 7 9
2 6 8 T
2 6 8 J
2 6 8 Q
2 6 8 K
2 6 T J
2 6 T Q
2 6 T K
2 6 T A
2 6 J Q
2 6 J K
2 6 J A
2 6 Q K
2 6 Q A
2 7 9 T
2 7 9 J
2 7 9 Q
2 7 9 K
2 7 9 A
2 7 T J
2 7 T Q
2 7 T K
2 7 T A
2 7 J Q
2 7 J K
2 7 J A
2 7 Q K
2 7 Q A
2 8 9 J
2 8 9 Q
2 8 9 K
2 8 9 A
2 8 T J
2 8 T Q
2 8 T K
2 8 T A
2 8 J Q
2 8 J K
2 8 J A
2 8 Q K
2 8 Q A
2 9 T A
2 9 J A
2 9 Q A
2 T J K
2 T J A
2 T Q K
2 T Q A
2 J Q A
3 4 6 7
3 4 6 T
3 4 6 J
3 4 6 Q
3 4 6 K
3 4 6 A
3 4 7 9
3 4 7 T
3 4 7 J
3 4 7 Q
3 4 7 K
3 4 9 T
3 4 9 J
3 4 9 Q
3 4 9 K
3 4 9 A
3 4 T J
3 4 T Q
3 4 T K
3 4 J Q
3 4 J K
3 4 Q K
3 5 6 8
3 5 8 9
3 5 8 A
3 6 7 T
3 6 7 J
3 6 7 Q
3 6 7 K
3 6 7 A
3 6 8 T
3 6 8 J
3 6 8 Q
3 6 8 K
3 6 T J
3 6 T Q
3 6 T K
3 6 T A
3 6 J Q
3 6 J K
3 6 J A
3 6 Q K
3 6 Q A
3 6 K A
3 7 9 T
3 7 9 J
3 7 9 Q
3 7 9 K
3 7 9 A
3 7 T J
3 7 T Q
3 7 T K
3 7 T A
3 7 J Q
3 7 J K
3 7 J A
3 7 Q K
3 7 Q A
3 7 K A
3 8 9 J
3 8 9 Q
3 8 9 K
3 8 9 A
3 8 T A
3 8 J A
3 8 Q A
3 8 K A
3 9 T Q
3 9 T K
3 9 T A
3 9 J Q
3 9 J K
3 9 J A
3 9 Q K
3 9 Q A
3 9 K A
3 T J K
3 T J A
3 T Q K
3 T Q A
3 T K A
3 J Q A
3 J K A
4 5 7 9
4 5 7 A
4 5 8 9
4 5 8 A
4 6 7 T
4 6 7 J
4 6 7 Q
4 6 7 K
4 6 7 A
4 6 8 T
4 6 8 J
4 6 8 Q
4 6 8 K
4 6 T J
4 6 T Q
4 6 T K
4 6 J Q
4 6 J K
4 6 Q K
4 7 9 T
4 7 9 J
4 7 9 Q
4 7 9 K
4 7 9 A
4 8 9 A
4 8 T J
4 8 T Q
4 8 T K
4 8 J Q
4 8 J K
4 8 Q K
4 9 T Q
4 9 T K
4 9 J Q
4 9 J K
4 9 Q K
4 T J K
4 T Q K
6 7 T J
6 7 T Q
6 7 T K
6 7 T A
6 7 J Q
6 7 J K
6 7 J A
6 7 Q K
6 7 Q A
6 7 K A
6 8 T J
6 8 T Q
6 8 T K
6 8 J Q
6 8 J K
6 8 Q K
6 T J K
6 T J A
6 T Q K
6 T Q A
6 T K A
6 J Q A
6 J K A
7 9 T Q
7 9 T K
7 9 T A
7 9 J Q
7 9 J K
7 9 J A
7 9 Q K
7 9 Q A
7 9 K A
7 T J K
7 T J A
7 T Q K
7 T Q A
7 T K A
7 J Q A
7 J K A
8 9 J Q
8 9 J K
8 9 J A
8 9 Q K
8 9 Q A
8 9 K A
8 T J K
8 T J A
8 T Q K
8 T Q A
8 T K A
8 J Q A
8 J K A
9 T Q K
9 T Q A
9 T K A
9 J Q A
9 J K A
        
    

Pointless partitions

Here is the (deduplicated) list of partitions I found back when I first searched. The first one is as in the image above, which I then constructed the above game from.

        
[
    [
        ["2C", "4C", "5C", "AH"],
        ["2D", "3D", "5D", "6S"],
        ["2H", "8D", "9D", "QD"],
        ["2S", "5H", "7S", "9H"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4D", "6D", "7D", "TH"],
        ["4H", "8H", "JD", "KH"],
        ["4S", "KC", "QS", "TC"],
        ["6C", "7C", "AS", "QC"],
        ["6H", "AD", "JH", "KD"],
        ["8S", "AC", "KS", "TS"]
    ],
    [
        ["2C", "8H", "JD", "KH"],
        ["2D", "3D", "5D", "6S"],
        ["2H", "8D", "KD", "QD"],
        ["2S", "5H", "7S", "9H"],
        ["3C", "6H", "JH", "QH"],
        ["3H", "6D", "JC", "TD"],
        ["3S", "4S", "QS", "TC"],
        ["4C", "5S", "8C", "9C"],
        ["4D", "7D", "9D", "TH"],
        ["4H", "5C", "7H", "AD"],
        ["6C", "7C", "AH", "QC"],
        ["8S", "AS", "KC", "TS"],
        ["9S", "AC", "JS", "KS"]
    ],
    [
        ["2C", "4C", "5S", "7C"],
        ["2D", "3D", "5D", "6S"],
        ["2H", "8D", "KD", "QD"],
        ["2S", "5H", "7S", "9H"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "6D", "QC", "TD"],
        ["3S", "9C", "AS", "TC"],
        ["4D", "7D", "9D", "TH"],
        ["4H", "5C", "8H", "AD"],
        ["4S", "KC", "QS", "TS"],
        ["6C", "7H", "AH", "JD"],
        ["6H", "8C", "JH", "KH"],
        ["8S", "AC", "JS", "KS"]
    ],
    [
        ["2C", "5C", "6C", "AH"],
        ["2D", "3D", "5D", "9S"],
        ["2H", "8D", "9D", "QD"],
        ["2S", "5H", "7S", "9H"],
        ["3C", "4C", "KH", "TC"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4D", "6D", "7D", "TH"],
        ["4H", "8H", "JD", "QH"],
        ["4S", "6S", "KC", "QS"],
        ["6H", "AD", "JH", "KD"],
        ["7C", "AS", "JC", "QC"],
        ["8S", "AC", "KS", "TS"]
    ],
    [
        ["2C", "4S", "5D", "7C"],
        ["2D", "3D", "5H", "6D"],
        ["2H", "8D", "KD", "QD"],
        ["2S", "6C", "QS", "TC"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4C", "6H", "JH", "KH"],
        ["4D", "7D", "9D", "TH"],
        ["4H", "5C", "8H", "AD"],
        ["6S", "7S", "AS", "KC"],
        ["8S", "AC", "KS", "TS"],
        ["9H", "AH", "JD", "QC"]
    ],
    [
        ["2C", "4S", "5D", "7C"],
        ["2D", "3D", "5C", "6D"],
        ["2H", "6H", "AD", "JH"],
        ["2S", "5H", "7S", "9H"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4C", "6C", "KH", "QC"],
        ["4D", "7D", "9D", "TH"],
        ["4H", "8D", "KD", "QD"],
        ["6S", "AS", "QS", "TC"],
        ["8H", "AH", "JD", "KC"],
        ["8S", "AC", "KS", "TS"]
    ],
    [
        ["2C", "5D", "6C", "AS"],
        ["2D", "3D", "5S", "6D"],
        ["2H", "8D", "KD", "QD"],
        ["2S", "3H", "8C", "9C"],
        ["3C", "9S", "JC", "QH"],
        ["3S", "7H", "JS", "TD"],
        ["4C", "JD", "KH", "TC"],
        ["4D", "7D", "9D", "TH"],
        ["4H", "5C", "8H", "AD"],
        ["4S", "5H", "7C", "9H"],
        ["6H", "AH", "JH", "QC"],
        ["6S", "7S", "KC", "QS"],
        ["8S", "AC", "KS", "TS"]
    ],
    [
        ["2C", "5D", "6C", "AC"],
        ["2D", "3D", "7D", "9H"],
        ["2H", "4D", "6D", "8D"],
        ["2S", "4C", "5C", "AH"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4H", "9D", "KD", "QD"],
        ["4S", "5H", "8H", "AS"],
        ["6H", "AD", "JH", "TH"],
        ["6S", "7S", "KS", "QC"],
        ["7C", "JD", "KH", "TC"],
        ["8S", "KC", "QS", "TS"]
    ],
    [
        ["2C", "5D", "6C", "AC"],
        ["2D", "3D", "8D", "9H"],
        ["2H", "AD", "JH", "TC"],
        ["2S", "4C", "5C", "7C"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4D", "6D", "7D", "TH"],
        ["4H", "9D", "KD", "QD"],
        ["4S", "5H", "8H", "AS"],
        ["6H", "AH", "JD", "KH"],
        ["6S", "7S", "KS", "QC"],
        ["8S", "KC", "QS", "TS"]
    ],
    [
        ["2C", "4S", "5D", "7C"],
        ["2D", "3D", "5H", "9D"],
        ["2H", "8D", "KD", "QD"],
        ["2S", "6C", "QS", "TC"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4C", "6H", "JH", "KH"],
        ["4D", "6D", "7D", "TH"],
        ["4H", "5C", "8H", "AD"],
        ["6S", "7S", "AS", "KC"],
        ["8S", "AC", "KS", "TS"],
        ["9H", "AH", "JD", "QC"]
    ],
    [
        ["2C", "4S", "5D", "7C"],
        ["2D", "3D", "5C", "9D"],
        ["2H", "6H", "AD", "JH"],
        ["2S", "5H", "7S", "9H"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4C", "6C", "KH", "QC"],
        ["4D", "6D", "7D", "TH"],
        ["4H", "8D", "KD", "QD"],
        ["6S", "AS", "QS", "TC"],
        ["8H", "AH", "JD", "KC"],
        ["8S", "AC", "KS", "TS"]
    ],
    [
        ["2C", "5D", "6C", "AS"],
        ["2D", "3D", "7C", "9D"],
        ["2H", "8D", "KD", "QD"],
        ["2S", "5H", "7S", "9H"],
        ["3C", "9S", "JC", "QH"],
        ["3H", "5S", "8C", "9C"],
        ["3S", "7H", "JS", "TD"],
        ["4C", "JD", "KH", "TC"],
        ["4D", "6D", "7D", "TH"],
        ["4H", "5C", "8H", "AD"],
        ["4S", "6S", "KC", "QS"],
        ["6H", "AH", "JH", "QC"],
        ["8S", "AC", "KS", "TS"]
    ]
]
        
    

Hands of fate

Here are a few played hands that are interesting in some way or other, mainly from a pointless perspective.

Format

A note on the format of these games. It is a simplified version of the format used by the Queen and Widow game logs.

The players are a 0-indexed array. The trick array consists of four parts:

The trick details are an array, in the order played, of:

The rest should be clear.

1: The reconstructed pointless game

This is the game that I manually reconstructed, from the first discovered pointless partition, as described in the text, and pictured, above.

Total score: 5

        
{
    "players": [
        "NA",
        "NA",
        "NA",
        "NA"
    ],
    "seasonal_suit": "D",
    "hands": [
        ["3D", "7D", "9D", "3H", "4H", "JH", "QH", "AH", "4S", "7S", "JS", "KS", "AS"],
        ["2D", "4D", "8D", "TD", "AD", "5H", "KH", "5C", "9C", "JC", "QC", "KC", "AC"],
        ["5D", "6D", "JD", "QD", "KD", "2S", "3S", "8S", "3C", "4C", "6C", "8C", "TC"],
        ["2H", "6H", "7H", "8H", "9H", "TH", "5S", "6S", "9S", "TS", "QS", "2C", "7C"]
    ],
    "tricks_score_cards_winner_cats": [
        [["9D", 0], ["8D", 1], ["QD", 2], ["2H", 3], 3, 0, []],
        [["2C", 3], ["AH", 0], ["5C", 1], ["4C", 2], 1, 0, []],
        [["4D", 1], ["6D", 2], ["TH", 3], ["7D", 0], 3, 0, []],
        [["TS", 3], ["KS", 0], ["AC", 1], ["8S", 2], 1, 0, []],
        [["2D", 1], ["5D", 2], ["6S", 3], ["3D", 0], 2, 0, []],
        [["KD", 2], ["6H", 3], ["JH", 0], ["AD", 1], 0, 0, []],
        [["4H", 0], ["KH", 1], ["JD", 2], ["8H", 3], 1, 3, ["J. Havel"]],
        [["QC", 1], ["6C", 2], ["7C", 3], ["AS", 0], 1, 0, []],
        [["KC", 1], ["TC", 2], ["QS", 3], ["4S", 0], 1, 0, []],
        [["9C", 1], ["8C", 2], ["5S", 3], ["3H", 0], 1, 0, []],
        [["JC", 1], ["3C", 2], ["9S", 3], ["QH", 0], 1, 0, []],
        [["TD", 1], ["3S", 2], ["7H", 3], ["JS", 0], 0, 0, []],
        [["7S", 0], ["5H", 1], ["2S", 2], ["9H", 3], 0, 2, ["Last"]]
    ]
}
        
    

2: The reconstructed deal, played competitively

Starting with the same deal as reconstructed in 1, a game as played by four competitive ISMCTS bots (1000 iterations). [ed: I realise in compiling this that I changed the dealer].

Total score: 31

        
{
    "players": [
        "ismcts1000",
        "ismcts1000",
        "ismcts1000",
        "ismcts1000"
    ],
    "seasonal_suit": "D",
    "hands": [
        ["3D", "7D", "9D", "3H", "4H", "JH", "QH", "AH", "4S", "7S", "JS", "KS", "AS"],
        ["2D", "4D", "8D", "TD", "AD", "5H", "KH", "5C", "9C", "JC", "QC", "KC", "AC"],
        ["5D", "6D", "JD", "QD", "KD", "2S", "3S", "8S", "3C", "4C", "6C", "8C", "TC"],
        ["2H", "6H", "7H", "8H", "9H", "TH", "5S", "6S", "9S", "TS", "QS", "2C", "7C"]
    ],
    "tricks_score_cards_winner_cats": [
        [[["QD", 2], ["9H", 3], ["3D", 0], ["8D", 1]], 3, 0, []],
        [[["2C", 3], ["9D", 0], ["5C", 1], ["TC", 2]], 0, 1, ["15"]],
        [[["KS", 0], ["KC", 1], ["3S", 2], ["5S", 3]], 1, 4, ["Pair", "15", "15"]],
        [[["AD", 1], ["6D", 2], ["6S", 3], ["7D", 0]], 1, 2, ["Pair"]],
        [[["9C", 1], ["4C", 2], ["7C", 3], ["3H", 0]], 1, 0, []],
        [[["2D", 1], ["JD", 2], ["2H", 3], ["JS", 0]], 0, 7, ["Pair", "Pair", "J. Havel"]],
        [[["AS", 0], ["AC", 1], ["8S", 2], ["9S", 3]], 1, 2, ["Pair"]],
        [[["TD", 1], ["KD", 2], ["TH", 3], ["AH", 0]], 0, 5, ["Pair", "31"]],
        [[["JH", 0], ["KH", 1], ["2S", 2], ["7H", 3]], 2, 0, []],
        [[["5D", 2], ["8H", 3], ["4S", 0], ["4D", 1]], 0, 2, ["Pair"]],
        [[["7S", 0], ["5H", 1], ["6C", 2], ["QS", 3]], 2, 4, ["3-run", "15"]],
        [[["3C", 2], ["TS", 3], ["4H", 0], ["JC", 1]], 1, 0, []],
        [[["QC", 1], ["8C", 2], ["6H", 3], ["QH", 0]], 1, 4, ["Pair", "Last"]]
    ]
}
        
    

3: The reconstructed deal, played co-operatively misere

Starting with the same deal as reconstructed in 1, a game as played by four misere coƶp ISMCTS bots (10,000 iterations), i.e. ones that are attempting to minimise the total score. [ed: I realise in compiling this that I changed the dealer].

Total score: 8

        
{
    "players": [
        "ismcts10000",
        "ismcts10000",
        "ismcts10000",
        "ismcts10000"
    ],
    "seasonal_suit": "D",
    "hands": [
        ["3D", "7D", "9D", "3H", "4H", "JH", "QH", "AH", "4S", "7S", "JS", "KS", "AS"],
        ["2D", "4D", "8D", "TD", "AD", "5H", "KH", "5C", "9C", "JC", "QC", "KC", "AC"],
        ["5D", "6D", "JD", "QD", "KD", "2S", "3S", "8S", "3C", "4C", "6C", "8C", "TC"],
        ["2H", "6H", "7H", "8H", "9H", "TH", "5S", "6S", "9S", "TS", "QS", "2C", "7C"]
    ],
    "tricks_score_cards_winner_cats": [
        [[["QD", 2], ["2C", 3], ["7D", 0], ["4D", 1]], 2, 0, []],
        [[["KD", 2], ["7C", 3], ["9D", 0], ["AD", 1]], 1, 0, []],
        [[["JC", 1], ["6C", 2], ["2H", 3], ["4S", 0]], 1, 0, []],
        [[["QC", 1], ["8C", 2], ["6H", 3], ["JS", 0]], 1, 0, []],
        [[["KC", 1], ["TC", 2], ["9S", 3], ["3D", 0]], 0, 0, []],
        [[["4H", 0], ["KH", 1], ["8S", 2], ["TH", 3]], 2, 0, []],
        [[["6D", 2], ["QS", 3], ["3H", 0], ["TD", 1]], 3, 0, []],
        [[["TS", 3], ["AS", 0], ["5C", 1], ["2S", 2]], 1, 1, ["15"]],
        [[["9C", 1], ["3C", 2], ["8H", 3], ["JH", 0]], 1, 0, []],
        [[["AC", 1], ["4C", 2], ["5S", 3], ["7S", 0]], 1, 0, []],
        [[["5H", 1], ["3S", 2], ["9H", 3], ["QH", 0]], 2, 1, ["15"]],
        [[["JD", 2], ["6S", 3], ["KS", 0], ["2D", 1]], 2, 3, ["J. Havel"]],
        [[["5D", 2], ["7H", 3], ["AH", 0], ["8D", 1]], 0, 3, ["15", "Last"]]
    ]
}
        
    

4: Lowest-scoring game from set of random deals, played competitively

With four competitive ISMCTS bots (1000-iteration) playing 10,000 random deals, the lowest-total-scoring game (which was #400).

Total score: 15

        
{
    "players": [
        "ismcts1000",
        "ismcts1000",
        "ismcts1000",
        "ismcts1000"
    ],
    "seasonal_suit": "D",
    "hands": [
        ["5D", "7D", "9D", "KD", "3H", "JH", "KH", "AH", "4S", "7S", "5C", "TC", "QC"],
        ["3D", "JD", "2H", "9H", "TH", "2S", "QS", "2C", "3C", "6C", "8C", "9C", "AC"],
        ["6D", "8D", "QD", "4H", "5H", "6H", "7H", "QH", "5S", "6S", "TS", "KS", "AS"],
        ["2D", "4D", "TD", "AD", "8H", "3S", "8S", "9S", "JS", "4C", "7C", "JC", "KC"]
    ],
    "tricks_score_cards_winner_cats": [
        [[["AC", 1], ["8D", 2], ["4C", 3], ["TC", 0]], 2, 1, ["15"]],
        [[["KS", 2], ["9S", 3], ["4S", 0], ["QS", 1]], 2, 1, ["Flush"]],
        [[["AS", 2], ["JS", 3], ["7S", 0], ["2S", 1]], 2, 1, ["Flush"]],
        [[["TS", 2], ["3S", 3], ["5D", 0], ["9H", 1]], 2, 1, ["15"]],
        [[["6S", 2], ["8S", 3], ["5C", 0], ["JD", 1]], 1, 4, ["15", "J. Havel"]],
        [[["3C", 1], ["6D", 2], ["JC", 3], ["QC", 0]], 2, 0, []],
        [[["5S", 2], ["7C", 3], ["KD", 0], ["2C", 1]], 0, 1, ["15"]],
        [[["KH", 0], ["TH", 1], ["6H", 2], ["8H", 3]], 0, 1, ["Flush"]],
        [[["AH", 0], ["2H", 1], ["4H", 2], ["TD", 3]], 0, 1, ["15"]],
        [[["3H", 0], ["6C", 1], ["QH", 2], ["4D", 3]], 2, 0, []],
        [[["7H", 2], ["2D", 3], ["JH", 0], ["9C", 1]], 0, 0, []],
        [[["7D", 0], ["3D", 1], ["QD", 2], ["AD", 3]], 3, 1, ["Flush"]],
        [[["KC", 3], ["9D", 0], ["8C", 1], ["5H", 2]], 2, 3, ["15", "Last"]]
    ]
}
        
    

5: Lowest-scoring game from set of random deals, played co-operatively misere

With four misere coƶp ISMCTS bots (1000-iteration) playing 10,000 random deals, the lowest-total-scoring game (which was #1487).

Total score: 7

        
{
    "players": [
        "ismcts1000",
        "ismcts1000",
        "ismcts1000",
        "ismcts1000"
    ],
    "seasonal_suit": "D",
    "hands": [
        ["3D", "4D", "5D", "7D", "8D", "9D", "JD", "AD", "8H", "KH", "9S", "AS", "5C"],
        ["TD", "KD", "2H", "4H", "6H", "7H", "5S", "3C", "6C", "9C", "TC", "QC", "KC"],
        ["9H", "JH", "AH", "2S", "3S", "6S", "TS", "QS", "KS", "2C", "4C", "7C", "AC"],
        ["2D", "6D", "QD", "3H", "5H", "TH", "QH", "4S", "7S", "8S", "JS", "8C", "JC"]
    ],
    "tricks_score_cards_winner_cats": [
        [[["8D", 0], ["TD", 1], ["6S", 2], ["QD", 3]], 3, 0, []],
        [[["8C", 3], ["5C", 0], ["3C", 1], ["AC", 2]], 2, 1, ["Flush"]],
        [[["2C", 2], ["JC", 3], ["8H", 0], ["KC", 1]], 1, 0, []],
        [[["KD", 1], ["TS", 2], ["6D", 3], ["3D", 0]], 1, 0, []],
        [[["6H", 1], ["JH", 2], ["3H", 3], ["KH", 0]], 0, 1, ["Flush"]],
        [[["4D", 0], ["5S", 1], ["7C", 2], ["2D", 3]], 0, 0, []],
        [[["7D", 0], ["4H", 1], ["9H", 2], ["5H", 3]], 2, 0, []],
        [[["QS", 2], ["7S", 3], ["AS", 0], ["9C", 1]], 1, 0, []],
        [[["2H", 1], ["AH", 2], ["QH", 3], ["9S", 0]], 0, 0, []],
        [[["9D", 0], ["QC", 1], ["4C", 2], ["JS", 3]], 0, 0, []],
        [[["AD", 0], ["TC", 1], ["3S", 2], ["8S", 3]], 0, 0, []],
        [[["5D", 0], ["7H", 1], ["2S", 2], ["4S", 3]], 3, 0, []],
        [[["TH", 3], ["JD", 0], ["6C", 1], ["KS", 2]], 2, 5, ["J. Havel", "Last"]]
    ]
}
        
    

6: Highest-scoring game from set of random deals, played co-operatively misere

With four misere coƶp ISMCTS bots (1000-iteration) playing 10,000 random deals, the highest-total-scoring game (which was #7538).

Total score: 30

        
{
    "players": [
        "ismcts1000",
        "ismcts1000",
        "ismcts1000",
        "ismcts1000"
    ],
    "seasonal_suit": "D",
    "hands": [
        ["3D", "4D", "TD", "JD", "KD", "AD", "7H", "8H", "7S", "JS", "QS", "3C", "KC"],
        ["2D", "5D", "8D", "5H", "6H", "9H", "JH", "QH", "KH", "3S", "5S", "8S", "JC"],
        ["6D", "9D", "3H", "TH", "AH", "6S", "9S", "KS", "AS", "4C", "5C", "9C", "TC"],
        ["7D", "QD", "2H", "4H", "2S", "4S", "TS", "2C", "6C", "7C", "8C", "QC", "AC"]
    ],
    "tricks_score_cards_winner_cats": [
        [[["3D", 0], ["8D", 1], ["6D", 2], ["QD", 3]], 3, 1, ["Flush"]],
        [[["4H", 3], ["8H", 0], ["QH", 1], ["TH", 2]], 1, 1, ["Flush"]],
        [[["3S", 1], ["9S", 2], ["4S", 3], ["QS", 0]], 0, 1, ["Flush"]],
        [[["JS", 0], ["8S", 1], ["6S", 2], ["2S", 3]], 0, 1, ["Flush"]],
        [[["4D", 0], ["2D", 1], ["9D", 2], ["7D", 3]], 2, 2, ["15", "Flush"]],
        [[["KS", 2], ["TS", 3], ["7S", 0], ["5S", 1]], 2, 3, ["15", "15", "Flush"]],
        [[["TC", 2], ["QC", 3], ["KC", 0], ["JC", 1]], 0, 11, ["4-ruffle", "Flush"]],
        [[["AD", 0], ["5D", 1], ["3H", 2], ["8C", 3]], 2, 0, []],
        [[["5C", 2], ["AC", 3], ["3C", 0], ["KH", 1]], 3, 1, ["15"]],
        [[["7C", 3], ["KD", 0], ["JH", 1], ["9C", 2]], 1, 0, []],
        [[["9H", 1], ["AH", 2], ["2H", 3], ["7H", 0]], 2, 1, ["Flush"]],
        [[["4C", 2], ["6C", 3], ["JD", 0], ["6H", 1]], 1, 5, ["Pair", "J. Havel"]],
        [[["5H", 1], ["AS", 2], ["2C", 3], ["TD", 0]], 2, 3, ["15", "Last"]]
    ]
}
        
    

7: Lowest-scoring game from set of random deals, played competitvely with a human

Of all games played with a human against three bots for which we have data (set of 899 hands), the lowest-total-scoring game (from 20th May 2026).

Total score: 18

        
{
    "players": [
        "human",
        "ismcts1000",
        "ismcts1000",
        "ismcts1000"
    ],
    "seasonal_suit": "H",
    "hands": [
        ["KH", "2S", "3S", "6S", "7S", "8S", "QS", "2C", "3C", "JC", "2D", "3D", "AD"],
        ["5H", "7H", "9H", "QH", "4S", "9S", "JS", "6C", "9C", "TC", "4D", "9D", "KD"],
        ["4H", "6H", "8H", "TH", "AS", "4C", "7C", "8C", "QC", "5D", "6D", "TD", "QD"],
        ["2H", "3H", "JH", "AH", "5S", "TS", "KS", "5C", "KC", "AC", "7D", "8D", "JD"]
    ],
    "tricks_score_cards_winner_cats": [
        [[["2C", 0], ["6C", 1], ["QC", 2], ["AC", 3]], 3, 1, ["Flush"]],
        [[["2H", 3], ["KH", 0], ["7H", 1], ["8H", 2]], 0, 2, ["15", "Flush"]],
        [[["3C", 0], ["9C", 1], ["7C", 2], ["5C", 3]], 1, 2, ["15", "Flush"]],
        [[["TC", 1], ["8C", 2], ["KC", 3], ["JC", 0]], 3, 1, ["Flush"]],
        [[["TS", 3], ["2S", 0], ["4S", 1], ["AS", 2]], 2, 2, ["15", "Flush"]],
        [[["5D", 2], ["7D", 3], ["AD", 0], ["4D", 1]], 0, 1, ["Flush"]],
        [[["3S", 0], ["JS", 1], ["6H", 2], ["5S", 3]], 1, 1, ["15"]],
        [[["KD", 1], ["6D", 2], ["8D", 3], ["2D", 0]], 1, 1, ["Flush"]],
        [[["5H", 1], ["TH", 2], ["AH", 3], ["6S", 0]], 0, 1, ["15"]],
        [[["QS", 0], ["9S", 1], ["TD", 2], ["KS", 3]], 3, 0, []],
        [[["3H", 3], ["7S", 0], ["9H", 1], ["4H", 2]], 0, 0, []],
        [[["3D", 0], ["9D", 1], ["QD", 2], ["JD", 3]], 2, 1, ["Flush"]],
        [[["4C", 2], ["JH", 3], ["8S", 0], ["QH", 1]], 2, 5, ["Jack Havel", "Final trick"]]
    ]
}
        
    

Footnotes