날짜를 n으로 나눌 수있는 마지막 시간은 언제입니까?


24

날짜는 YYYYMMDD와 같이 부호없는 정수로 표시 될 수 있습니다. 당신이해야 할 일은 주어진 숫자 n(오늘 날짜 포함) 로 나눌 수있는 가장 최근 날짜를 알아 낸 다음 해당 날짜를 위에 표시된 형식으로 반환하는 가장 짧은 프로그램이나 함수를 작성하는 것 입니다. 주어진 정수로 나눌 수있는 날짜 (00000101부터 오늘까지 포함)가없는 경우 -1을 반환해야합니다.

Current Date     Input     Output

30 July, 2014      4       20140728
30 July, 2014      7       20140729
28 July, 2014      4       20140728
28 July, 2014      7       20140722
28 July,    5    90000     -1

입력

STDIN에서 읽거나 함수 인수를 가져 오거나 입력이 변수에 저장 될 것으로 예상 할 수 있습니다. 입력은 부호없는 정수입니다.

산출

STDOUT에 쓰거나 날짜를 나타내는 정수를 YYYYMMDD 형식으로 리턴하거나 변수에 저장하십시오.

제한 사항

언어가 제공하는 모든 표준 라이브러리를 사용할 수 있습니다. 표준 허점이 적용됩니다.

승리 조건

이것은 이므로 가장 작은 프로그램 (바이트)이 이깁니다. 동점 인 경우, 가장 많은 표를 얻은 답이 이깁니다.


4
날짜 00000101이 존재하지 않습니다. 연도는 1부터 시작합니다. en.wikipedia.org/wiki/0_%28year%29
edc65

1
@ edc65 존재하는 척 할 수 있습니까?
overactor

3
2 월 29 일은 어떻습니까? 유효한 날짜를 확인하려면 전체 윤년 규칙을 적용해야합니까? en.wikipedia.org/wiki/Leap_year
디지털 외상

6
Julian-Gregorian 캘린더 스위치로 인해 손실 된 날은 어떻습니까? 아니면 우리는 그레고리력을 계속 가고 있습니까? en.wikipedia.org/wiki/Gregorian_calendar
디지털 외상

1
입력 / 출력 사양이 다소 느슨합니다. 예를 들어, "입력이 변수에 저장 될 것으로 예상"하면 C와 같은 언어로 변수 선언을 계산해야합니까? "프로그램 작성"이라고 말하지만 "함수 인수 사용"이라고 말하면 전체 프로그램이 아닌 함수 만 작성할 수 있습니까?
Bob

답변:


16

Mathematica, 93 60 바이트

For[i=0,(r=DatePlus@i--~FromDigits~100)>0&&!n∣r,];r~Max~-1

에 입력이 저장 될 것으로 예상합니다 n.

세로줄 은 "divides"의 유니 코드 문자이며, 3 바이트 (UTF-8)로 계산했습니다.

편집 : bloated DateString및 형식 사양 을 피하기위한 깔끔한 트릭을 찾았습니다 :).

편집 :-1 요구 사항을 완전히 잊었습니다 . 지금 수정했습니다.

여기에 설명이 있습니다

For[i=0,            i--                        ,];         (* i is the number of days AFTER
                                                              today. Hence, we decrement 
                                                              it. *)
For[i=0,   DatePlus@i--                        ,];         (* If no reference date is
                                                              provided, DatePlus will add
                                                              the given number of days to
                                                              today's date. The result is a 
                                                              list of 3 integers, luckily 
                                                              in order {year,month,day} *)
For[i=0,   DatePlus@i--~FromDigits~100         ,];         (* Interpret these as the digits
                                                              of a base 100 number. The 
                                                              beauty is that FromDigits
                                                              doesn't care about digits 
                                                              greater than the base and 
                                                              just carries them over. *)
For[i=0,(r=DatePlus@i--~FromDigits~100)        ,];         (* Store the number in r. *)
For[i=0,(r=DatePlus@i--~FromDigits~100)>0      ,];         (* Make sure it's positive. *)
For[i=0,(r=DatePlus@i--~FromDigits~100)>0&&!n|r,];         (* And keep going while n does 
                                                              not divide r. *)
For[i=0,(r=DatePlus@i--~FromDigits~100)>0&&!n|r,];r~Max~-1 (* Clamp result to -1. *)

유니 코드는 모노 스페이싱으로 엉망이기 때문에 설명 |대신에 사용 했습니다 .


+1. 유니 코드 문자를 3 바이트로 계산해야한다는 링크가 있습니까?
belisarius 박사

2
@belisarius OP는이 코드 골프는 문자가 아닌 바이트 수로 계산된다고 명시했습니다 (이것은 태그 위키에 명시된 기본값이기도합니다).
Martin Ender

나는 위키의 끝을 통해 읽지 못했습니다 :) 감사합니다!
belisarius 박사

