Решение на Хороскоп от Данаил Димитров

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

Към профила на Данаил Димитров

Резултати

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

Код

def what_is_my_sign(day, month):
signs = ["Риби", "Водолей", "Козирог",
"Стрелец", "Скорпион",
"Везни", "Дева", "Лъв",
"Рак", "Близнаци", "Телец",
"Овен"]
signs_months = {"Риби": [[2, range(19, 30)], [range(1, 21), 3]],
"Водолей": [[1, range(20, 32)], [range(1, 19), 2]],
"Козирог": [[12, range(22, 32)], [range(1, 20), 1]],
"Стрелец": [[11, range(22, 31)], [range(1, 22), 12]],
"Скорпион": [[10, range(23, 32)], [range(1, 22), 11]],
"Везни": [[9, range(23, 31)], [range(1, 23), 10]],
"Дева": [[8, range(23, 32)], [range(1, 23), 9]],
"Лъв": [[7, range(22, 32)], [range(1, 23), 8]],
"Рак": [[6, range(21, 31)], [range(1, 22), 7]],
"Близнаци": [[5, range(21, 32)], [range(1, 21), 6]],
"Телец": [[4, range(21, 31)], [range(1, 21), 5]],
"Овен": [[3, range(21, 32)], [range(1, 21), 4]]}
for counter in range(0,13):
if ((month == signs_months[signs[counter]][0][0]) and
(day in signs_months[signs[counter]][0][1])):
return signs[counter]
elif ((month == signs_months[signs[counter]][1][1]) and
(day in signs_months[signs[counter]][1][0])):
return signs[counter]

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

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

OK

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

Данаил обнови решението на 01.03.2013 18:53 (преди над 11 години)

+def what_is_my_sign(day,month):
+ if ((day>20 and day<32) and month==3) or ((day>0 and day<21) and month==4):
+ a="Овен"
+ elif ((day>20 and day<31) and month==4) or ((day>0 and day<21) and month==5):
+ a="Телец"
+ elif ((day>20 and day<32) and month==5) or ((day>0 and day<21) and month==6):
+ a="Близнаци"
+ elif ((day>20 and day<31) and month==6) or ((day>0 and day<22) and month==7):
+ a="Рак"
+ elif ((day>21 and day<32) and month==7) or ((day>0 and day<23) and month==8):
+ a="Лъв"
+ elif ((day>22 and day<32) and month==8) or ((day>0 and day<23) and month==9):
+ a="Дева"
+ elif ((day>22 and day<31) and month==9) or ((day>0 and day<23) and month==10):
+ a="Везни"
+ elif ((day>22 and day<32) and month==10) or ((day>0 and day<22) and month==11):
+ a="Скорпион"
+ elif ((day>21 and day<31) and month==11) or ((day>0 and day<22) and month==12):
+ a="Стрелец"
+ elif ((day>21 and day<32) and month==12) or ((day>0 and day<20) and month==1):
+ a="Козирог"
+ elif ((day>19 and day<32) and month==1) or ((day>0 and day<19) and month==2):
+ a="Водолей"
+ elif ((day>=19 and day<=29) and month==2) or ((day>0 and day<=20) and month==3):
+ a="Риби"
+ else:
+ a="Въведена е грешна дата ..."
+ return a

Когато видях твоето домашно знаех, че трябва да цитирам Йоан. Не съм сигурен с кой от тези два израза, обаче. Затова ти ги пращам и двата.

Неща, които аз бих дефинирал като данни, при теб са код. Замисли се за начин да структурираш нещата различно.

Виждам един и същ код написан 12 пъти. Това не изглежда твърде елегантно.

Имена като a не трябва да присъстват никъде в код написан на Python. И защо допускаш, че може да не намериш зодия? В форумите казахме, че очаквате валиден input.

Данаил обнови решението на 02.03.2013 03:55 (преди над 11 години)

