Tính toán cung hoàng đạo Trung Quốc


10

Cho rằng năm mới của Trung Quốc đang đến, đây là một thách thức để tính toán cung hoàng đạo, nguyên tố và Taijitu của Trung Quốc cho một ngày nhất định.

Đầu vào phải là một ngày:

1/31/2014

Ngày được sử dụng ở đây là kiểu Hoa Kỳ mm/dd/yyyy, nhưng có thể thay thế là kiểu ISO-8601: yyyy-mm-ddvì vậy kiểu đầu vào ngày không nghiêm ngặt.

Đầu ra phải là dấu hiệu động vật trong Hoàng đạo Trung Quốc bao gồm cả yếu tố tương ứng với ngày và đối tác Taijitu của nó :

Horse - Wood - Yang

Một bảng cho thấy mối quan hệ Zodiac - yếu tố - Taijitu có thể được nhìn thấy ở đây: Zodiac Trung Quốc - Năm

Định dạng đầu ra không nghiêm ngặt nhưng phải chứa thành phần động vật, thành phần và Taijitu và nên được phân định trong một số thời trang.

Ví dụ về đầu ra hợp lệ cho ngày trên có thể bao gồm:

(horse, wood, yang)
["Horse", "Wood", "Yang"]

Chương trình của bạn sẽ trả lại đầu ra hợp lệ trong khoảng ít nhất 100 năm, kể cả ngày hôm nay. Điều này có nghĩa là nó sẽ cần ít nhất hai chu kỳ 60 năm ( Sexagenary ).


3
Bạn có một liên kết thuận tiện để làm thế nào để tính toán bắt đầu một năm hoàng đạo?
Thực phẩm điện tử

3
Bạn không biết làm thế nào để tính năm zodaic nhưng nó "có vẻ khá đơn giản". Có lẽ chúng ta nên đóng câu hỏi này ngay bây giờ và mở lại nó khi bạn có những chi tiết nhỏ đó được giải quyết?

1
Một điều cần lưu ý là nó luôn nằm trong khoảng từ ngày 21 tháng 1 đến ngày 21 tháng 2.
Justin

3
Bảng bạn liên kết sẽ không được sử dụng trừ khi bạn thêm một hạn chế rằng không cần thiết phải đưa ra đầu ra chính xác cho các ngày nằm ngoài phạm vi đó.
Peter Taylor

2
Eduard Florinescu, hai điều bạn nên làm rõ trong câu hỏi: 1) phạm vi ngày đầu vào như @PeterTaylor chỉ ra, và 2) định dạng đầu ra có phải chính xác như bạn chỉ định trong ví dụ của mình không? Mỗi nhân vật đều có giá trị, vì vậy hãy thực hiện mục tiêu này. Cảm ơn.
Darren Stone

Câu trả lời:


4

Toán học 63

Được rồi, điều này có thể đang già đi, nhưng nó hoạt động (đầu vào ngày không rõ ràng trong nhiều trường hợp):

