En son ne zaman tarih n tarafından bölündü?


24

Bir tarih, işaretsiz bir tamsayı ile gösterilebilir: YYYYMMDD. Yapmanız gereken, numarası belirli bir numaraya bölünebilen en son tarihi belirleyen en kısa programı veya işlevi yazmaktır n(bugünün tarihini de içeren). Belirtilen tamsayı ile bölünebilen bir tarih (00000101 ile bugün arasında dahil) bir tarih olmadıysa, -1 değerini döndürmelisiniz.

Örnekler

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

Giriş

STDIN'den okuyabilir veya bir fonksiyon argümanı alabilir, hatta girişin bir değişkende saklanmasını bekleyebilirsiniz. Giriş imzasız bir tamsayı olacaktır.

Çıktı

YYYYMMDD biçiminde tarihi temsil eden tamsayıyı STDOUT'a yazın veya geri döndürün (veya değişkene kaydedin).

Kısıtlamalar

Dilinizin sunduğu herhangi bir standart kütüphaneyi kullanabilirsiniz. Standart boşluklar uygulanır.

Kazanma koşulları

Bu bir , yani en küçük program (bayt cinsinden) kazanır. Beraberlik durumunda en fazla oy alan cevap kazanır.


4
00000101 tarihi mevcut değil. 1. tarafından Yılın sayım başlar en.wikipedia.org/wiki/0_%28year%29
edc65

1
@ edc65 varmış gibi yapabilir miyiz?
overactor,

3
Peki ya 29 Şubat? Geçerli tarihleri ​​kontrol etmek için artık yıl kurallarını uygulamamız gerekir mi? en.wikipedia.org/wiki/Leap_year
Digital Trauma

6
Julian-Gregoryen takvim değişikliği nedeniyle kaybedilen günler ne olacak? Yoksa hep Gregoryen mi gidiyoruz? en.wikipedia.org/wiki/Gregorian_calendar
Digital Trauma,

1
Giriş / çıkış özellikleriniz oldukça gevşek. Örneğin, "girişin bir değişkende saklanmasını bekleyin", C gibi bir dilde değişken bildirimini saymalı mı? "Bir program yaz" diyorsunuz, yine de "bir fonksiyon tartışması al" diyorsunuz - bu, tam bir programdan ziyade sadece bir fonksiyon yazabileceğimiz anlamına mı geliyor?
Bob,

Yanıtlar:


16

Mathematica, 93 60 bayt

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

Girilecek girişi bekler n.

Dikey çizginin , 3 bayt (UTF-8) olarak saydığım "bölmeler" için unicode karakteri olduğunu unutmayın .

Düzenleme: şişirilmiş DateStringve biçim belirtimi önlemek için temiz bir hile bulundu :).

Düzenleme:-1 Gereksinimi tamamen unuttum . Şimdi düzeltildi.

İşte bir açıklama

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

Unicode bir monospacing ile uğraştığından açıklama |yerine kullandığımı unutmayın .


+ 1. Unicode karakterleri 3 bayt olarak saymanız gerektiğini gösteren bir bağlantınız var mı?
Dr. belisarius

2
@belisarius OP, bu golf kodunun karakterlerden değil, bayt sayıldığından (bu, wiki etiketinde belirtilen varsayılan değerdir) belirtti.
Martin Ender

Wiki'nin sonundan hiç okumamıştım :) Teşekkürler!
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

Teşekkürler @ chill0r, days = 'u kaldırmak için öneri için, ve try bloğunun bir satıra indirgenebileceğini belirten Jason S.


Evet. Bu standart bir işletim prosedürüdür;). Sekmeler yapıştırdıktan sonra boşluklara dönüştürülür.
Vector

Sen kaldırabilirsiniz days=in t-=d.timedelta(days=1). Bu da iyi çalışıyor (en azından python3)
chill0r

@ bitpwner ah görüyorum, sonra boşver.
Martin Ender

1
Daha fazla tasarruf edebilirsiniz: (1) kullanın int(t.strftime("%Y%m%d"))ve bırakın re, (2) bir satır kullanın tryçünkü yalnızca t-=d.timedelta(1)içinde olması gerekir.
Jason S

