कार्य दिवस उलटी गिनती


17

मेरे पास काम-जीवन को आसान बनाने के लिए मेरे पास केवल प्रतिभाशाली विचार था - एक विशिष्ट तिथि की उलटी गिनती जो केवल कार्यदिवसों की गणना करती है।


मूल कार्य एक विशिष्ट तिथि के लिए उलटी गिनती बनाना है जिसमें केवल उलटी गिनती में कार्यदिवस शामिल है।

कार्यदिवस सोमवार , मंगलवार , बुधवार , गुरुवार और शुक्रवार को गिना जाता है ।

इनपुट "अनौपचारिक" यूरोपीय मानक प्रारूप में एक विशिष्ट तिथि dd.MM.yyyyहोनी चाहिए और भविष्य में आज या एक दिन होनी चाहिए।

आउटपुट केवल बचे दिनों की संख्या होना चाहिए।

जैसे ही यह सबसे छोटा कोड जीतता है।


परीक्षण का मामला:

  Today    |   Input    | Output
10.12.2018 | 17.12.2018 |    5
02.10.2018 | 16.10.2018 |   10

अगर मुझे सवाल में कुछ चीजें याद आती हैं, तो कृपया मुझे माफ़ करें - यह मेरा पहला सवाल है :)

संपादित करें:

  • आप falseइसके बजाय आउटपुट के रूप में उपयोग कर सकते हैं 0 - लेकिन यह सुंदर नहीं है
  • डीएसटी का सम्मान करने के लिए कोई ज़रूरत नहीं है

9
क्या इस "अनौपचारिक" यूरोपीय इनपुट प्रारूप के पीछे कोई विशेष कारण है ? हमारी सहमति है कि जब भी संभव हो लचीला इनपुट की अनुमति दी जाए।
Arnauld

6
क्या वास्तव में प्रक्रिया प्रारूप के लिए एक कठिन "अतिरिक्त चुनौती" को जोड़ने का कोई मतलब है? यह सिर्फ अनुचित wrt भाषाओं को लगता है जिनमें लचीली तारीख प्रारूप हैं ...
क्विंटेक

3
@ मैंने यह नहीं कहा कि यह "कठिन" था, यह सिर्फ एक अनावश्यक परेशानी है, विशेष रूप से कोड-गोल्फ में ... लिंक को ध्यान दें जो ऊपर पोस्ट किया गया है ... आमतौर पर लचीला इनपुट आदर्श है ...
क्विंटेक

6
वैसे, आप ध्यान दें कि यह आपकी पहली चुनौती है; मैं आपको मुख्य चुनौती को पोस्ट करने से पहले शोधन के लिए सैंडबॉक्स का उपयोग करने के लिए आमंत्रित करता हूं ! अन्यथा, अच्छा काम, और मुझे आपसे कुछ और देखने का आनंद मिलेगा!
ग्यूसेप

7
वास्तव में सख्त इनपुट प्रारूप से प्रभावित नहीं है, लेकिन इसके अलावा एक अच्छी चुनौती है।
एलपीड्रो

जवाबों:


18

05AB1E , 130 128 133 131 124 123 बाइट्स

žežfžg)V0[Y`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()ćsO7%2@+Y`т‰0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVYI'.¡Q#

मैं अपने दिमाग से बाहर हूँ..

गोल्फिंग भाषा 05AB1E के लिए यह बिल्कुल भी मायने नहीं रखता कि इनपुट साथ है .या नहीं -। हालाँकि, 05AB1E में दिनांक ऑब्जेक्ट्स या परिकलन के लिए कोई भी बिल्ड नहीं है। आज की तारीखों के बारे में एकमात्र बिल्टिन वर्ष / माह / दिन / घंटे / मिनट / सेकंड / माइक्रोसेकंड है।

तो इस वजह से, आपके द्वारा देखे जाने वाले लगभग सभी कोड अगले दिन जाने के लिए मैन्युअल गणना हैं, और सप्ताह के दिन की गणना करते हैं।

+5 बाइट्स एक भाग के कारण मैं ज़ेलर के फार्मूले में भूल गया (वर्ष -1 जनवरी और फरवरी महीने के लिए) ।।

इसे ऑनलाइन आज़माएँ या 'आज' की एक स्व-निर्दिष्ट तिथि के साथ इसे ऑनलाइन आज़माएँ

स्पष्टीकरण:

पाठ की दीवार आने वाली।

सामान्य तौर पर, कोड निम्नलिखित छद्म कोड का अनुसरण करता है:

1   Date currentDate = today;
2   Integer counter = 0;
3   Start an infinite loop:
4*    If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
5       Counter += 1;
6*    currentDate += 1; // Set currentDate to the next day in line
7     If(currentDate == parsed input-string):
8       Stop the infinite loop, and output the counter

1) Date currentDate = today;05AB1E कार्यक्रम का यह हिस्सा है:

že          # Push today's day
  žf        # Push today's month
    žg      # Push today's year
      )     # Wrap them into a single list
       V    # Pop and store this list in variable `Y`

2) Integer counter = 0;और 3) Start an infinite loop:05AB1E कार्यक्रम में सीधे आगे हैं:

0     # Push 0 to the stack
 [    # Start an infinite loop

4) If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):मैनुअल गणना के साथ पहला कठिन हिस्सा है। चूंकि 05AB1E में कोई दिनांक निर्मित नहीं है, इसलिए हमें मैन्युअल रूप से सप्ताह के दिन की गणना करनी होगी ।

ऐसा करने का सामान्य सूत्र है:

h=(q+13(m+1)5+K+4+जे4-2जे)आधुनिक7,

