Kapan terakhir kali tanggalnya dapat dibagi oleh n?


24

Tanggal dapat diwakili oleh integer yang tidak ditandai seperti itu: YYYYMMDD. Yang perlu Anda lakukan adalah menulis program atau fungsi terpendek yang mencari tahu tanggal terbaru yang jumlahnya dapat dibagi dengan angka yang diberikan n(termasuk tanggal hari ini) dan kemudian mengembalikan tanggal itu dalam format yang ditunjukkan di atas. Jika tidak pernah ada tanggal (antara 00000101 dan hari ini inklusif) yang dapat dibagi oleh bilangan bulat yang diberikan, Anda harus mengembalikan -1.

Contohnya

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

Memasukkan

Anda dapat membaca dari STDIN atau mengambil argumen fungsi atau bahkan berharap input disimpan dalam variabel. Input akan berupa bilangan bulat yang tidak ditandatangani.

Keluaran

Menulis ke STDOUT atau mengembalikan (atau menyimpan dalam variabel) integer yang mewakili tanggal dalam format YYYYMMDD.

Batasan

Anda dapat menggunakan perpustakaan standar apa pun yang ditawarkan bahasa Anda. Celah standar berlaku.

Kondisi menang

Ini adalah , sehingga program terkecil (dalam byte) menang. Dalam kasus seri, jawaban dengan suara terbanyak menang.


4
Tanggal 00000101 tidak ada. Hitungan tahun dimulai oleh 1. en.wikipedia.org/wiki/0_%28year%29
edc65

1
@ edc65 dapatkah kita berpura-pura itu ada?
overactor

3
Bagaimana dengan 29 Feb? Apakah kita perlu menerapkan aturan tahun kabisat penuh untuk memeriksa tanggal yang valid? en.wikipedia.org/wiki/Leap_year
Digital Trauma

6
Bagaimana dengan hari-hari yang hilang karena pergantian kalender Julian-Gregorian? Atau kita akan pergi Gregorian sepanjang jalan? en.wikipedia.org/wiki/Gregorian_calendar
Digital Trauma

1
Input / output spesifikasi Anda agak longgar. Misalnya, haruskah "mengharapkan input disimpan dalam variabel" menghitung deklarasi variabel dalam bahasa seperti C? Anda mengatakan "menulis sebuah program", namun Anda mengatakan "mengambil argumen fungsi" - apakah itu berarti kita dapat menulis hanya fungsi daripada program penuh?
Bob

Jawaban:


16

Mathematica, 93 60 byte

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

Diharapkan input untuk disimpan n.

Perhatikan bahwa garis vertikal adalah karakter unicode untuk "membagi", yang saya hitung sebagai 3 byte (UTF-8).

Sunting: Ditemukan trik yang rapi untuk menghindari DateStringspesifikasi kembung dan format :).

Sunting: Benar-benar lupa tentang -1persyaratan. Diperbaiki sekarang

Berikut ini penjelasannya

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

Perhatikan bahwa saya telah menggunakan |bukannya dalam penjelasan, karena Unicode yang mengacaukan monospacing.


+1. Apakah Anda memiliki tautan yang menunjukkan bahwa Anda harus menghitung karakter unicode sebagai 3 byte?
Dr. belisarius

2
@belisarius OP menyatakan bahwa kode golf ini dihitung dengan byte dan bukan karakter (ini juga merupakan default seperti yang dinyatakan dalam tag wiki).
Martin Ender

Saya tidak pernah membaca sampai akhir wiki :) Terima kasih!
Dr. belisarius

6

Python 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

Terima kasih @ chill0r untuk saran untuk menghapus hari =, dan Jason S untuk tip bahwa blok coba dapat dikurangi menjadi satu baris.


Iya nih. Itu adalah prosedur operasi standar;). Tab dikonversi menjadi spasi setelah ditempelkan.
Vectorized

Anda dapat menghapus days=di t-=d.timedelta(days=1). Ini juga berfungsi dengan baik (setidaknya dalam python3)
chill0r

@ bitpwner ah saya mengerti, sudahlah.
Martin Ender

