Решение на Хороскоп от Щилиян Харбов
Резултати
- 6 точки от тестове
- 1 отнета точка
- 5 точки общо
- 15 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
............... ---------------------------------------------------------------------- Ran 15 tests in 0.002s OK
История (8 версии и 11 коментара)
Щилиян обнови решението на 02.03.2013 03:05 (преди над 11 години)
Щилиян обнови решението на 02.03.2013 03:45 (преди над 11 години)
Щилиян обнови решението на 02.03.2013 04:40 (преди над 11 години)
Помисли как да го направиш без толкова много if-ове. Така определено не е елегантно.
Освен това при if-овете в Python не са нужни тези външни скоби.
elif ((day >= 19 and day < 30 and month == 2) or
(day >= 1 and day < 21 and month == 3)):
е същото като
elif (day >= 19 and day < 30 and month == 2) or
(day >= 1 and day < 21 and month == 3):
Скобите ги сложих щото нещо съм се заблудил с PEP8, че трябва да е цялото заградено, но нищо де дали си минава теста в конзолата с pep8. От друга страна примерно философска целия израз в кръгли скобки означава, че двата предиката са от домейна на проблема така, че освен естетически проблем друг не виждам. Колкото до елегантността с 12 if за 12-те зодии мисля, че си е достатъчно рационално решение и всеки ще го разбере от пръв поглед, не че не мога да напиша решението без нито един if (Всъщност след като си свърша монолога ще ти го напиша, щом те дразнят толкова тези if-ве с else-ве). Можеше да седна да мисля някаква магична хеш функция или друга щуротия, но после пък щеше да има хохо от къде се взеха тези магични числа за ключове на речника и т.н. ....
Щилиян обнови решението на 03.03.2013 03:37 (преди над 11 години)
Щилиян обнови решението на 03.03.2013 03:40 (преди над 11 години)
Ето сега хем скобите не са излишни хем е елегантно, във функцията имам само return и израз :D, по-елегантно от това ... :P
Така харесва ли ти ?
(В настроение съм ;))
Щилиян обнови решението на 03.03.2013 04:08 (преди над 11 години)
Исках да ти подскажа да използваш някоя от колекциите в Питон и да използваш някой от loop-овете за да търсиш съответните стойности в нея.
Ще осъзнаеш по-нататък че такъв тип код обикновено е лоша идея, защото:
- Доста по-трудно се променя логиката му ако нещо е объркано
- Ако използваш колекции за подобни константни таблични данни това може да ти помогне за споделянето на код между множество функции когато имаш по-голяма задача.
Щилиян обнови решението на 03.03.2013 17:26 (преди над 11 години)
Съгласен, че е лоша идея, ако се ползва на повече места, но понеже домашната е за 1 функция и затова така :) иначе бих използвал namedtuple() И версиите станаха осем защото гледам, че в питончето day > 1 and day < 20 може да се напише 1 < day < 20. Можеше да го включите в материалите, струва ми се доста интересно :)
А има ли разлика в оценяването между начините на решение ?
Смисъл такъв, че аз си се забавлявам да направя решение само израз, но дали, ако вие очаквате да видите нещо определено и не го видите това определено нещо, то аз ще получа по-малко точки?
Добре де, как може да предадеш lisp-подобен код и да твърдиш, че няма излишни скоби!? Да не говорим, че караш курса за втора година и вече би трябвало да имаш понятие от четим код на питон и как се използват колекциите в него.
Доводът "ама те са само 12 еднакви if-а и са супер елегантни" дори не го коментирам. -1т.
Защо не отговори, когато питах за типа решения, а директно -1 само на мене ???
++ Коментирам финалната функция ++
1: (1 > 0) or (0 > 1) * "sign" ||| 2:((1 > 0) or (0 > 1)) * "sign"
Скобите ми трябват, защото нямаше да работи решението. Първото се оценява до True второто до 'sign', т.е. без скоби няма как да получа съответната зодия и функцията винаги щеше да връща 1, защото щях да събирам True + 11 * False = 1. Аналогично за втория случай 'sign' + 12 * '' = 'sign'. Ако не вярваш пусни си ги в интерпретатора двата израза и после пак ми кажи, че са излишни
Термин ЕЛЕГАНТНО в информатика не съществува. Това е дума от модата и етикета. Предполагам, че заради неугледния вид според другите професии, на първите програмисти същите са пренесли думата в кода, за да покажат ... нещо си ... че имат други виждания. Така, че дефинирайте на сайта какво е елегантно, за да можете да виждате това. Иначе си остава едно субективно усещане, което няма място в точна наука.
НИКЪДЕ не съм използвал "СУПЕР ЕЛЕГАНТНИ", използвал съм "РАЦИОНАЛНО", а защо рационално? Бях си направил шаблонче за булевата логика, отворих си редактора Ctrl + C / Ctrl + V 12 пъти и попълних от календара. Ясно ти е, че упражнението е било в рамките на 5 минути и на 12 реда за да се получи работеща функция. След това дойде PEP8 и нещата доста се разтеглиха :D
Сега щом ми отнемаш точка за 12 if, който ги НЯМАМ във финалното решение редно е на всички с решение 12 и повече if да отнемеш точка, иначе го считам за лична нападка затова, че съм си ПОЗВОЛИЛ да имам мнение относно ЕЛЕГАНТНО различно от вашето.
Колкото до това защо съм предал LISP подобно решение? Както писъх във въпроса, за оценяването такъв тип решения само израз винаги са ми били забавни. Не виждам какво ти пречи, че съм се забавлявал с такъв тип решение и как само от 1 видяна функиця от мене реши, че пиша нечетимо всичко останало ...
Самият факт, че си махнал ключовите думи if и else, за сметка на безумното количество скоби не подобрява нещата. Самият факт, че си отворил редактора и си пейстнал едно и също нещо 12 пъти, след което това не ти се е сторило грешно, е достатъчен да ти вземем точка.
Естествено, че има място за субективизъм в нашата наука. Всеки език си има свои разбирания за добри практики. И не стига това, ами голяма част от библиотеките за тези езици си позволяват да ги предефинират. В реда на нещата е ние да добавяме наши правила и е в реда на нещата да ви отнемаме точки, ако вие не ги спазвате.
Бяхме с намерението да не санкционираме никого за първо домашно, защото хората все още не знаят езика. Твоят случай не е такъв. Надяваме се по принцип да не пишеш такъв код и това да е изключение, защото си се забавлявал. Ако това е така, то тази отнета точка не ти е проблем. Забележките ни целят да поощряват писането на по-добър код. Приемайте ги като съвети, а не като опит да ви изкараме некадърни. Когато наши забележки не се вземат под внимание, отнемаме точки. Това е положението.
И пак ти казвам, че се забавлявах!
Виж решението ми за монетките и ще се обедиш, че е било за FUN това решение, защото за монетките съм го направил както се очаква.
:)
Спирам да протестирам, една точка найстина не е проблем :P