जहां दिसंबर के माध्यम से मार्च के लिए महीने:

  • क्ष है y महीने के ( [1, 31])
  • 1-अनुक्रमित हैnटी ([3, 12]) है
  • शताब्दी का वर्ष है (yआरआधुनिक100 )
  • जे 0-अनुक्रमित सदी है (yआर100)

और जनवरी और फरवरी के महीनों के लिए:

  • क्ष है y महीने के ( [1, 31])
  • 1-अनुक्रमितnटी+12 ([13, 14]) है
  • पिछले वर्ष के लिए सदी का वर्ष है ((yआर-1)आधुनिक100 )
  • जे पिछले वर्ष के लिए 0-अनुक्रमित सदी है (yआर-1100 )

सप्ताह के दिन में परिणाम , जहां 0 = शनिवार, 1 = रविवार, ..., 6 = शुक्रवार।
स्रोत: ज़ेलर का अभिनंदन

हम इसे 05AB1E कार्यक्रम के इस भाग में देख सकते हैं:

Y             # Push variable `Y`
 `            # Push the day, month, and year to the stack
  U           # Pop and save the year in variable `X`
   Ð          # Triplicate the month
    3        # Check if the month is below 3 (Jan. / Feb.),
              # resulting in 1 or 0 for truthy/falsey respectively
      12*     # Multiply this by 12 (either 0 or 12)
         +    # And add it to the month
              # This first part was to make Jan. / Feb. 13 and 14

>             # Month + 1
 13*          # Multiplied by 13
    5÷        # Integer-divided by 5
s3           # Check if the month is below 3 again (resulting in 1 / 0)
   Xα         # Take the absolute difference with the year
     ©        # Store this potentially modified year in the register
      т%      # mYear modulo-100
D4÷           # mYear modulo-100, integer-divided by 4
®т÷©4÷        # mYear integer-divided by 100, and then integer-divided by 4
®·(           # mYear integer-divided by 100, doubled, and then made negative
)             # Wrap the entire stack into a list
 ć            # Extract the head (the counter variable that was also on the stack)
  s           # Swap so the calculated values above are as list at the top
   O          # Take the sum of this entire list
    7%        # And then take modulo-7 to complete the formula,
              # resulting in 0 for Saturday, 1 for Sunday, and [2, 6] for [Monday, Friday]

2@            # Check if the day is greater than or equal to 2 (so a working day)

5) Counter += 1;फिर से सीधे आगे है:

     # The >=2 check with `2@` results in either 1 for truthy and 0 for falsey
+    # So just adding it to the counter variable is enough

6) currentDate += 1; // Set currentDate to the next day in lineफिर से अधिक जटिल है, क्योंकि हमें इसे मैन्युअल रूप से करना होगा। तो यह निम्नलिखित छद्म कोड के लिए विस्तारित किया जाएगा:

a   Integer isLeapYear = ...;
b   Integer daysInCurrentMonth = currentDate.month == 2 ?
c                                 28 + isLeapYear
d                                :
e                                 31 - (currentDate.month - 1) % 7 % 2;
f   If(currentDate.day < daysInCurrentMonth):
g     nextDate.day += 1;
h   Else:
i     nextDate.day = 1;
j     If(currentDate.month < 12):
k       nextDate.month += 1;
l     Else:
m       nextDate.month = 1;
n       nextDate.year += 1;

सूत्रों का कहना है:
यह निर्धारित करने के लिए एल्गोरिथ्म कि एक वर्ष एक लीप वर्ष है। (संपादित करें: अब प्रासंगिक नहीं है, क्योंकि मैं एक वैकल्पिक विधि काउपयोगकरके लीप वर्षों की जांच करता हूंजिससे 7 बाइट बचती हैं।)
एक महीने में दिनों की संख्या निर्धारित करने के लिए एल्गोरिथम।

6a) Integer isLeapYear = ...;05AB1E कार्यक्रम में इस तरह किया जाता है:

Y             # Push variable `Y`
 `            # Push the days, month and year to the stack
  т‰          # Divmod the year by 100
    0K        # Remove all items "00" (or 0 when the year is below 100)
      θ       # Pop the list, and leave the last item
       4Ö     # Check if this number is visible by 4
         U    # Pop and save the result in variable `X`

मेरे इस 05AB1E उत्तर में भी उपयोग किया जाता है , इसलिए चरणों को चित्रित करने के लिए कुछ उदाहरण वर्ष जोड़े जाते हैं।

6b) currentDate.month == 2 ? और सी) 28 + isLeapYearइस तरह से किए जाते हैं:

D            # Duplicate the month that is now the top of the stack
 2Q          # Check if it's equal to 2
   i         # And if it is:
    \        #  Remove the duplicated month from the top of the stack
     28X+    #  Add 28 and variable `X` (the isLeapYear) together

6d) : और 6e) 31 - (currentDate.month - 1) % 7 % 2;इस तरह से किए जाते हैं:

ë           # Else:
 <          #  Month - 1
  7%        #  Modulo-7
    É       #  Is odd (shortcut for %2)
     31     #  Push 31
       α    #  Absolute difference between both
}           # Close the if-else

6f) If(currentDate.day < daysInCurrentMonth):इस तरह किया जाता है:

     # Check if the day that is still on the stack is smaller than the value calculated
 i    # And if it is:

6 ग्राम) nextDate.day += 1; इस तरह किया जाता है:

Y       # Push variable `Y`
 ¬      # Push its head, the days (without popping the list `Y`)
  >     # Day + 1
   0    # Push index 0

        # (This part is done after the if-else clauses to save bytes)
}}      # Close the if-else clauses
  ǝ     # Insert the day + 1 at index 0 in the list `Y`
   V    # Pop and store the updated list in variable `Y` again

