

'''simple docstring'''






from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_keras_nlp_available,
    is_tensorflow_text_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


snake_case_       =       {
    'configuration_gpt2': ['GPT2_PRETRAINED_CONFIG_ARCHIVE_MAP', 'GPT2Config', 'GPT2OnnxConfig'],
    'tokenization_gpt2': ['GPT2Tokenizer'],
}

try:
      if not is_tokenizers_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      snake_case_       =       ['GPT2TokenizerFast']

try:
      if not is_torch_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      snake_case_       =       [
          'GPT2_PRETRAINED_MODEL_ARCHIVE_LIST',
          'GPT2DoubleHeadsModel',
          'GPT2ForQuestionAnswering',
          'GPT2ForSequenceClassification',
          'GPT2ForTokenClassification',
          'GPT2LMHeadModel',
          'GPT2Model',
          'GPT2PreTrainedModel',
          'load_tf_weights_in_gpt2',
      ]

try:
      if not is_tf_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      snake_case_       =       [
          'TF_GPT2_PRETRAINED_MODEL_ARCHIVE_LIST',
          'TFGPT2DoubleHeadsModel',
          'TFGPT2ForSequenceClassification',
          'TFGPT2LMHeadModel',
          'TFGPT2MainLayer',
          'TFGPT2Model',
          'TFGPT2PreTrainedModel',
      ]

try:
      if not is_keras_nlp_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      snake_case_       =       ['TFGPT2Tokenizer']

try:
      if not is_flax_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      snake_case_       =       ['FlaxGPT2LMHeadModel', 'FlaxGPT2Model', 'FlaxGPT2PreTrainedModel']

if TYPE_CHECKING:
      from .configuration_gpta import GPT2_PRETRAINED_CONFIG_ARCHIVE_MAP, GPTaConfig, GPTaOnnxConfig
      from .tokenization_gpta import GPTaTokenizer

      try:
            if not is_tokenizers_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .tokenization_gpta_fast import GPTaTokenizerFast

      try:
            if not is_torch_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_gpta import (
                GPT2_PRETRAINED_MODEL_ARCHIVE_LIST,
                GPTaDoubleHeadsModel,
                GPTaForQuestionAnswering,
                GPTaForSequenceClassification,
                GPTaForTokenClassification,
                GPTaLMHeadModel,
                GPTaModel,
                GPTaPreTrainedModel,
                load_tf_weights_in_gpta,
            )

      try:
            if not is_tf_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_tf_gpta import (
                TF_GPT2_PRETRAINED_MODEL_ARCHIVE_LIST,
                TFGPTaDoubleHeadsModel,
                TFGPTaForSequenceClassification,
                TFGPTaLMHeadModel,
                TFGPTaMainLayer,
                TFGPTaModel,
                TFGPTaPreTrainedModel,
            )

      try:
            if not is_keras_nlp_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .tokenization_gpta_tf import TFGPTaTokenizer

      try:
            if not is_flax_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_flax_gpta import FlaxGPTaLMHeadModel, FlaxGPTaModel, FlaxGPTaPreTrainedModel

else:
      import sys

      snake_case_       =       _LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)




'''simple docstring'''






from __future__ import annotations

from PIL import Image

# Define the first generation of cells
# fmt: off
snake_case_       =       [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]


def 					__lowerCamelCase			(      SCREAMING_SNAKE_CASE_     :	int    )							->   list[int]:
      """simple docstring"""

      return [int(SCREAMING_SNAKE_CASE_    ) for c in F"{ruleset:08}"[:8]]


def 					__lowerCamelCase			(      SCREAMING_SNAKE_CASE_     :	list[list[int]]  ,  SCREAMING_SNAKE_CASE_     :	list[int]  ,  SCREAMING_SNAKE_CASE_     :	int    )							->   list[int]:
      """simple docstring"""

      SCREAMING_SNAKE_CASE_      :			List[str]     =       len(cells[0]    )  # 31
      SCREAMING_SNAKE_CASE_      :			Optional[Any]     =       []
      for i in range(SCREAMING_SNAKE_CASE_    ):
            # Get the neighbors of each cell
            # Handle neighbours outside bounds by using 0 as their value
            SCREAMING_SNAKE_CASE_      :			Optional[Any]     =       0 if i == 0 else cells[time][i - 1]
            SCREAMING_SNAKE_CASE_      :			Tuple     =       0 if i == population - 1 else cells[time][i + 1]
            # Define a new cell and add it to the new generation
            SCREAMING_SNAKE_CASE_      :			Dict     =       7 - int(F"{left_neighbor}{cells[time][i]}{right_neighbor}"  ,  2    )
            next_generation.append(rule[situation]    )
      return next_generation


def 					__lowerCamelCase			(      SCREAMING_SNAKE_CASE_     :	list[list[int]]    )							->   Image.Image:
      """simple docstring"""

      SCREAMING_SNAKE_CASE_      :			List[Any]     =       Image.new("RGB"  ,  (len(cells[0]    ), len(SCREAMING_SNAKE_CASE_    ))    )
      SCREAMING_SNAKE_CASE_      :			Optional[int]     =       img.load()
      # Generates image
      for w in range(img.width    ):
            for h in range(img.height    ):
                  SCREAMING_SNAKE_CASE_      :			List[str]     =       2_5_5 - int(2_5_5 * cells[h][w]    )
                  SCREAMING_SNAKE_CASE_      :			str     =       (color, color, color)
      return img


if __name__ == "__main__":
      snake_case_       =       bin(int(input('Rule:\n').strip()))[2:]
      snake_case_       =       format_ruleset(int(rule_num))
      for time in range(1_6):
            CELLS.append(new_generation(CELLS, rule, time))
      snake_case_       =       generate_image(CELLS)
      # Uncomment to save the image
      # img.save(f"rule_{rule_num}.png")
      img.show()

