Sashité for Developers
  1. Sashité for Developers
  2. Specifications
  3. PON
  4. 1.0.0
  5. Examples

PON Examples


Overview

This document provides comprehensive examples of PON (Position Object Notation) usage across various game types, scenarios, and configurations. These examples illustrate practical applications of the PON specification while remaining rule-agnostic.

Note: All examples are for illustration purposes only. PON does not define or assume any game-specific rules, movement patterns, or win conditions.


Quick Reference Examples

Traditional Game Starting Positions

Western Chess (2D: 8×8 = 64 squares, 32 pieces)

{
  "board": [
    ["-r", "n", "b", "q", "k^", "b", "n", "-r"],
    ["+p", "+p", "+p", "+p", "+p", "+p", "+p", "+p"],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    ["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
    ["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Japanese Shōgi (2D: 9×9 = 81 squares, 40 pieces)

{
  "board": [
    ["l", "n", "s", "g", "k^", "g", "s", "n", "l"],
    [null, "r", null, null, null, null, null, "b", null],
    ["p", "p", "p", "p", "p", "p", "p", "p", "p"],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    ["P", "P", "P", "P", "P", "P", "P", "P", "P"],
    [null, "B", null, null, null, null, null, "R", null],
    ["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "S",
    "second": "s"
  },
  "turn": "first"
}

Chinese Xiangqi (2D: 9×10 = 90 squares, 32 pieces)

{
  "board": [
    ["r", "h", "e", "a", "g^", "a", "e", "h", "r"],
    [null, null, null, null, null, null, null, null, null],
    [null, "c", null, null, null, null, null, "c", null],
    ["p", null, "p", null, "p", null, "p", null, "p"],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    ["P", null, "P", null, "P", null, "P", null, "P"],
    [null, "C", null, null, null, null, null, "C", null],
    [null, null, null, null, null, null, null, null, null],
    ["R", "H", "E", "A", "G^", "A", "E", "H", "R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "X",
    "second": "x"
  },
  "turn": "first"
}

Thai Makruk (2D: 8×8 = 64 squares, 32 pieces)

{
  "board": [
    ["r", "n", "s", "m", "k^", "s", "n", "r"],
    [null, null, null, null, null, null, null, null],
    ["p", "p", "p", "p", "p", "p", "p", "p"],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    ["P", "P", "P", "P", "P", "P", "P", "P"],
    [null, null, null, null, null, null, null, null],
    ["R", "N", "S", "K^", "M", "S", "N", "R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "M",
    "second": "m"
  },
  "turn": "first"
}

Games After Opening Moves

Chess after 1.e4

{
  "board": [
    ["-r", "n", "b", "q", "k^", "b", "n", "-r"],
    ["+p", "+p", "+p", "+p", "+p", "+p", "+p", "+p"],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, "+P", null, null, null],
    [null, null, null, null, null, null, null, null],
    ["+P", "+P", "+P", "+P", null, "+P", "+P", "+P"],
    ["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "second"
}

Chess after 1.e4 c5 (Sicilian Defense)

{
  "board": [
    ["-r", "n", "b", "q", "k^", "b", "n", "-r"],
    ["+p", "+p", null, "+p", "+p", "+p", "+p", "+p"],
    [null, null, null, null, null, null, null, null],
    [null, null, "+p", null, null, null, null, null],
    [null, null, null, null, "+P", null, null, null],
    [null, null, null, null, null, null, null, null],
    ["+P", "+P", "+P", "+P", null, "+P", "+P", "+P"],
    ["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Shōgi after 1.P-7f

{
  "board": [
    ["l", "n", "s", "g", "k^", "g", "s", "n", "l"],
    [null, "r", null, null, null, null, null, "b", null],
    ["p", "p", "p", "p", "p", "p", "p", "p", "p"],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    [null, null, "P", null, null, null, null, null, null],
    ["P", "P", null, "P", "P", "P", "P", "P", "P"],
    [null, "B", null, null, null, null, null, "R", null],
    ["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "S",
    "second": "s"
  },
  "turn": "second"
}

Dimensional Examples

PON supports boards of any dimensionality through nested array structures.

1D Boards

1D boards are represented as a single array of squares.

1D board with 8 squares, 2 pieces

{
  "board": ["k^", "+p", null, null, null, null, "+P", "K^"],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Minimal 1D board: 1 square, 1 piece

{
  "board": ["k^"],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "S",
    "second": "s"
  },
  "turn": "first"
}

Minimal 1D board: 1 square, 0 pieces (empty)

{
  "board": [null],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "G",
    "second": "g"
  },
  "turn": "first"
}

2D Boards

2D boards are represented as an array of ranks (arrays).

Empty 8×8 board (64 squares, 0 pieces)

{
  "board": [
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Empty 3×3 board (9 squares, 0 pieces)

{
  "board": [
    [null, null, null],
    [null, null, null],
    [null, null, null]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "G",
    "second": "g"
  },
  "turn": "first"
}

3D Boards

3D boards use an additional level of nesting: array of layers, each containing ranks.

Simple 3D board (2 layers × 2 ranks × 2 files = 8 squares)

{
  "board": [
    [
      ["a", "b"],
      ["c", "d"]
    ],
    [
      ["A", "B"],
      ["C", "D"]
    ]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "G",
    "second": "g"
  },
  "turn": "first"
}

Empty 3D board (2 layers × 3 ranks × 3 files = 18 squares)

{
  "board": [
    [
      [null, null, null],
      [null, null, null],
      [null, null, null]
    ],
    [
      [null, null, null],
      [null, null, null],
      [null, null, null]
    ]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "G",
    "second": "g"
  },
  "turn": "first"
}

4D Boards

4D boards add another level of nesting: array of cubes, each containing layers.

4D board (2 cubes × 2 layers × 2 ranks × 2 files = 16 squares)

{
  "board": [
    [
      [
        ["a", "b"],
        ["c", "d"]
      ],
      [
        ["e", "f"],
        ["g", "h"]
      ]
    ],
    [
      [
        ["A", "B"],
        ["C", "D"]
      ],
      [
        ["E", "F"],
        ["G", "H"]
      ]
    ]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "G",
    "second": "g"
  },
  "turn": "first"
}

Dimensional Coherence

PON enforces dimensional coherence: all arrays at the same nesting level must have the same length (rectangular structure).

Valid examples:

Structure Description
["a", "b", "c"] 1D: 3 squares
[["a", "b"], ["c", "d"]] 2D: 2 ranks × 2 files
[[["a", "b"], ["c", "d"]], [["e", "f"], ["g", "h"]]] 3D: 2 layers × 2 ranks × 2 files

Invalid examples:

Structure Why invalid
[["a", "b"], ["c"]] Jagged: ranks have different lengths
[[["a"], ["b", "c"]], [["d", "e"], ["f", "g"]]] Jagged: inconsistent rank lengths

Cardinality Constraints

PON enforces cardinality constraints inherited from the Game Protocol:

Where:

Valid Examples

Description n p Validity
Minimal board with 1 piece 1 1 ✓ (1 ≤ 1)
Minimal empty board 1 0 ✓ (0 ≤ 1)
Empty 8×8 board 64 0 ✓ (0 ≤ 64)
Chess starting position 64 32 ✓ (32 ≤ 64)
Board with pieces in hand 16 4 ✓ (4 ≤ 16)

Invalid Examples

Description n p Why invalid
More pieces than squares 2 6 p > n (6 > 2)
Hands overflow board capacity 2 12 p > n (12 > 2)

Empty Board Positions

PON supports positions with zero pieces, useful for placement games like Go.

Empty 19×19 Go board (361 squares, 0 pieces)

{
  "board": [
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "G",
    "second": "g"
  },
  "turn": "first"
}

Cross-Style Games

Chess vs Makruk

Initial hybrid position (First player: Chess, Second player: Makruk):

{
  "board": [
    ["r", "n", "s", "m", "k^", "s", "n", "r"],
    [null, null, null, null, null, null, null, null],
    ["p", "p", "p", "p", "p", "p", "p", "p"],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    ["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
    ["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "m"
  },
  "turn": "first"
}

Chess vs Shōgi

{
  "board": [
    ["l", "n", "s", "g", "k^", "g", "s", "n", "l"],
    [null, "r", null, null, null, null, null, "b", null],
    ["p", "p", "p", "p", "p", "p", "p", "p", "p"],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    ["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
    [null, "B", null, null, null, null, null, "R", null],
    ["-R", "N", "B", "Q", "K^", "Q", "B", "N", "-R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "s"
  },
  "turn": "first"
}

Positions with Captured Pieces

Pieces in Hand

The hands field encodes pieces located in each player’s Hand.

Position with captures (First player has: 1 pawn; Second player has: 1 bishop)

{
  "board": [
    ["r", null, "b", "q", null, "b", null, "r"],
    ["+p", "+p", "+p", "+p", null, "k^", "+p", "+p"],
    [null, null, "n", null, null, "n", null, null],
    [null, null, null, null, "+p", null, null, null],
    [null, null, null, null, "+P", null, null, null],
    [null, null, null, null, null, "N", null, null],
    ["+P", "+P", "+P", "+P", null, "+P", "+P", "+P"],
    ["-R", "N", "B", "Q", "K^", null, null, "-R"]
  ],
  "hands": {
    "first": ["+p"],
    "second": ["B"]
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Shōgi position with multiple pieces in hand

{
  "board": [
    ["l", "n", null, "g", "k^", "g", null, "n", "l"],
    [null, "r", null, null, "s", null, null, "b", null],
    ["p", "p", "p", "p", null, "p", "p", "p", "p"],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, "p", null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    ["P", "P", "P", "P", null, "P", "P", "P", "P"],
    [null, "B", null, null, null, null, null, "R", null],
    ["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
  ],
  "hands": {
    "first": ["P"],
    "second": ["p"]
  },
  "styles": {
    "first": "S",
    "second": "s"
  },
  "turn": "first"
}

Multiple pieces of same type in hand

{
  "board": [
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, "K^", null, null, null, null],
    [null, null, null, null, "k^", null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null]
  ],
  "hands": {
    "first": ["P", "P", "P", "B", "B"],
    "second": ["p", "p", "p", "b", "b"]
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Hand Attribution

The Piece Side encoded in an EPIN token is independent of the Hand’s associated Side.

First player’s hand contains a piece with Side = second (lowercase ‘p’)

{
  "board": [
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, "K^", null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null]
  ],
  "hands": {
    "first": ["p"],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Second player’s hand contains a piece with Side = first (uppercase ‘P’)

{
  "board": [
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, "k^", null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null]
  ],
  "hands": {
    "first": [],
    "second": ["P"]
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "second"
}

This reflects the Game Protocol’s rule that captured pieces go to the Active Player’s Hand regardless of their Piece Side.


Piece State Modifiers

EPIN tokens support state modifiers (+ for enhanced, - for diminished).

Chess with castling rights encoded via state modifiers

Rooks with - indicate castling-capable (unmoved) state:

{
  "board": [
    ["-r", "n", "b", "q", "k^", "b", "n", "-r"],
    ["+p", "+p", "+p", "+p", "+p", "+p", "+p", "+p"],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    ["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
    ["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Shōgi with promoted pieces

+ prefix indicates promoted state:

{
  "board": [
    ["l", "n", null, "g", "k^", "g", "s", "n", "l"],
    [null, "r", null, null, null, null, null, "b", null],
    ["p", null, "p", "p", "p", "p", "+B", "p", "p"],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    [null, "p", null, null, null, null, null, null, null],
    ["P", null, "P", "P", "P", "P", "P", "P", "P"],
    [null, null, null, null, null, null, null, "R", null],
    ["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "S",
    "second": "s"
  },
  "turn": "first"
}

Terminal Pieces

The terminal marker (^) indicates pieces critical to match continuation.

Chess: Kings are terminal

{
  "board": [
    ["-r", "n", "b", "q", "k^", "b", "n", "-r"],
    ["+p", "+p", "+p", "+p", "+p", "+p", "+p", "+p"],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null],
    ["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
    ["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Multiple terminal pieces

{
  "board": [
    ["k^", null, null, null, null, "K^"],
    [null, null, null, null, null, null],
    [null, null, null, null, null, null],
    [null, null, null, null, null, null],
    [null, null, null, null, null, null],
    ["q^", null, null, null, null, "Q^"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "C",
    "second": "c"
  },
  "turn": "first"
}

Derivation Marker

The derivation marker (') indicates pieces with a derived (non-native) style.

Shōgi with Jeweled King for Gote (second player)

{
  "board": [
    ["l", "n", "s", "g", "k^'", "g", "s", "n", "l"],
    [null, "r", null, null, null, null, null, "b", null],
    ["p", "p", "p", "p", "p", "p", "p", "p", "p"],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    ["P", "P", "P", "P", "P", "P", "P", "P", "P"],
    [null, "B", null, null, null, null, null, "R", null],
    ["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "S",
    "second": "s"
  },
  "turn": "first"
}

Shōgi with Jeweled King for Sente (first player)

{
  "board": [
    ["l", "n", "s", "g", "k^", "g", "s", "n", "l"],
    [null, "r", null, null, null, null, null, "b", null],
    ["p", "p", "p", "p", "p", "p", "p", "p", "p"],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null, null],
    ["P", "P", "P", "P", "P", "P", "P", "P", "P"],
    [null, "B", null, null, null, null, null, "R", null],
    ["L", "N", "S", "G", "K^'", "G", "S", "N", "L"]
  ],
  "hands": {
    "first": [],
    "second": []
  },
  "styles": {
    "first": "S",
    "second": "s"
  },
  "turn": "first"
}

Summary Table

Feature JSON Representation Notes
1D board ["a", "b", "c"] Single array
2D board [["a", "b"], ["c", "d"]] Array of ranks
3D board [[["a"], ["b"]], [["c"], ["d"]]] Array of layers
Empty square null JSON null value
Piece "K^" EPIN token as string
Empty hand [] Empty array
Hand with pieces ["P", "P", "N"] Array of EPIN tokens
Styles {"first": "C", "second": "c"} SIN tokens
Turn "first" or "second" Active player
State modifier "+P", "-R" Enhanced/diminished
Terminal marker "k^", "K^" Critical pieces
Derivation marker "k^'", "K^'" Derived style