কর্ম দিবস গণনা


17

কাজের জীবনকে সহজ করে তোলার জন্য আমার কাছে প্রতিভা ধারণা ছিল - নির্দিষ্ট তারিখের একটি গণনা যা কেবলমাত্র কাজের দিন গণনা করে।


মূল কাজটি একটি নির্দিষ্ট তারিখের একটি কাউন্টডাউন তৈরি করা হয় যার মধ্যে কেবল কাউন্টডাউন-এর কার্যদিবসের অন্তর্ভুক্ত থাকে।

কাজের দিন গণনা হিসাবে সোমবার , মঙ্গলবার , বুধবার , বৃহস্পতিবার এবং শুক্রবার

ইনপুটটি "আনুষ্ঠানিক" ইউরোপীয় স্ট্যান্ডার্ড ফর্ম্যাটে একটি নির্দিষ্ট তারিখ হওয়া উচিত dd.MM.yyyyএবং ভবিষ্যতে অবশ্যই আজ বা একটি দিন হবে।

আউটপুটটি কেবল কয়েক দিনের বাকি থাকতে হবে।

এটি হিসাবে সংক্ষিপ্ততম কোড জয়ী।


পরীক্ষা ক্ষেত্রে:

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

যদি আমি প্রশ্নের কয়েকটি জিনিস মিস করি তবে দয়া করে আমাকে ক্ষমা করুন - এটি আমার প্রথম প্রশ্ন :)

সম্পাদনা করুন:

  • আপনি <- এরfalse পরিবর্তে আউটপুট হিসাবে ব্যবহার করতে পারেন 0 তবে এটি সুন্দর নয়
  • ডিএসটি সম্মানের দরকার নেই

9
এই "বেসরকারী" ইউরোপীয় ইনপুট ফর্ম্যাটটির পিছনে কোনও নির্দিষ্ট কারণ আছে ? আমাদের সম্মতিটি যখনই সম্ভব নমনীয় ইনপুটটিকে মঞ্জুরি দেওয়া।
আরনাউল্ড

6
তারিখের ফর্ম্যাটটি প্রক্রিয়াকরণের জন্য কঠোরতার সাথে "অতিরিক্ত চ্যালেঞ্জ" যুক্ত করার আসলেই কি কোনও পয়েন্ট আছে?
এটিকে কেবল অস্বাভাবিক আর্ট

3
@ হিল আমি এটি "কঠোর" বলিনি, এটি কেবল একটি অপ্রয়োজনীয় ঝামেলা, বিশেষত কোড-গল্ফের ক্ষেত্রে ...
আর্নল্ড

6
যাইহোক, আপনি নোট করুন যে এটি আপনার প্রথম চ্যালেঞ্জ; আমি আপনাকে একটি চ্যালেঞ্জ পোস্ট করার আগে সংশোধনের জন্য স্যান্ডবক্স ব্যবহার করার আমন্ত্রণ জানাই ! অন্যথায়, দুর্দান্ত কাজ, এবং আমি আপনার কাছ থেকে আরও কিছু দেখে উপভোগ করব!
জিউসেপে

7
কঠোর ইনপুট ফর্ম্যাট দ্বারা সত্যই প্রভাবিত নয় তবে এটি একটি ভাল চ্যালেঞ্জ।
এলপেড্রো

উত্তর:


18

05 এ বি 1 ই , 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#

আমার মাথা ঠিক নেই..

Golfing ভাষা 05AB1E জন্য এটি এ সব কোন ব্যাপার না কিনা ইনপুট সাথে আছেন .বা -। তবে, 05AB1E তারিখের অবজেক্টস বা গণনার জন্য কোনও বিল্টিন নেই। এটির তারিখগুলি সম্পর্কিত একমাত্র বিল্টিন হ'ল আজকের বছর / মাস / দিন / ঘন্টা / মিনিট / সেকেন্ড / মাইক্রোসেকেন্ড।

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