6) Else: और 6i) nextDate.day = 1;तब इस तरह किए जाते हैं:

ë        # Else:
 Y       #  Push variable `Y`
  1      #  Push a 1
   ¾     #  Push index 0
    ǝ    #  Insert 1 at index 0 (days part) in the list `Y`

6j) If(currentDate.month < 12): :

D           # Duplicate the list `Y`
 Ås         # Pop and push its middle (the month)
   D12     # Check if the month is below 12
       i    # And if it is:

6k) nextDate.month += 1; :

>       # Month + 1
 1      # Push index 1

        # (This part is done after the if-else clauses to save bytes)
}}      # Close the if-else clauses
  ǝ     # Insert the month + 1 at index 1 in the list `Y`
   V    # Pop and store the updated list in variable `Y` again

Else:6 एल) , 6 मी) nextDate.month = 1;और 6 एन)nextDate.year += 1; तो इस तरह से किए जाते हैं:

ë        # Else:
 \       #  Delete the top item on the stack (the duplicated month)
  1      #  Push 1
   D     #  Push index 1 (with a Duplicate)
    ǝ    #  Insert 1 at index 1 (month part) in the list `Y`

 ¤       #  Push its tail, the year (without popping the list `Y`)
  >      #  Year + 1
   2     #  Index 2

         # (This part is done after the if-else clauses to save bytes)
}}       # Close the if-else clauses
  ǝ      # Insert the year + 1 at index 2 in the list `Y`
   V     # Pop and store the updated list in variable `Y` again

और अंत में 8) If(currentDate == parsed input-string):और 9) Stop the infinite loop, and output the counter:

Y          # Push variable `Y`
 I         # Push the input
  '.¡     '# Split it on dots
     Q     # Check if the two lists are equal
      #    # And if they are equal: stop the infinite loop
           # (And output the top of the stack (the counter) implicitly)

5
तुम पागल हो ... एक अपवित्र है।
AdmBorkBork

1
अब तक का सबसे लंबा 05AB1E कार्यक्रम?
लुइस मेंडो

2
@LuisMendo बंद करें, लेकिन मुझे डर है कि मेरे पास एक 05AB1E उत्तर है जो खुद से भी लंबा है , और एक जो बहुत करीब आता है .. ;) मुझे यकीन है कि मैं वहाँ कुछ बाइट्स कर पाऊंगा और सरल करूँगा अगले दिन के छद्म कोड कार्यान्वयन के कुछ हिस्सों। कल सुबह देखेंगे, लेकिन बस खेल से वापस आ गए और जल्द ही बिस्तर पर चले जाएंगे।
केविन क्रूज़सेन

11

एक्सेल 24 बाइट्स

सेल A1 में इनपुट मानता है

=NETWORKDAYS(NOW()+1,A1)

अंतर्निहित फ़ंक्शन का उपयोग करता है। दुर्भाग्य से समारोह में आज और अंतिम तिथि दोनों शामिल हैं। ओपी ने आज से गिनती न करने के लिए स्पष्ट कर दिया है, इसलिए मैं एक को जोड़ देता हूं ताकि आज की गिनती न हो।

संख्या के प्रारूप पर टिप्पणियों को संबोधित करने के लिए, फिर से, यह एक्सेल मानक है: यहाँ छवि विवरण दर्ज करें


हालांकि यह दिनांक मानों के साथ काम करता है, यह इनपुट को लेने में विफल रहता है जैसा कि कहा गया है। यह (कम से कम अमेरिकी संस्करण में) 10.12.2018एक स्ट्रिंग है जब एक सेल में एक तिथि के बजाय आयोजित किया जाता है। इसे ठीक करने के स्पष्ट लेकिन लंबे समाधान को बदलने के लिए किया जाएगा A1करने के लिए DATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))अपने समाधान में
टेलर स्कॉट

दुर्भाग्य से, समुदाय ने फैसला किया है कि भाषाओं को मान्य होने के लिए उनकी डिफ़ॉल्ट सेटिंग्स के तहत चलने की जरूरत है (एक अपवाद जो मैंने इसे देखा है वह भाषा है - IE, यदि आपकी भाषा अंग्रेजी और स्पेनिश दोनों का समर्थन करती है, तो आप आसानी से या तो उपयोग कर सकते हैं, लेकिन इस पर ध्यान दिया जाना चाहिए।) आगे, ओपी (@hille) ने यह नहीं कहा है कि प्रारूप लचीला है, और वास्तव में काफी विपरीत बताया गया है (इस प्रश्न पर दूसरी टिप्पणी देखें)
टेलर स्कॉट

2
प्रारूप मानक नहीं है, यह स्थानीय-आधारित है। एक्सेल HKCU\Control Panel\International\sDecimalरजिस्ट्री स्ट्रिंग से प्रारूप को पढ़ता है । एक डिफ़ॉल्ट यूएस विंडोज इंस्टॉलेशन जो MM / dd / yyyy है। अधिकांश यूरोपीय संघ के देशों में यह डिफ़ॉल्ट होगा।
एरिक

@luisMendo हाँ, यह काम करता है। मैंने कोई स्पष्टीकरण नहीं देखा। अगर इसके बजाय पिछले दिन की गिनती नहीं की गई होती, तो मैं = NETWORKDAYS (अब (), A1-1) कर सकता था। मुझे पता था कि यह हमेशा वही बाइट काउंट होगा जो कोई बात नहीं है।
कीता -

खुशी है कि काम करता है। मैंने डाउनवोट को हटा दिया
लुइस मेंडो

11

आर , 76 बाइट्स

कृपया इस 72 बाइट R उत्तर पर भी नज़र डालें, जो स्थानीय-स्वतंत्र भी है।

