{"id":38795106,"url":"https://github.com/seifertd/tournament3","last_synced_at":"2026-05-07T00:05:09.697Z","repository":{"id":153714357,"uuid":"617286210","full_name":"seifertd/tournament3","owner":"seifertd","description":"Back to basics NCAA basketball pool software implemented in pure C.","archived":false,"fork":false,"pushed_at":"2025-08-10T00:56:25.000Z","size":279,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-10T02:31:36.633Z","etag":null,"topics":["clang","ncaa-basketball","ncaa-bracket"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seifertd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-03-22T04:11:17.000Z","updated_at":"2025-08-10T00:56:28.000Z","dependencies_parsed_at":"2024-03-20T01:31:10.983Z","dependency_job_id":"3e80169a-2445-4e93-a562-4c497e712b18","html_url":"https://github.com/seifertd/tournament3","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/seifertd/tournament3","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seifertd%2Ftournament3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seifertd%2Ftournament3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seifertd%2Ftournament3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seifertd%2Ftournament3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seifertd","download_url":"https://codeload.github.com/seifertd/tournament3/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seifertd%2Ftournament3/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28508523,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T11:50:55.898Z","status":"ssl_error","status_checked_at":"2026-01-17T11:50:55.569Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clang","ncaa-basketball","ncaa-bracket"],"created_at":"2026-01-17T12:41:42.557Z","updated_at":"2026-05-07T00:05:09.686Z","avatar_url":"https://github.com/seifertd.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"Tournament 3\n-------------\nBack to basics NCAA march madness basketball pool software implemented in pure C for speed.\nNo nonsensical bit twiddling.  40.2M bracket scores per second. \n\nImplemented as a single file header for command line pool management.\nThis may change at some point, not sure what benefit this has as\nthe use case I was thinking of no longer applies.\n\nBuilding\n--------\n\nRun\n\n```console\n$ make\n$ ./pool -h\n```\n\nUses the value of CC environment variable, or `cc` by default (`clang` on Darwin).\n\nUse clang explicitly:\n\n```console\n$ CC=clang make\n```\n\nTested on Linux Mint, Ubuntu, Windows 11 (MinGW), Windows 11 (WSL) and Mac OS X (M1).\n\nRunning a Pool\n--------------\nYou can use this software to run your office or friend group NCAA pool.\n\nInstructions\n------------\n1. Create a directory on your computer to hold the pool files.\n1. Create the `config.txt` file and set your pool's name, scoring method\n   and round scores.\n   1. If you are running this pool for profit, also fill in the `fee`\n      and `payouts` lines.\n   1. The `fee` is the number of currency units you collect per entry.\n   1. The `payouts` line is a comma separated list of no more than\n      4 integers which specify the payouts by rank. The first 3\n      values pay out 1st, 2nd, and 3rd place. The 4th value pays\n      out last place.\n      1. positive numbers specify a percentage of the total fees collected\n      1. -1 specifies that place gets the entry fee back.\n      1. The sum of the percentages has to equal exactly 100\n   1. [Sample `config.txt` file](https://seifertd.github.io/tournament3/2026/config.txt)\n1. Create the `teams.txt` file in the directory.\n   1. Each line is in the form \"Long Name,3-character Short Name\". Any extra fields (like seed number) are ignored.\n   1. Each team must have a unique short name. \n   1. The short names are case sensitive.\n   1. For the four play in games, use `PI1`, `PI2`, `PI3` and `PI4` as the\n      short name. The long name is irrelevant.\n   1. The order of teams listed is as follows: top left region first, bottom left region second,\n      top right region third, bottom right region fourth. The left side plays the right side\n      in the championship. Within each region, teams are in play order by seed as follows:\n      1, 16, 8, 9, 5, 12, 4, 13, 6, 11, 3, 14, 7, 10, 2, 15\n   1. Lines starting with a `#` character are considered comments and ignored\n   1. Optionally, include exactly 4 `Region: Name` lines to name the four regions\n      (e.g. `Region: East`). They can appear anywhere in the file. If omitted,\n      regions are labeled Region 1 through Region 4 in the teams report.\n   1. [Sample `teams.txt` file](https://seifertd.github.io/tournament3/2026/teams.txt)\n1. Collect entries\n   1. You can hand out forms, set up a pool on one of the free websites\n      or send out the included bracket HTML entry collector page via email.\n   1. The HTML entry collector needs to be edited with the current year's\n      teams.\n      1. New for 2024: there is a ruby script to generate the web entry collector\n         from the teams file. You need a working ruby install and can run it as\n         follows: `ruby web/make_bracket.rb ./2026/teams.txt ./web/2026_bracket.html ./2026/ncaa_2026.logo`\n         * 1st argument: the location of the generator script in this repo\n         * 2nd argument: the location of the teams file\n         * 3rd argument: location where to save the bracket\n         * 4th argument: the location of a logo image file in urldata format.\n      1. NOTE: The teams file MUST contain exactly 4 `Region: Name` lines for the\n         bracket generator to label the regions correctly. See the sample teams.txt\n         file above for correct format.\n   1. Here is what the HTML entry collector looks like: [Latest NCAA Tournament Bracket](https://seifertd.github.io/tournament3/web/2026_bracket.html)\n1. Create the `entries` subfolder and copy/create/save any entry files you\n   got from the pool entrants. \n1. Generate an entries report and send it out to everyone for confirmation:\n   `./pool -d mypool entries`\n1. Handle the play in games.\n   1. As the play in games are played, add to\n      the pool `config.txt` file lines that map the place holder short\n      team names (`PI[1234]`) with a new short name matching the winner.\n      You will end up with lines like:\n      ```\n      PI1=Wag\n      PI2=Cdo\n      PI3=GrS\n      PI4=CSt\n      ```\n   1. Make sure to change the long name of the play in teams in the\n      `teams.txt` file, but don't modify the `PI[1234]` short names.\n1. As games are played in the tournament, record the winners in the \n   `results.txt` file, one team short name per line. For play in games,\n   you can use either the original `PI[1234]` short names or the mapped\n   short names of the play in games from the step above.\n   1. [Sample `results.txt` file](https://seifertd.github.io/tournament3/2025/results.txt)\n1. Run the scores report: `./pool -d mypool scores` until the first round\n   is complete.\n1. Run your first possibilities report as soon as your machine\n   can handle it: `./pool -d mypool -p poss` and pass\n   around the results via email, slack, discord or whatever.\n1. When the final four teams are determined, run the Final Four\n   report to show all top 4 standings and payouts (if configured) for\n   each of the remaining possibilities: `./pool -d mypool ffour`\n\nScorers\n-------\nThe pool configuration specifies the scorer to use in the pool.\nEach scorer uses as input the bracket being scored, the winning\nteam number, the losing team number, the round number and the\ngame number. In addition to the scorer, the pool configuration\nspecifies 6 round scores that the scorer can use. The default\nround scores are 1, 2, 4, 8, 16, 32. To override the default,\nsupply a `roundScores` configuration option in the `config.txt`\nfile:\n\n   ```\n   roundScores=1,2,4,8,12,24\n   ```\nThese are the supported scorers:\n\n1. Basic: each correct pick is worth a constant amount - the round\n   round score configured for that round.\n1. Upset: each correct pick is worth the round score for the\n   game’s round plus the seed number of the winning team.\n1. SeedDiff: each correct pick is worth the round score for the\n   game’s round plus the difference in seeds of the winning team and\n   the losing team. The bonus points only apply if the loser was\n   picked correctly and the winner’s seed is greater than the\n   loser’s seed.\n1. RelaxedSeedDiff: each correct pick is worth the round score\n   for the game’s round plus the difference in seeds of the winning\n   team and the losing team. The bonus points only apply if\n   winner’s seed is greater than the loser’s seed. This differs\n   from SeedDiff in that the loser in the game need not have been\n   picked correctly.\n1. JoshP: each correct pick is worth the round score for the\n   game's round multiplied by the seed number of the winning team.\n1. UpsetMultiplier: each correct pick is worth the round score\n   for the game's round multiplied by the winner's seed divided by\n   the loser's seed when the winner's seed is greater (an upset).\n   Otherwise it is worth just the round score. The actual\n   opponent is used, like RelaxedSeedDiff.\n\nPossibilities Report\n---------------------\n\nM1 mac can analyze 2.147B possible outcomes against 50 entries\nin 37 minutes once there are 32 teams remaining.\n\n```\nSupercalifragilistic Pool: Possibilities Report\nThere are 32 teams and 31 games remaining,  2.147B possible outcomes\nDFS BPS:       968207 100% ELAPSED: 00:36:58\n            Min  Max  Curr  Max    Win   Times  Times\n    Name   Rank Rank Score Score Chance   Won    Tied Top Champs\n   entry23    1   29   193   497  17.93   385M 11.17M Cat,foe,wil,ane,hea\n   entry26    1   36   169   521  15.94 342.3M 8.821M mor,cir,mas,ten,gri\n   entry30    1   29   184   474  14.92 320.3M 11.19M slu,dis,dee,mus,hea\n   entry32    1   31   184   420   7.61 163.5M 6.399M lan,pos,dur,wid,sho\n   entry33    1   38   161   460   6.53 140.3M 5.080M fan,cla,ove,can,ane\n    entry7    1   37   165   444   5.13   110M 5.036M lan,aba,ext,spl,Cha\n    entry3    1   42   150   460   4.70 100.9M 4.543M dum,can,ten,ane,pos\n    entry9    1   33   169   439   4.43 95.10M 4.895M Cha,mus,ane,Wis,can\n    entry4    1   31   180   396   4.26 91.41M 4.098M moo,spl,ext,wid,aba\n   entry14    1   41   165   406   4.24 91.14M 4.179M dee,dum,mas,gri,Wis\n   entry47    1   44   155   380   2.57 55.11M 2.515M wil,mas,wid,pos,gri\n   entry50    1   36   167   423   2.11 45.27M 2.912M Cha,sho,aba,rap,pos\n   entry28    1   44   147   438   1.66 35.60M 1.718M mus,cir,lan,rap,gri\n   entry21    1   42   154   403   1.55 33.21M 1.777M mus,hea,spl,Wis,rap\n   entry19    1   41   158   363   1.20 25.79M 1.701M cla,spl,wid,sho,gri\n   entry38    1   40   161   368   1.19 25.66M 1.612M rap,wil,sho,spl,wid\n    entry6    1   48   121   423   0.82 17.61M 1.025M ten,ext,dur,foe,cir\n   entry13    1   48   128   352   0.40 8.512M 512.9K cir,Wis,pin,ove,dum\n   entry20    1   44   146   333   0.31 6.577M 587.7K dee,pin,ten,cla,ove\n   entry10    1   43   150   345   0.24 5.236M   477K sho,cla,ext,cir,aba\n   entry36    1   49   119   392   0.12 2.644M 213.4K aba,dur,dis,wid,spl\n   entry16    1   44   146   353   0.10 2.212M 208.7K moo,foe,mas,Wis,ext\n   entry41    1   40   155   302   0.06 1.254M 186.9K gri,aba,wid,pos,spl\n   entry29    1   50   102   303   0.05 1.042M 86.31K mas,spl,ext,aba,pos\n   entry37    1   48   133   335   0.03 630.7K 107.5K ten,spl,aba,gri,foe\n   entry46    1   50   122   320   0.02 497.2K 62.95K mus,dur,ten,mas,gri\n    entry8    1   50   101   311   0.01 232.3K 23.14K rap,pos,pin,can,gri\n   entry31    1   50   100   318   0.01 166.9K 20.40K moo,ane,Wis,ext,wil\n   entry34    1   50   124   272   0.00 46.97K 11.22K wid,mas,pin,ove,gri\n   entry12    1   50   103   267   0.00   2720    752 rap,ane,ext\n   entry27    1   50   122   255   0.00     29     64 cir,gri,rap,dur,ove\n   entry17    2   50   114   291   0.00      0      0\n    entry1    2   48   136   289   0.00      0      0\n   entry43    2   49   128   284   0.00      0      0\n   entry24    2   46   140   271   0.00      0      0\n   entry42    2   49   119   258   0.00      0      0\n   entry40    3   50    70   253   0.00      0      0\n   entry15    4   50   112   253   0.00      0      0\n    entry2    3   50   101   247   0.00      0      0\n   entry48    6   50   103   236   0.00      0      0\n   entry35    3   50    91   234   0.00      0      0\n   entry18    6   50   103   225   0.00      0      0\n   entry49    8   50   103   219   0.00      0      0\n   entry45    6   49   112   210   0.00      0      0\n   entry25   10   50   111   201   0.00      0      0\n   entry11   10   50   106   199   0.00      0      0\n   entry22   16   50   104   184   0.00      0      0\n    entry5   13   50    84   184   0.00      0      0\n   entry39   18   50   104   177   0.00      0      0\n   entry44   27   50    91   152   0.00      0      0\n```\n\nWe want to generate all possible outcomes and score all the entries\nagainst them. Set up a DFS with inputs:\n* games - array of game numbers remaining\n* gamesLeft - size of this array\n* game - game in games array under review\n* stats - array of stats structs, one per entry\n  * maxRank, minRank, maxScore, timesWon, timesTied, possibleScore, champCounts[], bracket\n  * possibleScore is set to current bracket score given state of tournament so far\n\nAlgo:\n1. Initial setup as above\n1. Determine the two teams in games[game]\n1. Assume winner is the first team, calculate gameScore for each entry, add\n   to possibleScore = possibleScore + gameScore\n1. Recurse with game += 1. If game == gamesLeft, sort stats by possiblScore and update stats for this result, stop recursion.\n1. Subtract the gameScore from step 2 from each possibleScore of each entry\n1. Repeat 2-5 with winner assumed to be second team\n\nmax recursion depth would be = number of games remaining\n\nParallelization of Possibilities Report\n---------------------------------------\nWe can parallelize the above to a power of 2 processes/servers/cores/etc if the\ncurrent tournament bracket is advanced and the algo run from there, then results\ncollected and combined.\n\n2 runners:\n  * 1st runner assumes game 1 winner is team1\n  * 2nd runner assumes game 1 winner is team2\n\n4 runners:\n  * 1st runner assumes game 1 winner is team1, game 2 winner is team1\n  * 2nd runner assumes game 1 winner is team2, game 2 winner is team1\n  * 3nd runner assumes game 1 winner is team1, game 2 winner is team2\n  * 4th runner assumes game 1 winner is team2, game 2 winner is team2\n\n8 runners:\n  * 1st runner assumes game 1 winner is team1, game 2 winner is team1, game 3 winner is team1\n  * 2nd runner assumes game 1 winner is team2, game 2 winner is team1, game 3 winner is team1\n  * 3nd runner assumes game 1 winner is team1, game 2 winner is team2, game 3 winner is team1\n  * 4th runner assumes game 1 winner is team2, game 2 winner is team2, game 3 winner is team1\n  * 5th runner assumes game 1 winner is team1, game 2 winner is team1, game 3 winner is team2\n  * 6th runner assumes game 1 winner is team2, game 2 winner is team1, game 3 winner is team2\n  * 7th runner assumes game 1 winner is team1, game 2 winner is team2, game 3 winner is team2\n  * 8th runner assumes game 1 winner is team2, game 2 winner is team2, game 3 winner is team2\n\netc\n\nExample run with 8 processes, collecting results into binary files in the pool directory:\n\n```console\n./pool -d test/fifty_entries -b 0 -n 8 -f bin poss \u0026\n./pool -d test/fifty_entries -b 1 -n 8 -f bin poss \u0026\n./pool -d test/fifty_entries -b 2 -n 8 -f bin poss \u0026\n./pool -d test/fifty_entries -b 3 -n 8 -f bin poss \u0026\n./pool -d test/fifty_entries -b 4 -n 8 -f bin poss \u0026\n./pool -d test/fifty_entries -b 5 -n 8 -f bin poss \u0026\n./pool -d test/fifty_entries -b 6 -n 8 -f bin poss \u0026\n./pool -d test/fifty_entries -b 7 -n 8 -f bin poss \u0026\n```\n\nWhen `-f bin` is used, a binary file with partial stats is written to the pool directory.\nThe partial stats file names are `poss_N_of_M.bin`.\n\nAfter producing the files (possibly on different machines), collect them into the\npool directory, then generate the possibilities report:\n\n```console\n./pool -d test/fifty_entries -r poss\n```\n\nUsing this method and a compute cloud of 4,096 Spot instances, we can generate a possibilities\nreport after Day 1 is complete in about 4 hours at a cost of roughly $280. See `aws/` for a\ncomplete implementation using AWS Batch.\n\nOn a single machine (M1 Mac), run one process per core using `parallel.sh` (set `PROCS` to your\ncore count). At 2.3M brackets/sec per process, a 12-core machine can generate the report\nin under 1 hour once there are 36 games remaining (about 37 teams), taking roughly 41\nminutes. With fewer cores the threshold is lower — for N cores it is when\n2^(games remaining) / (N × 2,300,000) falls under 3,600 seconds.\n\nMonte Carlo Possibilities Report\n---------------------------------\nWhen there are more than ~36 games remaining (e.g. immediately after Day 1 with\n31 games left), the exhaustive DFS is not practical on a single machine. The `mc`\ncommand runs a fast Monte Carlo simulation instead: it generates N random tournament\ncompletions, scores all entries against each one, and reports win probabilities with\nstatistical error margins.\n\nGame outcomes are sampled using one of two selection modes, controlled by the `-m`\nflag.\n\n### Selection modes\n\n**`-m seed` (default)** — Seed-weighted probability. For a matchup between seed S1\nand seed S2, the probability that the lower-seeded team wins is S2 / (S1 + S2)\n(e.g. a 1 vs 16 gives the 1-seed a ~94% chance; a 5 vs 12 gives ~71%). Simple and\nrequires no extra data, but is a rough approximation.\n\n**`-m model`** — Statistical model weighted by 24 team statistics sourced from\n[algebracket.com](https://algebracket.com). Each team is scored by computing a\nweighted sum of its normalized statistics; the win probability for a matchup is\n`score1 / (score1 + score2)`. This requires two additional files in the pool\ndirectory:\n\n- `weights.json` — a JSON object mapping each of the 24 stat IDs to its weight\n  (0–10). Use your own slider values from [algebracket.com](https://algebracket.com)\n  to reflect your own prediction preferences. The JSON key for each slider is\n  derived from the stat name by removing lowercase letters, spaces, and punctuation\n  (replacing `%` with `P`):\n\n  | JSON key  | Stat name              | JSON key  | Stat name              |\n  |-----------|------------------------|-----------|------------------------|\n  | `Seed`    | Seed                   | `OTSP`    | Opp. True Shoot %      |\n  | `WP`      | Win %                  | `P`       | Pace                   |\n  | `SS`      | SoS                    | `TP`      | Turnover %             |\n  | `PG`      | Pts / Gm               | `OTP`     | Opp. Turnover %        |\n  | `OPG`     | Opp Pts / Gm           | `TM`      | Turnover Margin        |\n  | `FGP`     | FG %                   | `AP`      | Assist %               |\n  | `3PFGP`   | 3Pt FG %               | `AT`      | Assists / Turnover     |\n  | `FTP`     | Free Throw %           | `FTFGA`   | FT / FGA               |\n  | `OR`      | Offense Rating         | `OFTFGA`  | Opp. FT / FGA          |\n  | `DR`      | Defense Rating         | `RP`      | Rebound %              |\n  | `ASM`     | Adj. Score Margin      | `ORP`     | Off. Rebound %         |\n  | `EFGP`    | Effective FG %         | `TSP`     | True Shooting %        |\n\n- `stats.csv` — per-team statistics in the algebracket CSV format (one row per\n  team, normalized stats in columns). The file must begin with front-matter comment\n  lines that map each anglebracket region integer to its pool region name, so teams\n  can be matched by (region, seed) rather than by name:\n\n```\n# region 0: East\n# region 1: South\n# region 2: West\n# region 3: Midwest\nRank,Name,Games Won,Region,Seed,Win %,SoS,...\n```\n\n```console\n./pool -d mypool -s 1000000 mc                  # seed-weighted (default)\n./pool -d mypool -s 1000000 -m model mc         # algebracket model\n```\n\nWith 1,000,000 simulations the worst-case statistical margin of error is ±0.1% at\n95% confidence. Runtime is a few seconds on any modern machine. The `-p` flag shows\nprogress, and `-f json` outputs JSON. The `-s` flag controls sample count (default\n1,000,000).\n\nThe output table mirrors the `poss` report format with an inline ±margin on the\nWin% column showing the statistical uncertainty for each entry's win probability.\n\nHTML Status Report\n---------------------------------\nIncluded in the repo is a ruby script that will generate a HTML\nstatus report page that you can either host on a web server or send \naround for opening in a web browser. It is completely stand alone.\nTo create it run the ruby web/status/generate.rb script. The script \nis likewise completely stand alone, requiring only Ruby 3.x and relying\non no third party gems. You can run it at any time, including before\nthe tournament starts. It will generate a history of the leader\nboard and possibilities as the tournament progresses. You should run it\nbefore the tourny begins, after each day in the first weekend, and\nthen after the Sweet Sixten, Elite Eight, Final Four and Championship \ngame. It is ok to run it in between these milestones if you want to.\n\nSee a sample here: [HTML Status Report](https://seifertd.github.io/tournament3/2026/pool.html)\n\nTo run:\n\n```console\nruby ./web/status/generate.rb -d \u003cPOOL_DIR\u003e -o path/to/status.html\n```\nGame Index\n-----------\nGame numbers by round and what game numbers teams will play in\nas they advance. Read across and up.\n\n```\n                    Game indexes\n                      Round\nSeeds Teams     1  2   3   4   5  Championship\n1-16  t1 t2:    0 32--48--56--60--62\n8-9   t3 t4:    1--+   |   |   |   |\n5-12  t5 t6:    2 33---+   |   |   |\n4-13  t7 t8:    3--+       |   |   |\n6-11  t9 t10:   4 34--49 --+   |   |\n3-14  t11 t12:  5--+   |       |   |\n7-10  t13 t14:  6 35---+       |   |\n2-15  t15 t16:  7--+           |   |\n1-16  t17 t18:  8-36--50--57---+   |\n8-9   t19 t20:  9                  |\n5-12  t21 t22: 10 37               |\n4-13  t23 t24: 11                  |\n6-11  t25 t26: 12 38  51           |\n3-14  t27 t28: 13                  |\n7-10  t29 t30: 14 39               |\n2-15  t31 t32: 15                  |\n                                   |\n1-16  t33 t34: 16 40  52  58  61---+\n8-9   t35 t36: 17\n5-12  t37 t38: 18 41\n4-13  t39 t40: 19\n6-11  t41 t42: 20 42  53\n3-14  t43 t44: 21\n7-10  t45 t46: 22 43\n2-15  t47 t48: 23\n1-16  t49 t50: 24 44  54  59\n8-9   t51 t52: 25\n5-12  t53 t54: 26 45\n4-13  t55 t56: 27\n6-11  t57 t58: 28 46  55\n3-14  t59 t60: 29\n7-10  t61 t62: 30 47\n2-15  t63 t64: 31\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseifertd%2Ftournament3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseifertd%2Ftournament3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseifertd%2Ftournament3/lists"}