เมื่อครั้งสุดท้ายที่วันที่ถูกหารด้วย 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_%28 ปีที่ผ่านมา
29

1
@ edc65 เราสามารถทำเป็นว่ามันมีอยู่จริงได้ไหม?
overactor

3
แล้ววันที่ 29 กุมภาพันธ์ล่ะ เราจำเป็นต้องใช้กฎการกระโดดแบบเต็มปีเพื่อตรวจสอบวันที่ที่ถูกต้อง en.wikipedia.org/wiki/Leap_year
Digital Trauma

6
สิ่งที่เกี่ยวกับวันที่หายไปเนื่องจากการเปลี่ยนปฏิทิน Julian-Gregorian หรือเรากำลังจะเกรกอเรียนตลอดทาง? en.wikipedia.org/wiki/Gregorian_calendar
Digital Trauma

1
ข้อมูลจำเพาะอินพุต / เอาต์พุตของคุณค่อนข้างหลวม ตัวอย่างเช่น "คาดว่าอินพุตจะถูกเก็บไว้ในตัวแปร" ควรนับการประกาศตัวแปรในภาษาเช่น C หรือไม่? คุณพูดว่า "เขียนโปรแกรม" แต่คุณบอกว่า "รับฟังก์ชั่นการโต้แย้ง" - นั่นหมายความว่าเราสามารถเขียนได้แค่ฟังก์ชั่นมากกว่าโปรแกรมเต็มหรือ
Bob

คำตอบ:


16

Mathematica, 93 60 ไบต์

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

nคาดว่าการป้อนข้อมูลจะถูกเก็บไว้ใน

โปรดสังเกตว่าเส้นแนวตั้งเป็นตัวอักษรยูนิโค้ดสำหรับ "หาร" ซึ่งฉันนับเป็น 3 ไบต์ (UTF-8)

แก้ไข:พบเคล็ดลับเรียบร้อยเพื่อหลีกเลี่ยงการกำหนด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. *)

โปรดทราบว่าฉันใช้|แทนคำอธิบายเพราะ Unicode หนึ่งยุ่งกับ monospacing


+ 1. คุณมีลิงค์ที่ชี้ให้เห็นว่าคุณควรนับ unicode chars เป็น 3 ไบท์หรือไม่?
ดร. เบลิซาเรียส

2
@belisarius OP ระบุว่ากอล์ฟรหัสนี้ถูกนับเป็นไบต์และไม่ใช่อักขระ (นี่เป็นค่าเริ่มต้นตามที่ระบุไว้ใน tag wiki)
Martin Ender

ฉันไม่เคยอ่านจนจบวิกิ :) ขอบคุณ!
ดร. เบลิซาเรียส

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

ขอบคุณ @ chill0r สำหรับคำแนะนำในการลบ days = และ Jason S สำหรับเคล็ดลับที่สามารถลดจำนวนบล็อกการลองเป็นหนึ่งบรรทัด


ใช่. นั่นคือขั้นตอนการดำเนินงานมาตรฐาน;) แท็บจะถูกแปลงเป็นช่องว่างหลังจากการวาง
Vectorized

คุณสามารถลบในdays= t-=d.timedelta(days=1)วิธีนี้ใช้ได้ดีเช่นกัน (อย่างน้อยใน python3)
chill0r

@ bitpwner อ่าเข้าใจแล้วไม่เป็นไร
Martin Ender

1
คุณสามารถประหยัดได้มากขึ้น: (1) ใช้int(t.strftime("%Y%m%d"))และวางre(2) ใช้หนึ่งบรรทัดtryเพราะt-=d.timedelta(1)ต้องการเพียงแค่อยู่ในนั้น
Jason S

1
@bitpwner strftimeในวันเก่าที่ทำงานใน python3, ตรวจสอบและฉันจะได้รับข้อผิดพลาดใน python2
เจสัน 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";}}}

204 ตัวอักษรด้วย 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
จริง ๆ แล้ว downvote? สิ่งนี้ไม่ได้แก้ปัญหาอย่างถูกต้องหรือไม่ กรุณาอธิบาย. หากใครคิดว่าฉันทำซ้ำคำตอบ 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

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)

รุ่น 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อืมแก้ไขปัญหานั้นแล้ว แต่ตอนนี้การแก้ปัญหาจะเชื่อมโยงกับตัวอักษรขั้นต่ำเท่านั้น คุณเห็นการปรับปรุงบ้างไหม?
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 จะต่ำเกินไปเมื่อทำการสะท้อน 'คุณปลอม' คุณหมายถึงอะไร (ขออภัยไม่มีเจ้าของภาษาอังกฤษ =)
ข้อบกพร่อง

