Задать вопрос
  • Как вывести элементы в список на питоне?

    @abcd0x00
    В третьем питоне:
    >>> a = ['1', '2', '3']
    >>> b = ['a', 'b', 'c']
    >>> c = ['x', 'y', 'z']
    >>> 
    >>> out = list(map(list, zip(a, b, c)))
    >>> out
    [['1', 'a', 'x'], ['2', 'b', 'y'], ['3', 'c', 'z']]
    >>>
    Ответ написан
    Комментировать
  • Как реализовать корректный поиск строк на С?

    @abcd0x00
    Помогите пожалуйста разобраться с тем, как организовать вывод обнаруженных строк именно после окончания ввода - допустим после двойного \n.

    Надо скомилировать программу, а потом ей на вход подать весь текст по каналу.
    В лине:
    cat file.txt | ./prog
    В винде:
    type file.txt | prog.exe
    Ответ написан
    Комментировать
  • Новичок в программировании. Что мне изучать в Python для моих задач?

    @abcd0x00
    Мои задачи: писать просты скрипты для автоматизации работы:

    Надо обратить внимание на составление программы. То есть ты должен словесно описать все действия в программе ещё до её записи на питоне. Например, питон тебе никак не поможет определить, сколько и каких аргументов должно быть у функции, что она должна возвращать и чего не должна, что она должна делать и чего не должна. Кажущаяся простой программа может оказаться довольно сложной в этом плане.
    Примеры

    например, скрипт, который на дизайнерском сайте будет каждый день по определенным критериям ставить лайки

    А если программисты изменят страницу? Как твой скрипт это поймёт? Допустим, он даже поймёт это и сообщит тебе, но тогда тебе придётся его менять, чтобы учесть новые условия. Чтобы его поменять в области распознавания страницы, эта часть должна быть хорошо изолирована от остальной программы, иначе скрипт придётся писать заново практически целиком. Время потратишь на переписывание скрипта, а страницу опять поменяют.

    И еще хочу самостоятельно для закрепления навыков сделать программу, которая будет при подключении плейера к компьютеру автоматически копировать музыку из указанной на компьютере папки в папку устройства.

    Если в середине копирования файла плейер вытащить и вставить обратно, что будет с этим файлом? Он останется недописанным? Его надо будет удалить, но как ты определишь, что не дописан именно этот файл из десятка скопированных?

    Питон тут не поможет, тебе нужен разработанный алгоритм, который состоит из алгоритмов, которые состоят из алгоритмов.
    Ответ написан
    1 комментарий
  • Как запомнить классы, функции и методы в программировании и сэкономить время?

    @abcd0x00
    Сначала проходишь всё один раз и подробно. При прохождении каждого раздела делаешь файл с заметками для него. После прохождения раздела читаешь этот файл с заметками снова.

    Ещё сделай себе html-страницу, где помещай ссылки на разделы, на стандарты, на страницы с материалом.
    Через эту страницу входи каждый раз, чтобы продолжить обучение. На этой же странице отмечай то, что ты уже прошёл.

    Потом делаешь одну html-страницу для всех своих html-страниц. (Прямо на диске переходишь между ними, никаких интернетов не надо.)

    Подробности

    Почему надо проходить полностью? Потому что если ты не пройдёшь все нюансы, ты не будешь знать их. А когда ты не знаешь нюансы, ты начинаешь писать всякую лишнюю хрень. Очень часто при открытии файла на чтение в питоне пишут 'r'. А почему? А потому что не читали полное описание open(), в котором написано, что по умолчанию там всегда 'r'. А когда точно не знают, начинают писать на всякий случай. То же самое касается кодировки в третьем питоне. Вот человек не знает, что там кодировку по умолчанию поменяли, и пишет там всегда "#encoding: utf-8", и удалить боится, потому что не знает, можно ли удалить. А чтобы знать, надо читать PEP, а он не читал.
    Ответ написан
    Комментировать
  • Разработчик языка программирования создает только стандарт?

    @abcd0x00
    Язык ведь определяет его транслятор?

    Язык - это множество цепочек над алфавитом. Чтобы задать язык, нужно составить грамматику, порождающую все цепочки языка.
    Транслятор - это программа, переводящая цепочку одного языка над одним алфавитом в цепочку другого языка над другим алфавитом. При этом цепочки должны быть семантически эквивалентными.

    Поэтому язык представляет из себя грамматику, которую составляют и для которой реализуют транслятор.

    Например, ассемблер - это язык (грамматика). Цепочка инструкций ассемблера с помощью транслятора транслируется в цепочку кодов машинного языка.

    А стандарт - это документ, фиксирующий грамматику, которому потом должны подчиняться все реализации, которые реализуют этот язык.
    Ответ написан
    Комментировать
  • Как прервать родительскую функцию?

    @abcd0x00
    Подскажите, возможно ли в событии прервать сразу несколько функций def 2 и def 1 и вернуть что-то (return)?

    Исключение можешь сделать (наследование), заполнить его нужными данными (метод) и породить через raise. А над f1 отловить через try и проверить данные (метод).
    Ответ написан
    Комментировать
  • В чём ошибка кода с рандомным выбором вопроса?

    @abcd0x00
    Проблема в следующем: каждый раз либо не считывает тесты, либо вопросы идут в обычном порядке. В чём проблема?

    Генератор случайного числа никак не используется. Нужно либо при чтении его использовать для чтения случайного вопроса, либо после чтения всех вопросов для перемешивания прочитанных. Первый вариант лучше, так как при втором варианте вопросы будут одни и те же всегда, хоть и в случайном порядке. Но при втором варианте ты должен будешь контролировать дублирование вопросов.
    Ответ написан
    Комментировать
  • Почему выполнение скрипта всегда идет по ветке ELSE?

    @abcd0x00
    Программы возвращают код завершения (код возврата). Если grep нашла текст, она выводит найденный текст и возвращает успешный код завершения (ноль). Если grep не нашла текст, она не выводит ничего и возвращает провальный код завершения (единицу). Вот опция -q отключает только выводимый текст, а код завершения как возвращался, так и возвращается. В shell'е конструкция $() имеет дело только с выводимым текстом и не знает про код возврата. Поэтому для неё найденный и ненайденный тексты выглядят одинаково - в виде пустоты.
    Ответ написан
    Комментировать
  • Почему в битовых сдвигах остаётся минус?

    @abcd0x00
    По стандарту C89 (и до C11), при сдвиге вправо знакового отрицательного числа результат зависит от реализации.


    3.3.7 Bitwise shift operators

    ...

    The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1
    has an unsigned type or if E1 has a signed type and a nonnegative
    value, the value of the result is the integral part of the quotient of
    E1 divided by the quantity, 2 raised to the power E2 . If E1 has a
    signed type and a negative value, the resulting value is
    implementation-defined.


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

    @abcd0x00
    >>> import collections
    >>> 
    >>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> n = 5
    >>> 
    >>> deq = collections.deque(enumerate(lst))
    >>> 
    >>> while len(deq) > 1:
    ...     deq.rotate(-n)
    ...     print(deq.pop())
    ... 
    (4, 5)
    (0, 1)
    (6, 7)
    (3, 4)
    (2, 3)
    (5, 6)
    (8, 9)
    (1, 2)
    >>> print(deq)
    deque([(7, 8)])
    >>>
    Ответ написан
    Комментировать
  • Верить ли Макконнелу?

    @abcd0x00
    Он дело говорит или забить?

    1)
    Лучший комментарий - тот, без которого и так всё понятно.
    В комментариях обычно описывается причина, по которой ты пишешь тот или иной фрагмент. Если ты собрался описывать то, как оно работает, то надо не комментарий писать, а код переписать так, чтобы комментарий вообще не нужен был (ниндзя-комментарий).

    2)
    Форматирование - это важная вещь до самых деталей. Есть автоматическое форматирование. Но какое бы оно ни было, ручное или автоматическое, точное и определённое форматирование нужно для того, чтобы сократить время чтения кода.
    Подробности

    Когда форматирования нет, ты сначала ищешь где что, потом у себя в голове раскладываешь это в правильно виде, а потом это рассматриваешь (в воображении). Так вот, голова не бесконечна, поэтому когда ты кладёшь форматирование в голову, то там места под более полезные вещи уже не хватает и размышлять о содержимом кода ты уже в полную силу не можешь. Тебе нужно думать про алгоритм, а ты думаешь "а правильно ли у меня там блок вложен? а в том ли блоке тот оператор получается?". И всё это только потому, что ты не можешь предоставить это экрану.
    Ответ написан
    Комментировать
  • Как в Ubuntu изменить имя файла на транслит и перед каждым изменённым символом поставить флаг?

    @abcd0x00
    [guest@localhost ~]$ \
    > func ()
    > {
    >     read s
    >     for ((i = 0; i < ${#s}; i++)); do
    >         c=${s:$i:1}
    >         case $c in
    >             "а") oc="a";;
    >             "б") oc="b";;
    >             "в") oc="v";;
    >             "г") oc="g";;
    >             "и") oc="i";;
    >             "й") oc="j";;
    >             "к") oc="k";;
    >             "л") oc="l";;
    >             "н") oc="n";;
    >             "о") oc="o";;
    >             "с") oc="s";;
    >             "я") oc="ya";;
    >               *) oc="$c";;
    >         esac    
    >         echo -n "$oc"
    >     done
    >     echo
    > }
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "яблонский головоног" | func
    yablonskij golovonog
    [guest@localhost ~]$
    Ответ написан
    3 комментария
  • Как в Ubuntu массово удалить спецсимволы из имён файлов в папке?

    @abcd0x00
    Общий способ через sed
    [guest@localhost tmp]$ touch file{1,2,3}.txt
    [guest@localhost tmp]$ 
    [guest@localhost tmp]$ ls file*.txt
    file1.txt  file2.txt  file3.txt
    [guest@localhost tmp]$ ls file*.txt | sed 's%\([^.]*\)\(\.txt\)%mv & \1_save\2%' 
    mv file1.txt file1_save.txt
    mv file2.txt file2_save.txt
    mv file3.txt file3_save.txt
    [guest@localhost tmp]$ ls file*.txt | sed 's%\([^.]*\)\(\.txt\)%mv & \1_save\2%' | sh
    [guest@localhost tmp]$ ls file*.txt
    file1_save.txt  file2_save.txt  file3_save.txt
    [guest@localhost tmp]$
    Ответ написан
    Комментировать
  • Как перевести курсор на новую строку при чтении из файла в СИ?

    @abcd0x00
    Прочитай какую-нибудь приличную книгу по C, ты неправильно используешь функции, неправильно используешь символы. То, что при компиляции ошибок не выдаёт, ещё не значит, что ошибок нет. В файле, открытом в текстовом режиме, нельзя смещаться на байтовую позицию, потому что в текстовом потоке все позиции неточные из-за допустимых неявных преобразований (некоторые символы могут удаляться/добавляться). То есть ошибку оно не выдаст, но результат будет неопределённым, вплоть до неизвестного мусора в массивах. Про CR LF я тебе уже написал - ты делаешь то, что уже сделано и встроено в язык. И символы эти уже встроены, и коды их точно так же можно получить в любой момент.
    Ответ написан
    Комментировать
  • Как происходит выделение памяти под читаемый файл?

    @abcd0x00
    Получается тогда нам нужно в начале размер файла прочитать, а потом уже все содержимое или как оно все происходит?

    Размер файла записан на диске (в файловой системе). Сам файл хранится в виде кусочков в разных местах диска. Кусочки связаны друг с другом по очереди (в каждом кусочке записано, где следующий кусочек).

    Собственно чтобы прочитать файл, нужно выделить какую-то область памяти для него.

    Чтобы прочитать файл, выделяется небольшой буфер, в который загружается часть файла. Если ты его прочитал, то в него же загружается следующая часть файла. Ты читаешь файл как бы через окно в виде буфера, которое скользит по файлу вперёд.

    Файлы бывают огромные, даже больше, чем оперативная память, но ты их спокойно можешь читать.
    Ответ написан
    4 комментария
  • Как удалить определенный коммит?

    @abcd0x00
    Выполни rebase -i до родителя коммита, который удаляешь.
    git rebase -i 6159eb3~
    Там откроется окно, в котором надо будет удалить строку с коммитом 6159eb3.
    После удаления сохраняешь и выходишь.

    Помни, что rebase создаёт все коммиты заново, поэтому применять его можно, пока никто твои коммиты не закачал к себе, иначе у них появятся дубликаты одних и тех же коммитов с разными хешами.
    Ответ написан
    3 комментария
  • Как правильно следить за последовательным ходом выполнения работ консольных утилит?

    @abcd0x00

    Как правильно следить за ходом выполнения работы и поддерживать запуск с предыдущего удачно выполненного этапа, в случае некорректно завершения текущего?

    У тебя прямо в скриптах должно быть завершение с кодом. Если ошибок не было, нужно завершать скрипт через exit 0. Если произошла ошибка, нужно завершать скрипт через exit 1.
    Когда у тебя скрипты так сделаны, ты можешь проверять их код завершения.

    А потом ты можешь написать скрипт со строками
    { script1.sh && echo "script1 - ok"; } || echo "script1 - fail"
    { script2.sh && echo "script2 - ok"; } || echo "script2 - fail"
    { script3.sh && echo "script3 - ok"; } || echo "script3 - fail"


    Пример
    { echo x1 && echo "script1 - ok"; } || echo "script1 - fail"
    { cat x && echo "script2 - ok"; } || echo "script2 - fail"
    { echo x2 && echo "script3 - ok"; } || echo "script3 - fail"
    { touch /x && echo "script4 - ok"; } || echo "script4 - fail"


    [guest@localhost ~]$ { echo x1 && echo "script1 - ok"; } || echo "script1 - fail"
    x1
    script1 - ok
    [guest@localhost ~]$ { cat x && echo "script2 - ok"; } || echo "script2 - fail"
    cat: x: Нет такого файла или каталога
    script2 - fail
    [guest@localhost ~]$ { echo x2 && echo "script3 - ok"; } || echo "script3 - fail"
    x2
    script3 - ok
    [guest@localhost ~]$ { touch /x && echo "script4 - ok"; } || echo "script4 - fail"
    touch: невозможно выполнить touch для «/x»: Отказано в доступе
    script4 - fail
    [guest@localhost ~]$



    Можно сделать и так
    { script1.sh && echo "script1 - ok"; } || { echo "script1 - fail"; exit 1; }
    { script2.sh && echo "script2 - ok"; } || { echo "script2 - fail"; exit 1; }

    Тогда он в случае успеха будет выводить успешную фразу и продолжать, а в случае ошибки он будет выводить сбойную фразу и сразу выходить (с кодом ошибки).
    Ответ написан
    Комментировать
  • Как выкусить подстроку из строки?

    @abcd0x00
    [guest@localhost ~]$ s="May 31 04:12:10 SSCK01 dhcpd[16691]: [ID 988538 local7.notice] [tid:30] NTCE DHCPOP(101) Protocol: DHCPDiscover from STRING-K01 PON 1/1/02/01:12.1.1 (chAddr=00:13:77:6d:44:6b) via 81.91.202.1."
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$s" | sed 's/.* from //; s/ (.*//'
    STRING-K01 PON 1/1/02/01:12.1.1
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Почему не получается заполнить структуру в СИ?

    @abcd0x00
    Используй fgets() + sscanf(). Через fgets() получаешь каждую строку, а через sscanf() достаёшь из неё нужные значения.
    Ответ написан
    Комментировать
  • Чем отличается char* от int*, float* и других в Си?

    @abcd0x00
    Указатель - это переменная, которая хранит адрес одного байта в памяти. Часто и сам адрес называют указателем, потому что сам адрес обычно не используется и подразумевает только то, что находится по этому адресу (поэтому они стали синонимами).
    По одному адресу ты не можешь сказать, сколько байт там можно рассматривать целиком, так как сам адрес даёт информацию только об одном байте. Поэтому у указателя есть тип, который означает, что по тому адресу лежит столько-то байт, которые надо рассматривать как единое целое.
    Ответ написан
    Комментировать