Решение на Астрологични забави от Васил Николов

Обратно към всички решения

Към профила на Васил Николов

Резултати

  • 10 точки от тестове
  • 0 бонус точки
  • 10 точки общо
  • 6 успешни тест(а)
  • 0 неуспешни тест(а)

Код

def interpret_western_sign(day, month):
sign_library=[
"capricorn", "aquarius", "pisces",
"aries", "taurus", "gemini",
"cancer", "leo", "virgo",
"libra", "scorpio", "sagittarius",
"capricorn"
]
sign_keys=[
121, 219, 321,
421, 521, 621,
723, 823, 923,
1023, 1122, 1222,
1331
]
sign_code = day + month * 100
for sign_index, keys in enumerate(sign_keys):
if keys > sign_code:
break
return sign_library[sign_index]
def interpret_chinese_sign(year):
chinese_sign_library = [
"rat", "ox", "tiger",
"rabbit", "dragon", "snake",
"horse", "sheep", "monkey",
"rooster", "dog", "pig"
]
REFERENCE_YEAR = 1900
year_index = (year - REFERENCE_YEAR) % 12
return chinese_sign_library[year_index]
def interpret_both_signs(day, month, year):
western_sign = interpret_western_sign(day, month)
chinese_sign = interpret_chinese_sign(year)
return western_sign, chinese_sign

Лог от изпълнението

......
----------------------------------------------------------------------
Ran 6 tests in 0.009s

OK

История (3 версии и 4 коментара)

Васил обнови решението на 06.03.2015 08:40 (преди над 9 години)

+def interpret_wastern_sign(day, month):
+ sign_library = [ "capricorn", "aquarius", "pisces", "aries", "taurus", "gemini", "cancer", "leo", "virgo", "libra", "scorpio", "sagittarius", "capricorn" ]
+ sign_keys = [ 121, 219, 321, 421, 521, 621, 723, 823, 923, 1023, 1122, 1222, 1331 ]
+ sign_code = day + month*100
+ for keys in sign_keys:
+ if keys > sign_code:
+ sign_index = sign_keys.index(keys)
+ break
+ return sign_library[sign_index]
+
+
+def interpret_chinese_sign(year):
+ chinese_sign_library = [ "rat", "ox", "tiger", "rabbit", "dragon", "snake", "horse", "sheep", "monkey", "rooster", "dog", "pig", ]
+ refrence_year = 1900
+ year_index = year - refrence_year - int( ( year - refrence_year ) / 12 ) *12
+ return chinese_sign_library[year_index]
+
+
+def interpret_both_signs(day, month, year):
+ western_sign = interpret_wastern_sign(day, month)
+ chinese_sign = interpret_chinese_sign(year)
+ return ( western_sign, chinese_sign)

Пусни си примерните тестове и тези от твои колеги, постнати във форума.

Освен това имаш твърде дълги редове. В Python не трябва да имаш ред по-дълъг от 79 символа. Не трябва да слагаш и интервали около скобите.

Не знам по кое време ми се е появила правописната грешка която прави кода ми да не минава тестовете "wAstern". В даден момент кодът ми мина тестовете. Благодаря за откритата грешка. Сега въпросът ми е мога ли да пратя на ново кода? Виждам че има версии на кода значи би трябвало да е възможно, но не успявам да установя как.

Относно другите забележчи имам няколко въпроса. Аз съм напълно нов в програмирането и не съм много на ясно с процедутире стандартните алгоритми и кое работи по-добре. Забелешката за разстоянията м/у скоби и оператори, мисля че я разбирам, по-малко байтове - по-добре. Поправетеме ако греша.

Относно ограничението на символите в ред, ще може ли да ми кажете от къде идва? Също как се създава пълноценно база данни от листове и речници?

Както споменах аз съм напълно нов в писането на кодове. Досегачният ми опит е обвързан само с малко скриптиране на специализирани софтуеари и нищо повече. Поради това не съм много наясно с подходящите алгоритми. Например дали loop-а който съм направил е по-одачен от серия if-ове или не. Ще може ли да ми препоръчате нянаква литература която да прегледам относно това какви алгоритми да подбирам за конкретни случай.

Васил обнови решението на 07.03.2015 21:10 (преди над 9 години)