โอ้ฉันไม่เห็นสเป็คนั้นแน่นอนว่าต้องเพิ่มอีกด้วยขอบคุณ!
ข้อบกพร่อง

3

JavaScript (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 (หรือ 124 ใน LINQPad) + 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

Groovy - 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

ตัวอย่าง run (วันที่ 7/30/2557):

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

ขอให้โชคดีกับวันที่ไม่ทำงาน microbenchmarkรายงานจะใช้เวลาประมาณครึ่งวินาทีในการย้อนกลับไป 15 วัน ณ วันที่ 31 กรกฎาคม 2014 สิ่งนี้จะใช้เวลาประมาณ 20 ล้านวินาที (~ 23 วัน) ในการคายออก-1อย่างน้อยตามด้านหลังของซองจดหมาย

แก้ไข : ทางลัดบางอย่างในความคิดเห็น


!dจะสั้นกว่าd==Fและมากกว่า!z%%n z%%n==0นอกจากนี้การทำas.numeric(gsub("-","",...)ฟังก์ชั่นควรลดจำนวนตัวอักษรเช่นกัน ยังคงเป็นงานที่ดี!
plannapus

โอ้และมักจะเป็นที่ดีอีกทางเลือกหนึ่งที่สั้นลงas.real as.numeric
plannapus

น่าเสียดายที่as.realหมดอายุเมื่อ R 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

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

แก้ไข: ฉันจัดการเพื่อเพิ่มประสิทธิภาพเล็กน้อย แต่ @DennisJaheruddin มีทางออกที่แท้จริงที่นี่


สิ่งนี้ยังคงสามารถเล่นกอล์ฟได้ฉันจะอัปเดต
Dennis Jaheruddin

@DennisJaheruddin ฉันได้ปฏิเสธการแก้ไขของคุณตามโพสต์เมตานี้ กรุณาแนะนำการปรับปรุงของคุณในความคิดเห็นเพื่อให้ OP สามารถตรวจสอบพวกเขาก่อนที่จะแก้ไขคำตอบของเขา
Martin Ender

โปรดทราบว่าคุณสามารถบันทึกตัวอักษรได้หลายวิธี: ใช้สคริปต์แทนที่จะใช้ฟังก์ชั่นปล่อยให้สิ่งต่าง ๆ ถูกกำหนดให้กับ ans ทำลูปจากต่ำไปสูงและให้ผลลัพธ์แต่ละรายการเขียนทับก่อนหน้านี้ . - ของ vectorization แน่นอนยังสามารถช่วยเหลือให้ดูคำตอบของฉัน
Dennis Jaheruddin

นี่คือลูปที่สั้นกว่ารุ่น 67 ตัวอักษร:-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Dennis Jaheruddin

@ MartinBüttnerขอบคุณสำหรับความคิดเห็น มีข้อผิดพลาดตามที่คุณพูด ตอนนี้มันน่าจะโอเค
สกอตต์

3

Python 3 - 151 148 bytes เครื่องปั่นไฟ

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)

ขอบคุณ @ nyuszika7h สำหรับimport*คำแนะนำ


2

ทับทิม 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}

อินพุต

nคาดว่าค่าตัวหารที่จะนำเสนอในตัวแปร

เอาท์พุต

ค่าส่งคืนของfฟังก์ชัน

ตัวอย่างออนไลน์: http://ideone.com/LoYxG4


2

Java: 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 บน classpath:

$ 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
นอกจากนี้ยังjava.time.*มี Java เวอร์ชันล่าสุด
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
  • seqสร้างจำนวนเต็มตั้งแต่ 1 ถึง 9 9หนึ่งรายการต่อบรรทัดและจัดรูปแบบเป็น-<x>day
  • ไพพ์นี้date -fซึ่งตีความแต่ละบรรทัดและส่งออกวันที่จัดรูปแบบเป็นdcนิพจน์เช่น[pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p(ช่องว่างที่เพิ่มเข้ามาสำหรับการอ่าน)
    • [pq] กำหนดแมโครเพื่อพิมพ์ส่วนบนสุดของสแต็กจากนั้นออก
    • sp บันทึกมาโครใน register p
    • [pq] กำหนดแมโครเพื่อกด -1 พิมพ์ด้านบนสุดของสแต็กจากนั้นออก
    • sq บันทึกมาโครใน register q
    • 20140728 จำนวนเต็มวันที่ฝัง
    • d ซ้ำด้านบนของสแต็ก
    • A1 กด 101 (00000101)
    • =qป๊อปอัพ 2 ค่าสแต็ค: เปรียบเทียบวันที่และ 101 และเรียกมาโครqถ้าเท่ากับ
    • 7 กดตัวแบ่ง
    • % ตัวแบ่งป๊อปอัพและหารหารและกดส่วนที่เหลือ
    • 0 กด 0
    • =pป๊อปอัพ 2 ค่าสแต็ก: เปรียบเทียบส่วนที่เหลือและ 0 และเรียกแมโครpถ้าเท่ากับ
    • d ซ้ำด้านบนของสแต็ก
    • แมโครpเรียกว่า: พิมพ์จำนวนเต็มวันที่และออกจากdcทั้งหมด
  • dcนิพจน์ถูกส่งไปยังdcเพื่อการประเมินผล เมื่อ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 สำหรับการย่อคืน -1


@ MartinBüttnerคำสาป! ตอนนี้มันไม่มีโทษ 19 ไบต์ :)
ดิจิตอลบาดเจ็บ

วิธีที่สั้นกว่าในการแปลงเอาต์พุตว่างเป็น -1: เพิ่ม|grep .||echo -1ไปยังจุดสิ้นสุดของecho ${$(cmd):-1}

@ WumpusQ.Wumbley ทำไมฉันไม่คิดอย่างนั้นล่ะ ขอบคุณ!
บาดเจ็บทางดิจิตอล

1
โดยวิธีการนี้ดูเหมือนว่าจะมีความไวต่อรุ่น coreutils Mine (8.15) ปฏิเสธที่จะกลับไปก่อนปี 1901 ด้วยข้อกำหนด "วันที่ผ่านมา"

1
ที่จริงแล้วดูเหมือนจะเป็นsizeof time_tปัญหาเนื่องจากขอบเขตที่มันแบ่งเป็น 2 ** 31 วินาทีก่อน 1/1/1970 การติดตั้งรุ่นเก่าของฉันก็น่าสงสาร 32-bit

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

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

จริง ๆ แล้วเป็น 138 ไบต์ คุณสามารถบันทึก 4 ไบต์โดยใช้from datetime import*แทนimport datetime as d, timedelta(1)แทนd.timedelta(1)และแทนyield return
nyuszika7h

ฉันใช้ตัวนับออนไลน์แบบสุ่มมีตัวเลือกที่ดีกว่านี้หรือไม่
RageCage


อะไรที่ทำให้แตกต่างจากอันนี้ bytecount.bluebus112.com
RageCage

อันนั้นจะไม่นับบรรทัดใหม่รวมถึงจะนับตัวอักษรไม่ใช่ไบต์ สำหรับข้อความ ASCII ทั้งสองเหมือนกันดังนั้นหลังจึงไม่สร้างความแตกต่างที่นี่ ในcode-golfคุณมักนับจำนวนตัวอักษรยกเว้นว่า OP พูดอย่างอื่น (นอกจากนี้สิ่งที่ฉันเชื่อมโยงเป็นผลลัพธ์แรกใน Google สำหรับ"จำนวนไบต์"ที่นี่)
nyuszika7h

2

JavaScript (ES5) - 94

โดยคาดว่าการป้อนข้อมูลในตัวแปรและสถานที่การส่งออกในxo

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

นี่เป็นเพียงการตัดครั้งแรกด้วยอัลกอริทึมแรกที่นึกถึง ฉันแน่ใจว่าดีกว่าเป็นไปได้ทั้งในประสิทธิภาพและความยาว

รุ่นนี้ hardcodes ส่วน "วันนี้" (นั่นคือ.z.D); เปลี่ยนเป็นตัวอักษรวันที่ ( yyyy.mm.dd) หรือจำนวนเต็มในระบบ q date (วันตั้งแต่ 1 มกราคม 2000) เพื่อเรียกใช้กรณีทดสอบ (q จะไม่แยกตัวอักษรวันที่เร็วกว่าศตวรรษที่สิบแปดต้นดังนั้นสำหรับวันที่ก่อนหน้านั้นคุณจะต้องทำงานออกค่าและใช้จำนวนเต็มที่เหมาะสมโดยตรง 1 มกราคม "AD 0" จากสเป็คเปลี่ยน ออกมาเป็น-730457ซึ่งจะใช้ในรหัสฟังก์ชั่น 28 กรกฎาคม AD 5 จากกรณีทดสอบที่ผ่านมากลายเป็น-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 Bytes
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.