নিকটতম বিশেষ সাধারণ বছর কখন?


11

একটি সাধারণ বছর এমন একটি বছর যা লিপ বছর নয় এবং যেখানে বছরের প্রথম এবং শেষ দিন একই দিনে থাকে। একটি বিশেষ সাধারণ বছর এমন একটি যা সোমবার থেকে শুরু হয় এবং সোমবারেও শেষ হয়।

আপনার চ্যালেঞ্জটি এমন একটি প্রোগ্রাম / ক্রিয়াকলাপ তৈরি করা যা ইনপুট হিসাবে এক বছর দেওয়া হলে নিকটতম বিশেষ সাধারণ বছরের সন্ধান করে, যদি এটি একটি সাধারণ বছর হয় তবে নিজেকে আউটপুট করে। বছরটি যদি তার আগেরটির সাথে একের কাছাকাছি হয় তবে তার পাশের একটিটি বড়টিকে আউটপুট দেয়।

ইনপুট

একটি পূর্ণসংখ্যা যা পরিসীমাতে পরীক্ষার জন্য বছরের প্রতিনিধিত্ব করে 1600 <= x <= 2100

আউটপুট

একটি সংখ্যার নিকটতম বিশেষ সাধারণ বছরের প্রতিনিধিত্ব করে।

পরীক্ষার মামলা

2017 -> 2018
2018 -> 2018
1992 -> 1990
1600 -> 1601
2100 -> 2103
1728 -> 1731 (lies between 1725 and 1731)

মন্তব্য

প্রদত্ত পরিসরের সমস্ত 54 বছর ইতিমধ্যে লিঙ্কযুক্ত উইকিপিডিয়া নিবন্ধে দেখানো হয়েছে। আমি এখানে তাদের রেফারেন্স প্রদান করব:

1601, 1607, 1618, 1629, 1635, 1646, 1657, 1663, 1674, 1685, 1691
1703, 1714, 1725, 1731, 1742, 1753, 1759, 1770, 1781, 1787, 1798
1810, 1821, 1827, 1838, 1849, 1855, 1866, 1877, 1883, 1894, 1900
1906, 1917, 1923, 1934, 1945, 1951, 1962, 1973, 1979, 1990
2001, 2007, 2018, 2029, 2035, 2046, 2057, 2063, 2074, 2085, 2091
2103 (Needed for 2097 to 2100)

1
লোকদের সাহায্য করার জন্য কেবল রেফারেন্সের জন্য, ক্রমটি প্রদর্শিত হবে 6, 11, 11। IE প্রথম 6 বছর পরে অন্যটি, তার 11 বছর পরে অন্যটি, তার 11 বছর পরে অন্যটি, তার 6 বছর পরে অন্যটি, ইত্যাদি
Sk

6
পছন্দ করুন আসল অনুক্রমটি "6, 11, 11, 6, 11, 11, 6, 11, 11, 11, 6, 12, 11, 11, 6, 11, 11, 6, 11, 11, 6, 11, 12, 11 , 6, 11, 11, 6, 11, 11, 6, 11, 6, 6, 11, 6, 11, 11, 11, 11, 6, 11, 11, 11, 6, 11, 11, 6, 11 , 11, 6, 11, 11, 6 "(12 ও 6 নোটটি নোট করুন, 11, 6, 6, 11, 6)
মার্টিন ইন্দরের

1
যেহেতু ক্যালেন্ডার প্রতি 400 বছরে পুনরাবৃত্তি হয়, তাই ক্রমের প্রাসঙ্গিক (পর্যায়ক্রমিক) অংশটি "6, 11, 11, 6, 11, 11, 6, 11, 11, 6, 12, 11, 11, 6, 11, 11 , 6, 11, 11, 6, 11, 12, 11, 6, 11, 11, 11, 6, 11, 11, 6, 11, 6, 11, 6, 11, 6, 11, 11, 11, 11, 6 , 11, 11 "। তিনটি অনিয়মের কারণে কেউ যদি এর সাথে বাইটস সংরক্ষণ করতে পারে তবে আমি মুগ্ধ হব।
মার্টিন ইন্ডার