z=WolframAlpha[#<>" Chinese zodiac",{{"Result",1},"Plaintext"}] &

Thí dụ:

z@"1/31/2014"

"Ngựa (Dương gỗ)"


Bề rộng của Mathicala làm tôi ngạc nhiên. Định dạng đầu ra của bạn không chính xác, nhưng tôi chắc chắn rằng nó dễ dàng được sửa.
Darren Stone

1
@DarrenStone nó có phần khéo léo vì Mathicala chỉ đơn giản gọi W | A. Bạn có nghĩ rằng đầu ra phải phù hợp với định dạng OP xóa không?
Yves Klett

Có vẻ như các câu trả lời khác được định dạng chính xác như đầu ra ví dụ của câu hỏi và chắc chắn phải có thêm mã để thực hiện bằng bất kỳ ngôn ngữ nào. Nhưng đó thực sự là một câu hỏi cho @EduardFlorinescu
Darren Stone

@DarrenStone đúng. Điều này chắc chắn sẽ thêm khá nhiều chi phí. W & C ...
Yves Klett

4

C # - 357 337 339 byte

string Z(System.DateTime d){var c=new System.Globalization.ChineseLunisolarCalendar();var y=c.GetSexagenaryYear(d);var s=c.GetCelestialStem(y)-1;return",Rat,Ox,Tiger,Rabbit,Dragon,Snake,Horse,Goat,Monkey,Rooster,Dog,Pig".Split(',')[c.GetTerrestrialBranch(y)]+" - "+"Wood,Fire,Earth,Metal,Water".Split(',')[s/2]+" - Y"+(s%2>0?"in":"ang");}

Định dạng:

string Z(System.DateTime d)
{
  var c = new System.Globalization.ChineseLunisolarCalendar();
  var y = c.GetSexagenaryYear(d);
  var s = c.GetCelestialStem(y) - 1;
  return
    ",Rat,Ox,Tiger,Rabbit,Dragon,Snake,Horse,Goat,Monkey,Rooster,Dog,Pig".Split(',')[c.GetTerrestrialBranch(y)]
    + " - "
    + "Wood,Fire,Earth,Metal,Water".Split(',')[s / 2]
    + " - Y" + (s % 2 > 0 ? "in" : "ang");
}

+1 Ngoài ra, bạn có thể lưu hơn 20 ký tự bằng cách tránh string.Format.
Thực phẩm điện tử

Vâng, đúng rồi, cảm ơn, tôi đã cố gắng đánh gôn s% 2 == 0, v.v. và quên cái lớn. :-) Và, thực sự, nó chính xác là 20 ký tự, IIANM.
Mặc Môn

4

Python 2: 360 * 387 586 594 - Ký tự

Giảm hơn nữa

m,n,p=map(int,raw_input().split("/"));p-=1924;d=int("5od2nauh6qe4obvj8rf5pd2math6re3ocvi8sf5pd2l9uh6rf3nbvi7sg5pd2k9th6rf4navj7sg5oc1m9ti7qe3navj8sg5pc1math6qd3nbvj8sf4oc1ma"[p],36);p-=31*m-31+n<(d<21)*31+d;print"Rat Ox Tiger Rabbit Dragon Snake Horse Goat Monkey Rooster Dog Pig".split()[p%12],"Wood Fire Earth Metal Water".split()[p%10/2],["Yang","Yin"][p%2]

Đoạn mã trên hoạt động trong khoảng thời gian sau: 5 tháng 2 năm 1924 - 31 tháng 12 năm 2043

Ví dụ: sau khi dán đoạn mã trên vào con trỏ trình thông dịch python

>>> m,n,p=map(int,raw_input().split("/"));p-=1924;d=int("5od2nauh6qe4obvj8rf5pd2math6re3ocvi8sf5pd2l9uh6rf3nbvi7sg5pd2k9th6rf4navj7sg5oc1m9ti7qe3navj8sg5pc1math6qd3nbvj8sf4oc1ma"[p],36);p-=31*m-31+n<(d<21)*31+d;print"Rat Ox Tiger Rabbit Dragon Snake Horse Goat Monkey Rooster Dog Pig".split()[p%12],"Wood Fire Earth Metal Water".split()[p%10/2],["Yang","Yin"][p%2]

và sau đó nhấn Enter, nhập một ngày như thế này

6/13/2018

và sau đó nhấn Entermột lần nữa, đầu ra sẽ được

Dog Earth Yang


* giảm thêm 27 byte với sự giúp đỡ của Brian xem các bình luận.


2
Bạn có để ý số cơ sở 36 của bạn chứa hai lần toán Toán không? :)
Timwi

1
@Timwi: D Không, tôi đã không, và điều đó vừa hay vừa ma quái!
Eduard Florinescu

