Решение на Астрологични забави от Калоян Кацаров

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

Към профила на Калоян Кацаров

Резултати

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

Код

import datetime
def interpret_western_sign(day, month):
birth_date = month * 100 + day
if birth_date >= 321 and birth_date <= 420:
return 'aries'
if birth_date >= 421 and birth_date <= 520:
return 'taurus'
if birth_date >= 521 and birth_date <= 620:
return 'gemini'
if birth_date >= 621 and birth_date <= 722:
return 'cancer'
if birth_date >= 723 and birth_date <= 822:
return 'leo'
if birth_date >= 823 and birth_date <= 922:
return 'virgo'
if birth_date >= 923 and birth_date <= 1022:
return 'libra'
if birth_date >= 1023 and birth_date <= 1121:
return 'scorpio'
if birth_date >= 1122 and birth_date <= 1221:
return 'sagittarius'
if birth_date >= 1222 or birth_date <= 120:
return 'capricorn'
if birth_date >= 121 and birth_date <= 219:
return 'aquarius'
if birth_date >= 219 and birth_date <= 320:
return 'pisces'
CHINESE = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse',
'sheep', 'monkey', 'rooster', 'dog', 'pig']
def interpret_chinese_sign(year):
remain = (1900 - year) % 12
if remain > 0:
return CHINESE[12-remain]
else:
return CHINESE[-1*remain]
def interpret_both_signs(day, month, year):
return (interpret_western_sign(day, month), interpret_chinese_sign(year))

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

......
----------------------------------------------------------------------
Ran 6 tests in 0.005s

OK

История (6 версии и 10 коментара)

Калоян обнови решението на 11.03.2015 07:31 (преди над 9 години)

+import datetime
+
+
+def d(m, d, y=1):
+ return datetime.date(y, m, d)
+
+zodiac = {'aries': [d(3, 21), d(4, 20)], 'taurus': [d(4, 21), d(5, 20)],
+ 'gemini': [d(5, 21), d(6, 20)], 'cancer': [d(6, 21), d(7, 22)],
+ 'leo': [d(7, 23), d(8, 22)], 'virgo': [d(8, 23), d(9, 22)],
+ 'libra': [d(9, 23), d(10, 22)], 'scorpio': [d(10, 23), d(11, 21)],
+ 'sagittarius': [d(11, 22), d(12, 21)],
+ 'capricorn': [d(12, 22, 1), d(1, 20, 2)],
+ 'aquarius': [d(1, 21), d(2, 19)], 'pisces': [d(2, 19), d(3, 20)]}
+
+
+def interpret_western_sign(day, month):
+ if month == 1 and day <= 20:
+ search_key = d(month, day, 2)
+ else:
+ search_key = d(month, day)
+ for key, value in zodiac.items():
+ if search_key > value[0] and search_key < value[1]:
+ return key
+
+chinese = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse',
+ 'sheep', 'monkey', 'rooster', 'dog', 'pig']
+
+
+def interpret_chinese_sign(year):
+ counter = 0
+ for i in range(1900, year+1):
+ counter += 1
+ if counter == 13:
+ counter = 1
+ if i == year:
+ return chinese[counter-1]
+
+
+def interpret_both_signs(day, month, year):
+ return (interpret_western_sign(day, month), interpret_chinese_sign(year))
  • Функцията d е зле именована, а и нямаш нужда от нея.
  • Дали не изпускаш някакви случаис твоето решение? Дали използването на datetime по този начин не те ограничава леко?
  • Имената на константите трябва да са в SCREAMING_SNAKE_CASE
  • Добър избор на колекция за китайските зодии, но не можеш ли да намираш верният отговор по-просто? В момента изпускаш случаи :)

Калоян обнови решението на 11.03.2015 11:44 (преди над 9 години)