6

파이썬 2-150

import datetime as d,re
def f(n):
 t=d.date.today()
 while t:
    c=int(re.sub("-","",str(t)))
    if c%n<1:return c
    try:t-=d.timedelta(1)
    except:return-1

days =를 제거 할 것을 제안하는 @ chill0r에게 감사 드리며 try 블록을 한 줄로 줄일 수 있다는 팁은 Jason S입니다.


예. 그것은 표준 운영 절차입니다;). 붙여 넣기 후 탭이 공백으로 변환됩니다.
벡터화

당신은 제거 할 수 days=있는가 t-=d.timedelta(days=1). 이것은 또한 잘 작동합니다 (적어도 python3에서)
chill0r

@ bitpwner 아 아, 그때 신경 쓰지 마라.
마틴 엔더

1
(1) use int(t.strftime("%Y%m%d"))and drop re, (2) 한 줄만 사용하면 try되므로 더 많이 절약 할 수 있습니다 t-=d.timedelta(1).
Jason S

1
strftime오래된 날짜의 @bitpwner 는 python3에서 작동하고 확인했는데 python2에서 오류가 발생합니다.
Jason S

5

C # 136

수정 된 스펙에서는 부호없는 int를 가져 와서 int를 리턴하는 함수입니다.

int F(uint n){var d=System.DateTime.Now;int i;try{while((i=int.Parse(d.ToString("yyyMMdd")))%n>0)d=d.AddDays(-1);}catch{i=-1;}return i;}

가변 입출력을 가진 152 자

느슨한 입력 / 출력 요구 사항을 이용하여 입력은 변수에 저장되고 n(현재 정수 리터럴을 제외한 모든 문자를 계산) 출력에는 변수가 제공됩니다 s.

class P{static void Main(){var n=4;var d=System.DateTime.Now;string s;try{while(int.Parse(s=d.ToString("yyyMMdd"))%n>0)d=d.AddDays(-1);}catch{s="-1";}}}

STDIN / STDOUT이있는 204 자 :

using System;class P{static void Main(){int n=int.Parse(Console.ReadLine());var d=DateTime.Now;string s;try{while(int.Parse(s=d.ToString("yyyMMdd"))%n>0)d=d.AddDays(-1);}catch{s="-1";}Console.Write(s);}}

1
정말 공감대? 그래도 문제가 해결되지 않습니까? 설명 해주십시오. 누군가 내가 다른 C # 답변을 복제했다고 생각하면 실제로 다른 한 시간 전에 이것을 작성 하고 선언 표현식에 C # 6.0사용하는 것을 보았습니다 . 약간 추락하여 답변을 늦게 게시했습니다. 그럼에도 불구하고, 그것은 공감 율이 다소 약한 이유입니다.
Bob

4

T-SQL (2012)-148

n 값을 가진 자유 변수 @n이 있다고 가정합니다.

declare @ date=getdate()while convert(char,@,112)%@n>0 and'00010101'<@ set @=dateadd(d,-1,@)print iif(convert(char,@,112)%@n=0,convert(char,@),'-1')

4

골프 루아 90 86

n=I.r()d="%Y%m%d"i=O.d(d)+0j=0@i>0?i%n==0w(i)O.q()$j=j+1i=O.d(d,O.t()-j*86400)+0$w(-1)

ungolfed Lua 버전은 다음과 같습니다.

n = io.read()
d = "%Y%m%d"
i = os.date(d)+0   -- implicitly casts os.date(d) to int
j = 0
while i>0 do
   if i % n == 0 then
      print(i)
      os.exit()
   end
   j = j+1
   i = os.date(d,os.time()-j*86400)+0
end
print(-1)

2
여기서 테스트 n = 20140699 출력 20140699
William Barbosa

@ WilliamBarbosa : 고정; 20140699는 -1을 반환합니다.
Kyle Kanos

4

MATLAB : 61

