चीनी राशि चक्र की गणना करें


10

यह देखते हुए कि चीनी नव वर्ष आ रहा है, यहां दी गई तारीख के लिए चीनी राशि चक्र, तत्व और ताजीतू की गणना करना एक चुनौती है।

इनपुट एक तारीख होनी चाहिए:

1/31/2014

यहां उपयोग की जाने वाली तारीख अमेरिकी शैली है mm/dd/yyyy, लेकिन वैकल्पिक रूप से आईएसओ -8601 शैली हो सकती है: yyyy-mm-ddइसलिए तिथि इनपुट की शैली सख्त नहीं है।

उत्पादन चीनी राशि में पशु चिन्ह होना चाहिए, जिसमें वह तत्व शामिल है जो तिथि से मेल खाता है, और इसकी तीतितु काउंटर:

Horse - Wood - Yang

राशि - तत्व - ताजीतू संबंध दिखाने वाली एक तालिका यहाँ देखी जा सकती है: चीनी राशि - वर्ष

आउटपुट स्वरूप सख्त नहीं है, लेकिन इसमें पशु, तत्व और ताजीतू घटक शामिल होना चाहिए, और इसे कुछ फैशन में सीमांकित किया जाना चाहिए।

उपरोक्त तिथि के लिए मान्य आउटपुट के उदाहरणों में शामिल हो सकते हैं:

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

आपके कार्यक्रम को आज की तारीख सहित कम से कम 100 वर्षों के लिए वैध आउटपुट लौटा देना चाहिए। इसका मतलब है कि इसे कम से कम दो 60 साल ( सेक्सजेनरी ) चक्रों के लिए खाते की आवश्यकता होगी ।


3
क्या आपके पास राशि चक्र वर्ष की शुरुआत की गणना करने के लिए एक सुविधाजनक लिंक है?
हाथ-ई-फूड

3
आपको पता नहीं है कि राशि चक्र वर्ष की गणना कैसे करें लेकिन यह "बहुत सरल लगता है"। शायद हमें इस प्रश्न को अभी के लिए बंद कर देना चाहिए, और इसे फिर से खोलना चाहिए जब आपके पास उन छोटे विवरणों को इस्त्री किया जाए?

1
एक और ध्यान देने वाली बात यह है कि यह हमेशा 21 जनवरी से 21 फरवरी के बीच होता है।
जस्टिन

3
आपके द्वारा लिंक की गई तालिका तब तक किसी काम की नहीं है जब तक कि आप इस प्रतिबंध को नहीं जोड़ते हैं कि उस सीमा के बाहर की तारीखों के लिए सही आउटपुट देना अनावश्यक है।
पीटर टेलर

2
एडुआर्ड फ्लोरिंसकु, दो चीजें जो आपको सवाल में स्पष्ट करनी चाहिए: 1) इनपुट तिथि सीमा @PeterTaylor के रूप में बताती है, और 2) क्या आउटपुट स्वरूप ठीक वैसा ही होना चाहिए जैसा आप अपने उदाहरण में निर्दिष्ट करते हैं? प्रत्येक चरित्र मायने रखता है इसलिए कृपया इस उद्देश्य को बनाएं। धन्यवाद।
डेरेन स्टोन

जवाबों:


4

गणितज्ञ 63

ठीक है, यह पुराना हो सकता है, लेकिन यह काम करता है (तारीख इनपुट कई मामलों में अस्पष्ट है):

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

उदाहरण:

z@"1/31/2014"

"हॉर्स (यांग वुड)"


मैथमेटिका की चौड़ाई मुझे विस्मित करती है। आपका आउटपुट स्वरूप गलत है, लेकिन मुझे यकीन है कि यह आसानी से तय हो गया है।
डेरेन स्टोन

1
@ डारेनस्टोन यह कुछ हद तक घनीभूत है क्योंकि मैथेमेटिका केवल डब्ल्यू कहती है। क्या आपको लगता है कि आउटपुट को ओपी के प्रारूपण के अनुरूप होना चाहिए?
यवेस केलेट

ऐसा लगता है कि अन्य उत्तर बिल्कुल प्रश्न के उदाहरण आउटपुट की तरह स्वरूपित हैं और यह निश्चित रूप से किसी भी भाषा में ऐसा करने के लिए अतिरिक्त कोड लेता है। लेकिन यह वास्तव में @EduardFlorinescu के लिए एक प्रश्न है
डैरेन स्टोन

@DarrenStone सच है। यह निश्चित रूप से ओवरहेड का थोड़ा सा जोड़ देगा। डब्ल्यू एंड सी ...
यवेस केलेट