একটি অংশের কারণে +5 বাইট যা আমি জেলারের সূত্রে ভুলে গিয়েছিলাম (বছর -1 মাস জানুয়ারী এবং ফেব্রুয়ারি) ..

অনলাইনে চেষ্টা করুন বা 'আজকের' একটি এমুলেডড স্ব-নির্দিষ্ট তারিখের সাথে অনলাইনে চেষ্টা করুন

ব্যাখ্যা:

পাঠ্যের প্রাচীর oming

সাধারণভাবে, কোডটি নিম্নলিখিত সিউডো-কোড অনুসরণ করে:

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+K4+J42J)mod7,

যেখানে মার্চ মাসের মধ্যে থেকে ডিসেম্বর পর্যন্ত:

  • q হয়day মাসের ([1, 31])
  • m 1-ইনডেক্সডmonth ([3, 12])
  • K শতাব্দীর বছর (yearmod100 )
  • J 0- সূচকযুক্ত শতাব্দী (year100 )

এবং জানুয়ারী এবং ফেব্রুয়ারি মাসের জন্য:

  • q হয়day মাসের ([1, 31] )
  • m 1-ইনডেক্সেডmonth+12 ([13, 14] )
  • K পূর্ববর্তী বছর ( ( y a আর - 1 ) মোড 100 এর শতাব্দীর বছর(year1)mod100 )
  • J পূর্ববর্তী বছরের 0 index সূচকযুক্ত সেঞ্চুরি (year1100 )

সপ্তাহের h এর দিনে ফলাফল , যেখানে 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;

উত্স:
এক বছর একটি লিপ বছর কিনা তা নির্ধারণের জন্য অ্যালগরিদম। (সম্পাদনা: আর প্রাসঙ্গিক নয়, যেহেতু আমি লিপ বছরগুলি যাচাইয়ের জন্য একটি বিকল্প পদ্ধতি ব্যবহার করি যা by বাইট সংরক্ষণ করেছে।)
by একমাসে দিনের সংখ্যা নির্ধারণের জন্য অ্যালগরিদম।

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 উত্তরেও , সুতরাং পদক্ষেপগুলি বর্ণনা করার জন্য কয়েকটি উদাহরণ বছর যুক্ত করা হয়েছে।

6 বি) currentDate.month == 2 ?এবং 6 সি) 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

6 ডি) :এবং 6 ই)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:

6g) 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:এবং 6 আই)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
আপনি একটি পাগল ... একটি উত্সাহ আছে।
অ্যাডমবর্কবার্ক

1
দীর্ঘতম 05AB1E প্রোগ্রামটি কি কখনও?
লুইস মেন্ডো 18

2
@ লুইস মেন্ডো ক্লোজ, তবে আমি ভয় পাচ্ছি যে আমার কাছে একটি 05AB1E উত্তর দেবে যা আরও দীর্ঘ , এবং যেটি খুব কাছে আসে ... ;) আমি নিশ্চিত যে আমি এখানে কিছু বাইট গল্ফ করতে এবং সহজ করতে সক্ষম হব পরের দিনের সিউডো-কোড প্রয়োগের অংশগুলি। আগামীকাল সকালে দেখবে, তবে কেবল খেলাধুলা থেকে ফিরে এসেছিল এবং শীঘ্রই বিছানায় যাবে।
কেভিন ক্রুইজসেন

11

এক্সেল 24 বাইট

সেল এ 1 এ ইনপুট ধরেছে

=NETWORKDAYS(NOW()+1,A1)

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

সংখ্যার ফর্ম্যাটে মন্তব্যগুলিকে সম্বোধন করতে, আবার এটি এক্সেল স্ট্যান্ডার্ড: এখানে চিত্র বর্ণনা লিখুন


এটি তারিখের মানগুলির সাথে কাজ করার সময়, এটি উল্লিখিত হিসাবে ইনপুট নিতে ব্যর্থ। এটি হ'ল (কমপক্ষে মার্কিন সংস্করণে) 10.12.2018তারিখের পরিবর্তে কোনও ঘরে থাকা অবস্থায় একটি স্ট্রিং। এটিকে সংশোধন করার সুস্পষ্ট তবে দীর্ঘ সমাধান A1DATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))
টেলর স্কট