sum(!grepl("S",weekdays(seq(Sys.Date(),as.Date(scan(,""),"%d.%m.%Y"),1))))+1

इसे ऑनलाइन आज़माएं!

weekdaysसप्ताह के पाठ दिन देता है, इसलिए हम आज और इनपुट के बीच के दिनों के दिनों की गणना करते हैं और इसमें शामिल नहीं होते हैं S, और परिणाम में एक जोड़ते हैं।


8

जावा 10, 233 232 226 बाइट्स

import java.util.*;d->{int r=0;var s=Calendar.getInstance();s.setTime(new Date());var e=s.getInstance();for(e.setTime(new java.text.SimpleDateFormat("dd.MM.yyyy").parse(d));!s.after(e);s.add(5,1))if(s.get(7)%7>1)r++;return r;}

तारीख हमेशा मुझे याद दिलाती है कि वास्तव में जावा कैसे क्रिया है ..

नोट: अब दो छोटे जावा उत्तर (175 बाइट्स से नीचे) हैं, एक @LukeStevens द्वारा पहले के जावा संस्करणों से हटाए गए तरीकों के स्मार्ट उपयोग के साथ है , और एक का उपयोग करते हुए java.time.LocalDateजावा 8 के बाद से @ ओलिवियरगिरियर द्वारा नया है

इसे ऑनलाइन आज़माएं।

स्पष्टीकरण:

import java.util.*;            // Required import for both Calendar and Date
d->{                           // Method with String parameter and integer return-type
  int r=0;                     //  Result-integer, starting at 0
  var s=Calendar.getInstance();//  Create a Calendar instance for the start-date
  s.setTime(new Date());       //  Set the start date to today
  var e=s.getInstance();       //  Create a Calendar instance for the end-date
  for(e.setTime(               //  Set the end date to:
        new java.text.SimpleDateFormat("dd.MM.yyyy")
                               //   Create a formatter for the "dd.MM.yyyy" format
         .parse(d));           //   And parse the input-String to a Date
      !s.after(e)              //  Loop as long as we haven't reached the end date yet
      ;                        //    After every iteration:
       s.add(5,1))             //     Increase the start-date by 1 day
    if(s.get(7)%7>1)           //   If the day of the week is NOT a Saturday or Sunday:
                               //   (SUNDAY = 1, MONDAY = 2, ..., SATURDAY = 7)
      r++;                     //    Increase the result-sum by 1
  return r;}                   //  Return the result-sum

क्या आप कर सकते हैं e=s.clone()?
क्विंटेक

1
हम भी कर सकते हैं (मुझे लगता है) करते हैं Calendar s=Calendar.getInstance(),e=s.getInstance(), जो दुर्भाग्य से एक ही लंबाई के बराबर होता है।
मिशा लावरोव

1
@ मिशालारोव आह, स्थैतिक Cवास्तव में आवश्यक नहीं है। यह उस कोड के एक पुराने हिस्से से था जहां मैंने Cकहीं और इस्तेमाल किया था । var s=Calendar.getInstance();var e=s.getInstance();इतना धन्यवाद का उपयोग करके गोल्फ 1 बाइट करने में सक्षम है । :)
केविन क्रूज़सेन

1
150 बाइट्स , का उपयोग कर java.time
ओलिवियर ग्रेजायर

1
किया हुआ! यह बाइट्स में अन्य उत्तर के बहुत करीब है, लेकिन इसे अभी तक हरा नहीं है।
ओलिवियर ग्रेजायर

7

जावास्क्रिप्ट (ईएस 6), 116 103 बाइट्स

f=(d,n=+new Date)=>(D=new Date(n)).toJSON()<d.split`.`.reverse().join`-`&&(D.getDay()%6>0)+f(d,n+864e5)

इसे ऑनलाइन आज़माएं!

कैसे?

n

nD.toJSON()

YYYY - MM - DD T hh : mm : ss.sss Z

YYYY-MM-DDdYYYY-MM-DDDD.MM.YYYY

d.split`.`.reverse().join`-`

प्रत्येक पुनरावर्ती कॉल से पहले, हम अंतिम परिणाम को बढ़ाते हैं यदि D.getDay()न तो0606

(D.getDay() % 6 > 0) + f(d, n + 864e5)

86,400,000n


6

MATL , 24 बाइट्स

46tQZt24&YO:Z':X-9XO83-z

इसे ऑनलाइन आज़माएं!

मैं कोई इनपुट प्रारूप नहीं रखना चाहता, ताकि विशिष्ट कोड गोल्फ भाषाओं को बड़ा फायदा मिले

आप आधे सफल रहे :-)

व्याख्या

46      % Push 46 (ASCII for '.')
tQ      % Duplicate, add 1: gives 47 (ASCII for '/')
Zt      % Implicit input. Replace '.' by '/' in the input string
24&YO   % Convert string with date format 24 ('dd/mm/yyyy') to serial date number.
        % This is an integer representing day starting at Jan-1-0000
:       % Inclusive range from 1 to that
Z'      % Push current date and time as a serial number. Integer part is day;
        % decimal part represents time of the day
:       % Inclusive range from 1 to that
X-      % Set difference. Gives serial numbers of days after today, up to input
9XO     % Convert each number to date format 9, which is a letter for each day
        % of the week: 'M', 'T', 'W', 'T', ' F', 'S', 'S'
83-     % Subtract 83 (ASCII for 'S')
z       % Number of nonzeros. Implicit display

अगर मैंने चुनौती को सही ढंग से समझा, तो आप केवल एक तारीख इनपुट लेते हैं, और इसकी तुलना आज की तारीख से करते हैं। उदाहरण के लिए, 16.10.2018आज (सोमवार 01-10-2018) परिणाम 11, में कल 10, आदि
केविन क्रूज़सेन

