Найти - Пользователи
Полная версия: Помогите с контрольной работой
Начало » Центр помощи » Помогите с контрольной работой
1
Alexey18
Здраствуйте. Помогите пожалуйста с контрольной работай
Рассматривается множество целых чисел, принадлежащих числовому отрезку , которые делятся на 3 или 11 и не делятся на 2, 13, 22, 33. Найдите количество таких чисел и минимальное из них. В ответе запишите два целых числа: сначала количество, затем минимальное число.
Буду очень признателен, если кто-нибудь откликнется.
Ocean
В условии задачи пропущены границы числового отрезка, поэтому ставлю от 1 до 100.
можно обойтись одним if, но тогда строка длинная и плохо читаемая выходит

 def process_segment(start_point, finish_point):
    numbers = []
    for number in range(start_point, finish_point+1):
        if (number % 3 == 0 or number % 11 == 0):
            if (number % 2 != 0 and number % 13 != 0 and number % 22 != 0 and number % 33 != 0):
                numbers.append(number)
    return len(numbers), min(numbers)
print(process_segment(1, 100))
py.user.next
Ocean
В условии задачи пропущены границы числового отрезка, поэтому ставлю от 1 до 100.
Поставь от 1 до 1000000000. Сколько памяти оно займёт? Надо сделать без списка и за один проход.
А тут у тебя список, который жрёт память, и используется как минимум два прохода. Сначала по числам идёшь, а потом функция min() по ним ещё раз идёт. Функция len() тоже в общем случае для всех языков программирования ещё раз идёт. В питоне длина списка хранится в служебном поле, думаю, поэтому прохода по списку не будет, он сразу из поля этого невидимого возьмёт длину. Но в общем контексте функция len() считается допольнительным проходом.
То есть тут реально сделать всё без затрат памяти и за один проход только.
Ocean
py.user.next
Спасибо большое!)
Я сперва так написала, а потом подумала, что это “колхоз и много кода”, если есть специальные функции для этого и можно “оптимизировать код”. Поэтому заменила на список и методы списка

 # Первый вариант
def process_segment(start_point, finish_point):
    count_dividers = 0
    minimal_divider = finish_point
    for number in range(start_point, finish_point+1):
        if (number % 3 == 0 or number % 11 == 0):
            if (number % 2 != 0 and number % 13 != 0 and number % 22 != 0 and number % 33 != 0):
                count_dividers += 1
                if number < minimal_divider:
                    minimal_divider = number
    return count_dividers, minimal_divider
print(process_segment(1, 100))

Так делает все за одну проходку.

py.user.next
Но в общем контексте функция len() считается допольнительным проходом.
О! Вот это ваще не знала. Запомню.

Кстати, у меня какие-то кривые руки. Когда в теги код вставляю, он словно лишний пробел добавляет в первой строке. Я проверила несколько раз и нет лишнего пробела.
Твой код отображается корректно.
Что я делаю неправильно?

https://ibb.co/CBBqLfp

У меня есть один вопрос. Я не знаю только ли внутренние точки числового отрезка перебирать или граничные тоже. В текущем коде получается, что граничные точки отрезка включены.
Есть какое-то правило для такого класса задач или в таких случаях просто уточнять постановку задачи?

py.user.next
Ocean
Когда в теги код вставляю, он словно лишний пробел добавляет в первой строке.
Это в code python такой баг. Если просто code поставить, то там нет лишнего пробела, но и подсветки нет. Поэтому в code python первую строку делаешь пустой и в её начале обязательно ставишь пробел, а код пишешь со второй строки. Также стираются пустые строки, поэтому в них нужно пробел ставить в начале. Баг не исправляется потому, что что-то цепляет. Если его исправить, то там он либо появится снова при следующем обновлении движка, либо что-то другое поплывёт и там тоже надо будет исправлять и там гору исправлений нужно будет делать, на которую надо сразу время планировать.

По опыту написания программ, я тебе скажу так: баг может быть маленький и заметный, а его исправление может быть огромным и поначалу невидимым - то есть баг может быть маленькой надводной верхушкой огромного подводного айсберга. Поэтому их могут и не испрвлять, хотя они очевидны. Исправление маленького бага может требовать многих и многих часов работы.

