근무일 카운트 다운


17

방금 일을 더 쉽게 할 수있는 천재적인 아이디어를 얻었습니다. 근무 일수 만 계산하는 특정 날짜의 카운트 다운입니다.


기본 작업은 카운트 다운에 근무일 만 포함하는 특정 날짜에 대한 카운트 다운을 만드는 것입니다.

월요일 , 화요일 , 수요일 , 목요일금요일이 근무일로 계산 됩니다.

입력 은 "비공식"유럽 표준 형식의 특정 날짜 dd.MM.yyyy여야하며 오늘 또는 미래의 날짜 여야합니다.

출력 은 남은 일 수 여야합니다.

그것의로 짧은 코드 승리.


테스트 사례 :

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

질문에서 몇 가지를 놓친 경우 용서하십시오-그것은 나의 첫 번째 질문입니다 :)

편집하다:

  • <-false 대신 출력으로 사용할 수 0 있지만 아름답지는 않습니다.
  • DST를 존중할 필요가 없습니다.

9
"비공식"유럽식 입력 형식에 특별한 이유가 있습니까? 우리의 의견 은 가능할 때마다 유연한 입력을 허용하는 것입니다.
Arnauld

6
처리하기 어려운 날짜 형식의 "추가 문제"를 추가 할 때 실제로 어떤 점이 있습니까? 융통성있는 날짜 형식을 가진 불공정 한 WRT 언어들 ...
Quintec

3
@Hille 나는 그것이 "단단하다"고 말하지 않았다. 특히 코드 골퍼에서 불필요한 번거 로움이다 ... Arnauld가 위에 올린 링크를 주목하라 ... 일반적으로 유연한 입력은 표준이다 ...
Quintec

6
그건 그렇고, 당신은 이것이 첫 번째 도전이라는 것을 알고 있습니다. 메인에 도전을 게시하기 전에 개선 을 위해 샌드 박스 를 사용하도록 초대합니다 ! 그렇지 않으면, 좋은 일이고, 나는 당신에게서 더 많은 것을 보는 것을 즐길 것입니다!
Giuseppe

7
엄격한 입력 형식에는 큰 영향을 미치지 않지만 그 밖의 좋은 과제는 아닙니다.
ElPedro

답변:


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에는 Date 객체 또는 계산에 대한 기본 제공 기능이 없습니다. 날짜에 관한 유일한 내장은 오늘의 연 / 월 / 일 /시 / 분 / 초 / 마이크로 초입니다.

이 때문에 거의 모든 코드는 다음 날 수동으로 계산하고 요일을 계산합니다.

내가 Zeller의 공식에서 잊어 버린 부분으로 인해 +5 바이트

온라인으로 시도 하거나 에뮬레이트 된 자체 지정 날짜 'today'로 온라인으로 시도하십시오 .

설명:

텍스트 벽.

일반적으로 코드는 다음 의사 코드를 따릅니다.

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,

3 월에서 12 월 사이의 위치 :

  • q 은 ISday (달[1, 31])
  • m 은 1 인덱싱 된month ([3, 12])
  • K 는 세기의 해입니다 (yearmod100 )
  • J 0 인덱싱 세기이다 (year100)

그리고 1 월과 2 월 동안 :

  • q 은 ISday (달[1, 31])
  • m 은 1- 인덱싱 된month+12 ( [13, 14])입니다.
  • K 는 전년도의 세기입니다(year1)mod100 )
  • J 는 전년도의 인덱스가없는 세기입니다 (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;

출처 :
연도가 윤년인지 결정하기위한 알고리즘. (편집 : 7 바이트를 절약 한 윤년을 확인 하기 위해 다른 방법 을 사용 하기 때문에 더 이상 관련이 없습니다 .)
한 달의 일 수를 결정하는 알고리즘.

Integer isLeapYear = ...;6AB ) 는 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 ?및 6c) 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:

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

6h) 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:6l ) , 6m) nextDate.month = 1;및 6n) 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 프로그램?
Luis Mendo

2
@LuisMendo Close, 그러나 나는 더 긴 05AB1E 대답 하나너무 가까운 대답 하나를 두려워합니다 .. ;) 나는 여기에서 몇 바이트를 골프화하고 단순화 할 수 있다고 확신합니다. 다음날의 의사 코드 구현의 일부. 내일 아침에 보이지만 스포츠에서 돌아와 곧 잠자리에들 것입니다.
Kevin Cruijssen

11

엑셀 24 바이트

셀 A1에 입력을 가정

=NETWORKDAYS(NOW()+1,A1)

