Задать вопрос
  • Как проверить полученную случайную выборку в Python по ряду условий?

    Vindicar
    @Vindicar
    RTFM!
    Опиши правила генерации как конечный автомат. Например, так:
    rules = {
        # id_состояния: переходы
        # каждый переход - пара (набор_символов, следующее состояние)
        # будет выбран случайный переход, потом случайный символ из его набора символов
        # это начальное состояние. Можно генерировать любые символы.
        'default': [ (A, '1_vowel'), (B, '1_consonant') ], 
        # последний символ был гласной - следующая гласная будет последней
        '1_vowel': [ (A, '2_vowels'), (B, '1_consonant') ],
        # два последних символа были гласными - можем добавлять только согласные
        '2_vowels': [ (B, '1_consonant') ],
        # с согласными по аналогии
        '1_consonant': [ (A, '1_vowel'), (B, '2_consonants') ],
        '2_consonants': [ (A, '1_vowel') ],
    }

    Очевидно, правила могут быть и более сложными, такая схема это позволяет. Более того, можно описывать допустимые слоги и их сочетания вместо допустимых букв.
    А использовать их можно примерно так:
    from random import choice
    
    def generate(rules: dict[str, list[tuple[list, str]]], min_length: int) -> str:
        output = ''
        state = 'default'  # начальное состояние
        while len(output) < min_length:
            if not rules[state]:  # если нет переходов
                break  # прерываем цикл, так как уйти из этого состояния нельзя
            transition = choice(rules[state])  # случайно выбираем один из переходов
            output += choice(transition[0])  # случайно выбираем очередной символ согласно переходу
            state = transition[1]  # переходим в следующее состояние
        return output  # возвращаем то, что нагенерировали

    Тогда гарантируется, что сгенерированная строка будет соответствовать условиям.
    Ответ написан
    1 комментарий
  • Как проверить полученную случайную выборку в Python по ряду условий?

    Dr_Elvis
    @Dr_Elvis Куратор тега Python
    В гугле забанен
    import random
    
    ABC = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я']
    A = ['А', 'Е', 'Ё', 'И', 'О', 'У', 'Ы', 'Э', 'Ю', 'Я']
    B = ['Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ']
    
    creature = ''
    while True:
        fish = random.choices(ABC, k=8)
        for i in range(2, len(fish)):
            if fish[i] in A and fish[i-1] in A and fish[i-2] in A:
                break
            if fish[i] in B and fish[i-1] in B and fish[i-2] in B:
                break
        else:
            creature = ''.join(fish)
            break
    
    print(creature)

    Здесь мы используем бесконечный цикл while True, чтобы генерировать случайные последовательности букв, пока не будет найдена последовательность, которая удовлетворяет условиям.

    Для генерации случайных последовательностей мы используем функцию random.choices, которой передаем список ABC и длину последовательности k.

    Затем мы проверяем каждый элемент последовательности на предмет наличия недопустимых сочетаний гласных или согласных букв, используя цикл for и оператор if. Если мы находим такие сочетания, мы выходим из цикла с помощью оператора break. Если недопустимых сочетаний нет, мы объединяем выбранные буквы в итоговую строку creature с помощью метода join и выходим из цикла while True с помощью оператора break.

    Наконец, мы выводим итоговую строку на экран с помощью функции print.
    Ответ написан
    1 комментарий