-1,s=str2num(datestr(1:now,'YYYYmmDD')),d=s(~mod(s,n)),d(end)

제수가에 저장된 것으로 가정합니다 n. 결과는라는 변수에 저장됩니다 ans.


댓글 버전 :

-1                                     % Store -1 in ans in case we don't find anything
s=str2num(datestr(1:now,'YYYYmmDD'))   % Make a list of date numbers
d=s(~mod(s,n)),                        % Select only those who are dividable and prepend -1
d(end)                                 % Store last found value in ans, if anything is found

결과를 찾지 못하면 오류가 발생하지만 그에도 불구하고 변수에서 답을 여전히 사용할 수 있습니다.


2 개의 추가 문자를 사용하면 오류를 피할 수 있습니다.

s=str2num(datestr(1:now,'YYYYmmDD')),d=[-1;s(~mod(s,n))],d(end)

@ MartinBüttner Hmm, 그 문제를 해결했지만 이제 해결책은 최소 문자에만 묶여 있습니다. 개선 된 점이 있습니까?
Dennis Jaheruddin

1
아니, 내 머리 꼭대기에서 벗어나지 마라. 하지만 당신이 나를 이길 수 있도록 내 동기 부여는 약간 제한되어 있습니다. ;)
Martin Ender

4

PHP (92 = 85 + 7)

에 입력이 저장 될 것으로 예상합니다 $n.

for($d=date("Ymd");!($d%$n==0&checkdate($d/100%100,$d%100,substr($d,0,4))|$d<0);$d--);echo$d

나는 왜 더 이상 PHP를 좋아하지 않는지 기억했다.

편집 : 이제 사양의 -1도 구현됩니다.


아니, 방금 확인했는데, 에코 할 때 $ d가 너무 낮습니다. ‘위조했다’는 무슨 뜻입니까? (죄송합니다, 영어는 모국어가 아닙니다)
flawr

오, 나는 그 사양을 보지 못했습니다. 물론 이것은 추가되어야합니다. 감사합니다!
flawr

3

자바 스크립트 (ES6) 115

변수 n의 숫자를 예상하고 결과는 변수 r에 저장됩니다. 현재 날짜부터 시작하여 감소하는 매일을 확인합니다. 더 좋은 방법이 있어야합니다.
또한 표준 자바 스크립트 날짜 함수를 사용하면 모든 날짜가 1 학년으로 거슬러 올라갑니다 (그레고리 안 개혁 전에 윤년이 잘못되었습니다).

for(z=new Date,t=n+1;t>n&&t%n;)
  d=z.getDate(),
  t=z.getFullYear()*1e4+(z.getMonth()+1)*100+d,
  z.setDate(d-1);
r=t>n?t:-1

3

C #-144 (LINQPad에서 124 또는 124) + 각 자리수에 대해 1 n

이것은 입력이 변수에있을 것으로 예상합니다 n. 실행이 끝나면 원하는 값이 변수에있게 r됩니다. 00010101그러나 날짜 00000101가 존재하지 않기 때문에 첫 번째 날짜로 간주 합니다. 개선을위한 제안은 언제나 환영합니다.

class P{static void Main(){int n=7,r;var d=System.DateTime.Now;try{for(;(r=int.Parse(d.ToString("yyyMMdd")))%n>0;d=d.AddDays(-1));}catch{r=-1;}}}

LINQPad 버전 :

int n=7,r;var d=System.DateTime.Now;try{for(;(r=int.Parse(d.ToString("yyyMMdd")))%n>0;d=d.AddDays(-1));}catch{r=-1;}r.Dump();

3

그루비 - (301 개) 300 문자

Joda Time을 사용한다는 사실을 숨기는 트릭없이 매우 간단하고 느립니다.

골프 :

@Grab(group='joda-time', module='joda-time', version='2.3')
import org.joda.time.*
import org.joda.time.format.*
f={DateTimeFormat.forPattern("yyyyMMdd").print(new LocalDate().minusDays(it)) as int}
n=args[0] as int;b=0;x=-1;c=0
while(!b){if(f(c++)%n==0){x=f(--c);b=1};if(f(0)-c<=101){b=1}}
println x

실행 예 (2014 년 7 월 30 일) :

$ groovy D.groovy  7
20140729
$ groovy D.groovy  16
20140720
$ groovy D.groovy  90000
-1

언 골프 드 :

@Grab(group='joda-time', module='joda-time', version='2.3')

