টার্গেটডেট এবং সপ্তাহের দিন প্রদত্ত নিকটতম তারিখটি সন্ধান করুন


12

নির্দিষ্ট সপ্তাহের দিনের জন্য একটি টার্গেটডেটের নিকটতম তারিখটি সন্ধান করুন।

উদাহরণস্বরূপ, তারিখ 20161219এবং সপ্তাহের একটি দিন দেওয়া হয়েছে Friday (6), উত্তরটি 20161216

আরেকটি উদাহরণ, একটি তারিখ 20161219এবং সপ্তাহের এক দিন দেওয়া Wednesday (4), উত্তরটি 20161221

একটি চূড়ান্ত উদাহরণ, একটি তারিখ 20161219এবং সপ্তাহের একদিন দেওয়া Monday (2), উত্তরটি 20161219

নিয়মাবলী:

  • ইনপুট এবং আউটপুটের জন্য তারিখের ফর্ম্যাটটি অবশ্যই মিলবে। উদাহরণগুলিতে, আমি ব্যবহার করেছি yyyymmdd, তবে আপনি বছরের (কমপক্ষে দুটি অঙ্ক), মাস এবং মাসের দিন পর্যন্ত কোনও ফর্ম্যাট ব্যবহার করতে পারেন "মানব পাঠযোগ্য"।
  • সপ্তাহের দিনটি একটি পূর্ণসংখ্যা হিসাবে ইনপুট। আমার উদাহরণে, রবিবারটি সপ্তাহের প্রথম দিন, সুতরাং এটি সপ্তাহের সংখ্যার দিন 1। আপনি সপ্তাহের যে কোনও দিন নম্বর বজায় রাখতে পারেন, যতক্ষণ আপনি এটি লক্ষ্য রাখবেন যতক্ষণ এটি উদাহরণ থেকে পৃথক হয়।
  • ১৯ 1970০ সাল থেকে ২০৩০ এর মধ্যে অবশ্যই স্থান দেওয়া উচিত।
  • সাধারণ ভাষার তারিখের সরঞ্জাম এবং লাইব্রেরিগুলিতে অনুমোদিত তবে স্ট্রিট ক্রেডিট তাদের দেওয়া হয় যা সেগুলি ব্যবহার না করে।
  • সর্বনিম্ন বাইট জেতা

2
উত্তরগুলি সুবিধাজনক হলে তারিখটি কোনও অন্য আকারে নিতে পারে? এছাড়াও সপ্তাহের দিনগুলিতে ভাষাটি অসুবিধাগ্রস্ত দেখা যায় যে
ব্লু

4
হ্যাঁ, কঠোর বিন্যাসের প্রয়োজনীয়তা প্রকৃত তারিখ সন্ধানের চেয়ে পার্সিং / রূপান্তর / ফর্ম্যাটিং সম্পর্কে আরও এই কাজটি করে। আইএমও "এর লাইন বরাবর এটা উল্লেখ করার মঙ্গলজনক হত আপনি যে কোনো যুক্তিসংগত বিন্যাসে তারিখ এবং কাজের দিন গ্রহণ করতে পারে, যতদিন আপনি ইনপুট এবং আউটপুট জন্য একই বিন্যাস ব্যবহার করুন। "। তবে যেহেতু প্রচুর লোক ইতিমধ্যে উত্তর জমা দিয়েছে, আমি অনুমান করি এটি এখনকার মতো করে রাখা উচিত।
শে

@ এসএমএস আমি সম্মত পরের বারের জন্য পাঠ শিখেছি।
ব্রেট ভ্যান্ডারভেইন

1
@ ব্রিটভান্ডারভিন আমি প্রয়োজনীয়তাগুলি শিথিল করতে খুব দেরী করে বলে মনে করি না। আপনি আপডেট স্পেস সম্পর্কে (বর্তমানে 8) উত্তরের প্রতিটিটিতে একটি মন্তব্য যুক্ত করতে পারেন। আমি উপলক্ষে এমন কাজ করেছি।
21'16 এডম

উত্তর:


1

পার্ল 6 , 46 বাইট

{~first *.day-of-week==$^b,Date.new($^a)-3..*}

