interactives/src/lib/interactives.ts
Neeldhara Misra c5926b4213 Initial commit: Interactives site
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>
2026-04-17 03:09:40 +05:30

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 },
}));
}