1
Anda dapat menyimpan lebih banyak: (1) gunakan int(t.strftime("%Y%m%d"))dan lepas re, (2) gunakan satu baris trykarena hanya t-=d.timedelta(1)perlu ada di dalamnya.
Jason S

1
@ bitpwner strftimepada tanggal yang lebih lama berfungsi di python3, diperiksa dan saya mendapatkan kesalahan di python2
Jason S

5

C # 136

Dengan spesifikasi yang direvisi, fungsi yang mengambil int yang tidak ditandatangani dan mengembalikan 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 karakter dengan input / output variabel

Mengambil keuntungan dari persyaratan input / output yang longgar, input harus disimpan dalam variabel n(saat ini menghitung semua karakter kecuali bilangan bulat literal), dan output disediakan dengan variabel 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 karakter dengan 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
Sungguh, downvote? Apakah ini tidak menyelesaikan masalah dengan benar? Tolong jelaskan. Jika ada yang berpikir saya menduplikasi jawaban C # yang lain, saya benar-benar menulis ini sekitar satu jam sebelum yang lain, dan bahkan melihat ke dalam menggunakan C # 6.0 untuk pernyataan deklarasi. Terjadi sedikit sidetracked, yang mengakibatkan posting jawaban terlambat. Meski begitu, itu alasan yang agak lemah untuk downvote.
Bob

4

T-SQL (2012) - 148

Asumsikan ada variabel bebas @n dengan nilai 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)

Versi Lua ungolfed akan menjadi,

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
Diuji di sini n = keluaran 20140699 20140699
William Barbosa

@WilliamBarbosa: Diperbaiki; 20140699 mengembalikan -1.
Kyle Kanos

4

MATLAB: 61

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

Asumsikan pembagi disimpan dalam n. Hasilnya akan disimpan dalam variabel yang disebutans .


Versi yang dikomentari:

-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

Akan menghasilkan kesalahan jika tidak ada hasil ditemukan, tetapi jawabannya masih tersedia dalam variabel meskipun begitu.


Kesalahan dapat dihindari dengan biaya 2 karakter tambahan:

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

@ MartinBüttner Hmm, memecahkan masalah itu tetapi sekarang solusinya hanya terikat untuk karakter minimum. Bisakah Anda melihat peningkatan?
Dennis Jaheruddin

1
Tidak, tidak dari atas kepalaku. Tetapi motivasi saya untuk membantu Anda mengalahkan saya agak terbatas. ;)
Martin Ender

4

PHP (92 = 85 + 7)

Diharapkan input untuk disimpan $n.

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

Saya baru ingat mengapa saya tidak suka PHP lagi =)

EDIT: Sekarang -1 dari spesifikasi juga diterapkan.


Tidak, baru saja diperiksa, $ d akan menjadi terlalu rendah saat echo. Apa yang Anda maksud dengan 'Anda telah menempa'? (Maaf, tidak ada bahasa Inggris =)
flawr

Oh, saya tidak melihat spek itu, tentu saja ini harus ditambahkan, terima kasih!
flawr

3

JavaScript (ES6) 115