একটি ল্যাম্বডা যা দুটি আর্গুমেন্ট গ্রহণ করে: yyyy-mm-ddফর্ম্যাটে একটি তারিখের স্ট্রিং এবং 1= সোমবার থেকে 7= রবিবারের মধ্যে একটি সপ্তাহের দিন নম্বর ।

ব্যাখ্যা:

                           Date.new($^a)       # Construct Date object from first argument.
                                        -3     # Subtract 3 days.
                                          ..*  # Construct a Range from that, to infinity.
  first                   ,                    # Iterate the range, and return first date...
        *.day-of-week==$^b                     # whose weekday number equals the second arg.

উদাহরণগুলিতে ব্যবহৃত তারিখ এবং সপ্তাহের দিন বিন্যাসটি ব্যবহার করে এটি ৮৮ বাইট হবে:

{S:g/\-//with ~first *.day-of-week==($^b-2)%7+1,Date.new(|($^a~~/(....)(..)(..)/))-3..*}

এফওয়াইআই, আমি সপ্তাহের বিন্যাসের নিয়মের তারিখ এবং দিনটি সহজ করে দিয়েছি। পুনরায় জমা দিতে নির্দ্বিধায়
ব্রেট ভ্যান্ডারভেইন

টুইটারে
স্মাইল

2

পার্ল 6 , 83 বাইট

->$_,\w{~(Date.new(|m/(....)(..)(..)/)-3...*.day-of-week%7+1==w)[*-1]~~{S:g/"-"//}}

চেষ্টা করে দেখুন

সম্প্রসারিত

->     # pointy block lambda
  $_,
  \w
{
  ~(  # turn into a Str

    Date.new( |m/(....)(..)(..)/ ) - 3 # three days earlier
    ...                                # generate a sequence
    *.day-of-week % 7 + 1 == w         # stop when the right day is found

  )[*-1]  # the last one

  ~~      # apply the following block

  {
    S:g/"-"//  # remove 「-」
  }
}

এফওয়াইআই, আমি সপ্তাহের বিন্যাসের নিয়মের তারিখ এবং দিনটি সহজ করে দিয়েছি। পুনরায় জমা দিতে নির্দ্বিধায়
ব্রেট ভ্যান্ডারভেইন

2

জাভাস্ক্রিপ্ট (ES6), 93 বাইট

(s,n,d=new Date(s))=>d.setDate(d.getDate()+(n+9-d.getDay())%7-3)&&d.toISOString().slice(0,10)

%Y-%m-%dতারিখ বিন্যাস ব্যবহার করে। যদি %a %b %d %Yকোনও গ্রহণযোগ্য তারিখের ফর্ম্যাট হয় তবে 82 বাইটের জন্য:

(s,n,d=new Date(s))=>d.setDate(d.getDate()+(n+9-d.getDay())%7-3)&&d.toDateString()

আমি রবিবার = 10 থেকে শনিবার = 16 এর জন্য আরও 2 বাইট সঞ্চয় করতে পারি, তবে এটি সপ্তাহের ম্যাপিংয়ের একটি নির্বোধ দিন। পূর্ববর্তী 142 141 বাইট (@ গুয়েডসকে ধন্যবাদ) সংস্করণ যা নির্দিষ্ট ওয়াইওয়াইওয়াইএমএমডিডি তারিখ ফর্ম্যাটটি ব্যবহার করেছে, এর ব্যাখ্যা সহ:

(s,n,d=new Date(s.replace(/(?=..(..)?$)/g,'-')))=>d.setDate(d.getDate()+(n+9-d.getDay())%7-3)&&d.toISOString().replace(/-(..)-(..).*/,'$1$2')

এটি অনেক দীর্ঘ অনুভব করে। ব্যাখ্যা: প্রথমে -আইএসও ফর্ম্যাটে আনার জন্য তারিখে সন্নিবেশ করায় যা new Dateপার্স করতে পারে। তারপরে, প্রকৃত অফসেটের মধ্যে -3এবং এর 3জন্য একটি মান পেতে পছন্দসই দিনটিকে প্রকৃত দিনের সাথে তুলনা করে । ম্যাজিকটি 9এসেছে 7(কারণ %সিপিইউ মডুলো, সত্যিকারের মডুলো নয়) প্লাস 3( -3অফসেটের জন্য) বিয়োগ 1(কারণ n1-সূচকযুক্ত এবং getDay0-সূচকযুক্ত)। তারিখটি আবার আইএসও ফর্ম্যাটে রূপান্তরিত হয় এবং অযাচিত অক্ষর মুছে ফেলা হয়।


আপনি প্রথম প্রতিস্থাপনটি পরিবর্তন করে একটি বাইট সংরক্ষণ করতে পারেন.replace(/(?=..(..)?$)/g,'-')
ওয়াশিংটন গুয়েডস

এফওয়াইআই, আমি সপ্তাহের বিন্যাসের নিয়মের তারিখ এবং দিনটি সহজ করে দিয়েছি। পুনরায় জমা দিতে নির্দ্বিধায়
ব্রেট ভ্যান্ডারভেইন

1

পাইথন, 150 149 বাইট

from datetime import*
lambda s,n,t='%Y%m%d':[d for d in[datetime.strptime(s,t)+timedelta(o-3)for o in range(7)]if(n-2)%7==d.weekday()][0].strftime(t)

অউফ, 149. repl.it

অজানা ফাংশন যা একটি স্ট্রিং s, নির্দিষ্ট তারিখ ( t='%Y%m%d'ইনপুট এবং আউটপুট উভয়ের জন্য ফর্ম্যাট স্ট্রিং ব্যবহার করে ) এবং [১,]], এ একটি সংখ্যা গ্রহণ করে n
সপ্তাহের দিনের জন্য অনুরোধ করা হওয়ার পরে তিন দিন আগে তিন দিন থেকে সাত দিন ধরে সাত দিন পরিদর্শন করে।
সপ্তাহটি datetimeসোমবার থেকে শুরু হয় এবং শূন্য ভিত্তিক হয়, তাই পরীক্ষা হয় (n-2)%7==d.weekday()


এফওয়াইআই, আমি সপ্তাহের বিন্যাসের নিয়মের তারিখ এবং দিনটি সহজ করে দিয়েছি। পুনরায় জমা দিতে নির্দ্বিধায়
ব্রেট ভ্যান্ডারভেইন

1

বাশ + কোর্টিলস, 50

date -d$1+$[($2-`date -d$1 +%u`+9)%7-3]day +%Y%m%d

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

  • date -d$1 +%uসপ্তাহের দিন দেয় (1..7); 1 সোমবার
  • দিনের সূচকের পার্থক্য দিতে এটি সপ্তাহের ইনপুট দিন থেকে বিয়োগ করা হয়। আমরা একটি ফ্যাক্টর, ইনপুট তারিখ থেকে সীমার মধ্যে মধ্যে যোগ করতে হবে [-3, 3] নিকটতম তারিখ পেতে তাই আমরা একটি যাদু ফ্যাক্টর 9 যোগ করুন, মডিউল 7 নিতে চান, তাহলে বিয়োগ 3. যাদু ফ্যাক্টর 9 3 + 7 - 1। 3 পরিসীমা [-3, 3] এর জন্য ইনপুট পরিসরকে সামঞ্জস্য করে এবং মডুলোর পরে আবার বিয়োগ করা হয়। 7 টি প্রয়োজনীয় কারণ বাশ মডুলো সিপিইউ মডুলোর সমান এবং ফলাফল দিতে পারে - ডান পরিসরে 7 অ্যাডজাস্টগুলি যুক্ত করে। -1 হ'ল ইনপুটটিতে, 1 রবিবার, তবে% u আউটপুট সহ 1 সোমবার।
  • dateতারপরে বাইরের অংশটি <input date> + <magic factor>daysYYYYMMDD ফর্ম্যাটে পার্স করে এবং উপস্থাপন করে।

এফওয়াইআই, আমি সপ্তাহের বিন্যাসের নিয়মের তারিখ এবং দিনটি সহজ করে দিয়েছি। পুনরায় জমা দিতে নির্দ্বিধায়
ব্রেট ভ্যান্ডারভেইন

1

এস এ এস ম্যাক্রো ল্যাঙ্গুয়েজ, ১১০ বাইট

%macro s(d,a);%put %sysfunc(putn(%sysfunc(intnx(week.&a.,%eval(%sysfunc(putn(&d,8.))-4),1)),yymmddn8.));%mend;

একটি ভয়ানক গল্ফিং ভাষা তবে এখানে ব্যাখ্যাটি (ভিতরে থেকে বাইরে):

একটি ম্যাক্রো তৈরি করুন sযা একটি তারিখ ইনপুট dএবং একটি সংখ্যাগত সপ্তাহের দিন গ্রহণ করে a। তারপরে %eval(%sysfunc(putn(&d,8.))-4)তারিখটিকে একটি এসএএস সংখ্যাসূচক তারিখে রূপান্তর করে এবং 4 দিনের মধ্যে এটি হ্রাস করে। intnxফাংশন তারপর নিদিষ্ট কাজের দিন পরবর্তী সংঘটন ফেরৎ। putnতারপরে তারিখটি yyyymmdd এ ফর্ম্যাট করে এবং লগটিতে %putআউটপুট প্রিন্ট করে।


এফওয়াইআই, আমি সপ্তাহের বিন্যাসের নিয়মের তারিখ এবং দিনটি সহজ করে দিয়েছি। পুনরায় জমা দিতে নির্দ্বিধায়
ব্রেট ভ্যান্ডারভেইন

1

গণিত, 85 49 বাইট

#~DatePlus~Mod[#2-#~DateValue~"ISOWeekDay",7,-3]&

তারিখগুলির জন্য ইনপুট ফর্ম্যাটটি হয় হয় তালিকার মতো {2016, 12, 16}বা আসল DateObject(আমার মনে হয় আরও কয়েকজন কাজ করেন তবে আমি এটি পরীক্ষা করেছি)। উভয় ক্ষেত্রেই, আউটপুট ফর্ম্যাটটি স্বয়ংক্রিয়ভাবে মিলবে। দিনের সংখ্যাটি 1সোমবার থেকে শুরু হয় ।

ধারণাটি হ'ল ইনপুট সপ্তাহের দিন এবং লক্ষ্য সপ্তাহের দিনের সাথে পার্থক্যটি গণনা করা #2-#~DateValue~"ISOWeekDay"এবং তারপরে [-3, 3]অফসেট (অর্থাত Mod[...,7,-3]) দিয়ে একটি মডুলো ব্যবহার করে এটি ম্যাপ করা । ফলাফলটি কেবল ইনপুট তারিখে যুক্ত করা হয় (তারিখের অবজেক্টের জন্য ডিফল্ট ইউনিট দিনগুলি হয়)।


এফওয়াইআই, আমি সপ্তাহের বিন্যাসের নিয়মের তারিখ এবং দিনটি সহজ করে দিয়েছি। পুনরায় জমা দিতে নির্দ্বিধায়
ব্রেট ভ্যান্ডারভেইন

@ ব্র্যাটভেন্ডারভিইন ধন্যবাদ, সম্পাদিত।
মার্টিন এন্ডার

1

আর, 119 77 56 বাইট

নামবিহীন ফাংশন যা দুটি ইনপুট, তারিখ D(স্ট্রিং) এবং দিন d(সংখ্যাসূচক) লাগে ।

function(D,d,s=-3:3+as.Date(D))s[lubridate::wday(s)==d]

প্যাকেজ wday()থেকে ফাংশন ব্যবহার করে lubridate। এটি ডিফল্টরূপে রবিবার হিসাবে বিবেচনা করে Dateঅবজেক্টগুলিকে সুবিধার সাথে সপ্তাহের দিনে রূপান্তর করতে পারে 1

সম্পাদনা: আই / ও এখন as.Date()ফাংশনটির ডিফল্ট :"YYYY-mm-dd"

অবহেলিত এবং ব্যাখ্যা

function(D,d){
    D=as.Date(D);            # Format input date
    s=-3:3+D;                # Generate sequence of +- 3 days
    s[lubridate::wday(s)==d] # Match the weekday that equals to target day                                    
}

সম্পাদনা: এখন +-3দিনের একটি ক্রম তৈরি করে যার জন্য কোনও নির্দিষ্ট সপ্তাহের দিনটি খুঁজে পাওয়ার নিশ্চয়তা রয়েছে Sub পরবর্তীকালে আমাদের কেবলমাত্র একদিনের সাথে মিল করতে হবে যা সমস্যাটি আরও সহজ করে তুলেছে।


এফওয়াইআই, আমি সপ্তাহের বিন্যাসের নিয়মের তারিখ এবং দিনটি সহজ করে দিয়েছি। পুনরায় জমা দিতে নির্দ্বিধায়
ব্রেট ভ্যান্ডারভেইন

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