Skip to content

Instantly share code, notes, and snippets.

@rexim
Last active August 21, 2024 05:26
Show Gist options
  • Save rexim/7c966737e9a2737c7e17bdfc97ebc43a to your computer and use it in GitHub Desktop.
Save rexim/7c966737e9a2737c7e17bdfc97ebc43a to your computer and use it in GitHub Desktop.

Revisions

  1. rexim revised this gist Aug 18, 2024. No changes.
  2. rexim created this gist Aug 18, 2024.
    49 changes: 49 additions & 0 deletions rule110.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@
    // tsc -noErrorTruncation rule110.ts | sed 's/\[/\n[/g'
    type Tail<Xs extends Array<any>> = Xs extends [infer _, ...infer Rest] ? Rest : never;
    type Head<Xs extends Array<any>> = Xs extends [infer X, ...infer _] ? X : never;
    type Pair<X, Xs extends Array<X>> = [X, ...Xs]

    type Reverse<
    Items extends Array<any>,
    Acc extends Array<any> = []
    > = Items extends [] ? Acc : Reverse<Tail<Items>, Pair<Items[0], Acc>>;

    type Cell = 0 | 1;
    type Rule110<A extends Cell, B extends Cell, C extends Cell> = {
    "000": 0,
    "001": 1,
    "010": 1,
    "011": 1,
    "100": 0,
    "101": 1,
    "110": 1,
    "111": 0,
    }[`${A}${B}${C}`]

    // 0 0 [1 0]
    // 0

    type Start<Xs extends Array<Cell>> =
    Xs extends [infer X extends Cell, ...infer Rest extends Array<Cell>]
    ? [X, ...Next<X, Rest>]
    : [];

    type Next<
    X extends Cell,
    Items extends Array<Cell>,
    > = Items extends [infer Y extends Cell,
    infer Z extends Cell,
    ...infer Rest extends Array<Cell>]
    ? [Rule110<X, Y, Z>, ...Next<Y, [Z, ...Rest]>]
    : Items extends [infer Y extends Cell]
    ? [Y]
    : [];

    type Gen<N extends Array<any>, State extends Array<Cell>> =
    N extends []
    ? []
    : [State, ...Gen<Tail<N>, Start<State>>]

    type N = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    let x: Gen<N, [...N, 1, 0]> = 69;