Lần cuối cùng ngày chia hết cho n là khi nào?


24

Một ngày có thể được biểu thị bằng một số nguyên không dấu như: YYYYMMDD. Những gì bạn cần làm là viết chương trình hoặc hàm ngắn nhất để tìm ra ngày gần đây nhất có số chia hết cho một số đã cho n(bao gồm cả ngày hôm nay) và sau đó trả về ngày đó theo định dạng được hiển thị ở trên. Nếu chưa bao giờ có ngày (trong khoảng từ 00000101 đến ngày hôm nay) chia hết cho số nguyên đã cho, bạn nên trả về -1.

Ví dụ

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

Đầu vào

Bạn có thể đọc từ STDIN hoặc lấy tham số hàm hoặc thậm chí mong đợi đầu vào được lưu trữ trong một biến. Đầu vào sẽ là một số nguyên không dấu.

Đầu ra

Viết vào STDOUT hoặc trả về (hoặc lưu trong một biến) số nguyên biểu thị ngày theo định dạng YYYYMMDD.

Hạn chế

Bạn có thể sử dụng bất kỳ thư viện tiêu chuẩn mà ngôn ngữ của bạn cung cấp. Tiêu chuẩn áp dụng.

Điều kiện chiến thắng

Đây là một , vì vậy chương trình nhỏ nhất (tính bằng byte) sẽ thắng. Trong trường hợp hòa, câu trả lời có nhiều phiếu nhất sẽ thắng.


4
Ngày 00000101 không tồn tại. Số năm bắt đầu bằng 1. vi.wikipedia.org/wiki/0_%28year%29
edc65

1
@ edc65 chúng ta có thể giả vờ nó tồn tại không?
overactor

3
Ngày 29 tháng 2 thì sao? Chúng ta có cần áp dụng quy tắc năm nhuận đầy đủ để kiểm tra ngày hợp lệ không? vi.wikipedia.org/wiki/Leap_year
Chấn thương kỹ thuật số

6
Còn những ngày bị mất do chuyển đổi lịch Julian-Gregorian thì sao? Hay chúng ta sẽ đi Gregorian tất cả các cách? vi.wikipedia.org/wiki/Gregorian_calWiki
Chấn thương kỹ thuật số

1
Thông số kỹ thuật đầu vào / đầu ra của bạn khá lỏng lẻo. Ví dụ: "mong đợi đầu vào được lưu trữ trong một biến" có tính khai báo biến trong một ngôn ngữ như C không? Bạn nói "viết chương trình", nhưng bạn nói "lấy một đối số hàm" - điều đó có nghĩa là chúng ta có thể chỉ viết một hàm chứ không phải là một chương trình đầy đủ?
Bob

Câu trả lời:


16

Toán học, 93 60 byte

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

Dự kiến ​​đầu vào sẽ được lưu trữ trong n.

Lưu ý rằng dòng dọc là ký tự unicode cho "chia", mà tôi đã tính là 3 byte (UTF-8).

Chỉnh sửa: Tìm thấy một thủ thuật gọn gàng để tránh các DateStringđặc điểm kỹ thuật cồng kềnh và định dạng :).

Chỉnh sửa: Hoàn toàn quên về -1yêu cầu. Đã sửa bây giờ.

Đây là một lời giải thích

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

Lưu ý rằng tôi đã sử dụng |thay vì trong phần giải thích, vì Unicode là một lỗi với việc đơn cách hóa.


+ 1.Bạn có một liên kết chỉ ra rằng bạn nên đếm các ký tự unicode là 3 byte không?
Tiến sĩ belisarius

2
@ Belisarius OP tuyên bố rằng mã golf này được tính bằng byte và không phải ký tự (đây cũng là mặc định như được nêu trong thẻ wiki).
Martin Ender

Tôi chưa bao giờ phải đọc đến cuối wiki :) Cảm ơn!
Tiến sĩ belisarius

6

Con trăn 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

Cảm ơn @ chill0r về đề xuất xóa ngày = và Jason S cho mẹo rằng khối thử có thể được giảm xuống một dòng.


Vâng. Đó là một quy trình vận hành tiêu chuẩn;). Các tab được chuyển đổi thành không gian sau khi dán.
Vectorized

Bạn có thể loại bỏ days=trong t-=d.timedelta(days=1). Điều này cũng hoạt động tốt (ít nhất là trong python3)
chill0r

@bitpwner ah tôi hiểu rồi, đừng bận tâm.
Martin Ender

1
Bạn có thể tiết kiệm nhiều hơn: (1) sử dụng int(t.strftime("%Y%m%d"))và thả re, (2) sử dụng một dòng tryvì chỉ t-=d.timedelta(1)cần có trong đó.
Jason S

