C #, 630 611 604 572 570 byte, 120 năm
(thêm ~ 2⅔ byte mỗi năm nếu bạn biết bù)
Điều này tốt cho những người sinh ngày 31 tháng 1 năm 1900 đến ngày 24 tháng 1 năm 2020 và có khả năng sẽ gặp sự cố ngoài phạm vi đó. Có điểm thưởng cho số năm được bảo hiểm không?
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];
}
Hoặc cô đặc (có thêm ngắt dòng):
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];
}
Một trong những thủ thuật là có nguồn gốc của bảng bù vào ngày 28 tháng 1. Điều này chứng tỏ có số lượng nhân vật thấp nhất.
Nếu tình cờ, đầu vào là một chuỗi, hãy thêm 22 ký tự để thay đổi chữ ký phương thức thành:
string Z(string i){
và thêm dòng:
var d=DateTime.Parse(i);
CHỈNH SỬA:
- Đặt tất cả các chuỗi trong một mảng và thêm offset vào các bộ chọn đầu ra.
- Thay đổi ngày bù vào ngày 28 tháng 1.
string.Split()
Cảm hứng lấy từ câu trả lời của Eduard Florinescu .
- Nội tuyến tất cả các mảng. Nó chỉ lưu tôi 2 ký tự. : - /