Не знам до колко има значение, но функцията is_perfect или is_happy да се казва( примера е с happy, a в условието е указано perfect)?
Първо предизвикателство
Функцията се казва
is_perfect
, примерът вече е поправенКак трябва да се държи функцията в случая
is_perfect(0)
?Според мен трябва да връща False, т.к. 0 се дели на 1, но 1 != 0.
За референция списъкът на всички известни до момента перфектни числа: http://en.wikipedia.org/wiki/List_of_perfect_numbersis_perfect се дефинира над естествените числа(1, 2, 3..) поведението и във всички останали случаи е непредвидимо и няма да бъде тествано
Харесва ми логиката на Димитър, само че в условието има "по-големи от него".
За да избегнем религиозните спорове на тема дали нулата е естествено число правя малка промяна в условието, ще се интересуваме само от положителни цели числа.
Аз ли съм се объркал, или на лекцията казаха, че ако събмитнем предизвикателството по-рано ще получим коментар. Чакам вече от 12+ часа.Благодаря предварително :)
@Йончо Йончев, ставаше въпрос за задачата :)
Могат ли да бъдат изпратени две решения - в случай, че не съществуват нечетни перфектни числа и друго в противен случай? (проверено, е че няма нечетно перфектно число по-малко от 10 ^ 1500)
Доколкото си спомням, всички прости числа след 2 са нечетни, не знам какво имаш впредвид. Май съм прекалил с кафето. Дай пример.
Хмм, правилно си спомняш, голяма глупост съм написал, имах предвид перфектни - виж редекцията:)
Не можеш да пращаш две решения :)
Стояне, не си играй толкова да мислиш относно бързоефективност, Python не е мислен с тази цел .На състезание например ако ти се падне тази задача отваряш google.com намираш списъка с перфектните числа вкарваш го в един списък и просто проверяваш дали числото се съдържа там. (Ако решиш да дразниш проверяващите можеш да го направиш и със серия if-ове-> гледах как един от тях направо си е изплакал очите на едно такова решение) Тук се иска просто да напишеш програма, която проверява дали числото е перфектно. (Подсказка, да използваш списъци и условни конструкции, виж лекциите).
Впрочем в тестовете ще има ли числа по-големи от 10 ^ 10. Eclipse-a нещо ми изтрещя на такова число. Иначе казано, кога препълваме стека (Stackoverflow) с Python.
Времето за първото предизвикателство тъкмо изтече. Гледам, че колегите масово са писали някакви кратки решения, с каквото беше и моят първи опит. Даже функцията си стои в крайния ми код. :)
Тук се пораждат и два въпроса у мен:
- Каква точно е основната цел на предизвикателствата? Бързо решение и за по-шантав вход? Кратък и красив питонски код?
- В конкретния случай ми се стори, че 6-редовата ми функция просто не е достатъчно добро решение, тъй като просто забива за малко по-дълги числа и се наложи да имплементирам малко по-ефективни алгоритми за проверката. Може ли в условието да давате поне някакви ориентировъчни ограничения за време/изходни стойности?
- Може ли след изтичане на срока за предаване да публикувате тестовете, с които се е тествало.
Скоро(не по-късно от лекцията в понеделник) ще публикуваме тестовете в github.
По-скоро бих казал, че основната цел е кратък, ясен за четене и разбиране код, който работи. Страхотна ефективност не е задължителна в повечето случаи(освен ако не сме казали изрично).
Не мога да ти кажа какъв е точно timeout-а на тестовете, но не мисля, че е твърде малък.
Имам въпрос по първото предизвикателство: Кода ми:
def is_perfect(n): div = [1] [div.append(i) for i in range(2,n/2+1) if n%i == 0] return sum(div) == n
Не е минал тестовете и гърми с грешка, че не може да използва float na мястото на int. Явно съм ползвал стар компилатор, защото при мен всичко си минаваше.
Но оттук следва въпроса, освен range който очаква int,кои други структури изискват числа от определен тип ? (http://stackoverflow.com/questions/15173715/why-is-there-a-typeerror)
За справка, това би трябвало да мине :
def is_perfect(n): div = [1] [div.append(i) for i in range(2,int(n/2+1)) if n%i == 0] return sum(div) == n
Не само това е причината! Проблемът е, че считаш 1 за перфектно число, а то не е. Аз съм направил същата грешка...
1 не е по-малко от себе си. ;) Трябва да се чете внимателно условието, още повече като ако не си знаел какво представляват перфектните числа.
В Python 2.x / е целочислено деление, което не е така в Python 3.x(който преподаваме на този курс).
Ползвайте само Python 3, за да не ви се получават такива грешки
@Орлин-е отговори на част от въпроса ми, би ли допълнил моя списък sqrt връща float и range очаква int. Кой други конструкции зависят/връщат определен тип ?
@Орлин – въпроса ти е малко нереалистичен. За някои конструкции е очевидно (напр.
range
), за някои няма значение (напр.+
), а някои са доста изненадващи (math.ceil
), макар да имат сериозна вътрешна локига.В крайна сметка – пробвай и виж. Хубавото на Python, е че feedback-а е изключително лесен – пускаш конзолата и пробваш.
Последното, предполагам, е отговор за Йончо Йончев..
Трябва да сте влезли в системата, за да може да отговаряте на теми.