एक लक्षित तिथि और सप्ताह का दिन दिया, निकटतम तिथि ज्ञात करें


12

किसी दिए गए दिन के सप्ताह के लिए किसी लक्ष्य के लिए निकटतम तिथि ज्ञात करें।

उदाहरण के लिए, की तारीख 20161219और सप्ताह के एक दिन को देखते हुए Friday (6), उत्तर है 20161216

एक और उदाहरण, की तारीख 20161219और सप्ताह के एक दिन को देखते हुए Wednesday (4), उत्तर है 20161221

एक अंतिम उदाहरण, की तारीख 20161219और सप्ताह के एक दिन को देखते हुए Monday (2), उत्तर है 20161219

नियम:

  • इनपुट और आउटपुट के लिए दिनांक प्रारूप से मेल खाना चाहिए। उदाहरणों में, मैंने उपयोग किया है yyyymmdd, लेकिन आप किसी भी प्रारूप का उपयोग वर्ष में (कम से कम दो अंक), महीने, और महीने के दिन "मानव पठनीय" कर सकते हैं।
  • सप्ताह का दिन पूर्णांक के रूप में इनपुट है। मेरे उदाहरण में, रविवार सप्ताह का पहला दिन है, इसलिए यह सप्ताह की संख्या का दिन है 1। जब तक आप इसे उदाहरण से अलग करते हैं, तब तक आपके पास सप्ताह के नंबरिंग का कोई भी दिन हो सकता है।
  • 1970 से 2030 तक के वर्षों को समायोजित किया जाना चाहिए।
  • आम भाषा की तारीख के उपकरण और पुस्तकालयों की अनुमति है, लेकिन उन लोगों को स्ट्रीट क्रेडिट दिया जाता है जो उनका उपयोग नहीं करना चुनते हैं।
  • कम से कम बाइट्स जीतता है।

2
यदि सुविधाजनक हो तो उत्तर एक अलग रूप में तारीख ले सकते हैं? इसके अलावा सप्ताह के दिन भी उन भाषाओं के लिए असुविधाजनक दिखाई देते हैं जो सोमवार को सप्ताह का पहला दिन
ब्लू

4
हां, वास्तविक प्रारूप खोजने की तुलना में सख्त प्रारूप आवश्यकताएँ इस कार्य को पार्स / परिवर्तित / स्वरूपण के बारे में अधिक बनाती हैं। IMO को " किसी भी उचित प्रारूप में दिनांक और कार्यदिवस स्वीकार कर सकते हैं, जब तक आप इनपुट और आउटपुट के लिए समान प्रारूप का उपयोग करते हैं, " की तर्ज पर इसे निर्दिष्ट करना बेहतर होगा । लेकिन जब से लोगों का एक समूह पहले ही जवाब प्रस्तुत कर चुका है, मुझे लगता है कि इसे अभी भी रखना है।
SMLS

@smls मैं सहमत हूँ। अगली बार से सबक सीखा।
ब्रेट वेंडरविएन

1
@BrettVanderVeen मुझे नहीं लगता कि आवश्यकताओं को आराम करने के लिए बहुत देर हो चुकी है। आप अद्यतन किए गए युक्ति के बारे में (वर्तमान में 8) उत्तर में से प्रत्येक में एक टिप्पणी जोड़ सकते हैं। मैंने ऐसे मौके पर किया है।
Adám

जवाबों:


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.

उदाहरणों में प्रयुक्त दिनांक और कार्यदिवस प्रारूप का उपयोग करते हुए, यह 88 बाइट होगा:

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

FYI करें, मैंने सप्ताह प्रारूप के नियमों की तारीख और दिन को कम कर दिया। बेझिझक फिर से शुरू करें।
ब्रेट वेंडरविएन

@BrettVanderVeen: अपडेट किया गया।
smls

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 「-」
  }
}

FYI करें, मैंने सप्ताह प्रारूप के नियमों की तारीख और दिन को कम कर दिया। बेझिझक फिर से शुरू करें।
ब्रेट वेंडरविएन

2

जावास्क्रिप्ट (ईएस 6), 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 बाइट्स (@Guedes के लिए धन्यवाद) संस्करण जो विशिष्ट YYYYMMDD दिनांक स्वरूप का उपयोग करता है, इसके उत्तर के साथ:

(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,'-')
वाशिंगटन गेडेस

FYI करें, मैंने सप्ताह प्रारूप के नियमों की तारीख और दिन को कम कर दिया। बेझिझक फिर से शुरू करें।
ब्रेट वेंडरविएन

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)

