• Как разделить строку на части?

    @AlbertForest
    import re
    l = re.findall('(.{5}|.+$)' , '123456789')
    for i in l:
        print(i)
    Ответ написан
    Комментировать
  • Как передавать данные из ассинхронного цикла, запущенного в потоке?

    @AlbertForest
    queue.put (стандартный модуль queue) будет нормально работать внутри асинхронной функции
    Ответ написан
    Комментировать
  • Почему телеграм шлет неправильную длину entity?

    @AlbertForest
    @bot.message_handler(content_types=['text'])
    def messages(message):
        if message.json.get('entities'):
            print(f"tg length: {message.json['entities'][0]['length']}")
            print(f"calc length: {len(message.json['text'].encode('utf-16-le')) // 2}")
    
    bot.polling(none_stop = True, timeout=123)
    Ответ написан
    Комментировать
  • Как сделать текст который можно скопировать при нажатии?

    @AlbertForest
    Используй client.parse_mode = 'markdown' (для telethon. Что у тебя за либа - я не знаю)
    Ответ написан
    5 комментариев
  • Как исключить подстроку в регулярном выражении?

    @AlbertForest
    ~~(.+?)~~
    Ответ написан
    Комментировать
  • Как после срабатывания функции-хендлера в telegram bot получить следующее сообщение?

    @AlbertForest
    Я в таких случаях в бд ставлю флаг ожидания данных с указанием типа (допустим это поле waitdata).
    При получении каждого сообщения проверяю наличие этого флага.
    Примерно так
    @dp.message_handler(content_types=['text'])
    async def echo(message: types.Message):
        # если мы чего-то ждем от пользователя
        if user.waitdata:
            # если ждем город
            if user.waitdata == "city':
                #Следующее сообщение можно считать городом
                # сохраняем город

    (Это не рабочий код, а пример. Перепишите под себя)
    Ответ написан
    Комментировать
  • Как из строки удалить конкретное слово?

    @AlbertForest
    import re
    text = 'sometimes i want delete some from this text some'
    string = re.sub(r'\ssome$|some\s', '', text)
    print(string)
    Ответ написан
    3 комментария
  • Можно ли в телеграм боте создать отдельный чат?

    @AlbertForest
    Возможно ли с Api telegram создавать новый чат для двух пользователей?

    Да, Но тебе нужно client api. Боты не умеют создавать чаты. Смотри в сторону Telethon.
    Но вариант со ссылкой лучше. Так не заблочат аккаунт
    Ответ написан
    Комментировать
  • Как расчитать кол-во вариантов при рандомизации текста?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Ради интереса запилил свой вариант. В нем нет ошибки, о которой говорил в комментах. Функция parse разбирает шаблонную строку в дерево, по которому можно и рандомную строку получить, и посчитать количество вариантов. Пример использования в самом низу.
    Код на js, можно целиком скопипастить в консоль браузера, выполнить и посмотреть.

    код

    // ------- utls ----------
    function getRand(n) {
        return Math.floor(Math.random() * n);
    }
    
    function fact(n) {
        let f = 1;
        for (let i = 2; i <= n; ++i) {
            f *= i;
        }
        return f;
    }
    
    function shuffle(arr) {
        for (let i = arr.length - 1; i > 0; --i) {
            const r = getRand(i + 1);
            const t = arr[r];
            arr[r] = arr[i];
            arr[i] = t;
        }
        return arr;
    }
    
    // ------- classes ----------
    class Str extends String {
        getCount() { return 1; }
    }
    
    class Line {
        arr = [];
        toString() {
            return this.arr.slice(0).join('');
        }
        getCount() {
            return this.arr.reduce((r, a) => r * a.getCount(), 1);
        }
    }
    
    class Select {
        arr = [];
        toString() {
            return this.arr[getRand(this.arr.length)].toString();
        }
        getCount() {
            return this.arr.reduce((r, a) => r + a.getCount(), 0);
        }
    }
    
    class Order extends Line {
        arr = [];
        toString() {
            return shuffle(this.arr).join('');
        }
        getCount() {
            return fact(this.arr.length) * this.arr.reduce((r, a) => r * a.getCount(), 1);
        }
    }
    
    // ------- parse ----------
    
    function parse(str) {
        const reg = /[{}|\[\]]/g;
        let start = 0;
        let line = new Line();
        const stack = [{
            arr: [line],
        }];
        // debugger;
        while (true) {
            const match = reg.exec(str);
            if (!match) {
                if (str.length - start > 0) {
                    line.arr.push(new Str(str.substring(start)));
                }
                break;
            }
    
            if (match.index - start > 0) {
                line.arr.push(new Str(str.substring(start, match.index)));
            }
    
            start = reg.lastIndex;
    
            const c = match[0];
    
            if (c === '{' || c === '[') {
                const container = c === '{' ? new Select() : new Order();
                line.arr.push(container);
                stack.push(container);
                line = new Line();
                container.arr.push(line);
            } else {
                if (stack.length < 2) {
                    return null;
                }
                const container = stack[stack.length - 1];
                if (line.arr.length === 1) {
                    container.arr[container.arr.length - 1] = line.arr[line.arr.length - 1];
                }
                if (c === '|') {
                    line = new Line();
                    container.arr.push(line);
                } else {
                    stack.pop();
                    const arr = stack[stack.length - 1].arr;
                    line = arr[arr.length - 1];
                }
            }
        }
        return stack.length > 1 ? null : line.arr.length === 1 ? line.arr[0] : line;
    }
    
    // --------
    const p = parse('{ttt|2}qqq[1|2|3{[4|q]|5}]');
    
    console.log(p.toString());
    console.log(p.getCount());
    console.log(p);

    Ответ написан
    1 комментарий
  • Как расчитать кол-во вариантов при рандомизации текста?

    Vindicar
    @Vindicar
    RTFM!
    Обозначим одну подстановку как "терм", и допустим, что все варианты в терме уникальны (т.е. нет повторений внутри одного терма).
    Для терма {} количество комбинаций равно количеству вариантов в терме.
    Для терма [] количество комбинаций равно количеству перестановок вариантов в терме, т.е. факториал от количества комбинаций.
    Для всего выражения количество комбинаций должно быть равно произведению количеств комбинаций для каждого терма.

    С вложенными вариантами чуть сложнее.
    Для {} количество вариантов это по сути сумма их весов.
    Для [] количество вариантов считается так: количество перестановок вариантов, умноженное на произведение весов вариантов.
    У простой строки вес 1, у вложенного терма вес равен количеству его комбинаций.
    Таким образом, можно посчитать число комбинаций рекурсивно.

    import math
    
    class RandomChoice(list):
        pass
    
    class RandomOrder(list):
        pass
    
    def random_choice(options) -> int:
        total = 0
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total += random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total += random_order(option)
            else:
                total += 1
        return total
    
    def random_order(options) -> int:
        total = math.factorial(len(options))
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(option)
            # а для просто варианта ничего делать не надо
        return total
    
    def total_count(items) -> int:
        total = 1
        for item in items:
            if isinstance(item, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(item)
            elif isinstance(item, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(item)
        return total
    
    sample = [
        'я', 
        RandomChoice(['купил', 'приобрел']), # 2
        RandomChoice(['на ярмарке','на рынке','в магазе']), # 3
        RandomChoice(['сыр', #8
            RandomOrder(['соль, ','хлеб, ','муку, ']), # 6
            'сахар']),
    ]
    
    
    combos = total_count(sample)
    print(combos)
    Ответ написан
    3 комментария
  • Как узнать количество уникальных результатов random.shuffle?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    import itertools.
    itertools.permutations.
    Ответ написан
    Комментировать
  • Как узнать количество уникальных результатов random.shuffle?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Число перестановок списка длины n - это n! (факториал: n!=1*2*3*...*n). Это основы комбинаторики.

    Так что если надо просто число различных вариантов, то:

    math.factorial(len(our_list))
    Ответ написан
    Комментировать