คำนวณสัญลักษณ์จักรราศีจีน


10

ระบุว่าตรุษจีนกำลังจะมาถึงนี่คือความท้าทายในการคำนวณราศีจีนองค์ประกอบและ Taijitu สำหรับวันที่กำหนด

ข้อมูลที่ป้อนควรเป็นวันที่:

1/31/2014

วันที่ใช้ที่นี่คือรูปแบบของสหรัฐอเมริกาmm/dd/yyyyแต่อาจเป็นรูปแบบ ISO-8601: yyyy-mm-ddรูปแบบการป้อนวันที่จึงไม่เข้มงวด

ผลผลิตที่ควรจะเป็นเครื่องหมายของสัตว์ในจีนราศีรวมทั้งองค์ประกอบที่สอดคล้องกับวันที่และTaijituคู่:

Horse - Wood - Yang

ตารางแสดงความสัมพันธ์ของราศี - องค์ประกอบ - Taijitu สามารถดูได้ที่นี่: นักษัตรจีน - ปี

รูปแบบผลลัพธ์ไม่เข้มงวด แต่ควรมีส่วนประกอบของสัตว์องค์ประกอบและ Taijitu และควรคั่นด้วยบางแบบ

ตัวอย่างของผลลัพธ์ที่ถูกต้องสำหรับวันข้างต้นอาจรวมถึง:

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

โปรแกรมของคุณควรส่งคืนผลลัพธ์ที่ถูกต้องเป็นระยะเวลาอย่างน้อย 100 ปีรวมถึงวันที่วันนี้ ซึ่งหมายความว่าจะต้องมีบัญชีอย่างน้อยสองรอบ 60 ปี ( Sexagenary )


3
คุณมีลิงค์ที่สะดวกในการคำนวณการเริ่มต้นปีนักษัตรหรือไม่?
Hand-E-Food

3
คุณไม่มีความคิดวิธีการคำนวณปี zodaic แต่มัน "ดูเหมือนง่ายสวย" บางทีเราควรปิดคำถามนี้ไปแล้วเปิดใหม่เมื่อคุณมีรายละเอียดเล็ก ๆ น้อย ๆ

1
สิ่งที่ควรทราบอีกประการหนึ่งคือระหว่างวันที่ 21 มกราคมถึง 21 กุมภาพันธ์เสมอ
จัสติ

3
ตารางที่คุณลิงก์ไม่มีประโยชน์เว้นแต่คุณจะเพิ่มข้อ จำกัด ที่ไม่จำเป็นในการให้ผลลัพธ์ที่ถูกต้องสำหรับวันที่ที่อยู่นอกช่วงนั้น
Peter Taylor

2
Eduard Florinescu สองสิ่งที่คุณควรอธิบายให้ชัดเจนในคำถาม: 1) ช่วงวันที่อินพุตตามที่ @PeterTaylor ชี้ให้เห็นและ 2) รูปแบบผลลัพธ์จะต้องตรงตามที่คุณระบุในตัวอย่างหรือไม่ ตัวละครทุกตัวมีค่าดังนั้นโปรดทำให้วัตถุประสงค์นี้เป็นจริง ขอบคุณ
Darren Stone

คำตอบ:


4

Mathematica 63

โอเคสิ่งนี้อาจเริ่มเก่า แต่ก็ใช้งานได้ (การป้อนวันที่จะคลุมเครือในหลายกรณี):

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

ตัวอย่าง:

z@"1/31/2014"

"ม้า (หยางวู้ด)"


ความกว้างของ Mathematica ทำให้ฉันประหลาดใจ รูปแบบผลลัพธ์ของคุณไม่ถูกต้อง แต่ฉันแน่ใจว่าแก้ไขได้ง่าย
Darren Stone

1
@DarrenStone มันค่อนข้างน่าขายหน้าเพราะ Mathematica เพียงแค่เรียก W | A คุณคิดว่าผลลัพธ์จะต้องสอดคล้องกับการจัดรูปแบบของ OP หรือไม่?
Yves Klett

ดูเหมือนว่าคำตอบอื่น ๆ จะถูกจัดรูปแบบเหมือนกับผลลัพธ์ตัวอย่างของคำถามและแน่นอนว่าต้องใช้รหัสเพิ่มเติมในภาษาใด ๆ แต่นั่นเป็นคำถามสำหรับ @EduardFlorinescu
Darren Stone

@DarrenStone จริง นี้จะเพิ่มค่าใช้จ่ายเล็กน้อย W&C ...
Yves Klett

4

C # - 357 337 339 ไบต์

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");}

จัดรูปแบบ:

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 นอกจากนี้คุณสามารถประหยัดกว่า 20 string.Formatตัวอักษรโดยการหลีกเลี่ยง
Hand-E-Food

ใช่ถูกต้องขอบคุณฉันพยายามเล่นกอล์ฟหลาย% s = 2 0 = ฯลฯ และลืมรายการใหญ่ :-) และที่จริงแล้วมันคือ 20 ตัวอักษร IIANM
Mormegil

4

Python 2: 360 * 387 586 594 - ตัวละคร

ลดลงไปอีก

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]

รหัสข้างต้นใช้งานได้ในช่วงเวลาต่อไปนี้: 5 Feb 1924 - 31 Dec 2043