@KevinCruijssen वूप्स। धन्यवाद! अब ठीक है
लुइस मेंडो

1
और उसी बाइट-काउंट के साथ। :) अच्छा, +1 मुझसे।
केविन क्रूज़सेन

6

वोल्फ्राम भाषा (गणितज्ञ) , 64 56 बाइट्स

DayCount[Today,""<>#~StringTake~{{4,6},3,-4},"Weekday"]&

इसे ऑनलाइन आज़माएं!

DayCount[x,y,"Weekday"]xऔर बीच के दिनों की संख्या गिना जाता है y

इनपुट xऔर yकई चीजें हो सकती हैं, DateObjectजैसे कि एक फैंसी, जिसमें से लौटा हुआ है Today, या प्रारूप में एक स्ट्रिंग (दुर्भाग्य से)mm.dd.yyyy

मेरे पिछले प्रयास ने dd.mm.yyyyइनपुट को ए में बदलने की कोशिश कीDateObject मैथमेटिका को यह बताने के कि इसे कैसे पार्स किया जाए; नए समाधान बस क्रम में दिन और महीने डाल करने के लिए फिर से व्यवस्थित करता है Mathematica की उम्मीद है।

यह ध्यान देने योग्य है कि 28-बाइट समाधान DayCount[Today,#,"Weekday"]&न केवल एक महीने के दिन-वर्ष के इनपुट प्रारूप के लिए पूरी तरह से काम करता है, बल्कि यह सही ढंग से अस्पष्ट दिन-माह के इनपुट जैसे कि 31.12.2018, जो संभवतः 31 वें दिन के 12 वें दिन का उपयोग नहीं कर सकता है। महीना"। तो यह 60% से अधिक समय सही है :)



5

आर, 72 चार्ट

@Ngm द्वारा प्रदान किए गए उत्तर पर एक भिन्नता जो कुछ वर्णों को बचाने के लिए grepl से बचती है और गैर-अंग्रेजी स्थानों में काम करती है।

sum(strftime(seq(Sys.Date(),as.Date(scan(,""),"%d.%m.%Y"),1),'%u')<6)+1


1
छोटा और सामान्य भी। अच्छा जवाब और शरण में आपका स्वागत है।
एनजीएम

1
PPCG में आपका स्वागत है! आप एक TIO लिंक जोड़ सकते हैं - यह आसान है और आपके लिए उत्तर को प्रारूपित करता है :)
JayCe

5

जावा (ओपनजेडके 8) , 174 166 165 बाइट्स

केविन के जवाब और प्रेरित तारीख एपीआई के माध्यम से एक अच्छा राजभाषा 'trawl से प्रेरणा के साथ, मैं एक अधिक रसीला जावा समाधान प्राप्त करने में कामयाब रहा।

-8 बाइट्स केविन के आविष्कारशील रेगेक्स डेट पार्सिंग के लिए धन्यवाद

-1 बाइट्स नेवी के चतुर बिटवाइज ऑपरेशन के लिए धन्यवाद

import java.util.*;d->{long r=0,s=new Date().getTime(),e=Date.parse(d.replaceAll("(..).(..).","$2/$1/"));for(;s<=e;s+=864e5)r-=-new Date(s).getDay()%6>>-1;return r;}

इसे ऑनलाइन आज़माएं!

व्याख्या

import java.util.*;                         // Required import for Date 
long r=0,                                   // Initialise result variable
     s=new Date().getTime(),                // Current date in millis
     e=Date.parse(
         d.replaceAll("(..).(..).","$2/$1/")// Use regex to convert to MM/dd/yyyy
     );                                     // Parse date arg using deprecated API
for(;s<=e;                                  // Loop while current millis are less than date arg (e.g. date is before)       
    s+=864e5)                               // Add 86400000 ms to current date (equiv of 1 day)
    r-=-new Date(s).getDay()%6>>-1;        // If day is Sunday (0) or Saturday (6) don't increment, else add 1
return r;                                   // When loop finished return result

1
अच्छा उत्तर! डिफ़ॉल्ट प्रारूप प्रारूप के साथ d=d[0].splitऔर हटाए गए के साथ varargs का स्मार्ट उपयोग । आपकी पोस्ट में एक छोटी सी गलती, आपके पास आपके कोड के बजाय , और आपके स्पष्टीकरण में (भले ही आप उपयोग न करें )। .parseMM/dd/yyyyimport java.text.*;import java.util.*;// Required import for both Calendar and DateCalendar
केविन क्रूज़सेन

@KevinCruijssen पता नहीं क्यों मैं java.textलेकिन अब तय किया गया था ! धन्यवाद!
ल्यूक स्टीवंस

1
हालाँकि मुझे d=d[0].splitवैरग के साथ पसंद था , इनपुट को नियमित स्ट्रिंग में d=d[0].split("\\.");बदलना , 7 बाइट्सd[1]+"/"+d[0]+"/"+d[2] को d.replaceAll("(..).(..).","$2/$1/") सहेजना और बदलना ।
केविन क्रूज़सेन

1
और 1 अधिक बाइट बदलकर r+=new Date(s).getDay()%6<1?0:1,s+=864e5);करने के लिए s+=864e5)r+=new Date(s).getDay()%6<1?0:1;। :)
केविन क्रूज़सेन 12

1
-1 बाइट:r-=-new Date(s).getDay()%6>>-1;
नेवे

4

लाल , 72 बाइट्स

func[a][b: now/date s: 0 until[if b/weekday < 6[s: s + 1]a < b: b + 1]s]

इसे ऑनलाइन आज़माएं!

