100 साल का जन्मदिन मिला


26

मैं हाल ही में अपनी और अपनी पत्नी और बच्चों की उम्र को जोड़ रहा था और महसूस किया कि भविष्य में न जाने कितने ही दूर हमारे उम्र में ठीक 100 साल जुड़ जाएंगे।

चुनौती

एक संयुक्त (कुल) उम्र और जन्मतिथि की सूची वाले इनपुट के लिए, उस तारीख को आउटपुट करते हैं जिस पर संयुक्त युग सभी दिए गए कुल को जोड़ते हैं।

  1. इनपुट संयुक्त आयु (वर्षों में) एक सकारात्मक पूर्णांक होगा
  2. जन्मतिथि की इनपुट सूची उन तारीखों की एक सूची (जो भी प्रारूप आपकी भाषा के लिए सुविधाजनक है) होगी जिसमें दिन, महीने और वर्ष का संख्यात्मक प्रतिनिधित्व होना चाहिए। किसी विशिष्ट युग के बाद के दिनों की संख्या स्वीकार्य नहीं है। आप मान सकते हैं कि इनपुट तारीखों की सूची कालानुक्रमिक क्रम में क्रमबद्ध है।
  3. आउटपुट इनपुट तिथियों के समान प्रारूप में एक ही तारीख होगी
  4. संयुक्त आयु के प्रयोजनों के लिए, 1 वर्ष बिल्कुल 365.25 दिन माना जाता है
  5. कुछ निविष्टियों के लिए, सभी जन्म तिथियों के बाद की तारीख को खोजना असंभव होगा जब वे सभी संयुक्त आयु तक जोड़ देंगे। उदाहरण के लिए, दो जन्म तिथियों पर विचार करें जो 20 वर्ष से अलग हैं, लेकिन हम 10 वर्षों का एक संयुक्त चाहते हैं। उस मामले में, आउटपुट पुराने जन्म की तारीख का 10 वां जन्मदिन होगा। दूसरे शब्दों में, व्यक्तिगत आयु को उस व्यक्ति की जन्म तिथि से पहले की सभी तारीखों के लिए 0 माना जाता है
  6. आउटपुट पहली तारीख होगी जिस पर संयुक्त आयु कम से कम इनपुट उम्र तक जुड़ती है
  7. आप अंतर्निहित कार्यों का उपयोग कर सकते हैं
  8. आपको 1970/01/01 तक की तारीखों का समर्थन करना चाहिए।

उदाहरण

यहां मैं YYYY / MM / DD प्रारूप में सभी तिथियां दे रहा हूं, लेकिन आप जो भी प्रारूप पसंद करते हैं, कर सकते हैं।

Input                                               Output

 10  2000/01/01                                     2010/01/01
100  1975/03/05,1978/07/23,2008/11/12,2012/12/20    2018/11/22
100  1975/03/06,1978/07/23,2008/11/12,2012/12/20    2018/11/23
100  1975/03/09,1978/07/23,2008/11/12,2012/12/20    2018/11/23
100  1975/03/10,1978/07/23,2008/11/12,2012/12/20    2018/11/24
  3  1990/08/01,1995/07/02                          1993/08/01
 50  1975/03/05,1978/07/23,2008/11/12,2012/12/20    2001/11/13

ध्यान दें कि पिछले दो उदाहरणों में, आउटपुट तिथि इनपुट 5 की सीमा के भीतर है, नियम 5 के अनुसार।


1
@TimmyD। नियम 7 एक है हो सकता है , पर राज तो आप इसे पालन करने के लिए यदि आप नहीं करना चाहते हैं नहीं है। मुझे संदेह है कि दिनांक-समय के कार्य इनपुट दिनांक के पार्सिंग और आउटपुट तिथियों के प्रारूपण के लिए उपयोगी होंगे। YMMV।
डिजिटल ट्रामा

5
नियम 7 एक मई नियम है। इसे इस महीने (और अगले छमाही के लिए) सुरक्षित रूप से अनदेखा किया जा सकता है।
मार्टिन एंडर

वास्तविक रूप से, मुझे लगता है कि प्रत्येक जन्मदिन पर एक परिवार की जाँच होगी, वर्षों को पूर्णांक के रूप में गिना जाएगा और दिनों (0.25 के साथ जटिल मामला) को योग करने की कोशिश नहीं की जाएगी।
edc65

@ edc65 एक अच्छी PPCG चुनौती के रास्ते में वास्तविकता को कौन जाने देता है? ;-)
डिजिटल ट्रामा

जवाबों:


4

गणितज्ञ 138 107 237 बाइट्स

मेरे पहले प्रयास मैला और अयोग्य थे। यह आम तौर पर काम करना चाहिए, बशर्ते कि जन्म की तारीखें नवीनतम के क्रम में दी जाएं, जैसा कि परीक्षण मामलों में है।

परीक्षण मामलों को अच्छी तरह से चुना गया और सही ढंग से लागू करना मुश्किल था। मेरे द्वारा उम्मीद किए जाने से कोड अधिक लंबा हो गया।