1
@bitpwner strftimevào các ngày cũ hoạt động trong python3, đã kiểm tra và tôi gặp lỗi trong python2
Jason S

5

C # 136

Với các thông số kỹ thuật được sửa đổi, một hàm lấy một số nguyên không dấu và trả về một số nguyên.

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 ký tự với đầu vào / đầu ra thay đổi

Lợi dụng các yêu cầu đầu vào / đầu ra lỏng lẻo, đầu vào sẽ được lưu trữ trong biến n(hiện đang đếm tất cả các ký tự trừ chữ nguyên) và đầu ra được cung cấp cùng với biế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";}}}

204 ký tự với STDIN / STDOUT:

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
Thực sự, một downvote? Điều này không giải quyết vấn đề chính xác? Vui lòng giải thích. Nếu bất cứ ai nghĩ rằng tôi đã sao chép câu trả lời C # khác, tôi thực sự đã viết điều này khoảng một giờ trước câu trả lời khác và thậm chí đã xem xét sử dụng C # 6.0 cho các biểu thức khai báo. Có một chút lúng túng, dẫn đến việc đăng câu trả lời muộn. Ngay cả sau đó, đó là một lý do khá mỏng manh cho một downvote.
Bob

4

T-SQL (2012) - 148

Giả sử có một biến miễn phí @n với giá trị 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

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

Một phiên bản Lua vô danh sẽ là,

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
Đã thử nghiệm ở đây n = 20140699 đầu ra 20140699
William Barbosa

@WilliamBarbosa: Đã sửa; 20140699 trả về -1.
Kyle Kanos

4

MATLAB: 61

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

Giả sử số chia được lưu trữ trong n. Kết quả sẽ được lưu trữ trong một biến được gọi là ans.


Phiên bản đã bình luận:

-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

Sẽ tạo ra lỗi nếu không tìm thấy kết quả, nhưng câu trả lời vẫn có sẵn trong biến mặc dù vậy.


Lỗi có thể tránh được với chi phí của 2 ký tự phụ:

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

@ MartinBüttner Hmm, đã giải quyết vấn đề đó nhưng bây giờ giải pháp chỉ được gắn với ký tự tối thiểu. Bạn có thể thấy bất kỳ cải tiến?
Dennis Jaheruddin

1
Không, không phải trên đỉnh đầu của tôi. Nhưng động lực của tôi để giúp bạn đánh bại tôi là một chút hạn chế. ;)
Martin Ender

4

PHP (92 = 85 + 7)

Dự kiến ​​đầu vào sẽ được lưu trữ trong $n.

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

Tôi chỉ nhớ tại sao tôi không thích PHP nữa =)

EDIT: Bây giờ -1 của các thông số kỹ thuật cũng được thực hiện.


Không, chỉ cần kiểm tra nó, $ d sẽ là một mức quá thấp khi echo-ing. "Bạn đã giả mạo" nghĩa là gì? (Xin lỗi, không có tiếng anh bản xứ =)
flawr

Ồ, tôi đã không thấy thông số kỹ thuật đó, tất nhiên điều này phải được thêm vào, cảm ơn!
flawr

3

JavaScript (ES6) 115

Yêu cầu số trong biến n, kết quả được lưu trong biến r. Mỗi ngày được kiểm tra, bắt đầu với ngày hiện tại và giảm dần - phải có một cách tốt hơn.
Hơn nữa, bằng cách sử dụng các hàm ngày javascript tiêu chuẩn, tất cả các ngày đều theo kiểu gregorian cho đến năm 1 (với năm nhuận tương ứng sai trước khi cải cách gregorian).

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 (Hoặc 124 trong LINQPad) + 1 cho mỗi chữ số trong n

Điều này hy vọng đầu vào là trong biến n. Khi kết thúc thực hiện, giá trị mong muốn sẽ nằm trong biến r. Tuy nhiên, đây được coi 00010101là ngày đầu tiên vì ngày 00000101không tồn tại. Đề xuất cải tiến luôn được chào đón.

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

Phiên bản 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

Groovy - 301 300 ký tự

Rất đơn giản (và chậm), không có thủ thuật để che giấu sự thật rằng nó sử dụng Joda Time.

Chơi gôn

@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

Ví dụ chạy (vào ngày 30 tháng 7 năm 2014):

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

Ung dung:

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

Chúc may mắn với một ngày không làm việc. microbenchmarkbáo cáo mất khoảng nửa giây để quay lại 15 ngày. Kể từ ngày 31 tháng 7 năm 2014, việc này sẽ mất khoảng 20 triệu giây (~ 23 ngày) để nhổ ra -1, ít nhất là theo mặt sau của phong bì.

chỉnh sửa : một số phím tắt trong các ý kiến