Ocean
У меня есть один вопрос. Я не знаю только ли внутренние точки числового отрезка перебирать или граничные тоже.
Когда говорят “отрезок”, подразумевают от и до включительно. Когда говорят “интервал”, подразумевают от и до, не включая концы.

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

Поэтому вот это
  
        if (number % 3 == 0 or number % 11 == 0):
            if (number % 2 != 0 and number % 13 != 0 and number % 22 != 0 and number % 33 != 0):
                count_dividers += 1
                if number < minimal_divider:
                    minimal_divider = number
Можно записать вот так
  
        if ((number % 3 == 0 or number % 11 == 0)
            and number % 2 != 0
            and number % 13 != 0
            and number % 22 != 0
            and number % 33 != 0):
            count_dividers += 1
            if number < minimal_divider:
                minimal_divider = number
Перевёл нормально
  
        if ((number % 3 == 0 or number % 11 == 0)
            and number % 2 != 0
            and number % 13 != 0
            and number % 22 != 0
            and number % 33 != 0):
            count_divisors += 1
            if number < minimal_divisor:
                minimal_divisor = number
Ocean
py.user.next
Это в code python такой баг.
О, спасибо большое
Поняла. Буду добавлять пустую строку с пробелом

py.user.next
Когда говорят “отрезок”, подразумевают от и до включительно. Когда говорят “интервал”, подразумевают от и до, не включая концы.
Спасибо!

py.user.next
Можно записать вот так
Всегда с отступами на 4 пробела или на что ориентироваться?
Я видела пример из PEP8, что так с длинными выражениями делают, но не сообразила, что так и с if можно поступать.
Спасибо большое! Теперь так всегда буду делать. Оно и правда очень круто и читаемо

py.user.next
Я убрал лишние пробелы
Было так
  
        if ((number % 3 == 0 or number % 11 == 0)
            and number % 2 != 0
            and number % 13 != 0
            and number % 22 != 0
            and number % 33 != 0):
                count_divisors += 1
                if number < minimal_divisor:
                    minimal_divisor = number
Стало так
  
        if ((number % 3 == 0 or number % 11 == 0)
            and number % 2 != 0
            and number % 13 != 0
            and number % 22 != 0
            and number % 33 != 0):
            count_divisors += 1
            if number < minimal_divisor:
                minimal_divisor = number
Ocean
Всегда с отступами на 4 пробела или на что ориентироваться?
Даже один пробел всегда имеет значение. Поэтому есть ли пробел где-то или нет там пробела, это очень большое значение имеет. Это не в плане работы программы (семантики), не в плане правильности кода (синтаксиса). Потому что программа будет работать одинаково и интерпретироваться/компилироваться она будет одинаково. Этот пробел ни на что не влияет. Это имеет значение для работы с кодом, когда с ним работает человек руками где-то там. Также есть аспект когда с кодом работает программа “руками” где-то там, но мы этот аспект обсуждать сейчас не будем, так как тебе ещё рано об этом знать. Если ты семи нот не знаешь ещё всех точно, то как-то рановато раскрывать все секреты исполнения фламенко на восемнадцатиструнной гитаре, потому что без знания семи нот эти секреты не будут понятны даже близко, не будет понятен сам их смысл. Если кратко сказать, то существует такое пространство, целый мир, в котором одни программы пишут другие программы, и в этом пространстве существует множество всяких аспектов и нюансов тоже. Поэтому когда мы пишем код, мы думаем о том, что его может читать потом кто-то или что-то. И с ним этот кто-то или это что-то может ещё потом что-то делать. Поэтому мы на каждый пробельчик обращаем внимание.

Вот у Pet'а Peeves'а из PEP8 написано, что “не нужно ставить никакие лишние пробелы” - значит, так и делаем. Мы не думаем о том, а почему это не нужно, а не не нужно ли это на самом деле. Мы просто делаем это, чтобы научиться и запомнить, а поймём это всё потом.