सामान्य तर्क है

  1. X (दिनों में) के लिए हल करें जैसे कि जन्म तिथि के प्रत्येक दिनांक से x की दूरी समय के लक्ष्य मार्ग तक (जैसे 100 वर्ष दिनों में परिवर्तित)।
  2. यदि जल्द से जल्द तारीख + x दिन> जन्म की नवीनतम तारीख, जन्म की नवीनतम तारीख को हटा दें और चरण (1), Else स्थानांतरित करने के लिए (3)।
  3. वापसी (प्रारंभिक तिथि + x दिन)

t_~f~d_:=If[DateDifference[a=DateObject[DatePlus[d[[1]],Solve[t 365.25==Tr@(x-Join[{0},
QuantityMagnitude@(DateDifference[d[[1]],#,"Day"]&/@Rest@d)]),{x}][[1,1,2]]]/.
{y_,m_,n_,h_}:>{y,m,n+1}],d[[-1]]]>Quantity[0,"Days"],f[t,Most@d],a]

परीक्षण के मामलों

f[10, {{2000, 1, 1}}]
f[100, {{1975, 3, 5}, {1978, 7, 23}, {2008, 11, 12}, {2012, 12, 20}}]
f[100, {{1975, 3, 6}, {1978, 7, 23}, {2008, 11, 12}, {2012, 12, 20}}]
f[100, {{1975, 3, 9}, {1978, 7, 23}, {2008, 11, 12}, {2012, 12, 20}}]
f[100, {{1975, 3, 10}, {1978, 7, 23}, {2008, 11, 12}, {2012, 12,  20}}]
f[3, {{1990, 8, 1}, {1995, 7, 2}}]
f[50, {{1975, 3, 5}, {1978, 7, 23}, {2008, 11, 12}, {2012, 12, 20}}]

तस्वीरें


इसके अलावा, आपको स्थान की आवश्यकता नहीं है।
लेजियन मम्मल 978

1

पॉवरशेल, 145 125 बाइट्स

param($a,$b)$c=@();$b|%{$c+=date $_};$t=$a*365.25;$d=$c[0];while($t-gt0){$c|%{if($_-le$d){$t--}};$d=$d.AddDays(1)}"{0:d}"-f$d

सुंदर मुश्किल चुनौती है, लेकिन एक बार समझने के लिए अपेक्षाकृत सरल।

विस्तारित और टिप्पणी:

param($a,$b)          # Take our input
$c=@()                # Make a new array $c
$b|%{$c+=date $_}     # Change our input array $b of strings into dates, store in $c
$t=$a*365.25          # Target number of days we need to account for
$d=$c[0]              # Our starting date, also our cumulative date for output
while($t-gt0){        # While we still have days remaining
  $c|%{               # Iterate through our birthdays
    if($_-le$d){$t--} # If the birthday is less than our cumulutive day, subtract a day
  }
  $d=$d.AddDays(1)    # We've accounted for another day, so increment our cumulative day
}
"{0:d}"-f$d           # Format output

उदाहरण:

इनपुट में स्ट्रिंग-दिनांक अभ्यावेदन का स्पष्ट रूप से स्वरूपित सरणी समाहित करने की आवश्यकता है। आउटपुट MM/DD/YYYYप्रारूप में है (PowerShell में एन-यू-स्थानीयकरण के लिए डिफ़ॉल्ट)।

PS C:\Tools\Scripts\golfing> .\combined-100-year-birthday.ps1 50 @('03/05/1975','07/23/1978','11/12/2008','12/20/2012')
11/13/2001

संपादित करें - 20 बाइट्स को परिवर्तित करके कि हम जन्मदिन के माध्यम से कैसे पुनरावृति करते हैं, और कब / नहीं के बजाय का उपयोग करके


0

PHP, 220 बाइट्स

मैंने पठनीयता के लिए कुछ नए समाचार जोड़े हैं।

function c($y,$s){for($d=$y*365.25;++$i<count($l=array_map(date_create,$s));)$d+=
$l[0]->diff($l[$i])->days;($l[$i-1]>$r=$l[0]->add(new DateInterval(P.ceil($d/$i).D)
))?c($y,array_slice($s,0,-1)):print$r->format('Y/m/d');}

Ideone

यहाँ ungolfed संस्करण है:

function printCombinedBirthday($combinedAgeInYears, $listOfBirthDatesStrings)
{
    $combinedAgeInDays = $combinedAgeInYears * 365.25;
    $listOfBirthDates = array_map('date_create', $listOfBirthDatesStrings);
    $numberOfBirthDates = count($listOfBirthDates);

    for ($i = 0; $i < $numberOfBirthDates; ++$i) {
        $combinedAgeInDays += $listOfBirthDates[0]->diff($listOfBirthDates[$i])->days;
    }

    $combinedAgeInDays = ceil($combinedAgeInDays / $numberOfBirthDates);
    $interval = new DateInterval('P'. $combinedAgeInDays .'D');
    $result = $listOfBirthDates[0]->add($interval);

    if ($listOfBirthDates[$numberOfBirthDates - 1] > $result)
    {
        printCombinedBirthday(
            $combinedAgeInYears,
            array_slice($listOfBirthDatesStrings, 0, -1)
        );
    }
    else {
        echo $result->format('Y/m/d');
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.