Oouuf, 149. repl.it

फ़ंक्शन जो एक स्ट्रिंग लेता है s, निर्दिष्ट तिथि ( t='%Y%m%d'इनपुट और आउटपुट दोनों के लिए प्रारूप स्ट्रिंग का उपयोग करके ) और [1,7], में एक नंबर n
अनुरोध किए गए सप्ताह के दिन के लिए दिए गए तीन दिनों से पहले तीन दिनों से सात दिनों का निरीक्षण करता है।
सप्ताह datetimeसोमवार को शुरू होता है और शून्य आधारित होता है, इसलिए परीक्षण होता है (n-2)%7==d.weekday()


FYI करें, मैंने सप्ताह के प्रारूप नियमों की तारीख और दिन को कम कर दिया। बेझिझक फिर से शुरू करें।
ब्रेट वांडरवेइन

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 जोड़ते हैं, modulo 7 लेते हैं, फिर घटाते हैं 3. जादू कारक 9 है3 + 7 - 1 । 3 श्रेणी [-3, 3] के लिए इनपुट रेंज को समायोजित करता है, और मोडुलो के बाद फिर से घटाया जाता है। 7 की आवश्यकता है क्योंकि bash modulo CPU modulo के समान है और यह andve परिणाम दे सकता है - 7 समायोजन को सही श्रेणी में जोड़ता है। -1 इसलिए है क्योंकि इनपुट में 1 रविवार है, लेकिन% u आउटपुट के साथ, 1 सोमवार है।
  • बाहरी dateतब पार्स करता है <input date> + <magic factor>daysऔर इसे YYYYMMDD प्रारूप में प्रस्तुत करता है।

FYI करें, मैंने सप्ताह प्रारूप के नियमों की तारीख और दिन को कम कर दिया। बेझिझक फिर से शुरू करें।
ब्रेट वेंडरविएन

1

एसएएस मैक्रो भाषा, 110 बाइट्स

%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आउटपुट को लॉग में प्रिंट करता है।


FYI करें, मैंने सप्ताह प्रारूप के नियमों की तारीख और दिन को कम कर दिया। बेझिझक फिर से शुरू करें।
ब्रेट वेंडरविएन

1

गणितज्ञ, 85 49 बाइट्स

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

तारीखों के लिए इनपुट प्रारूप या तो एक सूची की तरह है {2016, 12, 16}या एक वास्तविक DateObject(मुझे लगता है कि कुछ अन्य लोग भी काम करते हैं, लेकिन मैंने इनका परीक्षण किया है)। किसी भी स्थिति में, आउटपुट स्वरूप स्वचालित रूप से मेल खाएगा। जिस दिन से नंबरिंग शुरू होती है1सोमवार ।

यह विचार इनपुट कार्यदिवस और लक्षित कार्यदिवस के बीच के अंतर की गणना करना है #2-#~DateValue~"ISOWeekDay"और फिर [-3, 3]ऑफसेट (यानी Mod[...,7,-3]) के साथ एक मॉडुलो का उपयोग करके इसे मैप करना है । परिणाम केवल इनपुट तिथि में जोड़ा जाता है (दिनांक ऑब्जेक्ट जोड़ के लिए डिफ़ॉल्ट इकाई दिन है)।


FYI करें, मैंने सप्ताह के प्रारूप नियमों की तारीख और दिन को कम कर दिया। बेझिझक फिर से शुरू करें।
ब्रेट वांडरवेइन

@BrettVanderVeen धन्यवाद, संपादित।
मार्टिन एंडर

1

आर, 119 77 56 बाइट्स

फ़ंक्शन जो दो इनपुट लेता है, दिनांक D(स्ट्रिंग) और दिन d(संख्यात्मक)।

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

पैकेज wday()से फ़ंक्शन का उपयोग करता है lubridate। यह डिफ़ॉल्ट रूप से रविवार के रूप में इलाज के Dateसाथ वस्तुओं को सप्ताह के दिनों में आसानी से परिवर्तित कर सकता है 1

संपादित करें: I / O अब 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दिनों का एक क्रम बनाता है जिसके लिए किसी भी सप्ताह के दिन की गारंटी दी जाती है।


FYI करें, मैंने सप्ताह प्रारूप के नियमों की तारीख और दिन को कम कर दिया। बेझिझक फिर से शुरू करें।
ब्रेट वेंडरविएन

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