```ts
export function readDotCells(cells: string): string {
  if (typeof cells !== "string" || cells.trim() === "") {
    throw new Error("Invalid input");
  }

  const parts = cells.split("-");
  let out = "";
  let i = 0;
  let inCount = false;

  while (i < parts.length) {
    const cell = parts[i];

    if (!/^(0|[1-6]+)$/.test(cell)) {
      throw new Error("Invalid cell");
    }

    if (cell === "0") {
      out += " ";
      i += 1;
      inCount = false;
      continue;
    }

    const dots = Array.from(cell).map(Number);
    if (!dots.every((d, index) => d > (index > 0 ? dots[index - 1] : 0))) {
      throw new Error("Dots do not rise");
    }

    let weight = dots.reduce((acc, dot) => acc + (1 << (dot - 1)), 0);

    if (weight === 32 || weight === 48) {
      if (i === parts.length - 1) {
        throw new Error("Shift or count sign at the end of line");
      }
      let next = 0;
      for (const dot of parts[i + 1]) {
        next += 1 << (Number(dot) - 1);
      }
      if (weight === 32 && (next < 1 || next > 26)) {
        throw new Error("Shift sign followed by a cell that spells no letter");
      }
      out += weight === 32 ? String.fromCharCode(64 + next) : String(next % 10);
      i += 2;
      inCount = weight === 48;
      continue;
    }

    if (inCount && (weight < 1 || weight > 10)) {
      throw new Error("Cell inside a count weighing more than 10");
    }

    out += String.fromCharCode(96 + weight);
    i += 1;
  }

  return out;
}
```