दिनांक को प्रारूप dd-mm-yyyy में ले जाता है, उदाहरण के लिए 31-10-2018 (10-अक्टूबर -2018 के साथ भी काम करता है)

सख्त इनपुट:

लाल , 97 बाइट्स

func[a][a: do replace/all a".""-"b: now/date s: 0 until[if b/weekday < 6[s: s + 1]a < b: b + 1]s]

इसे ऑनलाइन आज़माएं!

बक्शीश:

दिए गए दिनांक तक कार्य दिवसों की तारीखों / दिनों की सूची लौटाता है:

लाल , 235 बाइट्स

f: func [ a ] [
    b: now/date
    d: system/locale/days
    collect [ 
        until [ 
            if b/weekday < 6 [ 
                keep/only reduce [ b ":" d/(b/weekday) ]
            ]
            a < b: b + 1
        ]
    ]
]

इसे ऑनलाइन आज़माएं!


ए जी, कोई निष्पक्ष, अजगर में मैं इस आईओ प्रारूप प्रसंस्करण के बारे में 72 बाइट्स खर्च करने की जरूरत है ...: पी
क्विंटेक

1
आमतौर पर मेरे लाल समाधान सबसे लंबे लोगों में से होते हैं, लेकिन सौभाग्य से लाल तारीखों के साथ बहुत अच्छी तरह से व्यवहार करते हैं :)
गैलेन इवानोव

1
अजगर को संसाधित करने के लिए 90 बाइट्स ... मैंने किया है, मैंने तब तक छोड़ दिया जब तक कि अधिक लचीला इनपुट प्रारूप नहीं है: P
Quintec


3

पायथन 2 , 163 156 149 147 बाइट्स

lambda s:sum((date.today()+timedelta(x)).weekday()<5for x in range((date(*map(int,(s.split(".")[::-1])))-date.today()).days))
from datetime import*

इसे ऑनलाइन आज़माएं!

-7 @ धन्यवाद के साथ @mypetlion

-7 अधिक धन्यवाद @ovs के साथ

+30 बहुत ही प्रतिबंधात्मक इनपुट प्रारूप के कारण जो मैंने केवल अपने पिछले कोड को पोस्ट करने से पहले देखा था जो इनपुट (2018,11,1)लेता था जैसे :-(


2
इसके लिए कोई आवश्यकता नहीं (0,1)[t.weekday()<5]:। पायथन बूलियन का एक उपवर्ग है intऔर True, Falseइसका उपयोग अंकगणितीय संक्रियाओं में किया जा सकता है 1,0। इसे c+=t.weekday()<57 बाइट बचाने के लिए बदलें ।
mypetlion

1
149 बम्बा एक मेमने के रूप में।
ovs

साभार @mypetlion मुझे उस एक को याद नहीं करना चाहिए था।
एलपेड्रो

साभार @ovs दूसरी बार आपने हाल ही में मदद की है। पिछली बार एक बहुत प्रभावशाली -30 था। काम करने की कोशिश कर रहा था कि कैसे इसे एक मेमने में लाया जाए।
एलपेड्रो

3

जावा (JDK 10) , 171 बाइट्स

s->{int c=0;for(var t=java.time.LocalDate.now();!t.parse(s.replaceAll("(..).(..).(.*)","$3-$2-$1")).equals(t);t=t.plusDays(1))c-=t.getDayOfWeek().getValue()/6-1;return c;}

इसे ऑनलाइन आज़माएं!

क्रेडिट


1
आप बदल सकते हैं (.*)\\.(.*)\\.(.*)करने के लिए (..).(..).(.*)
केविन क्रूज़सेन

आपकी replaceAllतकनीक के साथ उसका उत्तर 7 बाइट्स के साथ-साथ गोल्फ हो सकता है, इसलिए आपका अभी भी थोड़ा लंबा है। ;)
केविन क्रूज़सेन

@ केविनक्रूजसेन रेगेक्स के लिए धन्यवाद! और कोई चिंता नहीं: मुझे कोई जवाब देने में कोई आपत्ति नहीं है;)
ओलिवियर ग्रेजायर

3

जावास्क्रिप्ट (Node.js) , 168 160 139 133 बाइट्स

35 बाइट्स क्विंटेक और केविन क्रूज़सेन के लिए कम धन्यवाद

D=>{var i=D.split('.'),n=0;for(var d=new Date();d<=new Date(i[2],i[1]-1,i[0]);d.setDate(d.getDate()+1))n+=-~d.getDay()%7>1;return n;}

इसे ऑनलाइन आज़माएं!

D=>{
  var i=D.split('.'),                 // Splits the date string by .
      n=0;                            // Counter variable
  for(var d=new Date();               // For the actual date
      d<=new Date(i[2],i[1]-1,i[0]);      // As long as the date is less or equal the requested date
      d.setDate(d.getDate()+1))           // Count the date one up
    n+=-~d.getDay()%7>1;                // If the date is not a Sunday or Saturday
  return n;                           // Return the counter variable
}

1
लैम्ब्डा के साथ 158 बाइट्स
क्विंटेक

1
अगर हालत में सुधार के साथ 139 बाइट्स
क्विंटेक

1
चूंकि आपकी विधि पुनरावर्ती नहीं है, इसलिए आपको f=बाइट-काउंट (और TIO पर आप इसे हेडर में डाल सकते हैं) में जोड़ने की आवश्यकता नहीं है , यही कारण है कि @Quintec ने कहा कि यह 141 बाइट्स के बजाय 139 बाइट्स है। इसके अलावा, आप बदल सकते हैं if((d.getDay()+1)%7>1)n++;करने के लिए n+=-~d.getDay()%7>1;के लिए यह गोल्फ के लिए 133 बाइट्स
केविन क्रूज़सेन

