Retrieves the value of an 0indexed 1D index from a 2D array. There are two ways to retrieve values: 1. Index2DArrayIteratormatrix  Iteratorint This iterator allows you to iterate through a 2D array by passing in the matrix and calling nextyouriterator. You can also use the iterator in a loop. Examples: listIndex2DArrayIteratormatrix setIndex2DArrayIteratormatrix tupleIndex2DArrayIteratormatrix sumIndex2DArrayIteratormatrix 5 in Index2DArrayIteratormatrix 2. index2darrayin1darray: listint, index: int  int This function allows you to provide a 2D array and a 0indexed 1D integer index, and retrieves the integer value at that index. Python doctests can be run using this command: python3 m doctest v index2darrayin1d.py  tupleIndex2DArrayIterator5, 523, 1, 34, 0 5, 523, 1, 34, 0  tupleIndex2DArrayIterator5, 523, 1, 34, 0 5, 523, 1, 34, 0  tupleIndex2DArrayIterator5, 523, 1, 34, 0 5, 523, 1, 34, 0  t  Index2DArrayIterator5, 2, 25, 23, 14, 5, 324, 1, 0  tuplet 5, 2, 25, 23, 14, 5, 324, 1, 0  listt 5, 2, 25, 23, 14, 5, 324, 1, 0  sortedt 1, 0, 2, 5, 5, 14, 23, 25, 324  tuplet3 23  sumt 397  1 in t True  t  iterIndex2DArrayIterator5, 523, 1, 34, 0  nextt 5  nextt 523 Retrieves the value of the onedimensional index from a twodimensional array. Args: array: A 2D array of integers where all rows are the same size and all columns are the same size. index: A 1D index. Returns: int: The 0indexed value of the 1D index in the array. Examples:  index2darrayin1d0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 5 5  index2darrayin1d0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1 Traceback most recent call last: ... ValueError: index out of range  index2darrayin1d0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 Traceback most recent call last: ... ValueError: index out of range  index2darrayin1d, 0 Traceback most recent call last: ... ValueError: no items in array
from collections.abc import Iterator
from dataclasses import dataclass


@dataclass
class Index2DArrayIterator:
    matrix: list[list[int]]

    def __iter__(self) -> Iterator[int]:
        """
        >>> tuple(Index2DArrayIterator([[5], [-523], [-1], [34], [0]]))
        (5, -523, -1, 34, 0)
        >>> tuple(Index2DArrayIterator([[5, -523, -1], [34, 0]]))
        (5, -523, -1, 34, 0)
        >>> tuple(Index2DArrayIterator([[5, -523, -1, 34, 0]]))
        (5, -523, -1, 34, 0)
        >>> t = Index2DArrayIterator([[5, 2, 25], [23, 14, 5], [324, -1, 0]])
        >>> tuple(t)
        (5, 2, 25, 23, 14, 5, 324, -1, 0)
        >>> list(t)
        [5, 2, 25, 23, 14, 5, 324, -1, 0]
        >>> sorted(t)
        [-1, 0, 2, 5, 5, 14, 23, 25, 324]
        >>> tuple(t)[3]
        23
        >>> sum(t)
        397
        >>> -1 in t
        True
        >>> t = iter(Index2DArrayIterator([[5], [-523], [-1], [34], [0]]))
        >>> next(t)
        5
        >>> next(t)
        -523
        """
        for row in self.matrix:
            yield from row


def index_2d_array_in_1d(array: list[list[int]], index: int) -> int:
    """
    Retrieves the value of the one-dimensional index from a two-dimensional array.

    Args:
        array: A 2D array of integers where all rows are the same size and all
               columns are the same size.
        index: A 1D index.

    Returns:
        int: The 0-indexed value of the 1D index in the array.

    Examples:
    >>> index_2d_array_in_1d([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], 5)
    5
    >>> index_2d_array_in_1d([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], -1)
    Traceback (most recent call last):
        ...
    ValueError: index out of range
    >>> index_2d_array_in_1d([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], 12)
    Traceback (most recent call last):
        ...
    ValueError: index out of range
    >>> index_2d_array_in_1d([[]], 0)
    Traceback (most recent call last):
        ...
    ValueError: no items in array
    """
    rows = len(array)
    cols = len(array[0])

    if rows == 0 or cols == 0:
        raise ValueError("no items in array")

    if index < 0 or index >= rows * cols:
        raise ValueError("index out of range")

    return array[index // cols][index % cols]


if __name__ == "__main__":
    import doctest

    doctest.testmod()