import org.joda.time.*
import org.joda.time.format.*

f = { DateTimeFormat.forPattern("yyyyMMdd").print(new LocalDate().minusDays(it)) as int }

n = args[0] as int
b = 0 
x = -1
c = 0

while (!b) {
    if(f(c++)%n==0) { x=f(--c); b=1}
    if(f(0)-c<=101){b=1}
}

println x

3

R, 146 (139)

D=function(n){
z=as.double(gsub("-","",y<-Sys.Date()))
d=F
while(z>100&!d){
y=y-1 
z=as.double(gsub("-","",y))
d=!z%%n}
ifelse(z>100,z,-1)}

작동하지 않는 날짜와 함께 행운을 빈다. microbenchmark15 일 전으로 돌아가려면 약 0.5 초가 걸립니다. 2014 년 7 월 31 일 현재 -1적어도 봉투 뒷면에 따르면 2 천만 초 (~ 23 일)가 뱉어 질 것 입니다.

편집 : 주석의 일부 단축키


!d보다 짧은 d==F!z%%n보다 z%%n==0. 또한 as.numeric(gsub("-","",...)함수로 만들면 문자 수가 줄어 듭니다. 그래도 잘 했어!
plannapus

아 그리고 as.real종종 좋은 짧은 대안 as.numeric입니다.
plannapus

불행히도 as.realR 3.0.0부터는 기능이 없습니다. 그러나 우리는 여전히 as.double한 문자 더 짧은 문자를 가지고 있습니다 .
shadowtalker

오, 나는 아직도 R 2.14를 사용하고 있다는 것을 몰랐다
plannapus

1
관리 권한이있는 컴퓨터에서 작업하고 있지 않으므로 실제로 본인에게 달려 있지 않습니다. 그러나 나는 이미 paste0내에서 .Rprofile자연적으로 :
plannapus

3

MATLAB 104

function d=f(v);for d=fix(now):-1:1 d=str2num(datestr(d,'YYYYmmDD'));if~mod(d,v)return;end;end;d=-1;end

언 골프 :

function d = f(v)
   for d=fix(now):-1:1
       d = str2num(datestr(d,'YYYYmmDD'));
       if ~mod(d,v)
          return; 
       end
   end
   d = -1;
end

편집 : 나는 그것을 조금 최적화했지만 @DennisJaheruddin은 여기에 실제 솔루션을 가지고 있습니다.


이것은 여전히 ​​골프가 될 수 있습니다. 업데이트하겠습니다.
데니스 Jaheruddin

@DennisJaheruddin 이 메타 게시물을 기반으로 한 편집을 거부 했습니다 . 의견에 개선 사항을 제안하면 OP가 답변을 수정하기 전에이를 검토 할 수 있습니다.
마틴 엔더

여러 가지 방법으로 문자를 저장할 수 있습니다. 함수 대신 스크립트를 사용하고, ans에 할당하고, 로우에서 하이로 루프를 수행하고, 각 결과가 이전 결과를 덮어 쓰도록하여 ​​루프를 끊을 필요가 없도록하십시오. . -물론 벡터화도 도움이 될 수 있습니다 . 내 대답을 참조하십시오 .
데니스 Jaheruddin

다음은 67 개 문자의 짧은 루프 기반 버전입니다.-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Dennis Jaheruddin

@ MartinBüttner 댓글 주셔서 감사합니다. 말씀하신대로 오류가 발생했습니다. 이제 괜찮을거야.
Scott

3

파이썬 3 - 151 148 바이트, 발생기

from datetime import*
t=date.today()
f=lambda n:next((y for y in(int((t-timedelta(o)).strftime("%Y%m%d"))for o in range(t.toordinal()))if y%n<1),-1)

import*제안 해 주셔서 감사합니다 @ nyuszika7h



2

자바 : 373 자

이것은 Groovy 답변의 포트이며 Joda Time을 사용합니다.

골프 :

import org.joda.time.*;
import org.joda.time.format.*;
public class D {
static int f(int i){return Integer.parseInt(DateTimeFormat.forPattern("yyyyMMdd").print(new LocalDate().minusDays(i)));}
public static void main(String[] args){
int n=Integer.parseInt(args[0]);int b=0,c=0,x=-1;
while(b!=1){if(f(c++)%n==0){x=f(--c);b=1;};if(f(0)-c<=101){b=1;}}
System.out.println(x);}}

클래스 경로에서 샘플 실행 (joda-time-2.4.jar 사용) :

$ java D 7
20140729
$ java D 4
20140728
$ java D 16
20140720
$ java D 90000
-1

언 골프 드 :

import org.joda.time.*;
import org.joda.time.format.*;

public class D {
    static int f(int i) {
        return Integer.parseInt(DateTimeFormat.forPattern("yyyyMMdd").print(new LocalDate().minusDays(i)));
    }

    public static void main(String[] args) {
        int n = Integer.parseInt(args[0]);
        int b = 0,c = 0,x = -1;

        while(b!=1) {
            if(f(c++)%n==0) { x=f(--c);b=1; }
            if(f(0)-c<=101) { b=1; }
        }

        System.out.println(x);
    }
}

3
도 있습니다 java.time.*자바의 최신 버전.
ntoskrnl

2

Bash + coreutils (8.21), 67 바이트

seq -f-%gday $[9**9]|date -f- +[pq]sp[_1pq]sq%Y%m%ddA1=qd$1%%0=p|dc
  • seq1 ~ 9 9의 정수를 한 줄에 하나씩 생성 하고-<x>day
  • 파이프 이에 date -f이는 포맷으로 날짜 각 라인을 해석하고 출력 dc식 등 [pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p(가독성 추가 공간)
    • [pq] 매크로를 정의하여 스택 상단을 인쇄 한 다음 종료
    • sp 레지스터 p에 매크로 저장
    • [pq] -1을 푸시 할 매크로를 정의하고 스택 상단을 인쇄 한 다음 종료
    • sq 레지스터 q에 매크로 저장
    • 20140728 포함 날짜 정수
    • d 스택 상단 복제
    • A1 푸시 101 (00000101)
    • =q팝 2 스택 값 : 날짜와 101을 비교하고 q같으면 매크로 호출
    • 7 푸시 분배기
    • % 팝 분배기 및 분할, 분할 및 나머지를 밀어
    • 0 푸시 0
    • =p상위 2 스택 값 팝 : 나머지와 0을 비교하고 p같으면 매크로를 호출하십시오.
    • d 스택 상단 복제
    • 매크로 p호출 : 날짜 정수를 인쇄하고 dc완전히 종료
  • dcdc평가 를 위해 표현식이 파이프됩니다 . 일단 dc인쇄 올바른 값과 종료된다, 파이프 라인의 나머지는 철거된다

산출:

$ ./lastdivdate.sh 4
20140728
$ ./lastdivdate.sh 7
20140729
$ ./lastdivdate.sh 123456
17901120
$ ./lastdivdate.sh 77777
19910912
$ ./lastdivdate.sh 7777777
-1
$ 

이 프로그램은 1에서 9 9 사이의 정수를 생성하기 때문에 앞으로 백만 년이 넘게 유효합니다. 이 제한이 허용되기를 바랍니다 ;-)


-1의 반환을 단축 한 @ WumpusQ.Wumbley에게 감사합니다.


@ MartinBüttner 저주! 이제 19 바이트의 페널티
Digital Trauma

빈 출력을 -1로 변환하는 더 짧은 방법 : |grep .||echo -1파이프 라인의 끝에 추가 하거나 다음과 같이 확장을 중첩 할 수있는 zsh를 사용하십시오 echo ${$(cmd):-1}(다른 곳에 백 슬래시가 발생합니다 ...)

@ WumpusQ.Wumbley 왜 그렇게 생각하지 않았습니까? 감사!
디지털 외상

1
그건 그렇고, 이것은 coreutils 버전에 민감한 것으로 보입니다. 광산 (8.15)은 "일 전"사양으로 1901 이전으로 돌아 가기를 거부합니다.

1
실제로 sizeof time_t경계가 깨지는 경계는 1970 년 1 월 1 일 전에 2 ** 31 초이므로 문제 가되는 것 같습니다 . 내 이전 설치도 32 비트입니다

2

PYTHON : 134 바이트

현재 리더를 이길 수는 없으며 최고의 Python 답변보다 훨씬 좋지는 않지만 최고의 Python 솔루션을 게시하기로 결정했습니다.

from datetime import*
def y(a,n):
 s=a.strftime("%Y%m%d")
 if int(s)%n==0:yield s
 try:x=y(a-timedelta(1),n)
 except:yield -1
 yield x

언 골프 드 :

from datetime import *
def y(a, n):
    s=int(a.strftime("%Y%m%d"))
    if s%n==0:
        yield s
    try:
        x=y(a-timedelta(1), n)
    except:
        yield -1
    yield x

실제로는 138 바이트입니다. 당신은을 사용하여 4 바이트를 저장할 수 있습니다 from datetime import*대신 import datetime as d, timedelta(1)대신 d.timedelta(1)yield대신 return.
nyuszika7h

임의의 온라인 바이트 카운터를 사용하고 있는데 더 좋은 옵션이 있습니까?
RageCage


이것과 다른 점은 무엇입니까? bytecount.bluebus112.com
RageCage

그것은 개행을 계산 하지 않으며 바이트가 아닌 문자를 계산 합니다. ASCII 텍스트의 경우 두 개는 동일하므로 후자는 차이가 없습니다. 에서 코드 골프 영업 달리 기술하지 않는 한, 당신은 일반적으로 문자를 계산합니다. (또한, 내가 링크 한 것은 여기 에서 "바이트 수"에 대한 Google의 첫 번째 결과였습니다 .)
nyuszika7h

2

자바 스크립트 (ES5)-94

변수의 입력을 예상하고 x출력을에 배치합니다 o.

for(i=Date.now();i>-7e13&&(o=(new Date(i)).toISOString().replace(/-|T.*/g,''))%x;i-=864e5)o=-1

2

k4 (84) (73)

f:{f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;.z.D];x]}