1
@bitpwner strftimeeski tarihlerde kontrol python3 çalışır ve ben python2 bir hata olsun
Jason S

5

C # 136

Gözden geçirilmiş teknik özelliklerle, işaretsiz bir int alan ve bir int döndüren bir işlev.

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

Değişken giriş / çıkış ile 152 karakter

Gevşek giriş / çıkış gereksinimlerinden yararlanarak giriş değişkende saklanır n(şu anda tamsayı hariç tüm karakterleri sayar) ve çıkış değişkenle sağlanır 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 ile 204 karakter:

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
Gerçekten, bir aşağı oy? Bu problemi doğru çözmüyor mu? Lütfen açıkla. Eğer biri diğer C # cevabını kopyaladığımı düşünüyorsa, bunu diğerine bir saat kadar önce yazdım ve hatta beyan ifadeleri için C # 6.0 kullanmaya başladım . Biraz saptırdım, bu da cevabı geç göndermeme yol açtı. O zaman bile, bu bir olumsuz oy için oldukça belirsiz bir neden.
Bob,

4

T-SQL (2012) - 148

N değerine sahip bir serbest değişken olduğunu @n varsayalım.

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)

Ungolfed Lua versiyonu,

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
Burada test edilmiştir n = 20140699 çıkış 20140699
William Barbosa

@WilliamBarbosa: Sabit; 20140699, -1 döndürür.
Kyle Kanos

4

MATLAB: 61

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

Bölenin saklandığı varsayılmaktadır n. Sonuç olarak adlandırılan değişkende saklanır ans.


Yorumlanan sürüm:

-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

Sonuç bulunamazsa bir hata üretilecektir, ancak buna rağmen değişkende cevap hala mevcuttur.


Fazladan 2 karakter karşılığında hata önlenebilir:

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

@ MartinBüttner Hmm, bu sorunu çözdü, ancak şimdi çözüm sadece minimum karakterler için bağlı. Herhangi bir gelişme görebiliyor musun?
Dennis Jaheruddin

1
Hayır, başımın üstünden değil. Ama beni yenmene yardım etme motivasyonum biraz sınırlı. ;)
Martin Ender

4

PHP (92 = 85 + 7)

Girilen girişin kaydedilmesini bekler $n.

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

PHP'yi neden sevmediğimi şimdi hatırladım =)

EDIT: Şimdi şartnamelerin -1'i de uygulanmaktadır.


Hayır, sadece kontrol ettim, $ d eko yaparken bir tane çok düşük olacak. Ne demek istiyorsun? (Üzgünüz, ingilizce yerli = yok)
flawr

Oh, bu özelliği görmedim, elbette bu eklenmeli, teşekkürler!
kusur,

3

JavaScript (ES6) 115

N değişkeninde sayı beklenir, r değişkeninde depolanan sonuç. Her gün kontrol edilir, geçerli tarihle başlar ve azalır - daha iyi bir yol olmalı.
Dahası, standart javascript tarih fonksiyonlarını kullanarak, tüm tarihler 1. yıla kadar gregoriandır (gregorian reformundan önce artık yılların yanlış olması nedeniyle).

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 (Veya LINQPad’de 124) n

Bu, girişin değişkende olmasını bekler n. Uygulama sonunda istenen değer değişkende olacaktır r. 00010101Tarihin olmadığı için bu ilk tarih olarak kabul edilir 00000101. İyileştirme için öneriler her zaman beklerim.

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 sürümü:

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

Harika - 301 300 karakter

Çok basit (ve yavaş), Joda Time kullandığı gerçeğini gizlemek için hiçbir hile ile.

golfed:

@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

Örnek çalışma (7/30/2014 tarihinde):

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

Ungolfed:

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

İşe yaramayan bir tarihte iyi şanslar. microbenchmark15 gün öncesine geri dönmenin yaklaşık yarım saniye sürdüğünü bildirdi. 31 Temmuz 2014 itibariyle -1, en azından zarfın arkasına göre tükürmek 20 milyon saniye (~ 23 gün) gibi bir şey alacaktır .

