C #, 630 611 604 572 570 ไบต์, 120 ปี
(เพิ่ม ~ 2⅔ไบต์ต่อปีเพิ่มเติมถ้าคุณรู้ว่าชดเชย)
นี่เป็นสิ่งที่ดีสำหรับผู้ที่เกิดวันที่ 31 ม.ค. 1900 ถึง 24 มกราคมถึง 2020 และมีแนวโน้มว่าจะผิดพลาดนอกช่วงดังกล่าว มีคะแนนโบนัสตามจำนวนปีที่ครอบคลุมหรือไม่?
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];
}
หรือย่อ (เพิ่มตัวแบ่งบรรทัด):
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];
}
หนึ่งในเทคนิคคือการให้กำเนิดตารางชดเชยที่ 28 ม.ค. นี่พิสูจน์แล้วว่ามีจำนวนตัวอักษรต่ำสุด
หากบังเอิญมีการยืนยันว่าอินพุตเป็นสตริงให้เพิ่ม 22 อักขระเพื่อเปลี่ยนวิธีการลงนามเป็น:
string Z(string i){
และเพิ่มบรรทัด:
var d=DateTime.Parse(i);
การแก้ไข:
- ใส่สตริงทั้งหมดในหนึ่งอาร์เรย์และเพิ่มออฟเซ็ตให้กับตัวเลือกเอาต์พุต
- เปลี่ยนวันชดเชยเป็น 28 มกราคม
string.Split()
แรงบันดาลใจที่นำมาจากคำตอบของเอดูอาร์ Florinescu
- Inline Array ทั้งหมด มันช่วยฉันแค่ 2 ตัวอักษรเท่านั้น : - /