내장 기능을 사용합니다. 불행히도이 기능에는 오늘 날짜와 종료 날짜가 모두 포함됩니다. 이후 OP는 오늘 계산하지 않기로 분명해 졌으므로 오늘 계산하지 않도록 NOW에 추가합니다.

숫자 형식에 대한 의견을 다시 말하면, 이것은 Excel 표준입니다. 여기에 이미지 설명을 입력하십시오


이것은 날짜 값과 함께 작동하지만 명시된대로 입력을받지 못합니다. 즉, (미국 버전에서는) 10.12.2018날짜가 아닌 셀에있을 때 문자열입니다. 이를 해결하기위한 분명하지만 긴 해결책은 솔루션에서 다음과 같이 변경 A1하는 DATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))것입니다.
Taylor Scott

불행히도, 커뮤니티는 언어가 기본 설정에서 유효한 언어로 실행되어야한다고 결정했습니다 (내가 본 예외는 언어입니다-IE, 언어가 영어와 스페인어를 모두 지원하는 경우, 어느 쪽이든 쉽게 사용할 수 있지만 또한 OP (@hille)는 형식이 융통성이 있다고 말하지 않았으며 실제로 형식과는 정반대입니다 (이 질문에 대한 두 번째 의견 참조)
Taylor Scott

2
형식은 표준 이 아니며 로케일 기반입니다. Excel은 HKCU\Control Panel\International\sDecimal레지스트리 문자열 에서 형식을 읽습니다 . 기본 미국 Windows 설치에서 MM / dd / yyyy입니다. 대부분의 EU 국가에서는 이것이 기본값입니다.
Erik A

@luisMendo 그렇습니다. 나는 어떤 설명도 보지 못했다. 마지막 날을 계산하지 않았다면 = NETWORKDAYS (NOW (), A1-1)이 될 수 있습니다. 어떤 설명이든 상관없이 항상 동일한 바이트 수임을 알았습니다.
Keeta-복원 Monica Monica

다행이다. 나는 downvote를 제거
Luis Mendo


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;}

Date는 항상 장황한 Java가 실제로 얼마나 많은지를 상기시켜줍니다.

참고 :이 개 짧은 자바 (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()있습니까?
Quintec

1
Calendar s=Calendar.getInstance(),e=s.getInstance()불행히도 정확히 같은 길이의 결과를 낼 수도 있습니다 .
Misha Lavrov 1

1
@MishaLavrov 아, 정적은 C실제로 필요하지 않습니다. 그것은 내가 C다른 곳에서 사용했던 코드의 오래된 부분에서 나왔습니다. var s=Calendar.getInstance();var e=s.getInstance();덕분에 1 바이트 골프를 할 수있었습니다 . :)
Kevin Cruijssen

1
사용하여 150 바이트java.time .
Olivier Grégoire

1
끝난! 다른 답변과 바이트 단위로 매우 가깝지만 아직 이길 수는 없습니다.
Olivier Grégoire

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)

온라인으로 사용해보십시오!

어떻게?

n

D.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,000


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등,
케빈 Cruijssen

@KevinCruijssen Whoops. 감사! 지금 수정
Luis Mendo

1
그리고 같은 바이트 수로. :) 니스, 나에게서 +1.
Kevin Cruijssen

6

Wolfram Language (Mathematica) , 64 56 바이트

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

온라인으로 사용해보십시오!

DayCount[x,y,"Weekday"]x와 사이의 평일 수를 계산합니다 y.

입력은 xy공상을 포함하여 여러 가지가 될 수 있습니다 DateObject에 의해 반환되는 것과 같은 Today, 또는 형식 (불행히도)의 문자열 mm.dd.yyyy.

나의 이전의 시도는 Mathematica에게 그것을 파싱하는 방법을 말함으로써 dd.mm.yyyy입력을 a로 바꾸려고 시도했다 DateObject. 새로운 솔루션은 단순히 Mathematica가 기대하는 순서대로 문자열을 재 배열하여 일과 월을 넣습니다.

28 바이트 솔루션 DayCount[Today,#,"Weekday"]&은 월-일-년 입력 형식에 완벽하게 작동 할뿐만 아니라 "31 일의 12 일을 의미 할 수없는 모호한 일-월-년 입력을 올바르게 처리 한다는 점에 주목할 가치가 있습니다. 31.12.2018달". 따라서 시간의 60 % 이상이 정확합니다. :)



5

R, 72 자

@ngm에서 제공하는 답변의 변형으로 grepl이 몇 문자를 저장하지 않고 영어가 아닌 로케일에서 작동합니다.

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


1
더 짧고 더 일반적인 것. 좋은 대답과 망명에 오신 것을 환영합니다.
ngm

1
PPCG에 오신 것을 환영합니다! 당신은 TIO 링크를 추가 할 수 있습니다 -그것은 쉽고 당신을위한 답변을 형식화합니다 :)
JayCe