1
यहां प्रासंगिक टिप क्यों -~iहै(i+1) , इसके अलावा भी है, अगर आपने इसे अभी तक नहीं देखा है, तो जावास्क्रिप्ट में गोल्फिंग के लिए टिप्स और गोल्फिंग के लिए टिप्स <सभी भाषाओं> के माध्यम से पढ़ना दिलचस्प हो सकता है। :)
केविन क्रूज़सेन

1
भविष्य के संदर्भ के लिए कुछ और सुझाव
झबरा

3

Python3 और Numpy , 96 बाइट्स

मैं बोरिंग पूर्व-निर्मित समाधान से छोटा नहीं हो सकता ...

from numpy import*
d=datetime64
lambda s:busday_count(d('today'),d(f'{s[6:]}-{s[3:5]}-{s[:2]}'))

इसे ऑनलाइन आज़माएं!


पायथन 3;) में जाना चाहिए
एलपेड्रो

अपने आयात के आधार पर, आप पायथन 3 का उपयोग नहीं कर रहे हैं , बल्कि अजगर 3 अंक के साथ
जोनाथन फ्रेच

@ जोनाथनफ्रेच शीर्षक में होना चाहिए? अजगर का उपयोग करने वाले अन्य लोगों ने भी पुस्तकालय का उपयोग किया है क्योंकि अजगर के पास तिथियों या समय के लिए कोई अंतर्निहित डेटाटाइप नहीं है।
एरोन

1
यह की अपनी परिभाषा पर निर्भर करता है builtin की तरह मॉड्यूल - datetime मानक पुस्तकालय मॉड्यूल हैं और इस तरह मैं उन्हें कोर भाषा का हिस्सा होने के रूप में गिना जाएगा। हालांकि, जब कोई तीसरे पक्ष के मॉड्यूल का उपयोग करता है , जैसे कि खसखस , एक भाषा की क्षमताओं को बढ़ाता है और इसलिए मैं इसे दूसरी भाषा के रूप में देखूंगा।
जोनाथन फ्रेच

2

पॉवरशेल , 107 99 बाइट्स

-8 बाइट्स mazzy के लिए धन्यवाद

$d,$m,$y=$args-split'\.';for($a=date;$a-lt(date "$y-$m-$d");$a=$a|% *ys 1){$o+=($a|% D*k)-in1..5}$o

इसे ऑनलाइन आज़माएं!

-splitइनपुट पर एक रेगेक्स करता है $args, मूल्यों को क्रमशः $days, $months और $yकान में संग्रहीत करता है। फिर, एक forलूप में प्रवेश करता है , $aआज की तारीख के लिए प्रारंभिक । लूप तब भी जारी रहता है जब हमारे इनपुट टारगेट की तारीख $aको -lनिबंधित किया जाता है t। प्रत्येक पुनरावृत्ति हम 1दा ysको जोड़ रहे हैं $a, और जाँच कर रहे हैं कि क्या वर्तमान के D*kलिए छोटा हैDayOfWeek ) सीमा में है 1..5(यानी, सोमवार से शुक्रवार)। उस बूलियन परिणाम में जमा हो जाता है $oऔर एक बार जब हम लूप से बाहर निकल जाते हैं तो मूल्य पाइपलाइन पर छोड़ दिया जाता है और आउटपुट निहित होता है।


100 बाइट्स? $d,$m,$y=$args-split'\.';for($a=date;$a-lt(date "$y-$m-$d");$a=$a|% *ys 1){$o+=($a|% D*k)-in1..5};$o
19

1
@ माज़ी वास्तव में। इसके अलावा, अर्धविराम के बीच for(...){...}और $oहटाया जा सकता है, इसलिए हम अब 100 से नीचे हैं!
AdmBorkBork

2

पायथन 2 , 147 143 141 140 बाइट्स

from datetime import*
lambda e,s=date.today():sum((s+timedelta(x+1)).weekday()<5for x in range((date(*map(int,e.split(".")[::-1]))-s).days))

इसे ऑनलाइन आज़माएं!

एक स्ट्रिंग, ई लेता है, जो "dd.MM.YYYY" प्रारूप में अंतिम तिथि का प्रतिनिधित्व करता है। वैकल्पिक रूप से प्रारंभ दिनांक भी लेता है, लेकिन यह एक datetime.date होने की उम्मीद है।

प्रारंभ दिनांक, s, आज की तिथि के लिए डिफ़ॉल्ट रूप से एक datetime.date ऑब्जेक्ट के रूप में समय की अवहेलना करने के लिए डिफ़ॉल्ट है। अंतिम समय को डेटाइम लाइफटाइम आब्जेक्ट में पार्स किया जाता है, फिर डेट में परिवर्तित किया जाता है, क्योंकि डेटाइमटाइम डेट ऑब्जेक्ट्स में पार्स विधि नहीं होती है और डेट्स को डेट्स से घटाया / जोड़ा नहीं जा सकता है। हर दिन (शुरू, अंत] के माध्यम से Iterates और कुल में 1 जोड़ देता है यदि इसका कार्यदिवस नंबर <5. ([0-4] हैं [Mon-Fri], [5-6] हैं [Sat-Sun])।

डेटाटाइम पार्स करना सबसे बुरा है, आप लोग।

EDIT: एलपेड्रो चुरा लिया 4 बाइट को बचाने के लिए का नक्शा (int, चीज) ।

संपादित 2: विद्युत BOOGALOO: इसे एक अनाम फ़ंक्शन बनाकर 2 बाइट्स सहेजे गए। (धन्यवाद हारून!)

EDIT 3: xrange -> रेंज। (फिर से हारून!)