Bạn có thể giải thích phần d = int (số 36 cơ sở) không? Tôi đã bắt gặp câu trả lời của bạn khi thực hiện nghiên cứu về stackoverflow cho một vấn đề tương tự. Tôi cần mở rộng các tính toán năm đến phạm vi năm 1500 - 2043. Cảm ơn trước sự giúp đỡ.
Luis Miguel

1
Bạn có thể lưu thêm 23 ký tự với một số vi mô. Xem reddit.com/r/Python/comments/2oqobw/ từ
Brian

1
@Timwi 1math62math6. Ngay cả 5 phần trước và 3 phần sau cũng được nhân đôi với các ký tự khác nhau. Đó là 3spooky5me.
Bạch tuộc ma thuật Urn

3

Hồng ngọc, 340

m,d,y=gets.split(?/).map(&:to_i);y+=1if 31*m+d-51>"d88jac8mlbuppp21ygmkjsnfsd4n3xsrhha4abnq9zgo6g2jupc39zav84434f75op4ftfhdcsa3xhc8nsw1ssw8p9qns1tf14mncy8j18msr9rsb7j7".to_i(36)>>5*y-9625&31
$><<[%w(Goat Monkey Rooster Dog Pig Rat Ox Tiger Rabbit Dragon Snake Horse)[y%12],%w(Metal Water Wood Fire Earth)[(y-1)/2%5],%w(Yin Yang)[y%2]]*' - '

Điều này sẽ làm việc cho các ngày từ ngày 5 tháng 2 năm 1924 đến ngày 29 tháng 1 năm 2044.


Con số "ma thuật" đó là cái quái gì vậy?
tomsmeding

1
@tomsmeding, đó là số nguyên 600 bit được mã hóa trong Base 36 để thu gọn. Bị vỡ thành bitfield, đó là một bảng của ngày đầu tiên theo lịch âm cho mỗi năm từ 1924 đến 1944.
Darren Stone

3

GolfScript (212 ký tự)

Điều này sử dụng các ký tự không in được, vì vậy đây là đầu ra từ xxd:

