Initial commit

This commit is contained in:
user
2026-07-12 14:06:45 +04:00
commit a75028d68f
148 changed files with 3275 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
from __future__ import annotations
from dataclasses import dataclass
from typing import Iterable
import numpy as np
@dataclass(frozen=True)
class Sequence8:
"""Пара 8-битных последовательностей: seq0 и инверсная seq1."""
_seq0: np.ndarray # uint8, shape (8,)
def __post_init__(self):
arr = np.asarray(self._seq0, dtype=np.uint8).reshape(-1)
if arr.size != 8:
raise ValueError("seq0 должна содержать 8 бит.")
if not np.isin(arr, [0, 1]).all():
raise ValueError("seq0 может состоять только из 0 и 1.")
object.__setattr__(self, "_seq0", arr)
@property
def seq0(self) -> np.ndarray:
"""Последовательность для бита 0."""
return self._seq0
@property
def seq1(self) -> np.ndarray:
"""Инверсия seq0 для бита 1."""
return 1 - self._seq0
def for_bit(self, bit: int) -> np.ndarray:
"""Вернуть последовательность по значению бита."""
if bit not in (0, 1):
raise ValueError("bit должен быть 0 или 1.")
return self._seq0 if bit == 0 else (1 - self._seq0)
@classmethod
def from_string(cls, bits: str) -> "Sequence8":
"""Создать из строки вида '01010101'."""
if len(bits) != 8 or any(ch not in "01" for ch in bits):
raise ValueError("Строка должна быть из 8 символов 0/1.")
arr = np.fromiter((int(ch) for ch in bits), dtype=np.uint8, count=8)
return cls(arr)
@classmethod
def from_iterable(cls, bits: Iterable[int]) -> "Sequence8":
"""Создать из итерируемого набора из 8 бит."""
arr = np.fromiter(bits, dtype=np.uint8, count=8)
if arr.size != 8:
raise ValueError("Нужно 8 бит.")
return cls(arr)
def __len__(self) -> int:
"""Длина последовательности."""
return 8