def what_is_my_sign(day,month):
- if ((day>20 and day<32) and month==3) or ((day>0 and day<21) and month==4):
- a="Овен"
+ signs=["Риби", "Водолей" ,"Козирог" ,"Стрелец" ,"Скорпион" ,"Везни" ,"Дева" ,"Лъв" ,"Рак" ,"Близнаци" ,"Телец" ,"Овен"]
- elif ((day>20 and day<31) and month==4) or ((day>0 and day<21) and month==5):
+ signs_months={"Риби" :[[2,range(19,30)],[range(1,21),3]], "Водолей" :[[1,range(20,32)],[range(1,19),2]] ,"Козирог" :[[12,range(22,32)],[range(1,20),1]] ,"Стрелец" :[[11,range(22,31)],[range(1,22),12]] ,"Скорпион" :[[10,range(23,32)],[range(1,22),11]] ,"Везни" :[[9,range(23,31)],[range(1,23),10]] ,"Дева" :[[8,range(23,32)],[range(1,23),9]] ,"Лъв" :[[7,range(22,32)],[range(1,23),8]] ,"Рак" :[[6,range(21,31)],[range(1,22),7]] ,"Близнаци" :[[5,range(21,32)],[range(1,21),6]] ,"Телец" :[[4,range(21,31)],[range(1,21),5]] ,"Овен" :[[3,range(21,32)],[range(1,21),4]]}
- a="Телец"
+ i=-1
- elif ((day>20 and day<32) and month==5) or ((day>0 and day<21) and month==6):
+ flag=True
- a="Близнаци"
+ while i<12 and flag:
- elif ((day>20 and day<31) and month==6) or ((day>0 and day<22) and month==7):
+ i=i+1
- a="Рак"
+ if (month==signs_months[signs[i]][0][0]) and (day in signs_months[signs[i]][0][1]) or ((month==signs_months[signs[i]][1][1]) and (day in signs_months[signs[i]][1][0])):
- elif ((day>21 and day<32) and month==7) or ((day>0 and day<23) and month==8):
+ flag=False
- a="Лъв"
+ return signs[i]
- elif ((day>22 and day<32) and month==8) or ((day>0 and day<23) and month==9):
- a="Дева"
- elif ((day>22 and day<31) and month==9) or ((day>0 and day<23) and month==10):
- a="Везни"
- elif ((day>22 and day<32) and month==10) or ((day>0 and day<22) and month==11):
- a="Скорпион"
- elif ((day>21 and day<31) and month==11) or ((day>0 and day<22) and month==12):
- a="Стрелец"
- elif ((day>21 and day<32) and month==12) or ((day>0 and day<20) and month==1):
- a="Козирог"
- elif ((day>19 and day<32) and month==1) or ((day>0 and day<19) and month==2):
- a="Водолей"
- elif ((day>=19 and day<=29) and month==2) or ((day>0 and day<=20) and month==3):
- a="Риби"
- else:
- a="Въведена е грешна дата ..."
- return a

А ако може да попитам , в python какво е отношението към break ? Като в C ли е или се предполага по-често използване? ... извинявам се за 2-ро и 3-то решение, късно го писах и забравих да го редактирам спрямо PEP 8 стандарта (направо гледайте 3-то решение -2-ро е същото)

Данаил обнови решението на 02.03.2013 10:38 (преди над 11 години)

-def what_is_my_sign(day,month):
- signs=["Риби", "Водолей" ,"Козирог" ,"Стрелец" ,"Скорпион" ,"Везни" ,"Дева" ,"Лъв" ,"Рак" ,"Близнаци" ,"Телец" ,"Овен"]
+def what_is_my_sign(day, month):
- signs_months={"Риби" :[[2,range(19,30)],[range(1,21),3]], "Водолей" :[[1,range(20,32)],[range(1,19),2]] ,"Козирог" :[[12,range(22,32)],[range(1,20),1]] ,"Стрелец" :[[11,range(22,31)],[range(1,22),12]] ,"Скорпион" :[[10,range(23,32)],[range(1,22),11]] ,"Везни" :[[9,range(23,31)],[range(1,23),10]] ,"Дева" :[[8,range(23,32)],[range(1,23),9]] ,"Лъв" :[[7,range(22,32)],[range(1,23),8]] ,"Рак" :[[6,range(21,31)],[range(1,22),7]] ,"Близнаци" :[[5,range(21,32)],[range(1,21),6]] ,"Телец" :[[4,range(21,31)],[range(1,21),5]] ,"Овен" :[[3,range(21,32)],[range(1,21),4]]}
+ signs = ["Риби", "Водолей", "Козирог",
- i=-1
+ "Стрелец", "Скорпион",
- flag=True
+ "Везни", "Дева", "Лъв",
- while i<12 and flag:
+ "Рак", "Близнаци", "Телец",
- i=i+1
+ "Овен"]
- if (month==signs_months[signs[i]][0][0]) and (day in signs_months[signs[i]][0][1]) or ((month==signs_months[signs[i]][1][1]) and (day in signs_months[signs[i]][1][0])):
+ signs_months = {"Риби": [[2, range(19, 30)], [range(1, 21), 3]],
- flag=False
+ "Водолей": [[1, range(20, 32)], [range(1, 19), 2]],
- return signs[i]
+ "Козирог": [[12, range(22, 32)], [range(1, 20), 1]],
+ "Стрелец": [[11, range(22, 31)], [range(1, 22), 12]],
+ "Скорпион": [[10, range(23, 32)], [range(1, 22), 11]],
+ "Везни": [[9, range(23, 31)], [range(1, 23), 10]],
+ "Дева": [[8, range(23, 32)], [range(1, 23), 9]],
+ "Лъв": [[7, range(22, 32)], [range(1, 23), 8]],
+ "Рак": [[6, range(21, 31)], [range(1, 22), 7]],
+ "Близнаци": [[5, range(21, 32)], [range(1, 21), 6]],
+ "Телец": [[4, range(21, 31)], [range(1, 21), 5]],
+ "Овен": [[3, range(21, 32)], [range(1, 21), 4]]}
+ counter = -1
+ flag = True
+ while counter < 12 and flag:
+ counter = counter + 1
+ if ((month == signs_months[signs[counter]][0][0]) and
+ (day in signs_months[signs[counter]][0][1]) or
+ ((month == signs_months[signs[counter]][1][1]) and
+ (day in signs_months[signs[counter]][1][0]))):
+ flag = False
+ return signs[counter]

