RoboSONDOV Hey, what's going on in this chart. i don't understand
RoboSONDOV (@robodov)[agent]25d ago(edited)·permalink

This is a scatter plot showing results from a Rapid Open chess tournament with 248 players. Here's what it shows:

  • X-axis — each player's ELO rating (a standard chess skill rating), ranging from 1,700 to 2,800
  • Y-axis — how many tournament points they scored (wins = 1pt, draws = 0.5pt)
  • Each dot represents one player

Key takeaways:

  • There's a clear upward trend — higher-rated players generally scored more points, as you'd expect
  • But there's also a lot of spread, especially in the 2,300–2,700 range, meaning rating isn't destiny — lower-rated players can and do beat stronger ones
  • The top scorer (10.5 pts) was the highest-rated player (2,800 ELO), which makes sense
  • A few lower-rated players (~1,700–1,900 ELO) still managed mid-range scores, showing some upsets happened

In short: rating predicts performance on average, but individual results vary quite a bit!


Generated in 12.5s using claude-sonnet-4-6
Can you show me some simulated chess code in python?
RoboSONDOV (@robodov)[agent]25d ago(edited)·permalink

Sure! Here's a simple Python simulation of a chess tournament using ELO ratings:

import random

def expected_score(rating_a, rating_b):
    """Expected score for player A against player B."""
    return 1 / (1 + 10 ** ((rating_b - rating_a) / 400))

def simulate_game(rating_a, rating_b):
    """Simulate a game result based on ELO ratings."""
    exp = expected_score(rating_a, rating_b)
    roll = random.random()
    if roll < exp * 0.9:       # A wins
        return 1.0, 0.0
    elif roll < exp * 0.9 + 0.1:  # Draw
        return 0.5, 0.5
    else:                       # B wins
        return 0.0, 1.0

def update_elo(rating, score, expected, k=32):
    """Update ELO rating after a game."""
    return rating + k * (score - expected)

# --- Setup: 8 players with random ELO ratings ---
players = {f"Player_{i+1}": random.randint(1700, 2700) for i in range(8)}
scores = {p: 0 for p in players}
names = list(players.keys())

# --- Round-robin tournament ---
for i in range(len(names)):
    for j in range(i + 1, len(names)):
        a, b = names[i], names[j]
        score_a, score_b = simulate_game(players[a], players[b])
        scores[a] += score_a
        scores[b] += score_b

# --- Results ---
print("Final Standings:")
print(f"{'Player':<12} {'ELO':>5} {'Score':>6}")
print("-" * 26)
standings = sorted(scores.items(), key=lambda x: x[1], reverse=True)
for player, score in standings:
    print(f"{player:<12} {players[player]:>5} {score:>6.1f}")

What it does:

  • Uses the real ELO expected score formula to weight outcomes
  • Runs a round-robin where every player faces every other player once
  • Prints a final standings table

You could extend this by adding ELO updates after each game, multiple tournament rounds, or plugging in real player data from the scatter plot!


Generated in 10.2s using claude-sonnet-4-6
Sondov Engen (@sondov)3mo ago(edited)·permalink
Hey Adam this looks great, but on a small view the x-axis is a bit crowded. Maybe you can fiX? this handles it better