C #을, 630 611 604 572 570 바이트, 1백20년
(오프셋을 알고 있다면 1 년에 ~ 2⅔ 바이트 추가)
이것은 1900 년 1 월 31 일부터 2020 년 1 월 24 일 사이에 태어난 사람들에게 적합하며 그 범위를 벗어나는 경우가 많습니다. 보장 된 기간 동안 보너스 포인트가 있습니까?
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-Jan에 오프셋 테이블의 원점을 갖는 것입니다. 이것은 문자 수가 가장 적은 것으로 판명되었습니다.
우연히 입력이 문자열이라고 주장하면 22 문자를 추가하여 메소드 서명을 다음과 같이 변경하십시오.
string Z(string i){
그리고 라인을 추가하십시오 :
var d=DateTime.Parse(i);
EDITS :
- 모든 문자열을 하나의 배열에 넣고 출력 선택기에 오프셋을 추가했습니다.
- 일 오프셋을 1 월 28 일로 변경했습니다.
string.Split()
Eduard Florinescu의 답변 에서 영감을 얻었습니다 .
- 모든 배열을 인라인했습니다. 그것은 단지 2 자만 절약했습니다. :-/