দুর্ভাগ্যক্রমে, সম্প্রদায়টি সিদ্ধান্ত নিয়েছে যে ভাষাগুলি বৈধ হওয়ার জন্য তাদের ডিফল্ট সেটিংসের অধীনে চালিত হওয়া দরকার (এটির মধ্যে একটি ব্যতিক্রম যা আমি দেখেছি তা হল ভাষা - IE, যদি আপনার ভাষা ইংরেজি এবং স্প্যানিশ উভয়কেই সমর্থন করে তবে আপনি সহজেই ব্যবহার করতে পারেন তবে এটি অবশ্যই লক্ষ করা উচিত)) আরও, ওপি (@ হিল) ফর্ম্যাটটি নমনীয় বলে উল্লেখ করেনি এবং বাস্তবে একেবারে বিপরীত বলেছে (এই প্রশ্নের দ্বিতীয় মন্তব্য দেখুন)
টেলর স্কট

2
ফর্ম্যাটটি মানক নয় , এটি স্থানীয় ভিত্তিক। এক্সেল HKCU\Control Panel\International\sDecimalরেজিস্ট্রি স্ট্রিং থেকে ফর্ম্যাটটি পড়ে । একটি ডিফল্ট ইউএস উইন্ডোজ ইনস্টলেশনতে যে এমএম / ডিডি / ইয়ে হয়। বেশিরভাগ EU দেশগুলিতে এটি ডিফল্ট হবে।
এরিক এ

@ লুইস মেন্ডো হ্যাঁ, এটি কার্যকর। আমি কোন স্পষ্টতা দেখতে পেলাম না। যদি এর পরিবর্তে গত দিনটি গণনা না করা হত তবে আমার = নেটওয়র্ককেডস (এখন (), এ 1-1) থাকতে পারত। আমি জানতাম এটি যে কোনও স্পষ্টতা বিবেচনা না করে সর্বদা একই বাইট গণনা হবে।
কেতা - মনিকাকে

খুশি যে কাজ করে। আমি ডাউনভোটটি সরিয়েছি
লুইস মেন্ডো

11

আর , 76 বাইট

দয়া করে এই 72 বাইট আর এর উত্তরটি দেখুন যা লোকেল-স্বতন্ত্র।

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 যেহেতু দ্বারা @ OlivierGrégoire

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

ব্যাখ্যা:

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
সম্পন্ন! এটি অন্য জবাবের খুব কাছে, তবে এটি এখনও পরাজিত করে না।
অলিভিয়ার গ্রাগোয়ার 11

7

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

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

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

কিভাবে?

একটি জাভাস্ক্রিপ্ট টাইমস্ট্যাম্পটিকে ইউনিক্সের যুগের আগে থেকে কেটে যাওয়া মিলিসেকেন্ডের সংখ্যা হিসাবে সংজ্ঞায়িত করা হয় । বর্তমান টাইমস্ট্যাম্পটি চলক ধরে রাখা হয়েছেএন

এনডি.toJSON() পদ্ধতিতে আইএসও 8601 ফর্ম্যাটে :

YYYY - এমএম - ডিডি টি এইচ : মিমি : এসএসএসএস জেড

YYYY-MM-DDYYYY-MM-DDDD.MM.YYYY

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

D.getDay()0606 :

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

86,400,000এন


6

এমএটিএল , 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, ইত্যাদি
কেভিন ক্রুইজসেন

পুনঃটুইট ধন্যবাদ! এখনই সংশোধন করা হয়েছে
লুইস মেন্ডো

1
এবং একই বাইট-কাউন্ট দিয়ে। :) ভাল, আমার কাছ থেকে +1।
কেভিন ক্রুইজসেন

6

