Решение на Астрологични забави от Йордан Пулов

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

Към профила на Йордан Пулов

Резултати

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

Код

def interpret_western_sign(day, month):
from itertools import repeat
western_days = []
for x in range(0, 13):
western_days.append([])
# capricorn
western_days[1].extend(repeat("capricorn", 20))
# aquarius
western_days[1].extend(repeat("aquarius", 11))
western_days[2].extend(repeat("aquarius", 18))
# pisces
western_days[2].extend(repeat("pisces", 10))
western_days[3].extend(repeat("pisces", 20))
# aries
western_days[3].extend(repeat("aries", 11))
western_days[4].extend(repeat("aries", 20))
# taurus
western_days[4].extend(repeat("taurus", 11))
western_days[5].extend(repeat("taurus", 20))
# gemini
western_days[5].extend(repeat("gemini", 11))
western_days[6].extend(repeat("gemini", 20))
# cancer
western_days[6].extend(repeat("cancer", 11))
western_days[7].extend(repeat("cancer", 22))
# leo
western_days[7].extend(repeat("leo", 11))
western_days[8].extend(repeat("leo", 22))
# virgo
western_days[8].extend(repeat("virgo", 11))
western_days[9].extend(repeat("virgo", 22))
# libra
western_days[9].extend(repeat("libra", 11))
western_days[10].extend(repeat("libra", 22))
# scorpio
western_days[10].extend(repeat("scorpio", 11))
western_days[11].extend(repeat("scorpio", 21))
# sagittarius
western_days[11].extend(repeat("sagittarius", 11))
western_days[12].extend(repeat("sagittarius", 21))
# capricorn
western_days[12].extend(repeat("capricorn", 11))
return western_days[month][day-1]
def interpret_chinese_sign(year):
year_mod = (year - 1900) % 12
chinese_years = [
"rat",
"ox",
"tiger",
"rabbit",
"dragon",
"snake",
"horse",
"sheep",
"monkey",
"rooster",
"dog",
"pig"
]
return chinese_years[year_mod]
def interpret_both_signs(day, month, year):
return (interpret_western_sign(day, month), interpret_chinese_sign(year))

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

..E...
======================================================================
ERROR: test_leap_year (test.TestSigns)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20150312-24164-1ss4vdf/test.py", line 32, in test_leap_year
    self.assertEqual(solution.interpret_western_sign(29, 2), 'pisces')
  File "/tmp/d20150312-24164-1ss4vdf/solution.py", line 59, in interpret_western_sign
    return western_days[month][day-1]
IndexError: list index out of range

----------------------------------------------------------------------
Ran 6 tests in 0.007s

FAILED (errors=1)

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

Йордан обнови решението на 08.03.2015 15:20 (преди над 9 години)

+def interpret_western_sign(day, month):
+ if month == 1:
+ if day >= 21:
+ return "aquarius"
+ else:
+ return "capricorn"
+ elif month == 2:
+ if day >= 19:
+ return "pisces"
+ else:
+ return "aquarius"
+ elif month == 3:
+ if day >= 21:
+ return "aries"
+ else:
+ return "pisces"
+ elif month == 4:
+ if day >= 21:
+ return "taurus"
+ else:
+ return "aries"
+ elif month == 5:
+ if day >= 21:
+ return "gemini"
+ else:
+ return "taurus"
+ elif month == 6:
+ if day >= 21:
+ return "cancer"
+ else:
+ return "gemini"
+ elif month == 7:
+ if day >= 23:
+ return "leo"
+ else:
+ return "cancer"
+ elif month == 8:
+ if day >= 23:
+ return "virgo"
+ else:
+ return "leo"
+ elif month == 9:
+ if day >= 23:
+ return "libra"
+ else:
+ return "virgo"
+ elif month == 10:
+ if day >= 23:
+ return "scorpio"
+ else:
+ return "libra"
+ elif month == 11:
+ if day >= 22:
+ return "sagittarius"
+ else:
+ return "scorpio"
+ elif month == 12:
+ if day >= 22:
+ return "capricorn"
+ else:
+ return "sagittarius"
+
+
+def interpret_chinese_sign(year):
+ year_mod = (year - 1900) % 12
+ if year_mod == 0:
+ return "rat"
+ elif year_mod == 1:
+ return "ox"
+ elif year_mod == 2:
+ return "tiger"
+ elif year_mod == 3:
+ return "rabbit"
+ elif year_mod == 4:
+ return "dragon"
+ elif year_mod == 5:
+ return "snake"
+ elif year_mod == 6:
+ return "horse"
+ elif year_mod == 7:
+ return "sheep"
+ elif year_mod == 8:
+ return "monkey"
+ elif year_mod == 9:
+ return "rooster"
+ elif year_mod == 10:
+ return "dog"
+ elif year_mod == 11:
+ return "pig"
+
+
+def interpret_both_signs(day, month, year):
+ return (interpret_western_sign(day, month), interpret_chinese_sign(year))

