Astro-based site with 40+ interactive math games, puzzles, and explorations. Includes admin dashboard, todo system, blog, theme/subcategory navigation, and embed pages for iframe embedding. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
744 lines
22 KiB
TypeScript
744 lines
22 KiB
TypeScript
export type InteractiveStatus = "published" | "draft" | "idea";
|
|
|
|
export interface Interactive {
|
|
slug: string;
|
|
title: string;
|
|
description: string;
|
|
tags: string[];
|
|
themes: string[];
|
|
subcategory?: string;
|
|
dateAdded: string;
|
|
hasGreenScreen: boolean;
|
|
status: InteractiveStatus;
|
|
}
|
|
|
|
/** First theme in the themes array is the primary theme. */
|
|
export function primaryTheme(interactive: Interactive): string {
|
|
return interactive.themes[0];
|
|
}
|
|
|
|
export interface Subcategory {
|
|
slug: string;
|
|
title: string;
|
|
description: string;
|
|
}
|
|
|
|
export interface Theme {
|
|
slug: string;
|
|
title: string;
|
|
description: string;
|
|
subcategories?: Subcategory[];
|
|
}
|
|
|
|
export const allThemes: Theme[] = [
|
|
{
|
|
slug: "discrete-math",
|
|
title: "Discrete Math",
|
|
description:
|
|
"Explore fundamental concepts in discrete mathematics through visual and interactive demonstrations.",
|
|
subcategories: [
|
|
{
|
|
slug: "foundations",
|
|
title: "Foundations",
|
|
description:
|
|
"Basic concepts including sets, logic, number systems, and fundamental mathematical structures.",
|
|
},
|
|
{
|
|
slug: "proofs",
|
|
title: "Proofs",
|
|
description:
|
|
"Learn proof techniques including direct proofs, contradiction, induction, and formal reasoning.",
|
|
},
|
|
{
|
|
slug: "counting",
|
|
title: "Counting",
|
|
description:
|
|
"Combinatorics, permutations, combinations, and advanced counting principles.",
|
|
},
|
|
{
|
|
slug: "uncertainty",
|
|
title: "Uncertainty",
|
|
description:
|
|
"Probability theory, random variables, and statistical reasoning in discrete contexts.",
|
|
},
|
|
{
|
|
slug: "structures",
|
|
title: "Structures",
|
|
description:
|
|
"Algebraic structures, relations, functions, and abstract mathematical systems.",
|
|
},
|
|
{
|
|
slug: "numbers",
|
|
title: "Numbers",
|
|
description:
|
|
"Number theory, modular arithmetic, cryptography, and computational number theory.",
|
|
},
|
|
{
|
|
slug: "graphs",
|
|
title: "Graphs",
|
|
description:
|
|
"Graph theory, algorithms on graphs, trees, and network analysis.",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
slug: "games",
|
|
title: "Games",
|
|
description:
|
|
"Learn through play with educational games that reinforce computer science and mathematical concepts.",
|
|
},
|
|
{
|
|
slug: "puzzles",
|
|
title: "Puzzles",
|
|
description:
|
|
"Challenge your problem-solving skills with educational puzzles designed to reinforce key concepts across multiple disciplines.",
|
|
},
|
|
{
|
|
slug: "data-structures",
|
|
title: "Data Structures",
|
|
description:
|
|
"Master fundamental and advanced data structures through interactive manipulation and visualization.",
|
|
},
|
|
{
|
|
slug: "contest-problems",
|
|
title: "Contest Problems",
|
|
description:
|
|
"Practice with problems from programming competitions, mathematical olympiads, and algorithmic challenges.",
|
|
},
|
|
{
|
|
slug: "social-choice",
|
|
title: "Social Choice",
|
|
description:
|
|
"Understand voting systems, fairness criteria, and collective decision-making through interactive simulations.",
|
|
},
|
|
{
|
|
slug: "miscellany",
|
|
title: "Miscellany",
|
|
description:
|
|
"Unique educational experiments and interactive content that sparks curiosity and enhances learning.",
|
|
},
|
|
{
|
|
slug: "advanced-algorithms",
|
|
title: "Advanced Algorithms",
|
|
description:
|
|
"Deep dive into complex algorithmic concepts with step-by-step visualizations and performance analysis.",
|
|
},
|
|
{
|
|
slug: "cards-and-math",
|
|
title: "Cards and Math",
|
|
description:
|
|
"Discover mathematical principles and probability theory through card games and interactive demonstrations.",
|
|
},
|
|
];
|
|
|
|
export const allInteractives: Interactive[] = [
|
|
// === Discrete Math - Foundations ===
|
|
{
|
|
slug: "binary-number-game",
|
|
title: "Binary Number Representation",
|
|
description:
|
|
"Learn how numbers are represented in binary (base-2) format through an interactive guessing game.",
|
|
tags: ["binary", "numbers", "conversion", "representation"],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "foundations",
|
|
dateAdded: "2024-01-15",
|
|
hasGreenScreen: true,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "ternary-number-game",
|
|
title: "Ternary Number Representation",
|
|
description:
|
|
"Learn how numbers are represented in ternary (base-3) format by toggling between 0, 1, or 2 copies of powers of three.",
|
|
tags: ["ternary", "numbers", "conversion", "representation", "base-3"],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "foundations",
|
|
dateAdded: "2024-01-16",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "balanced-ternary-game",
|
|
title: "Balanced Ternary Representation",
|
|
description:
|
|
"Explore balanced ternary using digits T (-1), 0, and 1. Add or subtract powers of three to match the target number.",
|
|
tags: [
|
|
"balanced-ternary",
|
|
"numbers",
|
|
"conversion",
|
|
"representation",
|
|
"base-3",
|
|
"signed-digits",
|
|
],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "foundations",
|
|
dateAdded: "2024-01-17",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "zeckendorf-game",
|
|
title: "Zeckendorf Representation",
|
|
description:
|
|
"Learn how numbers are represented using Fibonacci numbers with the unique Zeckendorf representation (no consecutive Fibonacci numbers).",
|
|
tags: [
|
|
"fibonacci",
|
|
"numbers",
|
|
"representation",
|
|
"zeckendorf",
|
|
"combinatorics",
|
|
],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "foundations",
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "knights-and-knaves",
|
|
title: "Knights and Knaves I",
|
|
description:
|
|
"Solve logic puzzles on an island where knights always tell the truth and knaves always lie!",
|
|
tags: ["logic", "truth-tellers", "liars", "deduction", "puzzle"],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "foundations",
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "rules-of-inference",
|
|
title: "Rules of Inference Playground",
|
|
description:
|
|
"Practice applying resolution and equivalence rules to derive conclusions step by step in this interactive logic playground.",
|
|
tags: ["logic", "inference", "playground", "rules", "proofs", "educational"],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "foundations",
|
|
dateAdded: "2024-12-23",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "parity-bits-game",
|
|
title: "Parity Bits Game",
|
|
description:
|
|
"Learn about error detection and correction through an interactive game about parity bits!",
|
|
tags: ["parity", "error-detection", "binary", "educational"],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "foundations",
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Discrete Math - Counting ===
|
|
{
|
|
slug: "ferrers-rogers-ramanujan",
|
|
title: "Ferrers Diagrams & Rogers-Ramanujan",
|
|
description:
|
|
"Visualize integer partitions through Ferrers diagrams and explore the Rogers-Ramanujan identities interactively.",
|
|
tags: ["partitions", "combinatorics", "number-theory", "visualization"],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "counting",
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Discrete Math - Uncertainty ===
|
|
{
|
|
slug: "presents-puzzle",
|
|
title: "The Presents Puzzle",
|
|
description:
|
|
"Explore a probability puzzle about search strategies. Charlie puts 26 presents in 100 boxes. Alice opens them in order while Bob opens odds first, then evens.",
|
|
tags: [
|
|
"probability",
|
|
"search",
|
|
"simulation",
|
|
"expected-value",
|
|
"strategy",
|
|
"uncertainty",
|
|
],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "uncertainty",
|
|
dateAdded: "2025-01-19",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Discrete Math - Structures ===
|
|
{
|
|
slug: "burnsides-lemma",
|
|
title: "Burnside's Lemma",
|
|
description:
|
|
"Explore how to count distinct objects under symmetry by creating necklaces with different bead and color combinations.",
|
|
tags: [
|
|
"group-theory",
|
|
"symmetry",
|
|
"combinatorics",
|
|
"counting",
|
|
"algebra",
|
|
"structures",
|
|
],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "structures",
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "draft" as const,
|
|
},
|
|
|
|
// === Discrete Math - Graphs ===
|
|
{
|
|
slug: "neighbor-sum-avoidance",
|
|
title: "Neighbor Sum Avoidance",
|
|
description:
|
|
"Arrange numbers in a circle so that the sum of two neighbors is never divisible by 3, 5, or 7. An interactive graph theory puzzle!",
|
|
tags: [
|
|
"graph-theory",
|
|
"puzzle",
|
|
"arrangement",
|
|
"divisibility",
|
|
"circle",
|
|
"mathematics",
|
|
],
|
|
themes: ["Discrete Math"],
|
|
subcategory: "graphs",
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Data Structures ===
|
|
{
|
|
slug: "zeckendorf-search-trick",
|
|
title: "Zeckendorf Search Magic Trick",
|
|
description:
|
|
"Experience the magic of Zeckendorf representation! Think of a number and watch as the cards reveal it through Fibonacci numbers.",
|
|
tags: [
|
|
"fibonacci",
|
|
"magic",
|
|
"numbers",
|
|
"trick",
|
|
"zeckendorf",
|
|
"representation",
|
|
],
|
|
themes: ["Data Structures"],
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "binary-search-trick",
|
|
title: "Binary Search Magic Trick",
|
|
description:
|
|
"Perform an amazing magic trick that reveals how binary numbers work. Think of a number and watch the magic happen!",
|
|
tags: ["binary", "magic", "numbers", "trick", "data-structures"],
|
|
themes: ["Data Structures"],
|
|
dateAdded: "2024-02-20",
|
|
hasGreenScreen: true,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "ternary-search-trick",
|
|
title: "Ternary Search Magic Trick",
|
|
description:
|
|
"Experience the magic of ternary search! Think of a number and watch as the cards reveal it through mathematical calculations.",
|
|
tags: [
|
|
"ternary",
|
|
"magic",
|
|
"numbers",
|
|
"trick",
|
|
"data-structures",
|
|
"search",
|
|
],
|
|
themes: ["Data Structures"],
|
|
dateAdded: "2024-07-20",
|
|
hasGreenScreen: true,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "guessing-game",
|
|
title: "Number Guessing Game",
|
|
description:
|
|
"Experience different search algorithms through interactive gameplay. Compare random, linear, and binary search strategies!",
|
|
tags: [
|
|
"algorithms",
|
|
"search",
|
|
"educational",
|
|
"interactive",
|
|
"binary-search",
|
|
"computer-science",
|
|
],
|
|
themes: ["Data Structures"],
|
|
dateAdded: "2024-12-23",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Games ===
|
|
{
|
|
slug: "game-of-sim",
|
|
title: "Game of Sim",
|
|
description:
|
|
"A strategic two-player game where you take turns coloring edges between vertices, trying to avoid creating a triangle of your own color.",
|
|
tags: ["strategy", "graph-theory", "two-player", "logic", "game-theory"],
|
|
themes: ["Games"],
|
|
dateAdded: "2024-03-10",
|
|
hasGreenScreen: true,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "northcotts-game",
|
|
title: "Northcott's Game",
|
|
description:
|
|
"A strategic board game where players move their pieces to outmaneuver their opponent in a tactical race.",
|
|
tags: ["strategy", "board-game", "two-player", "logic", "game-theory"],
|
|
themes: ["Games"],
|
|
dateAdded: "2024-03-15",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "nim-game",
|
|
title: "Game of Nim",
|
|
description:
|
|
"A classic two-player game of strategy. Take turns removing stones from heaps. The player to take the last stone wins!",
|
|
tags: ["strategy", "two-player", "math", "logic", "game-theory"],
|
|
themes: ["Games"],
|
|
dateAdded: "2024-07-21",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "assisted-nim-game",
|
|
title: "Assisted Game of Nim",
|
|
description:
|
|
"Learn the XOR strategy! Visualize how powers of 2 determine winning moves with color-coded borders.",
|
|
tags: [
|
|
"strategy",
|
|
"two-player",
|
|
"math",
|
|
"logic",
|
|
"game-theory",
|
|
"xor-strategy",
|
|
"educational",
|
|
],
|
|
themes: ["Games"],
|
|
dateAdded: "2024-07-21",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "gold-coin-game",
|
|
title: "The Gold Coin Game",
|
|
description:
|
|
"A strategic two-player game where you move coins to the left or take the leftmost coin. The player who takes the gold coin wins!",
|
|
tags: [
|
|
"strategy",
|
|
"two-player",
|
|
"logic",
|
|
"game-theory",
|
|
"movement",
|
|
"coins",
|
|
],
|
|
themes: ["Games"],
|
|
dateAdded: "2024-12-19",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "subtraction-game",
|
|
title: "The Subtraction Game",
|
|
description:
|
|
"A strategic two-player game where players take turns removing circles, with the last player to move winning.",
|
|
tags: [
|
|
"strategy",
|
|
"two-player",
|
|
"game-theory",
|
|
"mathematical-games",
|
|
"nim-variant",
|
|
],
|
|
themes: ["Games"],
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "craps-game",
|
|
title: "Craps: An Exploration",
|
|
description:
|
|
"Experience the classic casino dice game! Roll two dice and learn about probability as you discover the rules of the opening throw.",
|
|
tags: ["probability", "dice", "casino", "mathematics", "statistics"],
|
|
themes: ["Games"],
|
|
dateAdded: "2025-01-05",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "bagchal-game",
|
|
title: "Bagchal Game",
|
|
description:
|
|
"Play the traditional Nepali board game where tigers try to capture goats while goats try to block tigers.",
|
|
tags: ["strategy", "board-game", "two-player", "traditional"],
|
|
themes: ["Games"],
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Puzzles ===
|
|
{
|
|
slug: "knights-puzzle",
|
|
title: "Knights Exchange Puzzle",
|
|
description:
|
|
"A classic chess puzzle where you must exchange the positions of white and black knights using legal knight moves.",
|
|
tags: ["chess", "knights", "puzzle", "logic", "strategy"],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2024-07-21",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "plate-swap-puzzle",
|
|
title: "The Plate Swap Puzzle",
|
|
description:
|
|
"Arrange plates around a circular table so each person has their own plate. A challenging permutation puzzle!",
|
|
tags: ["logic", "permutation", "strategy", "puzzle", "cycles"],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2024-12-19",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "chessboard-repaint-puzzle",
|
|
title: "Chessboard Repaint Puzzle",
|
|
description:
|
|
"Repaint rows, columns, or 2x2 squares to achieve exactly one black square. A puzzle about parity and operations!",
|
|
tags: [
|
|
"logic",
|
|
"parity",
|
|
"strategy",
|
|
"puzzle",
|
|
"chessboard",
|
|
"operations",
|
|
],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2024-12-19",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "n-queens-puzzle",
|
|
title: "N-Queens Puzzle",
|
|
description:
|
|
"Place as many queens as possible on an nxn chessboard so that no two queens attack each other.",
|
|
tags: ["logic", "chess", "placement", "classic"],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "sikinia-parliament-puzzle",
|
|
title: "Parliament of Sikinia Puzzle",
|
|
description:
|
|
"Separate parliament members into two houses so each has at most one enemy in their house. A graph theory puzzle!",
|
|
tags: ["graph-theory", "logic", "coloring"],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "bulgarian-solitaire",
|
|
title: "Bulgarian Solitaire",
|
|
description:
|
|
"A mathematical card game where you repeatedly redistribute cards into piles until reaching a stable configuration.",
|
|
tags: [
|
|
"solitaire",
|
|
"card-game",
|
|
"mathematics",
|
|
"puzzle",
|
|
"redistribution",
|
|
"stable-configuration",
|
|
],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "pebble-placement-game",
|
|
title: "Pebble Placement Game",
|
|
description:
|
|
"Place pebbles on a grid following specific rules. A strategic puzzle about spatial reasoning!",
|
|
tags: ["strategy", "grid", "placement", "puzzle"],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "stacking-blocks",
|
|
title: "Stacking Blocks Optimization",
|
|
description:
|
|
"Split stacks of blocks to maximize your score! An optimization puzzle about strategic decision-making.",
|
|
tags: [
|
|
"optimization",
|
|
"strategy",
|
|
"mathematical",
|
|
"algorithm",
|
|
"puzzles",
|
|
],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "domino-retiling-puzzle",
|
|
title: "Domino Retiling Puzzle",
|
|
description:
|
|
"Rearrange dominoes on a grid to achieve the target configuration. A puzzle about combinatorics and tiling!",
|
|
tags: ["combinatorics", "tiling", "puzzle", "dominoes"],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "asc-desc-grid-puzzle",
|
|
title: "Ascending-Descending Grid Puzzle",
|
|
description:
|
|
"Fill a grid with numbers that are ascending in rows and descending in columns. A constraint satisfaction puzzle!",
|
|
tags: ["logic", "grid", "constraint", "puzzle"],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "ladybug-clock-puzzle",
|
|
title: "The Ladybug Clock Puzzle",
|
|
description:
|
|
"A ladybug walks randomly on a clock face. Discover the surprising probability that any given number is painted last!",
|
|
tags: [
|
|
"probability",
|
|
"random-walk",
|
|
"simulation",
|
|
"statistics",
|
|
"cover-time",
|
|
"puzzle",
|
|
],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2025-01-21",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "erdos-discrepancy-puzzle",
|
|
title: "The Erdos Discrepancy Problem",
|
|
description:
|
|
"Can you write instructions to survive the tunnel forever? Explore this famous mathematical puzzle through the Prisoner's Walk game.",
|
|
tags: [
|
|
"erdos",
|
|
"discrepancy",
|
|
"sequences",
|
|
"game-theory",
|
|
"impossibility",
|
|
"puzzle",
|
|
"number-theory",
|
|
],
|
|
themes: ["Puzzles"],
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Contest Problems ===
|
|
{
|
|
slug: "three-bank-accounts",
|
|
title: "Three Bank Accounts",
|
|
description:
|
|
"Peter has three bank accounts. He can transfer between them, but a transfer must exactly double the recipient's balance. Can he always empty one account?",
|
|
tags: ["strategy", "binary", "number-theory", "imo", "contest-problems"],
|
|
themes: ["Contest Problems"],
|
|
dateAdded: "2026-04-17",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "grid-tiling-puzzle",
|
|
title: "Grid Tiling Puzzle",
|
|
description:
|
|
"Based on IMO 2025: Place rectangular tiles on a grid so that each row and column has exactly one uncovered square.",
|
|
tags: ["puzzle", "geometry", "optimization", "imo", "contest-problems"],
|
|
themes: ["Contest Problems"],
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
{
|
|
slug: "sunny-lines-puzzle",
|
|
title: "Sunny Lines Puzzle",
|
|
description:
|
|
"Based on IMO 2025 P6: Place lines to cover points in a triangle. A line is 'sunny' if it's not parallel to x-axis, y-axis, or x+y=0.",
|
|
tags: ["puzzle", "geometry", "lines", "imo", "contest-problems"],
|
|
themes: ["Contest Problems"],
|
|
dateAdded: "2024-12-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Social Choice ===
|
|
{
|
|
slug: "rent-division-puzzle",
|
|
title: "Rent Division Puzzle",
|
|
description:
|
|
"Find a fair way to divide rent among roommates with different room preferences using the Sperner's lemma approach.",
|
|
tags: ["fairness", "division", "sperner", "social-choice", "economics"],
|
|
themes: ["Social Choice"],
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
// === Miscellany ===
|
|
{
|
|
slug: "eternal-domination-game",
|
|
title: "Eternal Domination Game",
|
|
description:
|
|
"Defend a graph forever by moving guards to respond to attacks. Explore the eternal domination number!",
|
|
tags: ["graph-theory", "domination", "strategy", "defense"],
|
|
themes: ["Miscellany"],
|
|
dateAdded: "2025-01-22",
|
|
hasGreenScreen: false,
|
|
status: "published" as const,
|
|
},
|
|
];
|
|
|
|
/** All published interactives. Use this for public-facing pages. */
|
|
export const publishedInteractives = allInteractives.filter(
|
|
(i) => i.status === "published"
|
|
);
|
|
|
|
export function getInteractiveBySlug(slug: string): Interactive | undefined {
|
|
return allInteractives.find((i) => i.slug === slug);
|
|
}
|
|
|
|
export function getInteractivesByTheme(themeTitle: string): Interactive[] {
|
|
return publishedInteractives.filter((i) => i.themes.includes(themeTitle));
|
|
}
|
|
|
|
export function getInteractivesBySubcategory(
|
|
themeTitle: string,
|
|
subcategorySlug: string
|
|
): Interactive[] {
|
|
return publishedInteractives.filter(
|
|
(i) => i.themes.includes(themeTitle) && i.subcategory === subcategorySlug
|
|
);
|
|
}
|
|
|
|
export function getThemeBySlug(slug: string): Theme | undefined {
|
|
return allThemes.find((t) => t.slug === slug);
|
|
}
|
|
|
|
/** Static paths for published and draft interactives (not ideas). */
|
|
export function getStaticPaths() {
|
|
return allInteractives
|
|
.filter((i) => i.status !== "idea")
|
|
.map((i) => ({
|
|
params: { slug: i.slug },
|
|
}));
|
|
}
|