5

자바 (오픈 JDK 8) , 174 (166) 165 바이트

Kevin의 답변에서 약간의 영감과 더 이상 사용되지 않는 Date API를 통한 트롤을 통해 더 간결한 Java 솔루션을 얻을 수있었습니다.

Kevin의 독창적 인 정규식 날짜 구문 분석 덕분에 -8 바이트

Nevay의 영리한 비트 연산 덕분에 -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더 이상 사용되지 않습니다 . 게시물에 하나의 작은 실수가 있습니다. 코드 대신 설명에 있습니다 (사용하지 않아도 ). .parseMM/dd/yyyyimport java.text.*;import java.util.*;// Required import for both Calendar and DateCalendar
Kevin Cruijssen

@KevinCruijssen 내가 왜 지금 고쳤는지 모르겠다 java.text! 감사!
Luke Stevens

1
d=d[0].splitvarargs를 좋아했지만 입력을 일반 문자열로 d=d[0].split("\\.");변경 d[1]+"/"+d[0]+"/"+d[2]하고 제거 하고 변경 하여 d.replaceAll("(..).(..).","$2/$1/") 7 바이트절약했습니다 .
Kevin Cruijssen

1
그리고 1 바이트 이상 변경하여 r+=new Date(s).getDay()%6<1?0:1,s+=864e5);s+=864e5)r+=new Date(s).getDay()%6<1?0:1;. :)
Kevin Cruijssen

1
-1 바이트 :r-=-new Date(s).getDay()%6>>-1;
Nevay

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) (2018 년 10 월 10 일과도 함께 사용)

엄격한 입력 :

빨강 , 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
        ]
    ]
]

온라인으로 사용해보십시오!


아아, 공정하지 않다, 파이썬에서는이 IO 형식을 처리하는 데 약 72 바이트를 사용해야합니다 ... : P
Quintec

1
일반적으로 내 레드 솔루션은 가장 긴 솔루션 중 하나이지만 운 좋게도 레드는 날짜를 잘 처리합니다 :)
Galen Ivanov

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*

온라인으로 사용해보십시오!

@mypetlion 덕분에 -7

@ovs 덕분에 -7 더

매우 제한적인 입력 형식으로 인해 +30으로 입력 한 이전 코드를 게시하기 직전에 눈에 (2018,11,1)띄었습니다. 예 :-(


2
필요가 없습니다 : (0,1)[t.weekday()<5]. 파이썬은 부울의 하위 클래스 intTrue, False같은 연산에 사용될 수있다 1,0. c+=t.weekday()<57 바이트를 절약하기 위해 교체하십시오 .
mypetlion

1
람다로 149 바이트
ovs

감사합니다 @mypetlion. 나는 그중 하나를 그리워해서는 안됩니다.
ElPedro

감사합니다 @ovs. 최근에 두 번째로 도움을 주셨습니다. 지난 시간은 매우 인상적이었습니다 -30. 이것을 람다에 넣는 방법을 연구하려고했습니다.
ElPedro

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
당신은 변경할 수 있습니다 (.*)\\.(.*)\\.(.*)에를 (..).(..).(.*).
Kevin Cruijssen

당신의 replaceAll기술로 그의 대답은 7 바이트로 골프를 칠 수 있으므로 여전히 약간 더 길다. ;)
Kevin Cruijssen

@KevinCruijssen 정규식 감사합니다! 그리고 걱정 : 나는 더 이상 대답을 가지고 신경 쓰지 않는다)
올리비에 그레 구 아르

3

자바 스크립트 (Node.js를) , 168 (160) 139 133 바이트

QuintecKevin Cruijssen 덕분에 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 바이트
Quintec

1
if 조건이 개선 된 139 바이트
Quintec

1
메소드가 재귀 적이 지 않기 때문에 f=바이트 수에 (및 TIO에서 헤더에 넣을 수 있음)을 추가 할 필요가 없기 때문에 @Quintec은 141 바이트 대신 139 바이트라고 언급했습니다. 또한, 당신은 변경할 수 if((d.getDay()+1)%7>1)n++;n+=-~d.getDay()%7>1;로 골프 그것에 133 바이트 .
Kevin Cruijssen

1
여기에 관련 팁이있는 이유 -~i(i+1) 있습니다. 아직 보지 않았다면 JavaScript 로 골프를 치기위한 팁<모든 언어>로 골프를 치기위한 팁 을 읽는 것이 흥미로울 수 있습니다. :)
Kevin Cruijssen