Mengharapkan angka dalam variabel n, hasil disimpan dalam variabel r. Setiap hari diperiksa, dimulai dengan tanggal saat ini dan pengurangan - harus ada cara yang lebih baik.
Selain itu, dengan menggunakan fungsi tanggal javascript standar, semua tanggal adalah gregorian hingga tahun 1 (dengan tahun kabisat salah sebelum reformasi 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 (Atau 124 dalam LINQPad) +1 untuk setiap digit dalam n

Ini mengharapkan input berada dalam variabel n. Pada akhir eksekusi, nilai yang diinginkan akan berada dalam variabel r. Ini dianggap 00010101sebagai kencan pertama, karena tanggal 00000101tersebut tidak ada. Saran untuk perbaikan selalu diterima.

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

Versi 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 karakter

Sangat sederhana (dan lambat), tanpa trik untuk menyembunyikan fakta bahwa ia menggunakan Joda Time.

Golf:

@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

Contoh dijalankan (pada 7/30/2014):

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

Tidak Disatukan:

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

Semoga beruntung dengan kencan yang tidak berfungsi. microbenchmarkmelaporkan dibutuhkan sekitar setengah detik untuk kembali 15 hari. Pada 31 Juli 2014, ini akan memakan waktu sekitar 20 juta detik (~ 23 hari) untuk dimuntahkan -1, setidaknya sesuai dengan bagian belakang amplop.

sunting : beberapa pintasan dalam komentar


!dlebih pendek dari d==Fdan !z%%ndari z%%n==0. Juga, menjadikan as.numeric(gsub("-","",...)fungsi harus mengurangi jumlah karakter juga. Tetap saja, pekerjaan bagus!
plannapus

Oh dan as.realsering kali merupakan alternatif yang baik, lebih pendek as.numeric.
plannapus

Sayangnya as.realtidak berfungsi pada R 3.0.0. Tapi kita masih punya as.doublesatu karakter yang lebih pendek.
shadowtalker

Oh saya tidak tahu karena saya masih menggunakan R 2.14
plannapus

1
Saya tidak bekerja di komputer saya memiliki hak administrasi, jadi itu tidak sepenuhnya terserah saya. Tapi saya sudah punya paste0di .Rprofilealami saya :)
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

Tidak Terkumpul:

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: Saya berhasil sedikit mengoptimalkannya, tetapi @DennisJaheruddin memiliki solusi nyata di sini


Ini masih bisa bermain golf sedikit, saya akan memperbaruinya.
Dennis Jaheruddin

@DennisJaheruddin Saya telah menolak suntingan Anda berdasarkan pada posting meta ini . Harap sarankan peningkatan Anda dalam komentar, sehingga OP dapat memeriksanya sebelum mengubah jawabannya.
Martin Ender

Perhatikan bahwa Anda dapat menyimpan karakter dengan berbagai cara: Gunakan skrip alih-alih fungsi, biarkan semuanya ditugaskan ke ans, lakukan perulangan dari rendah ke tinggi dan biarkan setiap hasil menimpa yang sebelumnya sehingga Anda tidak perlu memutus perulangan . - Tentu saja vektorisasi juga dapat membantu, lihat jawaban saya .
Dennis Jaheruddin

Berikut ini adalah versi berbasis loop yang lebih pendek dari 67 karakter:-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Dennis Jaheruddin

@ MartinBüttner Terima kasih atas komentarnya. Ada kesalahan seperti yang Anda katakan. Sekarang seharusnya tidak apa-apa.
Scott

3

Python 3 - 151 148 byte, generator

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)

Terima kasih @ nyuszika7h untuk import*sarannya


2

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

Memasukkan

Mengharapkan nilai pembagi hadir dalam variabel n.

Keluaran

Nilai pengembalian ffungsi

Contoh daring: http://ideone.com/LoYxG4


2

Java: 373 karakter

Ini adalah port dari jawaban Groovy, dan menggunakan Joda Time.

Golf:

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

Sampel berjalan (dengan joda-time-2.4.jar di classpath:

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

Tidak Disatukan:

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
Ada juga java.time.*versi Java terbaru.
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
  • seqmenghasilkan bilangan bulat dari 1 hingga 9 , satu per baris, dan memformatnya sebagai-<x>day
  • pipa ini date -fyang menginterpretasikan setiap baris dan menampilkan tanggal yang diformat menjadi dcekspresi seperti [pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p(spasi ditambahkan untuk dibaca)
    • [pq] tentukan makro untuk mencetak bagian atas tumpukan, lalu keluar
    • sp simpan makro dalam register h
    • [pq] tentukan makro untuk mendorong -1, mencetak bagian atas tumpukan, lalu keluar
    • sq simpan makro dalam register q
    • 20140728 integer tanggal tertanam
    • d duplikat atas tumpukan
    • A1 push 101 (00000101)
    • =qpop top 2 nilai stack: bandingkan tanggal dan 101, dan panggil makro qjika sama
    • 7 dorong pembagi
    • % pembagi pop dan pembagi, membagi dan mendorong sisanya
    • 0 tekan 0
    • =ppop top 2 nilai stack: bandingkan sisa dan 0, dan panggil makro pjika sama
    • d duplikat atas tumpukan
    • makro pdisebut: mencetak integer tanggal dan berhenti dcseluruhnya
  • dcekspresi disalurkan dcuntuk evaluasi. Setelah dcmencetak nilai yang tepat dan berhenti, sisa pipa akan dirobohkan

Keluaran:

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

Sejak program ini menghasilkan bilangan bulat dari 1 sampai 9 9 , maka akan berlaku sampai dengan lebih dari 1 juta tahun ke depan. Saya harap batasan ini dapat diterima ;-)


Terima kasih @ WumpusQ.Wumbley untuk mempersingkat kembalinya -1.


@ MartinBüttner Curses! Sekarang berhasil, dengan penalti 19 byte :)
Digital Trauma

