C #, 630 611 604 572 570 Bytes, 120 Jahre
(Fügen Sie ~ 2⅔ Bytes pro zusätzlichem Jahr hinzu, wenn Sie den Offset kennen.)
Dies ist gut für Menschen, die vom 31. Januar 1900 bis zum 24. Januar 2020 geboren wurden und wahrscheinlich außerhalb dieses Bereichs abstürzen werden. Gibt es Bonuspunkte für die Anzahl der abgedeckten Jahre?
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];
}
Oder komprimiert (mit zusätzlichen Zeilenumbrüchen):
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];
}
Einer der Tricks war, den Ursprung der Offset-Tabelle am 28. Januar zu haben. Dies erwies sich als die niedrigste Zeichenanzahl.
Wenn zufällig darauf bestanden wird, dass die Eingabe eine Zeichenfolge ist, fügen Sie 22 Zeichen hinzu, um die Methodensignatur in Folgendes zu ändern:
string Z(string i){
und fügen Sie die Zeile hinzu:
var d=DateTime.Parse(i);
EDITS:
- Fügen Sie alle Zeichenfolgen in ein Array ein und fügen Sie den Ausgabeselektoren Offsets hinzu.
- Der Tagesversatz wurde auf den 28. Januar geändert.
string.Split()
Inspiration aus Eduard Florinescus Antwort .
- Inline alle Arrays. Es hat mir nur 2 Zeichen erspart. : - /