1
나중에 참조 할 수있는 몇 가지 추가 정보 .
Shaggy

3

파이썬 3 & Numpy , 96 바이트

지루한 미리 만들어진 솔루션보다 작아 질 수 없었습니다 ...

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

온라인으로 사용해보십시오!


Python 3에
들어가야

가져 오기에 따라 Python 3을 사용하지 않고 numpy와 함께 Python 3을 사용 합니다.
Jonathan Frech

@JonathanFrech가 제목에 있어야합니까? 파이썬을 사용하는 다른 사람들은 파이썬에 날짜 또는 시간에 대한 내장 데이터 유형이 없으므로 라이브러리를 사용했습니다.
아론

1
이것은 당신의 정의에 따라 내장 과 같은 모듈 - 날짜가 표준 라이브러리 모듈입니다 따라서 나는 핵심 언어의 일부가되는로 계산한다. 그러나 numpy 와 같은 타사 모듈을 사용 하면 언어 기능이 향상되므로 다른 언어로 볼 수 있습니다.
Jonathan Frech

2

PowerShell , 107 99 바이트

mazzy 덕분에 -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

온라인으로 사용해보십시오!

행하는 정규식 -split입력에 $args매장에 값 $dAYS, $months 및 $y귀 각각. 그런 다음 for루프를 시작 $a하여 오늘 날짜로 초기화 합니다. 반면 루프가 계속 $a-lESS t한 우리의 입력 대상 날짜. 우리가 1da ys에 추가 할 때마다 $a현재 D*k(short 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
@mazzy 참으로. 또한, 사이 세미콜론 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"형식으로 나타내는 문자열 e를 사용합니다. 선택적으로 시작 날짜도 사용하지만 datetime.date 일 것으로 예상됩니다.

시작 날짜 s는 시간을 무시하기 위해 오늘 날짜로 datetime.date 객체로 기본 설정됩니다. datetime.date 오브젝트에는 구문 분석 메소드가없고 날짜 / 시간을 날짜에서 더하거나 뺄 수 없으므로 종료 시간은 datetime.datetime 오브젝트로 구문 분석 된 후 날짜로 변환됩니다. 매일 (시작, 끝)에서 반복되며 주중 수가 <5 인 경우 총계에 1을 더합니다 ([0-4]는 [월-금], [5-6]은 [토-일]).

날짜 시간 파싱이 최악입니다.

편집 : Stole ElPedro 의 맵 (int, thing) 트릭으로 4 바이트를 절약하십시오.

편집 2 : ELECTRIC BOOGALOO : 익명 기능으로 2 바이트를 절약했습니다. (아론 감사합니다!)

편집 3 : xrange-> 범위. (아론 감사합니다!)


1
천만에요! 좋은 답변 :)
ElPedro

1
f=여기에서 람다 식에서 벗어날 수있는 것이 관례입니다.
Aaron

1
"날짜 파싱이 최악이야, 너희들"Hahahaha는 내 고통을 느낀다. 그러나 내가 실패한 곳에서 성공했다. : P
Quintec

@Aaron 여러 함수 또는 import 문으로 괜찮을지 확신 할 수 없습니다. 감사합니다!
Triggernometry

1
여전히 잘 작동 하는 range것보다 사용할 수도 있습니다 xrange.
Aaron Aaron

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

PHP ( 탄소 포함 ), 107 바이트

function a($d){return Carbon\Carbon::parse($d)->diffInDaysFiltered(function($e){return!$e->isWeekend();});}

1

IBM / Lotus Notes Formula-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에서 찍은 스크린 샷이 있습니다.

enter image description here



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

C (연타) , 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;}

온라인으로 사용해보십시오!

@JonathanFrech 덕분에 -1 바이트


?i++:0-> &&++i.
Jonathan Frech

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}

q에서, 각 날짜는 밀레니엄 시작 이후 몇 일이 지 났는지에 따라 기본 정수 값을 갖습니다. 여기에 'mod 7'을 적용하면 각 요일에 대해 고유 한 값을 얻습니다 (토요일은 0, 금요일은 6). 따라서 2> x mod 7 일 때 주말 계산을 피하기 위해 카운터를 늘리지 마십시오.

편집 : 엄격한 날짜 형식 누락, 편집

EDIT2 : 포함


1
내가 함께 왔어요 제일이다 {sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7}위한 48 바이트 K 동사에 의존하지 않고.
streetster

리스트 인덱스를 사용하는 것은 리버스를 사용하는 것보다 루프를 사용하는 것보다 mod를리스트에 적용하는 것보다 훨씬 우아합니다. 위대한 답변 +1
Thaufeki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.