import datetime
-def d(m, d, y=1):
- return datetime.date(y, m, d)
+def date_obj(month, day, year=1):
+ return datetime.date(year, month, day)
-zodiac = {'aries': [d(3, 21), d(4, 20)], 'taurus': [d(4, 21), d(5, 20)],
- 'gemini': [d(5, 21), d(6, 20)], 'cancer': [d(6, 21), d(7, 22)],
- 'leo': [d(7, 23), d(8, 22)], 'virgo': [d(8, 23), d(9, 22)],
- 'libra': [d(9, 23), d(10, 22)], 'scorpio': [d(10, 23), d(11, 21)],
- 'sagittarius': [d(11, 22), d(12, 21)],
- 'capricorn': [d(12, 22, 1), d(1, 20, 2)],
- 'aquarius': [d(1, 21), d(2, 19)], 'pisces': [d(2, 19), d(3, 20)]}
+ZODIAC = {'aries': [date_obj(3, 21), date_obj(4, 20)],
+ 'taurus': [date_obj(4, 21), date_obj(5, 20)],
+ 'gemini': [date_obj(5, 21), date_obj(6, 20)],
+ 'cancer': [date_obj(6, 21), date_obj(7, 22)],
+ 'leo': [date_obj(7, 23), date_obj(8, 22)],
+ 'virgo': [date_obj(8, 23), date_obj(9, 22)],
+ 'libra': [date_obj(9, 23), date_obj(10, 22)],
+ 'scorpio': [date_obj(10, 23), date_obj(11, 21)],
+ 'sagittarius': [date_obj(11, 22), date_obj(12, 21)],
+ 'capricorn': [date_obj(12, 22, 1), date_obj(1, 20, 2)],
+ 'aquarius': [date_obj(1, 21), date_obj(2, 19)],
+ 'pisces': [date_obj(2, 19), date_obj(3, 20)]}
def interpret_western_sign(day, month):
if month == 1 and day <= 20:
- search_key = d(month, day, 2)
+ search_key = date_obj(month, day, 2)
else:
- search_key = d(month, day)
- for key, value in zodiac.items():
- if search_key > value[0] and search_key < value[1]:
+ search_key = date_obj(month, day)
+ for key, value in ZODIAC.items():
+ if search_key >= value[0] and search_key <= value[1]:
return key
-chinese = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse',
+CHINESE = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse',
'sheep', 'monkey', 'rooster', 'dog', 'pig']
def interpret_chinese_sign(year):
counter = 0
- for i in range(1900, year+1):
+ for i in range(1900, year + 1):
counter += 1
if counter == 13:
counter = 1
if i == year:
- return chinese[counter-1]
+ return CHINESE[counter - 1]
def interpret_both_signs(day, month, year):
return (interpret_western_sign(day, month), interpret_chinese_sign(year))

Калоян обнови решението на 11.03.2015 13:55 (преди над 9 години)

import datetime
def date_obj(month, day, year=1):
return datetime.date(year, month, day)
ZODIAC = {'aries': [date_obj(3, 21), date_obj(4, 20)],
'taurus': [date_obj(4, 21), date_obj(5, 20)],
'gemini': [date_obj(5, 21), date_obj(6, 20)],
'cancer': [date_obj(6, 21), date_obj(7, 22)],
'leo': [date_obj(7, 23), date_obj(8, 22)],
'virgo': [date_obj(8, 23), date_obj(9, 22)],
'libra': [date_obj(9, 23), date_obj(10, 22)],
'scorpio': [date_obj(10, 23), date_obj(11, 21)],
'sagittarius': [date_obj(11, 22), date_obj(12, 21)],
'capricorn': [date_obj(12, 22, 1), date_obj(1, 20, 2)],
'aquarius': [date_obj(1, 21), date_obj(2, 19)],
'pisces': [date_obj(2, 19), date_obj(3, 20)]}
def interpret_western_sign(day, month):
if month == 1 and day <= 20:
search_key = date_obj(month, day, 2)
else:
search_key = date_obj(month, day)
for key, value in ZODIAC.items():
if search_key >= value[0] and search_key <= value[1]:
return key
CHINESE = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse',
'sheep', 'monkey', 'rooster', 'dog', 'pig']
def interpret_chinese_sign(year):
counter = 0
for i in range(1900, year + 1):
counter += 1
if counter == 13:
counter = 1
if i == year:
return CHINESE[counter - 1]
+ counter = 12
+ for i in range(1899, -1, -1):
+ if i == year:
+ return CHINESE[counter - 1]
+ counter -= 1
+ if counter == 0:
+ counter = 12
def interpret_both_signs(day, month, year):
return (interpret_western_sign(day, month), interpret_chinese_sign(year))

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