-def interpret_wastern_sign(day, month):
- sign_library = [ "capricorn", "aquarius", "pisces", "aries", "taurus", "gemini", "cancer", "leo", "virgo", "libra", "scorpio", "sagittarius", "capricorn" ]
- sign_keys = [ 121, 219, 321, 421, 521, 621, 723, 823, 923, 1023, 1122, 1222, 1331 ]
- sign_code = day + month*100
+def interpret_western_sign(day, month):
+ sign_library=[
+ "capricorn", "aquarius", "pisces",
+ "aries", "taurus", "gemini",
+ "cancer", "leo", "virgo",
+ "libra", "scorpio", "sagittarius",
+ "capricorn"
+ ]
+ sign_keys=[
+ 121, 219, 321,
+ 421, 521, 621,
+ 723, 823, 923,
+ 1023, 1122, 1222,
+ 1331
+ ]
+ sign_code = day + month * 100
for keys in sign_keys:
if keys > sign_code:
sign_index = sign_keys.index(keys)
break
return sign_library[sign_index]
def interpret_chinese_sign(year):
- chinese_sign_library = [ "rat", "ox", "tiger", "rabbit", "dragon", "snake", "horse", "sheep", "monkey", "rooster", "dog", "pig", ]
+ chinese_sign_library = [
+ "rat", "ox", "tiger",
+ "rabbit", "dragon", "snake",
+ "horse", "sheep", "monkey",
+ "rooster", "dog", "pig"
+ ]
refrence_year = 1900
- year_index = year - refrence_year - int( ( year - refrence_year ) / 12 ) *12
+ year_index = year - refrence_year - int((year - refrence_year) / 12) * 12
return chinese_sign_library[year_index]
def interpret_both_signs(day, month, year):
- western_sign = interpret_wastern_sign(day, month)
+ western_sign = interpret_western_sign(day, month)
chinese_sign = interpret_chinese_sign(year)
- return ( western_sign, chinese_sign)
+ return(western_sign, chinese_sign)

Открих от къде упдейтна кода си. Сега открих какво е PEP 8 и се надявам този път да съм оцелил стила. Правописната грешка която беше изкочила също е поправена.

Благодаря за коментарите и с удоволтвие бих приел още.

Имам няколко предложения за теб.

Виж 19-тия си ред. Трябва ти индекса на тази стойност. Можеш да направиш цикъла си на 17ти ред така:

for sign_index, keys in enumerate(sign_keys):
    # ...

За целта се използва функцията enumerate. Така няма да ти се налага да използваш .index на листа.

32-рия ти ред е доста сложен. Не би ли могъл да го постигнеш по някакъв по - прост начин, изискващ по - малко сметки? Замисли се какво точно искаш да получиш от него и няма ли някоя по - проста опреация, която да ти го даде.

Пак според pep8 39-тия ред може да е

return (western_sign, chinese_sign)

или дори

return western_sign, chinese_sign

За такива грешки във форматирането е много полезен някакъв linter, например - pylint. Няма да ти се налага да запомняш всички детайли от веднъж.

Също така - reference :)

Васил обнови решението на 09.03.2015 23:40 (преди над 9 години)

def interpret_western_sign(day, month):
sign_library=[
"capricorn", "aquarius", "pisces",
"aries", "taurus", "gemini",
"cancer", "leo", "virgo",
"libra", "scorpio", "sagittarius",
"capricorn"
]
sign_keys=[
121, 219, 321,
421, 521, 621,
723, 823, 923,
1023, 1122, 1222,
1331
]
sign_code = day + month * 100
- for keys in sign_keys:
+ for sign_index, keys in enumerate(sign_keys):
if keys > sign_code:
- sign_index = sign_keys.index(keys)
break
return sign_library[sign_index]
def interpret_chinese_sign(year):
chinese_sign_library = [
"rat", "ox", "tiger",
"rabbit", "dragon", "snake",
"horse", "sheep", "monkey",
"rooster", "dog", "pig"
]
- refrence_year = 1900
- year_index = year - refrence_year - int((year - refrence_year) / 12) * 12
+ REFERENCE_YEAR = 1900
+ year_index = (year - REFERENCE_YEAR) % 12
return chinese_sign_library[year_index]
def interpret_both_signs(day, month, year):
western_sign = interpret_western_sign(day, month)
chinese_sign = interpret_chinese_sign(year)
- return(western_sign, chinese_sign)
+ return western_sign, chinese_sign