4

सी # - 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
हाथ-ई-फूड

हाँ, ठीक है, धन्यवाद, मैंने विभिन्न s% 2 == 0 आदि को गोल करने की कोशिश की, और बड़े को भूल गया। :-) और, वास्तव में, यह बिल्कुल 20 अक्षर IIANM था।
मॉरमगिल

4

अजगर 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 फरवरी 1924 - 31 दिसंबर 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 बाइट्स घटाए ।


2
क्या आपने देखा कि आपके आधार -36 नंबर में दो बार "गणित" है? :)
तिमवी

1
@ टिमी: डी नहीं, मैंने नहीं किया, और यह अच्छा और डरावना दोनों है!
एडुआर्ड फ्लोरिंसक्यू

एडुआर्ड, क्या आप डी = इंट (बेस 36 नंबर) भाग की व्याख्या कर सकते हैं? इसी तरह की समस्या के लिए स्टैकओवरफ्लो में शोध कर रहा हूं। मुझे वर्ष गणनाओं का विस्तार वर्ष 1500 - 2043 तक करने की आवश्यकता है। किसी भी मदद के लिए अग्रिम धन्यवाद।
लुइस मिगुएल

1
आप कुछ microoptimisations के साथ एक और 23 अक्षर बचा सकते हैं। देखें reddit.com/r/Python/comments/2oqobw/...
ब्रायन

1
@Timwi 1math6और 2math6। यहां तक ​​कि पूर्ववर्ती 5 और निम्नलिखित 3 को अलग-अलग वर्णों के साथ मिरर किया गया है। वह 3spooky5me है।
मैजिक ऑक्टोपस 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
@tomsmeding, यह कॉम्पैक्टनेस के लिए बेस 36 में एन्कोड किया गया 600-बिट पूर्णांक है। 1924 और 1944 के बीच प्रत्येक वर्ष के लिए चंद्र कैलेंडर के पहले दिन की तालिका में टूटी हुई बिट्रिल्ड।
डैरेन स्टोन

3

गोल्फस्क्रिप्ट (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ब्याज की सीमा (2044 के लिए 1924), और एक से अधिक से साल दर साल बदलता है कभी नहीं, इसलिए लुकअप तालिका एक की त्रुटि शर्तों संक्षेप द्वारा संतुलित त्रिगुट में एन्कोड किया गया है और त्रुटि की जाती है अधिक तालिका का उपसर्ग।


इस प्रकार, अब तक का सबसे छोटा, मैथमेटिका को छोड़कर, एक बाहरी संसाधन का उपयोग कर रहा है। +1
एडुआर्ड फ्लोरिनस्कु

2

सी #, 630 611 604 572 570 बाइट्स, 120 साल

(यदि आप ऑफसेट जानते हैं तो प्रति वर्ष ~ 2 the बाइट जोड़ें)

यह २४-जन -२०२० के माध्यम से ३१-जन -१ ९९ को जन्म लेने वाले लोगों के लिए अच्छा है और संभवतः इस सीमा के बाहर दुर्घटनाग्रस्त हो जाएगा। क्या कवर किए गए वर्षों की संख्या के लिए बोनस अंक हैं?

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()एडुआर्ड फ्लोरिंसक्यू के जवाब से प्रेरणा ली गई ।
  • सभी सरणियों को रेखांकित किया। इसने केवल मुझे 2 वर्णों को बचाया। : - /

बदल " - "+new[]{"Yang","Yin"}[x%2]कर 5 अक्षर बचाएं " - Y"+(x%2<1?"ang":"in"):)
तिमिवी

-1

स्विच स्टेटमेंट का उपयोग करके PHP के साथ बहुत सीधे आगे ।

  • गणना जहाँ तक आप चाहते हैं ...

    <?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 में आपका स्वागत है! हमें गंभीर प्रतियोगियों होने के लिए सभी उत्तरों की आवश्यकता होती है , इसलिए कोड-गोल्फ के मामले में, हमें कोड को छोटा करने के प्रयास के लिए उत्तर की आवश्यकता होती है। उदाहरण के लिए, एकल पत्र चर नाम, अतिरिक्त व्हाट्सएप को दूर करना, आदि
अज्ञानता का अवतार

1
PPCG में आपका स्वागत है, आपका कोड केवल वर्षों तक पूरी नहीं होने के लिए काम करता है
एडुआर्ड फ्लोरिंसक्यू

यह सच है। मेरे विचार से यह कठिन है ...
मैकबेट

रिक्त स्थान हटा दिए गए हैं और पहले से ही var छोटा है। जानकारी के लिए धन्यवाद
6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.