Не забравяй да си пуснеш тестовете преди да предадеш, ако решиш да правиш промени в последния момент :)

Калоян обнови решението на 11.03.2015 15:26 (преди над 9 години)

import datetime
def date_obj(month, day, year=1):
return datetime.date(year, month, day)
ZODIAC = {'aries': [date_obj(3, 21), date_obj(4, 20)],
'taurus': [date_obj(4, 21), date_obj(5, 20)],
'gemini': [date_obj(5, 21), date_obj(6, 20)],
'cancer': [date_obj(6, 21), date_obj(7, 22)],
'leo': [date_obj(7, 23), date_obj(8, 22)],
'virgo': [date_obj(8, 23), date_obj(9, 22)],
'libra': [date_obj(9, 23), date_obj(10, 22)],
'scorpio': [date_obj(10, 23), date_obj(11, 21)],
'sagittarius': [date_obj(11, 22), date_obj(12, 21)],
'capricorn': [date_obj(12, 22, 1), date_obj(1, 20, 2)],
'aquarius': [date_obj(1, 21), date_obj(2, 19)],
'pisces': [date_obj(2, 19), date_obj(3, 20)]}
def interpret_western_sign(day, month):
if month == 1 and day <= 20:
search_key = date_obj(month, day, 2)
else:
search_key = date_obj(month, day)
for key, value in ZODIAC.items():
if search_key >= value[0] and search_key <= value[1]:
return key
CHINESE = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse',
'sheep', 'monkey', 'rooster', 'dog', 'pig']
def interpret_chinese_sign(year):
- counter = 0
- for i in range(1900, year + 1):
- counter += 1
- if counter == 13:
- counter = 1
- if i == year:
- return CHINESE[counter - 1]
- counter = 12
- for i in range(1899, -1, -1):
- if i == year:
- return CHINESE[counter - 1]
- counter -= 1
- if counter == 0:
- counter = 12
+ remain = (1900 - year) % 12
+ if remain > 0:
+ return CHINESE[12-remain]
+ else:
+ return CHINESE[-1*remain]
def interpret_both_signs(day, month, year):
return (interpret_western_sign(day, month), interpret_chinese_sign(year))

Така вече е ок за китайските зодии, но за първата изпускаш нещо. Както беше фиксирал 1900, тук също си фиксирал нещо, което ти пречи да достигнеш всички случаи.

Ако решиш да правиш още промени, не забравяй да пуснеш тестовете преди да предадеш :)

Калоян обнови решението на 11.03.2015 16:57 (преди над 9 години)

