```ts
export function hopOffsetGrid(
  start: number[],
  moves: string[],
): { cell: number[]; distance: number } {
  if (!Array.isArray(start) || start.length !== 2) {
    throw new Error("the start must be a two-element address");
  }
  for (const part of start) {
    if (typeof part !== "number" || !Number.isInteger(part)) {
      throw new Error("an address must hold whole numbers");
    }
  }
  if (!Array.isArray(moves)) {
    throw new Error("the moves must be a list");
  }
  let col = start[0];
  let row = start[1];
  for (const move of moves) {
    if (move === "e") {
      col += 1;
    } else if (move === "w") {
      col -= 1;
    } else if (move === "ne" || move === "NE") {
      row -= row % 2 !== 0 ? 1 : -1;
      col += 1;
    } else if (move === "nw" || move === "NW") {
      row -= row % 2 !== 0 ? 1 : -1;
      col -= 1;
    } else if (move === "se" || move === "SE") {
      row += row % 2 !== 0 ? 1 : -1;
      col += 1;
    } else if (move === "sw" || move === "SW") {
      row += row % 2 !== 0 ? 1 : -1;
      col -= 1;
    }
  }
  return {
    cell: [col, row],
    distance: Math.abs(col - start[0]) + Math.abs(row - start[1]),
  };
}
```