ওল্ফ্রাম ভাষা (ম্যাথমেটিকা) , 64 56 বাইট 64

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ম্যাথামেটিকাল কহন কিভাবে এটা বিশ্লেষণ করতে করে; নতুন সমাধানটি ম্যাথমেটিকার প্রত্যাশা অনুযায়ী দিন এবং মাসটিকে সাজানোর জন্য স্ট্রিংটিকে কেবল পুনরায় সাজায়।

এটি লক্ষণীয় যে 28-বাইট সমাধানটি DayCount[Today,#,"Weekday"]&কেবলমাত্র এক মাস-দিন-বছরের ইনপুট ফর্ম্যাটের জন্য পুরোপুরি কার্যকরভাবে কাজ করে না, তবে সঠিকভাবে দ্ব্যর্থহীন দিন-মাস-ইন-ইনপুটগুলিও পরিচালনা করে 31.12.2018, যা সম্ভবত 31 এর 12 তম দিনটিকে বোঝাতে পারে না মাস "। সুতরাং এটি 60% এরও বেশি সময় :)



5

আর, 72 টি অক্ষর

@Ngm দ্বারা প্রদত্ত উত্তরের একটি প্রকার যা কিছু অক্ষর সংরক্ষণ করতে গ্রেপলকে এড়িয়ে চলে এবং অ-ইংরাজী লোকালগুলিতে কাজ করে।

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


1
খাটো এবং আরও সাধারণ। সুন্দর উত্তর এবং আশ্রয় স্বাগতম।
এনজিএম

1
পিপিসিজিতে আপনাকে স্বাগতম! আপনি একটি টিআইও লিঙ্ক যুক্ত করতে পারেন - এটি সহজ এবং আপনার জন্য উত্তরটি ফর্ম্যাট করে :)
জয়সি

5

জাভা (ওপেনজেডিকে 8) , 174 166 165 বাইট

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

-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
চমৎকার উত্তর! এর সাথে varargs এর স্মার্ট ব্যবহার d=d[0].splitএবং .parseডিফল্ট ফর্ম্যাট MM/dd/yyyyবিন্যাসের সাথে অবমুক্ত । আপনার পোস্টে একটি ছোট্ট ভুল, আপনার কোডের import java.text.*;পরিবর্তে import java.util.*;এবং // Required import for both Calendar and Dateআপনার ব্যাখ্যায় (যদিও আপনি ব্যবহার না করেন Calendar)।
কেভিন ক্রুইজসেন

@ কেভিন ক্রুইজসেন আমার জানা নেই কেন আমি java.textএখনই স্থির করে ফেলেছি ! ধন্যবাদ!
লুক স্টিভেন্স 9

1
যদিও আমি পছন্দ করেছে d=d[0].splitভারার্গস, একটি নিয়মিত স্ট্রিং ইনপুট পরিবর্তন, অপসারণ সঙ্গে d=d[0].split("\\.");এবং পরিবর্তন d[1]+"/"+d[0]+"/"+d[2]করার জন্য d.replaceAll("(..).(..).","$2/$1/") 7 বাইট সংরক্ষণ
কেভিন ক্রুইজসেন 12

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]

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

ডিডি-মিমি-ইয়ে ফর্ম্যাটে তারিখটি নেয়, উদাহরণস্বরূপ 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 বাইট ... আমি শেষ করেছি, আরও নমনীয় ইনপুট ফর্ম্যাট না হওয়া পর্যন্ত আমি প্রস্থান করলাম: পি
কুইন্টেক


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

@Ovs কে ধন্যবাদ সহ আরও 7