이것은 처음 떠 올린 알고리즘으로 시작한 것일뿐입니다. 성능과 길이가 모두 더 낫습니다.

이 버전은 "오늘"부분 (즉 .z.D)을 하드 코딩합니다 . yyyy.mm.dd테스트 사례를 실행하려면 날짜 리터럴 ( ) 또는 q 날짜 시스템의 정수 (2000 년 1 월 1 일 이후의 날짜)로 변경하십시오. (q는 18 세기 초의 날짜 리터럴을 구문 분석하지 않으므로 그 이전 날짜의 경우 값을 계산하고 적절한 정수를 직접 사용해야합니다. 1 월 1 일, "AD 0"은 사양에서 -730457함수 코드에서 사용되는 것으로 판명되었습니다 . AD 5 월 7 일 28 일은 마지막 테스트 사례에서 -728450입니다.)

주어진 테스트 사례 :

  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;2014.07.30];x]}4
20140728
  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;2014.07.30];x]}7
20140729
  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;2014.07.28];x]}4
20140728
  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;2014.07.28];x]}7
20140722
  "d"$-728450
0005.07.28
  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;-728450];x]}90000
-1

편집하다:

g:.,/$`\:`$$:;f:{$[Z=r:{(z>x)&.q.mod[g z]y}[Z:-730458;y]{x-1}/x;-1;g"d"$r]}