!dngắn hơn d==F!z%%nhơn z%%n==0. Ngoài ra, làm as.numeric(gsub("-","",...)thành một chức năng cũng nên giảm số lượng ký tự. Tuy nhiên, công việc tốt đẹp!
plannapus

Oh và as.realthường là một thay thế tốt, ngắn hơn để as.numeric.
plannapus

Thật không may as.reallà không còn tồn tại kể từ R 3.0.0. Nhưng chúng ta vẫn có as.doublemột ký tự ngắn hơn.
Shadowtalker

Ồ tôi không biết rằng vì tôi vẫn đang sử dụng R 2.14
plannapus

1
Tôi không làm việc trên máy tính, tôi có quyền quản trị, vì vậy nó không thực sự phụ thuộc vào tôi. Nhưng tôi đã có paste0trong .Rprofiletự nhiên rồi :)
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

Ung dung:

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

EDIT: Tôi đã quản lý để tối ưu hóa nó một chút, nhưng @DennisJaheruddin có giải pháp thực sự ở đây


Điều này vẫn có thể được chơi golf khá nhiều, tôi sẽ cập nhật nó.
Dennis Jaheruddin

@DennisJaheruddin Tôi đã từ chối chỉnh sửa của bạn dựa trên bài đăng meta này . Vui lòng đề xuất cải tiến của bạn trong một nhận xét, để OP có thể xem xét chúng trước khi sửa đổi câu trả lời của anh ấy.
Martin Ender

Lưu ý rằng bạn có thể lưu ký tự theo nhiều cách khác nhau: Sử dụng tập lệnh thay vì hàm, để mọi thứ được gán cho ans, thực hiện vòng lặp từ thấp đến cao và để mỗi kết quả ghi đè lên tập lệnh trước để bạn không cần phải phá vỡ vòng lặp . - Tất nhiên vector hóa cũng có thể giúp đỡ, xem câu trả lời của tôi .
Dennis Jaheruddin

Đây là một phiên bản ngắn hơn dựa trên 67 ký tự:-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Dennis Jaheruddin

@ MartinBüttner Cảm ơn bạn đã bình luận. Có một lỗi như bạn nói. Bây giờ nó sẽ ổn thôi.
Scott

3

Python 3 - 151 148 byte, trình tạo

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)

Cảm ơn @ nyuszika7h đã import*gợi ý


2

Hồng ngọc 103

require'date'
f=->{d=Date.today 
(s=d.strftime('%Y%m%d').to_i
return s if s%n<1
d-=1)while d.year>0
-1}

Đầu vào

Mong giá trị chia sẽ xuất hiện trong biến n.

Đầu ra

Giá trị trả về của fhàm

Ví dụ trực tuyến: http://ideone.com/LoYxG4


2

Java: 373 ký tự

Đây là một cổng của câu trả lời Groovy và sử dụng Joda Time.

Chơi gôn

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

Chạy mẫu (với joda-time-2.4.jar trên đường dẫn lớp:

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

Ung dung:

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
Cũng có java.time.*phiên bản mới nhất của Java.
ntoskrnl

2

Bash + coreutils (8.21), 67 byte

seq -f-%gday $[9**9]|date -f- +[pq]sp[_1pq]sq%Y%m%ddA1=qd$1%%0=p|dc
  • seqtạo các số nguyên từ 1 đến 9 9 , mỗi số một dòng và định dạng nó là-<x>day
  • dẫn đường này để date -fdiễn giải từng dòng và đưa ra ngày được định dạng thành một dcbiểu thức, chẳng hạn như [pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p(khoảng trắng được thêm vào để dễ đọc)
    • [pq] xác định một macro để in đỉnh ngăn xếp, sau đó thoát
    • sp lưu macro trong đăng ký p
    • [pq] xác định một macro để đẩy -1, in đỉnh ngăn xếp, sau đó thoát
    • sq lưu macro trong thanh ghi q
    • 20140728 số nguyên ngày nhúng
    • d trùng lặp đầu ngăn xếp
    • A1 đẩy 101 (00000101)
    • =q pop top 2 stack value: so sánh ngày và 101, và gọi macro q nếu bằng
    • 7 đẩy chia
    • % chia pop và chia, chia và đẩy phần còn lại
    • 0 đẩy 0
    • =pgiá trị ngăn xếp pop top 2: so sánh phần còn lại và 0 và gọi macro pnếu bằng
    • d trùng lặp đầu ngăn xếp
    • macro pđược gọi là: in số nguyên ngày và thoát dchoàn toàn
  • dcbiểu thức được dẫn đến dcđể đánh giá. Sau khi dcin đúng giá trị và thoát, phần còn lại của đường ống bị phá hủy

Đầu ra:

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

Vì chương trình này tạo ra các số nguyên từ 1 đến 9 9 , nên nó sẽ có hiệu lực trong tương lai chỉ hơn 1 triệu năm. Tôi hy vọng giới hạn này là chấp nhận được ;-)


Cảm ơn @ WumpusQ.Wumbley đã rút ngắn lợi nhuận của -1.


@ MartinBüttner nguyền rủa! Bây giờ, với một hình phạt 19 byte :)
Chấn thương kỹ thuật số