düzenleme : yorumlarda bazı kısayollar


!dd==Fve !z%%ndaha kısa z%%n==0. Ayrıca, as.numeric(gsub("-","",...)bir işleve dönüşmek karakter sayısını da azaltmalıdır. Yine de güzel iş!
plannapus

Oh ve as.realgenellikle iyi, daha kısa bir alternatiftir as.numeric.
plannapus

Maalesef as.real, R 3.0.0'dan itibaren geçersiz. Ama biz hala as.doublebir karakterden daha kısa olanı var .
shadowtalker

Oh, bilmiyordum ki hala R 2.14 kullanıyorum
plannapus

1
Yönetim hakları olan bir bilgisayarda çalışmıyorum, bu yüzden gerçekten bana bağlı değil. Ama ben zaten paste0benim .Rprofiledoğal olarak :) var
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

Ungolfed:

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: Biraz optimize etmeyi başardım, fakat @DennisJaheruddin'ın burada gerçek çözümü var


Bu hala biraz golf olabilir, güncelleyeceğim.
Dennis Jaheruddin

@DennisJaheruddin Bu meta yayına göre düzenlemenizi reddettim . Lütfen bir yorumdaki iyileştirmelerinizi önerin; böylece OP, cevabını değiştirmeden önce bunları gözden geçirebilir.
Martin Ender

Karakterleri çeşitli şekillerde kaydedebileceğinizi unutmayın: Bir işlev yerine bir komut dosyası kullanın, işlerin ans için atanmasına izin verin, döngüyü düşükten yükseğe doğru yapın ve her sonucun önceki sürenin üzerine yazmasına izin verin, böylece döngüyü kırmanız gerekmez . - Tabii ki vectorization da yardımcı olabilir, cevabımı görün .
Dennis Jaheruddin

İşte 67 karakterden oluşan kısa bir döngü sürümü:-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Dennis Jaheruddin

@ MartinBüttner Yorumunuz için teşekkür ederiz. Dediğiniz gibi bir hata oluştu. Şimdi iyi olmalı.
Scott

3

Python 3 - 151 148 bayt, jeneratörler

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)

İçin teşekkürler @ nyuszika7h import*öneri


2

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

Giriş

Değişkende bulunan bölen değerinin olmasını bekler n .

Çıktı

Geri dönüş değeri fFonksiyonun

Çevrimiçi örnek: http://ideone.com/LoYxG4


2

Java: 373 karakter

Bu Groovy cevabının bir liman ve Joda Time kullanır.

golfed:

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

Örnek çalışır (sınıf yolunda joda-time-2.4.jar ile:

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

Ungolfed:

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
Orada da java.time.*Java en son sürümünde.
ntoskrnl

2

Bash + coreutils (8.21), 67 bayt

seq -f-%gday $[9**9]|date -f- +[pq]sp[_1pq]sq%Y%m%ddA1=qd$1%%0=p|dc
  • seqher satıra bir tane olmak üzere 1 ila 9 9 arasında tamsayılar oluşturur ve-<x>day
  • date -fher çizgiyi yorumlayan ve dcböyle bir ifadeye biçimlendirilmiş tarihi [pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p(okunabilirlik için eklenen boşluklar) çıkaran boru
    • [pq] yığının üst kısmını yazdırmak için bir makro tanımlayın, ardından
    • sp Makroyu p kaydına kaydet
    • [pq] -1'e basacak bir makro tanımlayın, yığının üstünü yazdırın, sonra çıkın
    • sq Makroyu kaydetme siciline kaydet q
    • 20140728 gömülü tarih tamsayı
    • d yığının çoğaltılmış
    • A1 101 (00000101)
    • =qpop top 2 yığın değeri: tarih ve 101'i karşılaştır ve qeşitse makro çağır
    • 7 itici bölücü
    • % bölme ve bölme pop, bölme ve kalanı itme
    • 0 0'a bas
    • =p pop top 2 yığın değerleri: kalanı ve 0'ı karşılaştırın ve makroyu çağırın p eşitse
    • d yığının çoğaltılmış
    • Makro pdenir: tarih tamsayısını basar ve dctamamen çıkar
  • dcifadeler dcdeğerlendirme için yayınlanmıştır. Bir kere dcdoğru değeri yazdırır ve çıkar, boru hattının geri kalanı parçalanır

Çıktı:

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

Bu program 1 ila 9 9 arasında tamsayılar ürettiğinden , gelecekte 1 milyon yıldan fazla geçerli olacaktır. Umarım bu sınırlama kabul edilebilir ;-)


Teşekkürler @ WumpusQ.Wumbley -1 dönüşünü kısaltmak için.


@ MartinBüttner Curses! Şimdi, 19 baytlık bir ceza ile :) :)
Digital Trauma,

