Задать вопрос
  • Правильно ли решил задачу?

    bingo347
    @bingo347
    Crazy on performance...
    Задачка прикольная для обучения, позволяет поработать сразу со многими конструкциями языка.

    Для начала комментарии по Вашему решению:
    1. Тип String алоцирует память на куче, операция += над типом String может приводить к реалокации памяти. Алокация памяти не дешевая операция, в данной задаче можно обойтись вообще без нее.
    2. Для повторяющихся операций придумали циклы, а с циклами хорошо сочетаются коллекции, например массивы и слайсы.
    3. Уже писали в комментах, но все же, if true - бесполезная штука.

    Теперь давайте посмотрим на текст песни. У нас 12 куплетов.
    Каждый куплет начинается с очень похожих строчек: "On the first day of Christmas", "On the second day of Christmas", и т.д., меняется только числительное.
    Потом всегда идет строчка "My true love sent to me" в каждом куплете.
    Затем идет от 1 до 12 строчек, повторяющиеся из куплета в куплет, но в i-том куплете будет только i таких строчек. Притом тут есть особенность, что первая строчка в куплете иногда отличается от своих аналогов в последующих куплетах.
    Ну и наконец, в 12 куплете мы видим, что строка "And a partridge in a pear tree" присутствует 2 раза, что выбивается из общего правила.

    Решение с объяснением

    Для начала вынесем факт того, что у нас 12 куплетов в константу, это нам пригодится для дальнейшего объявления массивов и итерации по ним.
    const NUMBER_OF_VERSES: usize = 12;

    Заведем массив числительных, которые меняются в первых строчках куплетов.
    const NUMERALS: [&str; NUMBER_OF_VERSES] = [
        "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth",
        "11th", "12th",
    ];


    Так же заведем массив, для повторяющихся строчек куплетов.
    const LINES: [&str; NUMBER_OF_VERSES] = [
        "And a partridge in a pear tree",
        "Two turtle-doves",
        "Three French hens",
        "Four calling birds",
        "Five golden rings (five golden rings)",
        "Six geese a-laying",
        "Seven swans a-swimming",
        "Eight maids a-milking",
        "Nine ladies dancing",
        "Ten lords a-leaping",
        "Eleven pipers piping",
        "12 drummers drumming",
    ];


    Так же нам понадобится массив первых строчек куплетов, так как среди них есть отличающиеся. Я нашел такие в 1 и 11 куплете (так как массивы у нас индексируются с 0, то они будут под индексами 0 и 10 соответственно). Остальные же будут такими же как в массиве LINES, а значит можно по экономить размер бинаря и занимаемую память за счет того что в массивах у нас только ссылки на строки, которые можно копировать.
    Тут конечно можно написать что-то вроде
    const DIFFERING_LINES: [&str; NUMBER_OF_VERSES] = [
        "A partridge in a pear tree",
        LINES[1],
        LINES[2],
        // ...
    ];
    но это дикая копипаста, которая плохо читается и подвержена ошибкам.
    Благо в Rust есть константные функции, которые могут выполняться в compile-time и возвращают константы, а значит можно наш константный массив сгенерировать. Правда константные функции довольно сильно ограничены, в них можно пользоваться лишь ветвлениями, циклами, простейшей арифметикой (в том числе над указателями, а значит и получать доступ к элементам массива по индексу). Так же можно вызывать другие константные функции. Цикл for нам к сожалению тут не доступен, так как он работает поверх итераторов, а методы IntoIter::into_iter и Iterator::next, которые он вызывает, не являются константными. Но цикл со счетчиком можно сделать и через while. По итогу получим такую функцию:
    const fn gen_differing_lines() -> [&'static str; NUMBER_OF_VERSES] {
        let mut i = 0;
        let mut lines = [""; NUMBER_OF_VERSES];
        while i < NUMBER_OF_VERSES {
            lines[i] = match i {
                0 => "A partridge in a pear tree",
                10 => "I sent 11 pipers piping",
                i => LINES[i],
            };
            i += 1;
        }
        lines
    }

    И инициализируем ей наш массив:
    const DIFFERING_LINES: [&str; NUMBER_OF_VERSES] = gen_differing_lines();


    Теперь еще особенность, в самих куплетах, строчки из LINES в них идут в обратном порядке. То есть для 4 куплета (индекс 3) нам помимо строчки DIFFERING_LINES[3] нам нужно напечатать строки под индексами 2, 1 и 0 из LINES. Для удобства вынесем печать строк из LINES в отдельную функцию:
    fn print_verse(mut i: usize) {
        while i > 0 {
            i -= 1;
            println!("{}", LINES[i]);
        }
    }


    Ну и осталось написать основной код для печати:
    fn main() {
        for i in 0..NUMBER_OF_VERSES {
            println!("On the {} day of Christmas", NUMERALS[i]);
            println!("My true love sent to me");
            println!("{}", DIFFERING_LINES[i]);
            print_verse(i);
        }
        println!("{}", LINES[0]);
    }


    А полное решение можно посмотреть и запустить тут:
    https://play.rust-lang.org/?version=stable&mode=re...
    Ответ написан
    Комментировать
  • Как в ubuntu запускать скрипт при старте?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    1. гуглить enable rc.local ubuntu
    2. написать systemd скрипт автозапуска.
    Ответ написан
  • Как работает docker на MacBook с m1?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    На М1 работает отлично: десяток-полтора контейнеров перевариваются вполне нормально. Все запускается, работает как надо. Да, х86 виртуализация работает медленно - но тут ничего не поделать, хост все же арм. Если нужна максимально быстрая виртуализация х86 - надо использовать х86 машину с линуксом или виндой.
    Ответ написан
    Комментировать
  • Как сделать белый список для тг бота?

    Vindicar
    @Vindicar
    RTFM!
    1. Хранить список допущенных к работе пользователей.
    2. При обработке каждого события определять id пользователя-отправителя и проверять его на вхождение в список.
    3. Добавить команды для управления списком.
    Ответ написан
  • Возможно ли настроить доверие для Сбербанк?

    CityCat4
    @CityCat4 Куратор тега Цифровые сертификаты
    Дома с переломом ноги
    Глеб. елы-палы. Ты башкой своей пойми, что сертификаты для банков, херанков, еще чего - это только предлог. Тебе напомнить, как создавался РКН? Изначально там были заложены только цели защиты детей от изображений писек.

    Точно также будет и здесь - не поставишь сертификаты от Сбера - поставишь еще от чего-нибудь, не поставишь ни от чего - просто в тырнет не выйдешь. Провайдеру организовать дополнительную страницу, на которую нужно просто зайти (но для захода нужен российский сертификат) - да вообще делать нефиг.

    Если ты чего-то опасаешься - юзай виртуалку с российскими сертификатами.
    Ответ написан
    7 комментариев
  • Возможно ли настроить доверие для Сбербанк?

    @d-stream
    Готовые решения - не подаю, но...
    Использовать отдельный броузер/виртуалку с подключенным УЦ Russian Trusted CA
    Ответ написан
    Комментировать
  • Существует ли сервис наглядной интерпретации python в байткод?

    @deliro
    Получить байткод:
    import dis
    dis.dis(твоя функция)


    Либо на уровне AST:

    import ast, inspect
    ast.dump(ast.parse(inspect.getsource(твоя функция)))
    Ответ написан
    Комментировать
  • Какие книги прочитать по Форт (Forth) языку программирования?

    @Filipp42
    Поищите книги Лео Броуди.
    Ответ написан
    Комментировать
  • Можно ли в месте файл указать ссылку?

    Vindicar
    @Vindicar
    RTFM!
    Можно было чуть-чуть погуглить примеры, и почитать код, там всё написано простым английским:
    async def recognize_song(
            self, data: Union[str, pathlib.Path, bytes, bytearray, AudioSegment]
        ) -> Dict[str, Any]:
            """
            Creating a song signature based on a file and searching for this signature in the shazam
            database.
                :param data: Path to song file or bytes
                :return: Dictionary with information about the found song
            """

    Т.е. data принимает или путь к файлу, или байты с содержимым файла.
    Поэтому ответ на твой вопрос: нужно самому скачать аудиофайл по ссылке, и скачанное содержимое отдать в recognize_song().
    Если у тебя ссылка на youtube, то либо используй пакет youtubedl, либо посмотри в примерах есть что-то на тему.
    Ответ написан
    Комментировать
  • Стоит ли данные авторизации главного администратора хранить в окружении?

    @12rbah
    Вот пример того пользователи хранятся в вордпрессе примерв целом как вариант можете загуглить rbac + ваш язык и посмотреть как реализована либа и как её используют. Еще будет полезно погуглить rbac design.
    Мне пришла мысль, что можно указать логин и хэш пароля прямо в .env файле
    На самом деле немного странное решение, вполне нормально хранить эти данные в бд, если не ошибаюсь в wp так и делают.
    К роуту авторизации этого пользователя можно предоставлять только с определённого пула IP-адресов, которые храним в этом же файле окружения вместе с ключами шифрования JWT.
    Так не стоит делать, если это нужно то лучше написать в отдельноё middleware, которое будет уметь это делать, эта задача к системе ролей никак не относится.
    Раз в этом файле хранятся ключи шифрования, то полагаю место достаточно надёжное и почему бы так не поступить.
    Довольно неудобно менять пароль, по сути нужно перезапускать систему для этого
    создать одного главного админа который будет либо единственным в своём роде, либо сможет раздавать такой же уровень прав
    Вообще это не такая и редкая ситуация когда только 1 человек знает все пароли, но стоит предусмотреть возможность чтобы была возможность того, чтобы админ мог создавать пользователей с любыми ролями и привилегиями. Я же правильно понял, что вы хотите создать систему ролей которую можно будет применить к любому проекту, то глупо ограничивать пользователя, пусть делает что ему нужно, с вашей стороны нужно обеспечить гибкую систему ролей.
    Ответ написан
    Комментировать
  • Не понимаю данную бесконечность в операторе while?

    @dima20155
    you don't choose c++. It chooses you
    Ты в цикле не изменяешь х.
    Каждую итерацию проверяется условие, оно всегда верно, поэтому и бесконечный цикл.
    Ответ написан
    Комментировать
  • Не понимаю данную бесконечность в операторе while?

    @deliro
    Давай по буковкам читать как в детском саду:

    икс равно нулю
    пока икс меньше десяти, печатай икс

    Икс всегда равно нулю, ты это нигде не меняешь, а ноль всегда меньше десяти. Выхода из цикла не планируется, по крайней мере, в пределах нашей вселенной
    Ответ написан
    Комментировать
  • Как циклом Python for пройти несколько (сотен) range?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как называются "\n","\r","\t"... в строках?

    drygdryg
    @drygdryg
    Python-разработчик
    Это специальные управляющие последовательности (англ. escape sequences), которые используются для записи пробельных (непечатных) символов (англ. whitespace characters). Все эти символы соответствуют шаблону \s в регулярных выражениях:
    import re
    
    print(all(re.fullmatch(r'\s', string) for string in ('\n', '\r', '\t', ' ')))  # True
    Ответ написан
    1 комментарий
  • Как называются "\n","\r","\t"... в строках?

    paran0id
    @paran0id
    Умный, но ленивый
    В общем случае - escape sequences, управляющие последовательности по-нашему.
    Ответ написан
    Комментировать
  • Как последовательно объединить несколько DataFrame с одинаковыми столбцами?

    Maksim_64
    @Maksim_64
    Data Analyst
    если планируете использовать pd. concat(), то сначала собираете ваши фреймы в список frame_list. A потом этот список в pd.concat(). далее pd.concat имеет аргумент axis, его поставьте 0 (если у вас совпадают имена столбцов), он будет добавлять их вниз новыми рядами.
    ваш псевдо код будет иметь вид
    frame_list = []
    for i in ally_code:
        df = get_units_player( get_player_json(i) )
        frame_list.append(df)
    final_df = pd.concat(frame_list,axis= 0)
    Ответ написан
    1 комментарий
  • Как быстро заливать на сервер (Debian) большие объемы данных?

    @robin777
    Ответ написан
    Комментировать
  • Вот вы защитились в аспирантуре и работаете в IT — степень помогает?

    Viji
    @Viji
    DevOps Engineer
    Если захочет работать в будущем в конторе, которая занимается чем-то продвинутым, типо микропроцессоров, высокоскоростными (например на бирже, где платят 500 тыс зеленых в год) или квантовыми вычислениями то да, поможет конечно!
    Ответ написан
    2 комментария
  • Влияют ли на производительность неиспользуемые библиотеки?

    GavriKos
    @GavriKos
    Вы о Using что ли?
    На производительность у конечного пользователя - не влияет, оптимизатор их вырежет.
    НА производительность у вас - ну немного влияет, но вы этого не заметите
    Ответ написан
    Комментировать
  • Нужно написать загадку используя python. Где я сделал ошибку?

    @Elvinchik
    Попробуйте так:

    print('Какой знак зодиака больше всего боится самолётов?')
    s = ''
    
    while s.lower() != 'близнецы':
        s = input('Введите ответ и нажмите Enter: ')
    
    print('Вы отгадали загадку')
    Ответ написан
    Комментировать