0000000: 272d 272f 6e2a 7e5c 2833 312a 2b5c 3a5e  '-'/n*~\(31*+\:^
0000010: 3139 2a22 d4e3 275a 747f 878c 70cb 996d  19*"..'Zt...p..m
0000020: a4f9 19e9 699e d818 bb61 c4e3 2232 3536  ....i....a.."256
0000030: 6261 7365 2033 6261 7365 5e31 3932 322d  base 3base^1922-
0000040: 3c7b 282d 7d2f 3330 2532 312b 3e5e 352d  <{(-}/30%21+>^5-
0000050: 2b3a 5e31 3225 2752 6174 0a4f 780a 5469  +:^12%'Rat.Ox.Ti
0000060: 6765 720a 5261 6262 6974 0a44 7261 676f  ger.Rabbit.Drago
0000070: 6e0a 536e 616b 650a 486f 7273 650a 476f  n.Snake.Horse.Go
0000080: 6174 0a4d 6f6e 6b65 790a 526f 6f73 7465  at.Monkey.Rooste
0000090: 720a 446f 670a 5069 6727 6e2f 3d6e 5e32  r.Dog.Pig'n/=n^2
00000a0: 2f35 2527 576f 6f64 0a46 6972 650a 4561  /5%'Wood.Fire.Ea
00000b0: 7274 680a 4d65 7461 6c0a 5761 7465 7227  rth.Metal.Water'
00000c0: 6e2f 3d6e 5e31 2627 5961 6e67 0a59 696e  n/=n^1&'Yang.Yin
00000d0: 276e 2f3d                                'n/=

Một chương trình tương đương sử dụng chuỗi thoát và do đó dài hơn một chút là:

'-'/n*~\(31*+\:^19*"\xD4\xE3'Zt\x87\x8Cp\xCB\x99m\xA4\xF9\x19\xE9i\x9E\xD8\x18\xBBa\xC4\xE3"256base 3base^1922-<{(-}/30%21+>^5-+:^12%'Rat
Ox
Tiger
Rabbit
Dragon
Snake
Horse
Goat
Monkey
Rooster
Dog
Pig'n/=n^2/5%'Wood
Fire
Earth
Metal
Water'n/=n^1&'Yang
Yin'n/=

Phần thú vị là điện toán, được đưa ra ngày, cho dù đó là trước hay sau Tết Nguyên đán rơi vào năm Gregorian đó. Lấy cảm hứng từ thuật toán tính toán Phục sinh mà tôi đã sử dụng cho một câu hỏi trước đó, tôi tìm kiếm một phép tính khá đơn giản về ngày đầu năm mới. Cuối cùng, tôi đã sử dụng một công thức đơn giản giúp tôi đạt được điều đó, cộng với một bảng tra cứu cho cụm từ lỗi.

Tính toán đơn giản là day_of_year = 21 + (19 * year % 30). Các phạm vi hạn lỗi từ 0để 8trên phạm vi quan tâm (1924-2044), và không bao giờ thay đổi từ năm này sang năm bởi nhiều hơn một, vì vậy các bảng tra cứu được mã hóa trong ternary cân bằng và sai số được tính toán bằng cách tổng hợp các thuật ngữ lỗi của một tiền tố của bảng.


Đẹp, ngắn nhất cho đến nay, ngoại trừ Mathicala người ta đang sử dụng một nguồn tài nguyên bên ngoài. +1
Eduard Florinescu

2

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ự. : - /

Lưu 5 ký tự bằng cách thay đổi " - "+new[]{"Yang","Yin"}[x%2]thành " - Y"+(x%2<1?"ang":"in"):)
Timwi

-1

Khá đơn giản với PHP bằng cách sử dụng câu lệnh Switch .

  • Tính toán theo như bạn muốn ...

    <?php
    
    // input the year
    $Y = 2020;
    
    // calculate the Z sign
    switch (($Y - 4) % 12) {
      case  0: $z = 'Rat';break;
      case  1: $z = 'Ox';break;
      case  2: $z = 'Tiger';break;
      case  3: $z = 'Rabbit';break;
      case  4: $z = 'Dragon';break;
      case  5: $z = 'Snake';break;
      case  6: $z = 'Horse';break;
      case  7: $z = 'Goat';break;
      case  8: $z = 'Monkey';break;
      case  9: $z = 'Rooster'; break;
      case 10: $z = 'Dog';break;
      case 11: $z = 'Pig';break;
    }
    
    // calculate the e
    switch (($Y / 2) % 5) {
      case  0: $e = 'Metal';break;
      case  1: $e = 'Water';break;
      case  2: $e = 'Wood'; break;
      case  3: $e = 'Fire'; break;
      case  4: $e = 'Earth'; break;
    }
    
    // calculate the polarity
     switch ($Y % 2) {
        case  0: $p = 'Yang';break;
        case  1: $p = 'Yin';break;
    
    }
    
     echo '$Y is $z - $e - $p.';
    

1
Chào mừng đến với PPCG! Chúng tôi yêu cầu tất cả các câu trả lời phải là đối thủ cạnh tranh nghiêm trọng , vì vậy trong trường hợp chơi golf, chúng tôi yêu cầu các câu trả lời phải nỗ lực rút ngắn mã. Ví dụ: tên biến chữ cái đơn, loại bỏ khoảng trắng thừa, v.v.
Hiện thân của sự thiếu hiểu biết

1
Chào mừng bạn đến với PPCG, mã của bạn chỉ hoạt động trong nhiều năm không hoàn thành ngày
Eduard Florinescu

điều đó đúng. Nó khó hơn tôi nghĩ, nhóm
MACboyet

loại bỏ khoảng trắng và rút ngắn var. cảm ơn về thông tin
MACboyet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.