C #, 630 611 604 572 570 bajtów, 120 lat
(dodaj ~ 2⅔ bajtów na dodatkowy rok, jeśli znasz przesunięcie)
Jest to dobre dla osób urodzonych od 31 stycznia 1900 r. Do 24 stycznia 2020 r. I prawdopodobnie ulegnie awarii poza tym zakresem. Czy są punkty bonusowe za liczbę lat objętych ubezpieczeniem?
string Z(DateTime date)
{
int[] days = new int[] { 3, 22, 11, 1, 19, 7, -3, 16, 5, -6, 13, 2,
21, 9, -2, 17, 6, -5, 14, 4, 23, 11, 0, 19,
8, -3, 16, 5, -5, 13, 2, 20, 9, -2, 17, 7,
-4, 14, 3, 22, 11, -1, 18, 8, -3, 16, 5, -6,
13, 1, 20, 9, -1, 17, 6, -4, 15, 3, 21, 11,
0, 18, 8, -3, 16, 5, -7, 12, 2, 20, 9, -1,
18, 6, -5, 14, 3, 21, 10, 0, 19, 8, -3, 16,
5, 23, 12, 1, 20, 9, -1, 18, 7, -5, 13, 3,
22, 10, 0, 19, 8, -4, 15, 4, -6, 12, 1, 21,
10, -2, 17, 6, -5, 13, 3, 22, 11, 0, 19, 8 };
string[] signs = "Rat,Ox,Tiger,Rabbit,Dragon,Snake,Horse,Goat,Monkey,Rooster,Dog,Pig".Split(',');
string[] elements = "Metal,Water,Wood,Fire,Earth".Split(',');
string[] polarities = new string[] { "Yang", "Yin" };
int year = date.Year - 1900;
int x = year - (date.DayOfYear < days[year] + 28 ? 1 : 0);
return signs[x % 12] + " - " + elements[x / 2 % 5] + " - " + polarities[x % 2];
}
Lub skondensowane (z dodanymi podziałami linii):
string Z(DateTime d){
int y=d.Year-1900,
x=y-(d.DayOfYear<new[]{3,22,11,1,19,7,-3,16,5,-6,13,2,21,9,-2,17,6,-5,14,4,23,11,0,19,8,-3,16,5,-5,13,2,20,9,-2,17,7,-4,14,3,22,11,-1,18,8,-3,16,5,-6,13,1,20,9,-1,17,6,-4,15,3,21,11,0,18,8,-3,16,5,-7,12,2,20,9,-1,18,6,-5,14,3,21,10,0,19,8,-3,16,5,23,12,1,20,9,-1,18,7,-5,13,3,22,10,0,19,8,-4,15,4,-6,12,1,21,10,-2,17,6,-5,13,3,22,11,0,19,8}[y]+28?1:0);
return "Rat,Ox,Tiger,Rabbit,Dragon,Snake,Horse,Goat,Monkey,Rooster,Dog,Pig".Split(',')[x%12]+" - "+"Metal,Water,Wood,Fire,Earth".Split(',')[x/2%5]+" - "+new[]{"Yang","Yin"}[x%2];
}
Jednym z trików było ustalenie pochodzenia tabeli offsetów 28 stycznia. Okazało się, że ma najmniejszą liczbę znaków.
Jeśli przypadkiem nalega, aby dane wejściowe były ciągiem, dodaj 22 znaki, aby zmienić podpis metody na:
string Z(string i){
i dodaj wiersz:
var d=DateTime.Parse(i);
EDYCJE:
- Umieść wszystkie ciągi w jednej tablicy i dodaj przesunięcia do selektorów wyjściowych.
- Zmieniono przesunięcie dnia na 28 stycznia.
string.Split()
Inspiracja zaczerpnięta z odpowiedzi Eduarda Florinescu .
- Inline wszystkie tablice. Uratowało mi to tylko 2 postacie. : - /