Các cách ngắn hơn để chuyển đổi đầu ra trống thành -1: thêm |grep .||echo -1vào cuối đường ống hoặc sử dụng zsh nơi bạn có thể lồng các mở rộng như thế echo ${$(cmd):-1}này (điều này sẽ khiến bạn phải trả lại dấu gạch chéo ở nơi khác ...)

@ WumpusQ.Wumbley Tại sao tôi không nghĩ về điều đó? Cảm ơn!
Chấn thương kỹ thuật số

1
Nhân tiện, điều này dường như nhạy cảm với phiên bản coreutils. Mine (8.15) từ chối quay trở lại trước năm 1901 với thông số kỹ thuật "ngày trước".

1
Trên thực tế, nó có vẻ là một sizeof time_tvấn đề, vì ranh giới nơi nó bị phá vỡ là 2 ** 31 giây trước 1/1/1970. Cài đặt cũ hơn của tôi cũng là 32-bit một cách thảm hại

2

PYTHON: 134 byte

Sẽ không thể đánh bại nhà lãnh đạo hiện tại và nó không tốt hơn câu trả lời Python tốt nhất, nhưng tôi đã quyết định đăng giải pháp Python tốt nhất của mình.

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

Ung dung:

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

Nó thực sự là 138 byte. Bạn có thể lưu 4 byte bằng cách sử dụng from datetime import*thay vì import datetime as d, timedelta(1)thay vì d.timedelta(1)yieldthay vì return.
nyuszika7h

Tôi đang sử dụng bộ đếm byte trực tuyến ngẫu nhiên, có lựa chọn nào tốt hơn không?
RageCage


Điều gì làm cho cái đó khác với cái này? bytecount.bluebus112.com
RageCage

Cái đó không tính dòng mới, cộng với nó đếm ký tự , không phải byte. Đối với văn bản ASCII, hai cái này giống nhau, vì vậy cái sau không tạo ra sự khác biệt ở đây. Trong code-golf , bạn thường đếm các ký tự trừ khi OP nói khác. (Ngoài ra, kết quả mà tôi đã liên kết là kết quả đầu tiên trong Google cho "số byte" ở đây.)
nyuszika7h

2

JavaScript (ES5) - 94

Nó hy vọng đầu vào biến x, và đặt đầu ra vào 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]}

Đây chỉ là một cắt giảm ban đầu với thuật toán đầu tiên xuất hiện trong tâm trí; Tôi chắc chắn tốt hơn có thể cả về hiệu suất và chiều dài.

Phiên bản này mã hóa phần "hôm nay" (đó là .z.D); thay đổi nó thành một ngày bằng chữ ( yyyy.mm.dd) hoặc một số nguyên trong hệ thống ngày q (ngày kể từ ngày 1 tháng 1 năm 2000) để chạy các trường hợp thử nghiệm. (q sẽ không phân tích ngày theo nghĩa đen sớm hơn đầu thế kỷ thứ mười tám, vì vậy đối với những ngày trước đó, bạn sẽ cần tính ra giá trị và sử dụng trực tiếp số nguyên thích hợp. Ngày 1 tháng 1, "AD 0", từ thông số kỹ thuật, lần lượt ngoài ra -730457, được sử dụng trong mã chức năng. 28 tháng 7, AD 5, từ trường hợp thử nghiệm cuối cùng, hóa ra là -728450.)

Các trường hợp thử nghiệm đã cho:

  {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

chỉnh sửa:

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

Đây là một cách tiếp cận khác nhau, sử dụng một trong các toán tử hội tụ để giảm ngày cho đến khi tìm thấy một số chia hết hoặc nó vượt qua ranh giới 1/1/0000. Nó cũng thực hiện việc chuyển đổi từ ngày sang số nguyên hơi khác nhau.

Các trường hợp thử nghiệm, lần này tất cả cùng một lúc:

  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 byte (mô-đun)

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

Điều này có thể được cô đọng xuống rất nhiều 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 Subcho 139 Byte
Taylor Scott

1

PowerShell - 76

Điều này phụ thuộc vào số lượng được lưu trữ trong biến $n.

try{@(0..$n|%{'{0:yyyyMMdd}'-f(date).AddDays(-$_)}|?{!($_%$n)})[0]}catch{-1}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.