5
আমার জন্য 2 কে অভিনন্দন! : পি
TheLethalCoder

1
a year that is not a leap year and where the first and last day of the year are on the same dayসেই সংজ্ঞাটির দ্বিতীয় অংশটি নিরর্থক। সমস্ত অ-লিপ বছর একই দিনে শুরু হয় এবং শেষ হয়, ঠিক 52 সপ্তাহ এবং এক দিন (365 দিন) দীর্ঘ।
জন গর্ডন

উত্তর:


1

জেলি , 30 বাইট

“Þıİs|9ṗ[¿¶F’ṃ“©€¿‘⁽£d;+\ạÐṂ⁸Ṁ

একটি পূর্ণসংখ্যার লিঙ্কটি পূর্ণসংখ্যা বছর গ্রহণ করে এবং ফিরিয়ে দেয়।

এটি অনলাইন চেষ্টা করুন! অথবা একটি পরীক্ষা স্যুট দেখুন

কিভাবে?

অনেকগুলি অন্যান্য উত্তরের মতো এটি ইনক্রিমেন্টগুলি থেকে ইনপুট ডোমেনের জন্য প্রয়োজনীয় বছরের তালিকা তৈরি করে এবং ইনপুট থেকে ন্যূনতম পরম পার্থক্যের সর্বাধিক বছরটি সন্ধান করে।

“Þıİs|9ṗ[¿¶F’ṃ“©€¿‘⁽£d;+\ạÐṂ⁸Ṁ - Main link: number y
                   ⁽£d         - augmented base 250 literal = 1601
“Þıİs|9ṗ[¿¶F’                  - base 250 literal = 20129386383114231907032071
              “©€¿‘            - code page index list = [6,12,11]
             ṃ                 - base decompression = [6,11,11,6,11,11,6,11,11,6,12,11,11,6,11,11,6,11,11,6,11,12,11,6,11,11,6,11,11,6,11,6,6,11,6,11,11,6,11,11,6,11,11,6,11,11,6,11,11,6,11,11,6,12]
                      ;        - concatenate = [1601,6,11,11,6,11,11,6,11,11,6,12,11,11,6,11,11,6,11,11,6,11,12,11,6,11,11,6,11,11,6,11,6,6,11,6,11,11,6,11,11,6,11,11,6,11,11,6,11,11,6,11,11,6,12]
                       +\      - reduce with addition = [1601,1607,1618,1629,1635,1646,1657,1663,1674,1685,1691,1703,1714,1725,1731,1742,1753,1759,1770,1781,1787,1798,1810,1821,1827,1838,1849,1855,1866,1877,1883,1894,1900,1906,1917,1923,1934,1945,1951,1962,1973,1979,1990,2001,2007,2018,2029,2035,2046,2057,2063,2074,2085,2091,2103]
                            ⁸  - link's left argument, y
                          ÐṂ   - filter keep if maximal:
                         ạ     -   absolute difference
                             Ṁ - maximum (alternatively tail, Ṫ, since increasing)

9

পিএইচপি, 67 বাইট

for(;date(LN,mktime(0,0,0,1,1,$y=$argn+$i))>1;)$i=($i<1)-$i;echo$y;

এটি অনলাইন চেষ্টা করুন!

অথবা

for(;date(LN,strtotime("1/1/".$y=$argn+$i))>1;)$i=($i<1)-$i;echo$y;

এটি অনলাইন চেষ্টা করুন!

সম্প্রসারিত

for(;
date(LN,mktime(0,0,0,1,1,$y=$argn+$i)) # N is 1 for Monday and L is 0 for Non leap year
>1;) # loop so long as expression is not 1
  $i=($i<1)-$i; # set $i 0,1,-1,2,-2 ...
echo$y; # Output Year

তারিখ


1
একটি বাইট সংরক্ষণ করুন:$i=($i<1)-$i;
ক্রিস্টোফ

8

পাইথন 2 , 129 124 118 বাইট

a=[11,11,6]*13
a[29:29]=a[19:19]=12,
a[10:10]=6,6
n=input()
o=[2401-n]
for i in a*2:o+=o[-1]-i,
print n+min(o,key=abs)

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস চেষ্টা করে দেখুন
প্রথমে সিক্যুয়েন্সটি উত্পন্ন হয় (বিপরীত) a, তারপরে 2401 - input_yearক্রমটি বিয়োগ করার জন্য প্রারম্ভিক মান হিসাবে ব্যবহৃত হয়।
এইভাবে তালিকায় oসমস্ত সাধারণ বছর এবং ইনপুটগুলির মধ্যে পার্থক্য থাকবে, নিকটতম বছরটি শূন্যের নিকটতম (ধনাত্মক বা negativeণাত্মক) সংখ্যা হবে, তারপরে বের করা হবে (min, key=abs)এবং ইনপুটটিতে ফিরে যুক্ত হবে।

সঙ্গে datetime, 119 বাইট

lambda i:i+min([y-i for y in range(2200,1500,-1)if datetime(y,1,1).weekday()<1and y%400],key=abs)
from datetime import*

এটি অনলাইন চেষ্টা করুন!


এটি কি অনুক্রমের ভিত্তিতে বছরের তালিকা তৈরি করে?
TheLethalCoder

@ দ্য লেথাল কোডার কিন্ডা, কিছুটা ব্যাখ্যা যুক্ত করেছেন
রড

7

05 এ বি 1 ই , 41 বাইট

6xD<Š)•HΘ%A°,SΔA)u•3вè.pO0¸ì1601+DI-ÄWQϤ

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

6xD<Š)                                     # push the list [11,6,12]
      •HΘ%A°,SΔA)u•                        # push the number 20129386383114231907032071
                   3в                      # convert to a base-3 digit list
                     è                     # use this to index into the first list
                      .p                   # get list of prefixes
                        O                  # sum each sublist
                         0¸ì               # prepend 0
                            1601+          # add 1601 to each
                                 D         # duplicate
                                  I-       # subtract input from each
                                    Ä      # calculate absolute value
                                     WQÏ   # keep only the years that have the 
                                           # smallest absolute difference from input
                                        ¤  # get the last one


