সংযুক্ত 100 বছরের জন্মদিন


26

আমি সম্প্রতি আমার এবং আমার স্ত্রী এবং বাচ্চাদের যুগ যুগোপযোগী করেছিলাম এবং বুঝতে পেরেছিলাম যে খুব বেশি দূর-দূরবর্তী ভবিষ্যতের কোনও সময় আমাদের বয়সের সমস্তগুলি ঠিক 100 বছর পর্যন্ত যুক্ত হবে।

চ্যালেঞ্জ

সম্মিলিত (মোট) বয়স এবং জন্ম তারিখের তালিকাগুলির সমন্বিত ইনপুটগুলির জন্য, সম্মিলিত বয়সগুলি প্রদত্ত মোটটিতে যোগ করার তারিখটি আউটপুট দেয়।

  1. ইনপুট সম্মিলিত বয়স (বছরগুলিতে) একটি ধনাত্মক পূর্ণসংখ্যা হবে
  2. জন্মের তারিখগুলির ইনপুট তালিকাটি তারিখের একটি তালিকা (আপনার ভাষার জন্য উপযুক্ত যে কোনও বিন্যাসই উপযুক্ত হবে) এর মধ্যে অবশ্যই দিন, মাস এবং বছরের সংখ্যাগত উপস্থাপনা থাকতে হবে। নির্দিষ্ট যুগের পরে যে দিনগুলি গ্রহণযোগ্য নয়। আপনি ধরে নিতে পারেন ইনপুট তারিখগুলির তালিকা কালানুক্রমিকভাবে সাজানো হয়েছে।
  3. আউটপুট ইনপুট তারিখগুলির মতো একই ফর্ম্যাটে একক তারিখ হবে
  4. সম্মিলিত বয়সের উদ্দেশ্যে, 1 বছর ঠিক 365.25 দিন হিসাবে বিবেচিত হয়
  5. কিছু ইনপুটগুলির জন্য, তারা সমস্ত সম্মিলিত বয়সের সাথে যুক্ত হওয়ার পরে সমস্ত জন্ম তারিখের পরে তারিখ পাওয়া অসম্ভব হবে। উদাহরণস্বরূপ দুটি জন্মের তারিখ বিবেচনা করুন যা 20 বছর দূরে রয়েছে, তবে আমরা 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 অনুসারে ইনপুট তারিখের সীমার মধ্যে থাকে।


1
@TimmyD। বিধি 7 একটি নিয়ম হতে পারে , তাই আপনি যদি না চান তবে আপনাকে এটি অনুসরণ করতে হবে না। আমার সন্দেহ হয় যে তারিখ-কালীন কার্যগুলি ইনপুট তারিখগুলি বিশ্লেষণ এবং আউটপুট তারিখের বিন্যাসের জন্য কার্যকর হবে। YMMV।
ডিজিটাল ট্রমা

5
বিধি 7 একটি মে নিয়ম। এই মাসে নিরাপদে উপেক্ষা করা যেতে পারে (এবং পরবর্তী অর্ধ বছরের জন্য)।
মার্টিন এন্ডার

বাস্তবতাত্ত্বিকভাবে, আমি মনে করি একটি পরিবার প্রতিটি জন্মদিনে বছরগুলি পূর্ণসংখ্যার হিসাবে গণনা করে এবং দিনগুলি যোগ করার চেষ্টা না করে (0.25 বিষয়কে জটিল করে তোলে)।
edc65

@ edc65 ভাল পিপিসিজি চ্যালেঞ্জের পথে বাস্তবতা কে পেতে দিয়েছে? ;-)
ডিজিটাল ট্রমা

উত্তর:


4

গণিত 138 107 237 বাইট

আমার প্রথম প্রচেষ্টাটি ছিল ম্লান এবং অযোগ্য। পরীক্ষার ক্ষেত্রে যেমন জন্মের তারিখগুলি প্রাথমিক থেকে সর্বশেষের ক্রমে দেওয়া হয় তবে এটি সাধারণভাবে কাজ করা উচিত।

পরীক্ষার কেসগুলি ভালভাবে নির্বাচিত হয়েছিল এবং সঠিকভাবে প্রয়োগ করা কঠিন ছিল। কোডটি আমার প্রত্যাশার চেয়ে দীর্ঘতর হয়েছে।

সাধারণ যুক্তি হচ্ছে

  1. এক্স (দিনগুলিতে) এর জন্য সমাধান করুন যেমন প্রতিটি জন্মের তারিখের সাথে x থেকে দূরত্বের লক্ষ্য উত্তীর্ণের (যেমন 100 বছরকে দিন রূপান্তরিত করা হয়) যোগ করা যায়।
  2. যদি প্রথমতম তারিখ + x দিন> সর্বশেষ জন্মের তারিখ, সর্বশেষ জন্মের তারিখটি সরিয়ে দিন এবং পুনরায় পুনরায় পদক্ষেপ (1), অন্যথায় সরান (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}}]

ছবি


এছাড়াও, আপনার জায়গার দরকার নেই।
LegionMammal978

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ফর্ম্যাটে রয়েছে (পাওয়ারশেলের এন-স্থানীয়করণের জন্য ডিফল্ট)।

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

পিএইচপি, 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

নিখরচায় সংস্করণটি এখানে:

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');
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.