+30 অত্যন্ত সীমাবদ্ধ ইনপুট ফর্ম্যাটটির কারণে যা আমি আমার পূর্ববর্তী কোডটি পোস্ট করার ঠিক আগে লক্ষ্য করেছি যা ইনপুট গ্রহণ করেছে যেমন (2018,11,1):-(


2
কোন এই জন্য প্রয়োজন: (0,1)[t.weekday()<5]। পাইথন বুলিয়ানস একটি সাবক্লাস intএবং True, Falseএটি পাটিগণিতের ক্রিয়াকলাপ হিসাবে ব্যবহার করা যেতে পারে 1,0c+=t.weekday()<57 টি বাইট সংরক্ষণ করতে এটির সাথে প্রতিস্থাপন করুন ।
mypetlion


ধন্যবাদ @ মাইপেটলিয়ন। আমার এটা মিস করা উচিত ছিল না।
এলপেড্রো

ধন্যবাদ @ovs দ্বিতীয়বার আপনি সম্প্রতি সাহায্য করেছেন। গতবারটি খুব চিত্তাকর্ষক ছিল -30। এটি কীভাবে ল্যাম্বডায় ফেলা যায় তা নিয়ে কাজ করার চেষ্টা করছিল।
এলপেড্রো

3

জাভা (জেডিকে 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 বাইট দ্বারা গল্ফ করা যেতে পারে তবে আপনার এখনও কিছুটা দীর্ঘ। ;)
কেভিন ক্রুইজসেন 12

রেজিেক্সের জন্য ধন্যবাদ কেভিন ক্রুইজসেন! এবং কোনও উদ্বেগের বিষয় নয়: আমার আর উত্তর না দেওয়া আপত্তি নেই;)
অলিভিয়ার গ্রাগোয়ার

3

জাভাস্ক্রিপ্ট (নোড.জেএস) , 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
অবস্থার উন্নতি হলে 139 বাইটস
কুইনটেক

1
যেহেতু আপনার পদ্ধতিটি পুনরাবৃত্তিযোগ্য নয়, তাই আপনার f=বাইট-কাউন্টে যোগ করার দরকার নেই (এবং টিআইওতে আপনি এটি হেডারটিতে রাখতে পারেন), এই কারণেই @ কুইন্টেক 141 বাইটের পরিবর্তে এটি 139 বাইট বলেছে। এছাড়াও, আপনি এটি 133 বাইটে গল্ফে পরিবর্তন if((d.getDay()+1)%7>1)n++;করতে n+=-~d.getDay()%7>1;পারেন ।
কেভিন ক্রুইজসেন 14

1

1
ভবিষ্যতের রেফারেন্সের জন্য আরও কয়েকটি টিপস
শেগি

3

পাইথন 3 এবং নম্পি , 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
এটি আপনার বিল্টিনের সংজ্ঞার উপর নির্ভর করে - ডেটটাইমের মতো মডিউলগুলি স্ট্যান্ডার্ড লাইব্রেরি মডিউল এবং এইভাবে আমি তাদের মূল ভাষার অংশ হিসাবে গণনা করব। যাইহোক, যখন কেউ নম্পির মতো তৃতীয় পক্ষের মডিউলগুলি ব্যবহার করে , একটি ভাষার সক্ষমতা বাড়ায় এবং তাই আমি এটিকে অন্য ভাষা হিসাবে দেখতে চাই।
জোনাথন ফ্রেঞ্চ 15

2

পাওয়ারশেল , 107 99 বাইট

-8 বাইট মজির ধন্যবাদ

$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

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

সঞ্চালিত একটি Regex -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
mazzy

1
পছন্দ করুন প্লাস, এর মাঝে সেমিকোলনfor(...){...} এবং $oসরানো যেতে পারে, সুতরাং আমরা এখন 100 এর নিচে!
অ্যাডমবর্কবার্ক

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))

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

একটি স্ট্রিং নেয়, e, যা "dd.MM.YYYY" ফর্ম্যাটে শেষের তারিখটি উপস্থাপন করে। Ptionচ্ছিকভাবে প্রারম্ভের তারিখটিও গ্রহণ করে তবে এটি ডেটটাইম.ডেট হবে বলে আশা করা যায়।