В данном случае мы ставим не четыре пробела, а мы стоим под открывающей круглой скобкой, правее её на один символ. Так получаются четыре пробела, но они получаются случайно. Нам похрен, сколько там получилось пробелов, мы стоим под скобкой, к которой вся эта хрень относится. Также and'ы у нас перенесены, а не оставлены на строках выше, хотя красивее было бы их оставить на строках выше. Мы делаем не так, как красивее будет, а мы делаем так, как я выше написал (кто будет с этим работать дальше и что будет с этим работать дальше - вот они определяют то место, куда мы ставим and'ы). Если мы захотим добавить ещё одно условие к этим имеющимся, мы просто раздвинем две строки и вставим это условие туда. Две строки, которые мы раздвинули, остались неизменными, - это важный фактор. Система контроля версий, в которой хранится этот код, очень легко обустроит у себя в нутрях это добавление строки, так как существующие строки, которые в ней уже хранятся, не затронуты нашей этой вставкой, их содержание не изменилось ни на символ. При этом этот код может храниться в разных системах контроля версий как одновременно, так и в разные времена и даже в разные десятилетия (в разные эпохи, которые часто многие программы не переживают из-за своих ограничений каких-то). Но во всех них простая вставка строки между строками - это простая операция, которая как выполняется просто, так и отменяется просто. Вставленную легко строку так же легко и вырезать обратно. Ну, и к комментированию для её временного выключения она также предрасположена. Также обрати внимание на первую строку условия и последнюю строку условия. Мы их не можем быстро вырезать, быстро заменить и тому подобное. Ну, мы могли бы их так же поставить, чтобы они тоже были пригодны для этого. Но мы этого не делаем и просто для этих двух строк делаем исключение из правил. Если мы будем их менять, мы потрудимся и попереставляем эти двоеточия там and'ы и прочие вещи. Мы идём на это осознанно, на вот эти неудобности.

Это один маленький пример. Много там таких аспектов, почему вот это туда надо ставить, а почему вот это сюда надо ставить, по этим вопросам нужно читать книги. Читать книги, читать вот такие PEP'ы, эти PEP'ы есть в разных языках ещё, в каждом языке есть какие-то свои особенности и фишки, фигурные скобочки там где-нибудь и так далее со своими аспектами. Пока не знаешь, делай так, как советуют. Почему это надо делать так, разберёшься потом.


tags: code format
Ocean
py.user.next
ну что ) я еще с одним спасибо!

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

Твои советы работают даже шире, чем python
Наконец-то нашла в чем проблема у меня была с настройкой virtualenv и virtualenvwrapper хотя до этого не могла никак разобраться года два.
Ну как раз с тех пор как узнала о них и начала пробовать использовать)
Я пыталась перескочить несколько ступеней и поэтому нихрена не получалось.
В какой-то момент даже полностью сломала настройки PATH и в терминале даже базовые команды не выполнялись, пытаясь методом тыка непонятных заклинаний из гугла полечить проблему.
Так что пришлось откатиться назад и вот! Ура! Работает! И добилась я этого осознанно, а не просто удачно нагуглила. Узнала много нового про bash и .bashrc )))

py.user.next
В данном случае мы ставим не четыре пробела, а мы стоим под открывающей круглой скобкой, правее её на один символ. Так получаются четыре пробела, но они получаются случайно.
Ну вот я видела где-то в коде Django приложений, что иначе строки “подвешивали”. Поэтому и спросила.
Но сейчас поняла и успокоилась. Буду сидеть на жопе спокойно и постепенно все осваивать.

Книги, документацию и PEP читаю снова и снова. Никуда не тороплюсь и правда начинает больше доходить.

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

py.user.next
Вставленную легко строку так же легко и вырезать обратно. Ну, и к комментированию для её временного выключения она также предрасположена. Также обрати внимание на первую строку условия и последнюю строку условия. Мы их не можем быстро вырезать, быстро заменить и тому подобное. Ну, мы могли бы их так же поставить, чтобы они тоже были пригодны для этого. Но мы этого не делаем и просто для этих двух строк делаем исключение из правил. Если мы будем их менять, мы потрудимся и попереставляем эти двоеточия там and'ы и прочие вещи. Мы идём на это осознанно, на вот эти неудобности.
Да, поняла. Это действительно логично.










This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB