Решение на Хороскоп от Симеон Попов

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

Към профила на Симеон Попов

Резултати

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

Код

def what_is_my_sign(day, month):
signs = {'Козирог': ((1, 1), (19, 1)),
'Водолей': ((20, 1), (18, 2)),
'Риби': ((19, 2), (20, 3)),
'Овен': ((21, 3), (20, 4)),
'Телец': ((21, 4), (20, 5)),
'Близнаци': ((21, 5), (20, 6)),
'Рак': ((21, 6), (21, 7)),
'Лъв': ((22, 7), (22, 8)),
'Дева': ((23, 8), (22, 9)),
'Везни': ((23, 9), (22, 10)),
'Скорпион': ((23, 10), (21, 11)),
'Стрелец': ((22, 11), (21, 12)),
'Козирог': ((22, 12), (31, 12))}
test_value = day + month*100
for key, value in signs.items():
start_period, end_period = value
start = start_period[0] + start_period[1]*100
end = end_period[0] + end_period[1]*100
if test_value in range(start, end+1):
return key

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

...F...........
======================================================================
FAIL: test_capricorn (test.HoroscopeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/d20130307-16279-hf3dxk/test.py", line 35, in test_capricorn
    self.assertEqual(solution.what_is_my_sign(1, 1), 'Козирог')
AssertionError: None != 'Козирог'

----------------------------------------------------------------------
Ran 15 tests in 0.002s

FAILED (failures=1)

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

Симеон обнови решението на 28.02.2013 10:46 (преди над 11 години)

+def what_is_my_sign(day=1, month=1):
+ #Правя уникално число от месеца и датата ми на раждане
+ my_day_num = 100*month + day
+ # Правя dictionary с ключове имената на зодиите,
+ # и стойности, list-ове от уникалните числа
+ # в интервала на зодията
+ sign_dict = {"Овен":list(range(100*3 + 21,100*3 + 32)) +
+ list(range(100*4 + 1,100*4 + 21)),
+ "Телец":list(range(100*4 + 21,100*4 + 31)) +
+ list(range(100*5 + 1,100*5 + 21)),
+ "Близнаци":list(range(100*5 + 21,100*5 + 32)) +
+ list(range(100*6 + 1,100*6 + 21)),
+ "Рак":list(range(100*6 + 21,100*6 + 31)) +
+ list(range(100*7 + 1,100*7 + 22)),
+ "Лъв":list(range(100*7 + 22,100*7 + 32)) +
+ list(range(100*8 + 1,100*8 + 23)),
+ "Дева":list(range(100*8 + 23,100*8 + 32)) +
+ list(range(100*9 + 1,100*9 + 23)),
+ "Везни":list(range(100*9 + 23,100*9 + 31)) +
+ list(range(100*10 + 1,100*10 + 23)),
+ "Скорпион":list(range(100*10 + 23,100*10 + 32)) +
+ list(range(100*11 + 1,100*11 + 22)),
+ "Стрелец":list(range(100*11 + 22,100*11 + 31)) +
+ list(range(100*12 + 1,100*12 + 22)),
+ "Козирог":list(range(100*12 + 22,100*12 + 32)) +
+ list(range(100*1 + 1,100*1 + 20)),
+ "Водолей":list(range(100*1 + 20,100*1 + 32)) +
+ list(range(100*2 + 1,100*2 + 19)),
+ "Риби":list(range(100*2 + 19,100*2 + 30)) +
+ list(range(100*3 + 1,100*3 + 21))}
+
+ # Тук правя проверката в кой от елементите на sign_dict
+ # се намира my_day_num и когато намери къде е,
+ # връща ключа, който е името на зодията всъщност
+ for key,value in sign_dict.items():
+ if my_day_num in value:
+ return key
+

Старах се много, да спазвам конвенцията записана в PEP 8 документа, но имаше 1-2 неща, които не са ми ясни. Надявам се все пак да съм ги разбрал правилно и да не ме санкционирате много. На следващата лекция, ще ви попитам за тях.

  • Разкарай коментарите. В езици като python пляскането на коментари преди всеки блок е ужасен подход. Кодът сам трябва да говори за себе си.
  • Помисли дали не искаш да подобриш начина, по който пазиш датите за всяка зодия. За нещо толкова малко правиш огромен списък.
  • Мини пак през PEP 8. Наблегни малко на това кога да оставяш интервали между оператори и запетаи.

Симеон обнови решението на 28.02.2013 12:33 (преди над 11 години)

def what_is_my_sign(day=1, month=1):
- #Правя уникално число от месеца и датата ми на раждане
- my_day_num = 100*month + day
- # Правя dictionary с ключове имената на зодиите,
- # и стойности, list-ове от уникалните числа
- # в интервала на зодията
- sign_dict = {"Овен":list(range(100*3 + 21,100*3 + 32)) +
- list(range(100*4 + 1,100*4 + 21)),
- "Телец":list(range(100*4 + 21,100*4 + 31)) +
- list(range(100*5 + 1,100*5 + 21)),
- "Близнаци":list(range(100*5 + 21,100*5 + 32)) +
- list(range(100*6 + 1,100*6 + 21)),
- "Рак":list(range(100*6 + 21,100*6 + 31)) +
- list(range(100*7 + 1,100*7 + 22)),
- "Лъв":list(range(100*7 + 22,100*7 + 32)) +
- list(range(100*8 + 1,100*8 + 23)),
- "Дева":list(range(100*8 + 23,100*8 + 32)) +
- list(range(100*9 + 1,100*9 + 23)),
- "Везни":list(range(100*9 + 23,100*9 + 31)) +
- list(range(100*10 + 1,100*10 + 23)),
- "Скорпион":list(range(100*10 + 23,100*10 + 32)) +
- list(range(100*11 + 1,100*11 + 22)),
- "Стрелец":list(range(100*11 + 22,100*11 + 31)) +
- list(range(100*12 + 1,100*12 + 22)),
- "Козирог":list(range(100*12 + 22,100*12 + 32)) +
- list(range(100*1 + 1,100*1 + 20)),
- "Водолей":list(range(100*1 + 20,100*1 + 32)) +
- list(range(100*2 + 1,100*2 + 19)),
- "Риби":list(range(100*2 + 19,100*2 + 30)) +
- list(range(100*3 + 1,100*3 + 21))}
-
- # Тук правя проверката в кой от елементите на sign_dict
- # се намира my_day_num и когато намери къде е,
- # връща ключа, който е името на зодията всъщност
- for key,value in sign_dict.items():
- if my_day_num in value:
- return key
+ signs = {'Козирог':((1, 1), (19, 1)),
+ 'Водолей':((20, 1), (18, 2)),
+ 'Риби':((19, 2), (20, 3)),
+ 'Овен':((21, 3), (20, 4)),
+ 'Телец':((21, 4), (20, 5)),
+ 'Близнаци':((21, 5), (20, 6)),
+ 'Рак':((21, 6), (21, 7)),
+ 'Лъв':((22, 7), (22, 8)),
+ 'Дева':((23, 8), (22, 9)),
+ 'Везни':((23, 9), (22, 10)),
+ 'Скорпион':((23, 10), (21, 11)),
+ 'Стрелец':((22, 11), (21, 12)),
+ 'Козирог':((22, 12), (31, 12))}
+
+ DAY = 0
+ MONTH = 1
+
+ test_value = day + month*100
+
+
+ for key, value in signs.items():
+ start_period, end_period = value
+ start = start_period[DAY] + start_period[MONTH]*100
+ end = end_period[DAY] + end_period[MONTH]*100
+ if test_value in range(start, end+1):
+ return key

Не намирам голяма нужда от

DAY = 0
MONTH = 1

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

Но да, ако си пуснал примерния тест и той е минал, така определено е по-добре.

Симеон обнови решението на 28.02.2013 15:56 (преди над 11 години)

-def what_is_my_sign(day=1, month=1):
+def what_is_my_sign(day, month):
signs = {'Козирог':((1, 1), (19, 1)),
'Водолей':((20, 1), (18, 2)),
'Риби':((19, 2), (20, 3)),
'Овен':((21, 3), (20, 4)),
'Телец':((21, 4), (20, 5)),
'Близнаци':((21, 5), (20, 6)),
'Рак':((21, 6), (21, 7)),
'Лъв':((22, 7), (22, 8)),
'Дева':((23, 8), (22, 9)),
'Везни':((23, 9), (22, 10)),
'Скорпион':((23, 10), (21, 11)),
'Стрелец':((22, 11), (21, 12)),
'Козирог':((22, 12), (31, 12))}
- DAY = 0
- MONTH = 1
-
test_value = day + month*100
-
-
+
for key, value in signs.items():
start_period, end_period = value
- start = start_period[DAY] + start_period[MONTH]*100
- end = end_period[DAY] + end_period[MONTH]*100
+ start = start_period[0] + start_period[1]*100
+ end = end_period[0] + end_period[1]*100
if test_value in range(start, end+1):
return key

ОК, Направих, го както го искате :) Т.е. махнах ненужните неща според вас, въпреки че наистина за мен беше по-четимо така :) Вчера споменахте, че доста хора пишат на Java и C, аз като Jav-ист наистина бих подходил така, но в случая на Python, предпочитам да слушам вас.

Тестовете вървят разбира се, няма да пратя решение, което не минава теста. Първото ми решение исках да е нестандартно, затова беше толкова сложно като имплементация, второто е ... сравнително по-простичко, но все пак нестандартно. Така че ... това е :)

Симеон обнови решението на 02.03.2013 10:44 (преди над 11 години)

def what_is_my_sign(day, month):
- signs = {'Козирог':((1, 1), (19, 1)),
- 'Водолей':((20, 1), (18, 2)),
- 'Риби':((19, 2), (20, 3)),
- 'Овен':((21, 3), (20, 4)),
- 'Телец':((21, 4), (20, 5)),
- 'Близнаци':((21, 5), (20, 6)),
- 'Рак':((21, 6), (21, 7)),
- 'Лъв':((22, 7), (22, 8)),
- 'Дева':((23, 8), (22, 9)),
- 'Везни':((23, 9), (22, 10)),
- 'Скорпион':((23, 10), (21, 11)),
- 'Стрелец':((22, 11), (21, 12)),
- 'Козирог':((22, 12), (31, 12))}
+ signs = {'Козирог': ((1, 1), (19, 1)),
+ 'Водолей': ((20, 1), (18, 2)),
+ 'Риби': ((19, 2), (20, 3)),
+ 'Овен': ((21, 3), (20, 4)),
+ 'Телец': ((21, 4), (20, 5)),
+ 'Близнаци': ((21, 5), (20, 6)),
+ 'Рак': ((21, 6), (21, 7)),
+ 'Лъв': ((22, 7), (22, 8)),
+ 'Дева': ((23, 8), (22, 9)),
+ 'Везни': ((23, 9), (22, 10)),
+ 'Скорпион': ((23, 10), (21, 11)),
+ 'Стрелец': ((22, 11), (21, 12)),
+ 'Козирог': ((22, 12), (31, 12))}
test_value = day + month*100
-
+
for key, value in signs.items():
start_period, end_period = value
start = start_period[0] + start_period[1]*100
end = end_period[0] + end_period[1]*100
if test_value in range(start, end+1):
- return key
+ return key

Симеон обнови решението на 02.03.2013 10:58 (преди над 11 години)

def what_is_my_sign(day, month):
signs = {'Козирог': ((1, 1), (19, 1)),
'Водолей': ((20, 1), (18, 2)),
'Риби': ((19, 2), (20, 3)),
'Овен': ((21, 3), (20, 4)),
'Телец': ((21, 4), (20, 5)),
'Близнаци': ((21, 5), (20, 6)),
'Рак': ((21, 6), (21, 7)),
'Лъв': ((22, 7), (22, 8)),
'Дева': ((23, 8), (22, 9)),
'Везни': ((23, 9), (22, 10)),
'Скорпион': ((23, 10), (21, 11)),
'Стрелец': ((22, 11), (21, 12)),
'Козирог': ((22, 12), (31, 12))}
test_value = day + month*100
for key, value in signs.items():
start_period, end_period = value
start = start_period[0] + start_period[1]*100
end = end_period[0] + end_period[1]*100
if test_value in range(start, end+1):
- return key
+ return key