C # 630 611 604 572 570 bayt, 120 yıl
(ofseti biliyorsanız ek yıl başına ~ 2⅔ bayt ekleyin)
Bu, 31 Ocak-1900 ile 24 Ocak 2020 arasında doğan insanlar için iyidir ve muhtemelen bu aralığın dışında çökecektir. Kapsanan yılların bonus puanları var mı?
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];
}
Veya yoğunlaştırılmış (satır sonları eklenmiş olarak):
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];
}
Püf noktalarından biri, 28 Ocak'ta ofset masasının başlangıcına sahip olmaktı. Bu, en düşük karakter sayısına sahip olduğunu kanıtladı.
Şans eseri girişin bir dize olması konusunda ısrar ederse, yöntem imzasını şu şekilde değiştirmek için 22 karakter ekleyin:
string Z(string i){
ve satırı ekleyin:
var d=DateTime.Parse(i);
DÜZENLEMELER:
- Tüm dizeleri bir diziye koyun ve çıkış seçicilerine ofsetleri ekleyin.
- Gün ofseti 28 Ocak olarak değiştirildi.
string.Split()İlham Eduard Florinescu'nun cevabından alınmıştır .
- Tüm dizileri satır içine aldım. Bana sadece 2 karakter kazandırdı. : - /