Boş çıktıyı -1 |grep .||echo -1echo ${$(cmd):-1}

@ WumpusQ.Wumbley Neden bunu düşünmedim? Teşekkürler!
Dijital Travma

1
Bu arada, bu coreutils sürümüne duyarlı görünüyor. Mine (8.15) 1901'den önce "günler önce" spesifikasyonuyla geri dönmeyi reddediyor.

1
Aslında bu bir sizeof time_tsorun gibi görünüyor , çünkü kırıldığı sınır 1/1/1970'den önce 2 ** 31 saniye. Eski kurulumum da acayip 32-bit

2

PYTHON: 134 bayt

Şu anki lideri yenemeyeceksin ve bu en iyi Python cevabından daha iyi değil, ama en iyi Python çözümümü göndermeye karar verdim.

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

Ungolfed:

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

Aslında 138 bayttır. 4 bayt from datetime import*yerine import datetime as d, timedelta(1)yerine d.timedelta(1)ve yieldyerine kullanabilirsiniz return.
nyuszika7h

Rastgele bir çevrimiçi bayt sayacı kullanıyorum, daha iyi bir seçenek var mı?
RageCage 13


Bunu bundan farklı kılan nedir? bytecount.bluebus112.com
RageCage

Bu yeni satır saymaz, ayrıca bayt değil karakter sayar . ASCII metni için ikisi aynıdır, dolayısıyla ikincisi burada bir fark yaratmaz. In kod golf OP aksi söylemediği sürece, genellikle karakterleri saymak. (Ayrıca, bağlantıda bulunduğum bağlantı Google’da burada "bayt sayısı" için ilk sonuçtur .)
nyuszika7h

2

JavaScript (ES5) - 94

Girdiyi değişkende bekler xve çıktıyı içine yerleştirir 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]}

Bu akla gelen ilk algoritma ile sadece bir ilk kesimdir; Hem performans hem de uzunluk açısından daha iyi olabileceğinden eminim.

Bu sürüm "bugün" bölümünü kodlar (bu .z.D); yyyy.mm.ddsınama durumlarını çalıştırmak için onu bir tarih değişkeni ( ) veya q tarih sisteminde (1 Ocak 2000'den günler) bir tam sayı olarak değiştirin. (q, on sekizinci yüzyılın başlarından daha eski olan tarih değişmezlerini ayrıştırmayacaktır, bu nedenle ondan önceki tarihler için değeri hesaplamanız ve uygun tamsayıyı doğrudan kullanmanız gerekir. dışında olması -730457fonksiyon kodunda kullanıldığı,. 28 Temmuz AD 5, son test davadan, olarak çıkıyor -728450.)

Verilen test durumları:

  {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

Düzenle:

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

Bu, yakınsama operatörlerinden birini kullanarak tarihi bölünebilir bir tane bulana veya 1/1/0000 sınırını geçinceye kadar azaltmak için kullanan farklı bir yaklaşımdır. Ayrıca tarihten tamsayıya dönüşüm biraz farklıdır.

Test vakaları, bu sefer bir kerede:

  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 bayt (modül)

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

Bu, 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 Byte'a kadar yoğun bir şekilde yoğunlaştırılabilir
Taylor Scott,

1

PowerShell - 76

Bu, değişkende saklanan sayıya bağlıdır $n.

try{@(0..$n|%{'{0:yyyyMMdd}'-f(date).AddDays(-$_)}|?{!($_%$n)})[0]}catch{-1}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.