1
आपका स्वागत है! अच्छा जवाब :)
ElPedro

1
यह सम्मेलन है जिसे आप f=लैम्ब्डा के भावों से यहाँ छोड़ सकते हैं
हारून

1
"लाइफटाइम पार्सिंग सबसे खराब है, आप लोग" हाहाहा मेरा दर्द महसूस करते हैं, आप सफल हुए जहां मैं हालांकि असफल रहा: पी
क्विंटेक

@ अगर मुझे यकीन नहीं है कि अगर यह कई कार्यों के साथ या आयात विवरण के साथ ठीक है, धन्यवाद!
त्रिगुणमिति

1
आप इसके rangeबजाय xrangeइसका उपयोग कर सकते हैं यह अभी भी ठीक काम करना चाहिए।
हारून

2

PHP, 66 बाइट्स

for($t=time();$t<strtotime($argn);)$r+=date(N,$t+=86400)<6;echo$r;

के लिए खाली उत्पादन 0; के +बीच echoऔर $rठीक करने के लिए डालें ।

ऑनलाइन के साथ पाइप के रूप में चलाएं -nrया इसे आज़माएं


60 आउटपुट के साथ बाइट्स:

for($t=time();$t<strtotime($argn);)echo date(N,$t+=86400)<6;


1

आईबीएम / लोटस नोट्स फॉर्मूला - 99 बाइट्स

d:=i;c:=0;@While(d>@Today;@Set("c";c+@If(@Weekday(d)=1:7;0;1));@Set("d";@Adjust(d;0;0;-1;0;0;0)));c

दिनांक / समय क्षेत्र से इनपुट लेता है i। के इनपुट प्रारूप iको .अलग करने के लिए सेट किया गया है ताकि इनपुट को परिवर्तित करने की आवश्यकता न हो। नोट्स किसी भी विभाजक के साथ एक तारीख इनपुट ले सकते हैं जब तक आप इसे बताएंगे कि यह क्या होने वाला है (आशा है कि धोखा नहीं है!)। सूत्र संकलित संख्यात्मक क्षेत्र में हैo ही रूप ।

एक तरफ दिलचस्प: जब से @Forऔर @Whileमहान डेमियन काट्ज़ द्वारा R6 में (मुझे लगता है) फॉर्मूला भाषा में पेश किया गया था द्वारा केवल उनके लिए मेरे द्वारा पाया गया उपयोग कोड गोल्फिंग है। मैंने कभी उन्हें प्रोडक्शन ऐप में इस्तेमाल नहीं किया।

सूत्र के लिए कोई TIO उपलब्ध नहीं है इसलिए यहां 02.10.2018 को एक स्क्रीनशॉट लिया गया है:

यहाँ छवि विवरण दर्ज करें



1

K4 , 40 बाइट्स

समाधान:

{+/1<.q.mod[d+!(."."/:|"."\:x)-d:.z.d]7}

स्पष्टीकरण:

तारीखों के बीच के अंतर की गणना करें, सप्ताहांत को अनदेखा करने के लिए मॉडुलो 7 का उपयोग करें, योग करें।

{+/1<.q.mod[d+!(."."/:|"."\:x)-d:.z.d]7} / the solution
     .q.mod[                         ]7  / modulo with 7
                                 .z.d    / UTC date
                               d:        / save as d
                              -          / subtract from
               (             )           / do this together
                       "."\:x            / split input on "."
                      |                  / reverse
                 "."/:                   / join back with "."
                .                        / take the value
              !                          / range 0..the difference
            d+                           / add today's date to range
   1<                                    / is 1 less than the modulo (ie is this mon-fri)?
 +/                                      / sum up

टिप्पणियाँ:

  • पार्सिंग के लिए एक ही बाइट विकल्प: "D"$,/|"."\:x

1

सी (क्लैंग) , 209 208 205 बाइट्स

संकलक झंडे -DU=u=localtime(&b) -DW=tm_wday -DY=tm_year -DT=tm_yday(52 बाइट्स)।

#import<time.h>
i;f(char*a){long b;struct tm t,*u;time(&b);U;strptime(a,"%d.%m.%Y",&t);for(i=0;u->T^t.T|u->Y^t.Y;u->W&&u->W^6&&i++,b+=86400,U);return i;}

इसे ऑनलाइन आज़माएं!

-1 बाइट धन्यवाद @ जोनाथनफ्रेच को



0

क्यू, 52 79 बाइट्स

{x:"D"$"."sv reverse"."vs x;i:0;while[x-.z.d;$[2>x mod 7;x-:1;[i+:1;x-:1]]];:i}

q में, प्रत्येक तिथि में एक अंतर्निहित पूर्णांक मान होता है, जो इस बात पर आधारित होता है कि सहस्राब्दी की शुरुआत के कितने दिन बीत चुके हैं। इसके लिए 'मॉड 7' को लागू करते हुए, आपको सप्ताह के प्रत्येक दिन (शनिवार के लिए 0, शुक्रवार के लिए 6) के लिए अद्वितीय मान मिलते हैं। इसलिए जब 2> x मॉड 7, काउंटर को न बढ़ाएं, तो सप्ताहांत की गिनती से बचें।

संपादित करें: सख्त तिथि प्रारूप, संपादन को याद किया

EDIT2: शामिल हैं


1
बेस्ट मैं आया हूँ कश्मीर क्रिया का सहारा लिए बिना 48 बाइट्स के{sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7} लिए ।
स्ट्रीटस्टर

सूची सूचकांकों का उपयोग करना रिवर्स की तुलना में बहुत अधिक सुरुचिपूर्ण है, और लूप का उपयोग करने के बजाय सूची में मॉड को लागू करना है। शानदार जवाब +1
थूफेकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.