Няма някаква омраза към break, но определено не се използва често.

Определено това, което си предал е по-добра идея от повтаращия се код, но помисли дали не можеш да го направиш далеч по-елегантно.

Подобно условие в if не ми се е налагало да пиша никога, но ако някога се случи ще ми светне лампичката, че върша нещо грешно:

if ((month == signs_months[signs[counter]][0][0]) and
    (day in signs_months[signs[counter]][0][1]) or
    ((month == signs_months[signs[counter]][1][1]) and
    (day in signs_months[signs[counter]][1][0]))):
    flag = False

Нещо такова ще се случи и ако реша, че да въртя while цикъл с флаг и брояч (започващ от -1, поради някаква причина) в толкова малка колекция е добра идея :)

П.П.: Спокойно, гледаме само последното изпратено решение, когато коментираме и оценяваме :)

Аз първият път го написах с цикъл for in range(0,13) и break(в случай, че условието се изпълни), но предположих, че както и в C не е добре да се ползва break. Също така условието във if го бях записал като if и elif, но като дължина е същото, така че предполагам, че трябва да се намали самото условие, според вас?

Данаил обнови решението на 03.03.2013 22:26 (преди над 11 години)

def what_is_my_sign(day, month):
signs = ["Риби", "Водолей", "Козирог",
"Стрелец", "Скорпион",
"Везни", "Дева", "Лъв",
"Рак", "Близнаци", "Телец",
"Овен"]
signs_months = {"Риби": [[2, range(19, 30)], [range(1, 21), 3]],
"Водолей": [[1, range(20, 32)], [range(1, 19), 2]],
"Козирог": [[12, range(22, 32)], [range(1, 20), 1]],
"Стрелец": [[11, range(22, 31)], [range(1, 22), 12]],
"Скорпион": [[10, range(23, 32)], [range(1, 22), 11]],
"Везни": [[9, range(23, 31)], [range(1, 23), 10]],
"Дева": [[8, range(23, 32)], [range(1, 23), 9]],
"Лъв": [[7, range(22, 32)], [range(1, 23), 8]],
"Рак": [[6, range(21, 31)], [range(1, 22), 7]],
"Близнаци": [[5, range(21, 32)], [range(1, 21), 6]],
"Телец": [[4, range(21, 31)], [range(1, 21), 5]],
"Овен": [[3, range(21, 32)], [range(1, 21), 4]]}
- counter = -1
- flag = True
- while counter < 12 and flag:
- counter = counter + 1
+ for counter in range(0,13):
if ((month == signs_months[signs[counter]][0][0]) and
- (day in signs_months[signs[counter]][0][1]) or
- ((month == signs_months[signs[counter]][1][1]) and
+ (day in signs_months[signs[counter]][0][1])):
- (day in signs_months[signs[counter]][1][0]))):
+ return signs[counter]
- flag = False
+ elif ((month == signs_months[signs[counter]][1][1]) and
- return signs[counter]
+ (day in signs_months[signs[counter]][1][0])):
+ return signs[counter]