ตัวอย่าง: หลังจากวางโค้ดด้านบนในเคอร์เซอร์ล่ามหลาม

>>> 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]

จากนั้นกดEnterป้อนวันที่เช่นนี้

6/13/2018

จากนั้นกดEnterอีกครั้งเอาต์พุตจะเป็น

Dog Earth Yang


* ลดลงอีก 27 ไบต์ด้วยความช่วยเหลือของ Brian ในการดูความคิดเห็น


2
คุณสังเกตเห็นว่าเลขฐาน 36 ของคุณมี“ คณิตศาสตร์” สองครั้งหรือไม่? :)
Timwi

1
@Timwi: D ไม่ฉันไม่ได้และนั่นเป็นทั้งดีและน่ากลัว!
Eduard Florinescu

Eduard คุณสามารถอธิบายส่วน d = int (ฐาน 36 จำนวน) ได้หรือไม่ ฉันเจอคำตอบของคุณในการทำวิจัยใน stackoverflow สำหรับปัญหาที่คล้ายกัน ฉันต้องการขยายการคำนวณปีเป็นช่วงปี 1500 - 2043 ขอบคุณล่วงหน้าสำหรับความช่วยเหลือใด ๆ
Luis Miguel

1
คุณสามารถบันทึกอีก 23 ตัวอักษรด้วย microoptimisations ดูreddit.com/r/Python/comments/2oqobw/…
Brian

1
@Timwi และ1math6 2math6แม้แต่ค่าก่อนหน้า 5 และ 3 ต่อไปนี้ก็จะถูกสะท้อนด้วยตัวอักษรที่แตกต่างกัน นั่นคือ 3spooky5me
Magic Octopus Urn

3

ทับทิม, 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]]*' - '

จะใช้งานได้สำหรับวันที่ระหว่าง 5 ก.พ. 1924 และ 29 มกราคม 2044


นรกนั้นคืออะไร "วิเศษ"?
tomsmeding

1
@ ทอมอมซิงมันเป็นจำนวนเต็ม 600 บิตที่เข้ารหัสใน Base 36 เพื่อความกะทัดรัด แยกเป็น bitfields เป็นตารางของวันแรกของปฏิทินจันทรคติในแต่ละปีระหว่างปี 1924 และ 1944
Darren Stone

3

GolfScript (212 ตัวอักษร)

นี่ใช้อักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือผลลัพธ์จาก 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/=

โปรแกรมที่เทียบเท่าซึ่งใช้การยกเว้นสตริงและด้วยเหตุนี้อีกเล็กน้อยคือ:

'-'/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/=

ส่วนที่น่าสนใจคือการคำนวณกำหนดวันที่ไม่ว่าจะเป็นก่อนหรือหลังปีใหม่จีนที่ตกอยู่ในปีเกรกอเรียน จากแรงบันดาลใจจากอัลกอริธึมการคำนวณอีสเตอร์ที่ฉันใช้กับคำถามก่อนหน้านี้ฉันมองหาการคำนวณวันปีใหม่อย่างง่าย ในที่สุดฉันก็ไปกับสูตรง่ายๆที่ทำให้ฉันได้รับมากที่สุดรวมทั้งตารางการค้นหาสำหรับคำผิดพลาด

day_of_year = 21 + (19 * year % 30)คำนวณง่ายคือ คำผิดพลาดมีตั้งแต่0ไปจนถึง8ช่วงที่น่าสนใจ (1924 ถึง 2044) และไม่เคยเปลี่ยนจากปีหนึ่งไปอีกมากกว่าหนึ่งปีดังนั้นตารางการค้นหาจะถูกเข้ารหัสในแบบไตรภาคที่สมดุลและข้อผิดพลาดจะคำนวณโดยการรวมข้อผิดพลาดของ คำนำหน้าของตาราง


ดีมากป่านนี้ยกเว้น Mathematica หนึ่งกำลังใช้ทรัพยากรภายนอก +1
Eduard Florinescu

2

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 ตัวอักษรเท่านั้น : - /

บันทึกตัวละคร 5 ตัวโดยเปลี่ยน" - "+new[]{"Yang","Yin"}[x%2]เป็น" - Y"+(x%2<1?"ang":"in"):)
Timwi

-1

ค่อนข้างตรงไปตรงมากับPHP โดยใช้คำสั่ง Switch

  • การคำนวณเท่าที่คุณต้องการ ...

    <?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
ยินดีต้อนรับสู่ PPCG! เราต้องการคำตอบทั้งหมดเพื่อเป็นคู่แข่งที่ร้ายแรงดังนั้นในกรณีของ code-golf เราต้องการคำตอบเพื่อพยายามทำให้รหัสสั้นลง ตัวอย่างเช่นชื่อตัวแปรตัวอักษรตัวเดียวการลบช่องว่างเพิ่มเติม ฯลฯ
ศูนย์รวมของความไม่รู้

1
ยินดีต้อนรับสู่ PPCG รหัสของคุณใช้ได้เฉพาะปีที่ไม่สมบูรณ์
Eduard Florinescu

นั่นเป็นความจริง. มันยากกว่าที่ฉันคิด…
MACboyet

ลบช่องว่างและทำให้ var สั้นลงแล้ว ขอบคุณสำหรับข้อมูล
MACboyet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.