이것은 수렴 연산자 중 하나를 사용하여 나누기 가능한 것을 찾거나 1/1/0000 경계를 넘을 때까지 날짜를 줄이는 다른 방법입니다. 날짜에서 정수로의 변환도 약간 다릅니다.

테스트 사례, 이번에는 한 번에 :

  g:.,/$`\:`$$:;{$[Z=r:{(z>x)&.q.mod[g z]y}[Z:-730458;y]{x-1}/x;-1;g"d"$r]}'[2014.07.30 2014.07.30 2014.07.28 2014.07.28,"d"$-728450;4 7 4 7 90000]
20140728 20140729 20140728 20140722 -1

1

VBA 343 바이트 (모듈)

Sub divD(i As Long)
a = Now()
b = Format(a, "yyyymmdd")
    Do While b / i <> Int(b / i)
    a = DateAdd("d", -1, a)
    b = Format(a, "yyyymmdd")
        If b = "01000101" Then
            MsgBox -1
            Exit Sub
        End If
    Loop
MsgBox b
End Sub

이것은 Sub d(i):a=Now:b=a:Do Until b/i=Int(b/i):a=DateAdd("d",-1,a):b=Format(a,"yyyymmdd"):If b="01000101"Then:b=-1:Exit Sub:Loop:Debug.?b:End Sub139 바이트 로 크게 압축 될 수 있습니다
Taylor Scott

1

PowerShell-76

변수에 저장되는 숫자에 따라 다릅니다 $n.

try{@(0..$n|%{'{0:yyyyMMdd}'-f(date).AddDays(-$_)}|?{!($_%$n)})[0]}catch{-1}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.