শুরুর তারিখটি সময়কে উপেক্ষা করার জন্য ডেটটাইম.ডেট অবজেক্ট হিসাবে আজকের তারিখে ডিফল্ট হয়। শেষের সময়টিকে একটি ডেটটাইম.ডেটটাইম অবজেক্টে পার্স করা হয় তারপরে একটি তারিখে রূপান্তর করা হয়, যেহেতু ডেটটাইম.ডেট অবজেক্টগুলিতে পার্স পদ্ধতি নেই এবং তারিখের সময় থেকে তারিখের সময়গুলি যোগ / বিয়োগ করা যায় না। (শুরু, শেষ] এ প্রতিদিন শুরু করে এবং সপ্তাহে দিনের সংখ্যা <5 হলে ([0-4] [সোম-শুক্র], [5-6] হ'ল [শনি-সূর্য]) মোট 1 টি যুক্ত করে।

ছেলেরা, ডেটটাইম পার্সিং সবচেয়ে খারাপ।

সম্পাদনা: চুরি করা এলপেড্রোর মানচিত্র ( অন্তর্নিহিত , জিনিস) 4 টি বাইট সংরক্ষণ করার কৌশল।

সম্পাদনা 2: বৈদ্যুতিন বুগললো: একটি বেনামে ফাংশন তৈরি করে 2 বাইট সংরক্ষণ করা হয়েছে। (ধন্যবাদ হারুন!)

সম্পাদনা 3: এক্সরেঞ্জ -> ব্যাপ্তি। (আবারও ধন্যবাদ হারুন!)


1
আপনাকে স্বাগতম! সুন্দর উত্তর :)
এলপেড্রো

1
এটি এমন কনভেনশন যা আপনি f=এখানে ল্যাম্বডা এক্সপ্রেশন থেকে ছেড়ে দিতে পারেন
অ্যারন

1
"ডেটটাইম পার্সিং সবচেয়ে খারাপ, আপনারা" হাহাহাহা আমার বেদনা অনুভব করেন, আপনি যেখানে সফল হন সেখানেই সফল হন: পি
কুইন্টেক

অ্যারন @ আমি কখনই নিশ্চিত নই যে এটি একাধিক ফাংশন বা আমদানির বিবৃতি সহ ঠিক আছে, ধন্যবাদ!
ট্রিগারনমেট্রি

1
এটি ঠিক ঠিক কাজ করা উচিত rangeতার চেয়ে আপনি ব্যবহার করতে পারেন xrange
হারুন

2

পিএইচপি, 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 তে আমার ধারণা সূত্রের ভাষায় চালু হয়েছিল ড্যামিয়েন কাটজ এবং তাদের জন্য আমি খুঁজে পেয়েছি তা হল কোড গল্ফিং। আমি এগুলি কখনও প্রযোজনা অ্যাপে ব্যবহার করি নি।

সূত্রের জন্য কোনও টিআইও উপলব্ধ নেই তাই এখানে 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

q, 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}

কিউতে, সহস্রাব্দের শুরু হতে কত দিন কেটে গেছে তার উপর ভিত্তি করে প্রতিটি তারিখের অন্তর্নিহিত পূর্ণসংখ্যা মান থাকে। এতে 'মডড 7' প্রয়োগ করে আপনি সপ্তাহের প্রতিটি দিনের (শনিবারের জন্য 0, শুক্রবারের জন্য 6) অনন্য মান পাবেন। সুতরাং যখন 2> এক্স মড 7, সপ্তাহান্তে গণনা এড়াতে কাউন্টারটিকে বাড়িয়ে তুলবেন না।

সম্পাদনা: মিসড কঠোর তারিখের ফর্ম্যাট, সম্পাদনা

সম্পাদনা 2: অন্তর্ভুক্ত


1
শ্রেষ্ঠ আমি সঙ্গে আসা পর্যন্ত করেছি {sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7}জন্য 48 বাইট কে ক্রিয়া অবলম্বন না।
রাস্তায়

তালিকার সূচকগুলি ব্যবহার করা বিপরীতগুলির চেয়ে অনেক বেশি মার্জিত এবং তালিকায় মোড প্রয়োগ করার পরিবর্তে লুপ ব্যবহার করার চেয়ে বেশি। দুর্দান্ত উত্তর +1
থাইফেকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.