Cara yang lebih pendek untuk mengonversi output kosong menjadi -1: tambahkan |grep .||echo -1ke ujung pipa, atau gunakan zsh di mana Anda dapat membuat sarang ekspansi seperti echo ${$(cmd):-1}(ini akan membebani Anda backslash di tempat lain ...)

@ WumpusQ.Wumbley Mengapa saya tidak memikirkan itu? Terima kasih!
Digital Trauma

1
Ngomong-ngomong, ini sepertinya peka terhadap versi coreutils. Milik saya (8,15) menolak untuk kembali sebelum 1901 dengan spesifikasi "hari yang lalu".

1
Sebenarnya itu tampaknya menjadi sizeof time_tmasalah, karena batas di mana batasnya adalah 2 ** 31 detik sebelum 1/1/1970. Instalasi saya yang lebih lama juga menyedihkan 32-bit

2

PYTHON: 134 byte

Tidak akan bisa mengalahkan pemimpin saat ini, dan itu tidak jauh lebih baik daripada jawaban Python terbaik, tapi saya memutuskan untuk mengirim solusi Python terbaik saya.

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

Tidak Disatukan:

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

Ini sebenarnya 138 byte. Anda dapat menyimpan 4 byte dengan menggunakan from datetime import*bukan import datetime as d, timedelta(1)bukannya d.timedelta(1)dan yieldbukannya return.
nyuszika7h

Saya menggunakan penghitung byte online acak, apakah ada opsi yang lebih baik?
RageCage


Apa yang membuatnya berbeda dari yang ini? bytecount.bluebus112.com
RageCage

Yang itu tidak menghitung baris baru, plus itu menghitung karakter , bukan byte. Untuk teks ASCII, keduanya sama, jadi yang terakhir tidak membuat perbedaan di sini. Dalam kode-golf , Anda biasanya menghitung karakter kecuali OP mengatakan sebaliknya. (Juga, yang saya tautkan adalah hasil pertama di Google untuk "jumlah byte" di sini.)
nyuszika7h

2

JavaScript (ES5) - 94

Ia mengharapkan input dalam variabel x, dan menempatkan output dalam 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]}

Ini hanya potongan awal dengan algoritma pertama yang muncul di pikiran; Saya yakin lebih baik mungkin dalam performa dan panjang.

Versi ini mengubah kode bagian "hari ini" (itulah .z.D); ubah ke tanggal literal ( yyyy.mm.dd) atau bilangan bulat dalam sistem tanggal q (hari sejak 1 Januari 2000) untuk menjalankan test case. (q tidak akan menguraikan literal tanggal lebih awal dari awal abad kedelapan belas, jadi untuk tanggal sebelum itu, Anda harus menghitung nilainya dan menggunakan bilangan bulat yang tepat secara langsung. 1 Januari, "0 AD", dari spec, belokan out to be -730457, yang digunakan dalam kode fungsi. 28 Juli, 5 M, dari test case terakhir, ternyata -728450.)

Kasus uji yang diberikan:

  {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

edit:

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

Ini adalah pendekatan yang berbeda yang menggunakan salah satu operator konvergensi untuk mengurangi tanggal sampai menemukan tanggal yang dapat dibagi atau melintasi batas 1/1/0000. Itu juga melakukan konversi dari tanggal ke bilangan bulat sedikit berbeda.

Kasing uji, kali ini sekaligus:

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

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

Ini bisa menjadi sangat padat hingga 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 Bytes
Taylor Scott

1

PowerShell - 76

Ini tergantung pada jumlah yang disimpan dalam variabel $n.

try{@(0..$n|%{'{0:yyyyMMdd}'-f(date).AddDays(-$_)}|?{!($_%$n)})[0]}catch{-1}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.