import datetime
-def date_obj(month, day, year=1):
- return datetime.date(year, month, day)
-
-ZODIAC = {'aries': [date_obj(3, 21), date_obj(4, 20)],
- 'taurus': [date_obj(4, 21), date_obj(5, 20)],
- 'gemini': [date_obj(5, 21), date_obj(6, 20)],
- 'cancer': [date_obj(6, 21), date_obj(7, 22)],
- 'leo': [date_obj(7, 23), date_obj(8, 22)],
- 'virgo': [date_obj(8, 23), date_obj(9, 22)],
- 'libra': [date_obj(9, 23), date_obj(10, 22)],
- 'scorpio': [date_obj(10, 23), date_obj(11, 21)],
- 'sagittarius': [date_obj(11, 22), date_obj(12, 21)],
- 'capricorn': [date_obj(12, 22, 1), date_obj(1, 20, 2)],
- 'aquarius': [date_obj(1, 21), date_obj(2, 19)],
- 'pisces': [date_obj(2, 19), date_obj(3, 20)]}
-
-
def interpret_western_sign(day, month):
- if month == 1 and day <= 20:
- search_key = date_obj(month, day, 2)
- else:
- search_key = date_obj(month, day)
- for key, value in ZODIAC.items():
- if search_key >= value[0] and search_key <= value[1]:
- return key
+ birth_date = month * 100 + day
+ if birth_date >= 321 and birth_date <= 420:
+ return 'aries'
+ if birth_date >= 421 and birth_date <= 520:
+ return 'taurus'
+ if birth_date >= 521 and birth_date <= 620:
+ return 'gemini'
+ if birth_date >= 621 and birth_date <= 722:
+ return 'cancer'
+ if birth_date >= 723 and birth_date <= 822:
+ return 'leo'
+ if birth_date >= 823 and birth_date <= 922:
+ return 'virgo'
+ if birth_date >= 923 and birth_date <= 1022:
+ return 'libra'
+ if birth_date >= 1023 and birth_date <= 1121:
+ return 'scorpio'
+ if birth_date >= 1122 and birth_date <= 1221:
+ return 'sagittarius'
+ if birth_date >= 1222 or birth_date <= 120:
+ return 'capricorn'
+ if birth_date >= 121 and birth_date <= 219:
+ return 'aquarius'
+ if birth_date >= 219 and birth_date <= 320:
+ return 'pisces'
CHINESE = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse',
'sheep', 'monkey', 'rooster', 'dog', 'pig']
def interpret_chinese_sign(year):
remain = (1900 - year) % 12
if remain > 0:
return CHINESE[12-remain]
else:
return CHINESE[-1*remain]
def interpret_both_signs(day, month, year):
return (interpret_western_sign(day, month), interpret_chinese_sign(year))
+
+print(interpret_western_sign(5, 1))

Калоян обнови решението на 11.03.2015 16:58 (преди над 9 години)

import datetime
def interpret_western_sign(day, month):
birth_date = month * 100 + day
if birth_date >= 321 and birth_date <= 420:
return 'aries'
if birth_date >= 421 and birth_date <= 520:
return 'taurus'
if birth_date >= 521 and birth_date <= 620:
return 'gemini'
if birth_date >= 621 and birth_date <= 722:
return 'cancer'
if birth_date >= 723 and birth_date <= 822:
return 'leo'
if birth_date >= 823 and birth_date <= 922:
return 'virgo'
if birth_date >= 923 and birth_date <= 1022:
return 'libra'
if birth_date >= 1023 and birth_date <= 1121:
return 'scorpio'
if birth_date >= 1122 and birth_date <= 1221:
return 'sagittarius'
if birth_date >= 1222 or birth_date <= 120:
return 'capricorn'
if birth_date >= 121 and birth_date <= 219:
return 'aquarius'
if birth_date >= 219 and birth_date <= 320:
return 'pisces'
CHINESE = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse',
'sheep', 'monkey', 'rooster', 'dog', 'pig']
def interpret_chinese_sign(year):
remain = (1900 - year) % 12
if remain > 0:
return CHINESE[12-remain]
else:
return CHINESE[-1*remain]
def interpret_both_signs(day, month, year):
return (interpret_western_sign(day, month), interpret_chinese_sign(year))
-
-print(interpret_western_sign(5, 1))

Добре, хвана си пропуска, но сега искам да се отървеш от тези if-ове. Вкарай данните в някаква колекция и я обхождай или взимай информацията от там. Виж слайдовете от последната лекция.

И тъй като вече не ползваш datetime, махни този import

А за да отговоря на въпроса ти, винаги се гледа последната качена версия.