Определено не те мързи! Но тези if-ове! Можеш да го напишеш по много по - елегатен и лесен за четене начин. Я сега си представи, че зодиите във всеки календар бяха по 1000. Така ли щеше да го направиш?

Йордан обнови решението на 10.03.2015 23:00 (преди над 9 години)

def interpret_western_sign(day, month):
- if month == 1:
- if day >= 21:
- return "aquarius"
- else:
- return "capricorn"
- elif month == 2:
- if day >= 19:
- return "pisces"
- else:
- return "aquarius"
- elif month == 3:
- if day >= 21:
- return "aries"
- else:
- return "pisces"
- elif month == 4:
- if day >= 21:
- return "taurus"
- else:
- return "aries"
- elif month == 5:
- if day >= 21:
- return "gemini"
- else:
- return "taurus"
- elif month == 6:
- if day >= 21:
- return "cancer"
- else:
- return "gemini"
- elif month == 7:
- if day >= 23:
- return "leo"
- else:
- return "cancer"
- elif month == 8:
- if day >= 23:
- return "virgo"
- else:
- return "leo"
- elif month == 9:
- if day >= 23:
- return "libra"
- else:
- return "virgo"
- elif month == 10:
- if day >= 23:
- return "scorpio"
- else:
- return "libra"
- elif month == 11:
- if day >= 22:
- return "sagittarius"
- else:
- return "scorpio"
- elif month == 12:
- if day >= 22:
- return "capricorn"
- else:
- return "sagittarius"
+ from itertools import repeat
+ western_days = []
+ for x in range(0, 13):
+ western_days.append([])
+
+ # capricorn
+ western_days[1].extend(repeat("capricorn", 20))
+
+ # aquarius
+ western_days[1].extend(repeat("aquarius", 11))
+ western_days[2].extend(repeat("aquarius", 18))
+
+ # pisces
+ western_days[2].extend(repeat("pisces", 10))
+ western_days[3].extend(repeat("pisces", 20))
+
+ # aries
+ western_days[3].extend(repeat("aries", 11))
+ western_days[4].extend(repeat("aries", 20))
+
+ # taurus
+ western_days[4].extend(repeat("taurus", 11))
+ western_days[5].extend(repeat("taurus", 20))
+
+ # gemini
+ western_days[5].extend(repeat("gemini", 11))
+ western_days[6].extend(repeat("gemini", 20))
+
+ # cancer
+ western_days[6].extend(repeat("cancer", 11))
+ western_days[7].extend(repeat("cancer", 22))
+
+ # leo
+ western_days[7].extend(repeat("leo", 11))
+ western_days[8].extend(repeat("leo", 22))
+
+ # virgo
+ western_days[8].extend(repeat("virgo", 11))
+ western_days[9].extend(repeat("virgo", 22))
+
+ # libra
+ western_days[9].extend(repeat("libra", 11))
+ western_days[10].extend(repeat("libra", 22))
+
+ # scorpio
+ western_days[10].extend(repeat("scorpio", 11))
+ western_days[11].extend(repeat("scorpio", 21))
+
+ # sagittarius
+ western_days[11].extend(repeat("sagittarius", 11))
+ western_days[12].extend(repeat("sagittarius", 21))
+
+ # capricorn
+ western_days[12].extend(repeat("capricorn", 11))
+
+ return western_days[month][day-1]
+
+
def interpret_chinese_sign(year):
year_mod = (year - 1900) % 12
- if year_mod == 0:
- return "rat"
- elif year_mod == 1:
- return "ox"
- elif year_mod == 2:
- return "tiger"
- elif year_mod == 3:
- return "rabbit"
- elif year_mod == 4:
- return "dragon"
- elif year_mod == 5:
- return "snake"
- elif year_mod == 6:
- return "horse"
- elif year_mod == 7:
- return "sheep"
- elif year_mod == 8:
- return "monkey"
- elif year_mod == 9:
- return "rooster"
- elif year_mod == 10:
- return "dog"
- elif year_mod == 11:
- return "pig"
+ chinese_years = [
+ "rat",
+ "ox",
+ "tiger",
+ "rabbit",
+ "dragon",
+ "snake",
+ "horse",
+ "sheep",
+ "monkey",
+ "rooster",
+ "dog",
+ "pig"
+ ]
+ return chinese_years[year_mod]
def interpret_both_signs(day, month, year):
return (interpret_western_sign(day, month), interpret_chinese_sign(year))

Ето едно друго решение без if-ове. Mоето лично мнение е че 1-ят вариант на interpret_western_sign е по-добър и по-четим от 2-ят , защото човек мисли 1-во за месеца (ограничава зодиите до 2) и след това гледа датата.

Mоето лично мнение е че 1-ят вариант на interpret_western_sign е по-добър и по-четим от 2-ят

Моето е, че и двата варианта са еднакво далеч от "добри" и "четими". Опитай се да опростиш малко :)

Тази забележка е все така валидна:

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