4

গণিত, 70 বাইট

Max@Nearest[Select[Range[7!],!LeapYearQ@{#}&&DayName@{#}==Monday&],#]&

5040 (= 7!) অবধি সমস্ত বিশেষ সাধারণ বছরের একটি তালিকা তৈরি করে এবং তারপরে টাইয়ের ক্ষেত্রে সর্বাধিক গ্রহণ করে ইনপুটটির নিকটস্থতমটিকে খুঁজে পায়।


এই আমি প্রত্যাশা ছিল উত্তর সাজানোর ছিল, তালিকা তৈরি এবং তার সাথে তুলনা। কেউ উত্তর খুঁজে পেতে "সিকোয়েন্স" ব্যবহার করতে পারে কিনা তা দেখতে আকর্ষণীয় হবে।
TheLethalCoder

4
Whaaaa ... পিএইচপি গণিতকে মারছে?
বিশপ

আমি আপনার কোডটি নিয়ে খেলছিলাম এবং এটি নিয়ে এসেছি: (n = 1; টি = #; যদিও [! ডেএন নেম @ {t} == সোমবার || লিপইয়ারকিউ @ {t}, n ++; টি = # - (- 1 ) ^ n * তল [n / 2]]; টি) এবং আপনি //.t/ এর সাথে প্রতিস্থাপন করে এটিকে গল্ফ করতে পারেন; ইত্যাদি? আমি চেষ্টা করেছি কিন্তু আমি পারছি না ...
J42161217

3

জাভা 7, 217 বাইট

import java.util.*;int c(int y){return d(y,1);}int d(int y,int x){Calendar c=Calendar.getInstance(),d=Calendar.getInstance();c.set(y,0,1);d.set(y,11,31);return c.get(7)==d.get(7)&c.get(7)==2?y:d(y+x,x>0?-++x:-(--x));}

ব্যাখ্যা:

এখানে চেষ্টা করুন।

import java.util.*;                   // Required import for Calendar

int c(int y){                         // Method with integer parameter and integer return-type
  return d(y,1);                      //  Call second method with additional parameter
}                                     // End of method (1)

int d(int y,int x){                   // Method (2) with two integer parameters and integer return-type
  Calendar c=Calendar.getInstance(),  //  Create two Calendar instances
           d=Calendar.getInstance();
  c.set(y,0,1);                       //  Set one to 01 January yyyy
  d.set(y,11,31);                     //  and one to 31 December yyyy
  return c.get(7)==d.get(7)           //  If both are the same day of the week
         &c.get(7)==2?                //  and it is a Monday:
          y                           //   Return the input-year
         :                            //  Else:
          d(y+x,                      //   Recursive-call with year + `x`
                x>0?-++x:-(--x));     //   and change `x` to the next to check
                                      //   +1,-2,+3,-4,+5,-6,etc.
}                                     // End of method (2)

যদি এক্স সবসময় 1 হতে চলেছে তবে কেন কেবল সি সি () {remove সরান এবং এতে পরিবর্তন int d(int y, int x){}করবেন নাd(int y){int x = 1;...}
ব্রায়ান এইচ।

@BrianH। কারণ আমি একটি পুনরাবৃত্তি-কলটি ব্যবহার xকরি যা ব্যবহার করে , তাই যদি আমি 1পদ্ধতির শীর্ষে প্রতিবারে এটি পুনরায় সেট করি তবে এটি xভুল এবং পুনরাবৃত্ত কলটি ব্যর্থ হবে।
কেভিন ক্রুইজসেন


1

সি #, 183 বাইট

বলটি কিছুটা ঘূর্ণায়মান হওয়ার জন্য, এখানে আমি একটি নিজস্ব প্রয়োগ করেছি implementation আমি নিশ্চিত যে এটি এখনও গল্ফ করা যেতে পারে তাই যদি কেউ নতুন উত্তর হিসাবে পোস্ট করতে নির্দ্বিধায় চান।

namespace System.Linq{n=>Enumerable.Range(1,9999).Where(y=>!DateTime.IsLeapYear(y)&(int)new DateTime(y,1,1).DayOfWeek==1).GroupBy(y=>Math.Abs(n-y)).OrderBy(g=>g.Key).First().Last();}

এটি অনলাইন চেষ্টা করুন!

সম্পূর্ণ / ফর্ম্যাট সংস্করণ, এটি রান করার সময় প্রদত্ত ব্যাপ্তির সমস্ত আউটপুটও দেখায়।

namespace System.Linq
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, int> f = n =>
                Enumerable.Range(1, 9999)
                          .Where(y => !DateTime.IsLeapYear(y)
                                    & (int)new DateTime(y, 1, 1).DayOfWeek == 1)
                          .GroupBy(y => Math.Abs(n - y))
                          .OrderBy(g => g.Key)
                          .First()
                          .Last();

            for (int y = 1600; y <= 2100; ++y)
            {
                Console.WriteLine($"{y} -> {f(y)}");
            }

            Console.ReadLine();
        }
    }
}

1

রুবি, 145 বাইট

f=->i{i+(1.upto(i).map{|m|Time.new(y=i+m).monday?&&Time.new(y,6).friday?? m:Time.new(y=i-m).monday?&&Time.new(y,6).friday?? -m :nil}.find{|a|a})}

ইনপুট হিসাবে শুরুর বছর গ্রহণ করা একটি ল্যাম্বদা সংজ্ঞা দেয় - f[2017] => 2018

রুবি স্ট্যান্ডার্ড লাইব্রেরি ভালো লাগবে! wday==1হিসাবে একই দৈর্ঘ্যmonday? এবং অসীম কম শীতল :)। বিশেষ সাধারণ বছরের চেকটি এই বিষয় দ্বারা করা হয় যে সোমবার থেকে শুরু হওয়া একটি সাধারণ বছরে, 1 জুন শুক্রবার ("শুক্রবার" সমান-সংক্ষিপ্ততম দিনের নাম!)

দুর্ভাগ্যক্রমে, উভয় দিকের অনুসন্ধানে এটি এতটা ভাল নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.