ช่วงวันที่หลัก


16

หมายเหตุ: เนื่องจากฉันเป็นชาวดัตช์ตัวเองวันที่ทั้งหมดอยู่ในdd-MM-yyyyรูปแบบดัตช์ในคำอธิบายการท้าทายและกรณีทดสอบ

ท้าทาย:

อินพุต:
วันที่เริ่มต้นs ; วันที่สิ้นสุดe ; ตัวเลขn

เอาท์พุท:
วันที่ทั้งหมดอยู่ในช่วง[s,e] (รวมทั้งสองด้าน) ซึ่งมีจำนวนเฉพาะจำนวนnหลักในวันที่

ตัวอย่าง:

อินพุต:วันที่เริ่ม: 12-11-1991; วันที่สิ้นสุด: 02-02-1992; หลัก:4

ผลลัพธ์:
ด้วย 0s ชั้นนำสำหรับวัน / เดือน:

[20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 01-12-1991, 02-12-1991, 09-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 01-01-1992, 02-01-1992, 09-01-1992, 10-01-1992, 11-01-1992, 12-01-1992, 19-01-1992, 20-01-1992, 21-01-1992, 22-01-1992, 29-01-1992, 01-02-1992, 02-02-1992]

ไม่มีการนำ 0s สำหรับวัน / เดือน:

[20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 3-12-1991, 4-12-1991, 5-12-1991, 6-12-1991, 7-12-1991, 8-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 3-1-1992, 4-1-1992, 5-1-1992, 6-1-1992, 7-1-1992, 8-1-1992, 10-1-1992, 13-1-1992, 14-1-1992, 15-1-1992, 16-1-1992, 17-1-1992, 18-1-1992, 20-1-1992, 23-1-1992, 24-1-1992, 25-1-1992, 26-1-1992, 27-1-1992, 28-1-1992, 31-1-1992]

กฏท้าทาย:

  • วันที่อินพุตและเอาต์พุตอาจอยู่ในรูปแบบที่เหมาะสม (date-) สามารถเป็นสตริงได้ในทุก ๆdMyรูปแบบ (รวมถึงตัวคั่นที่เลือกได้), รายการจำนวนเต็มสามจำนวน, Date-object ดั้งเดิมของภาษาของคุณ ฯลฯ เอาต์พุตอาจเป็นรายการ / อาร์เรย์ / สตรีม, พิมพ์ไปยัง STDOUT, สตริงที่มีตัวคั่นเดี่ยว ฯลฯ
  • คุณได้รับอนุญาตให้รวมหรือไม่รวม 0s นำหน้าสำหรับวัน / เดือนในผลงานของคุณ โปรดระบุว่าคุณใช้คำตอบใดในสองข้อเนื่องจากจะทำให้เกิดผลลัพธ์ที่แตกต่างกัน Ie 1-1-1991มี 2 ​​หลักที่ไม่ซ้ำกัน แต่01-01-1991เป็น 3 หลักที่ไม่ซ้ำกัน
  • คุณไม่ต้องจัดการกับปีอธิกสุรทินและความแตกต่างของปฏิทินเกรโกเรียนเทียบกับจูเลียน คุณสามารถสันนิษฐานได้ว่าช่วงวันที่ที่ระบุในกรณีทดสอบจะไม่เกินวันที่ 28 กุมภาพันธ์ / 1 มีนาคมสำหรับปีหารด้วย 4
  • ตัวเลขอินพุตnรับประกันได้ว่าอยู่ในช่วง[1,8]ดังนั้นการจัดการกับn=0จะไม่ได้รับการระบุ (การส่งคืนรายการเปล่าจะสมเหตุสมผลที่สุด แต่การให้ข้อผิดพลาดหรือผลลัพธ์ที่ไม่ถูกต้องก็เป็นเรื่องดีเช่นกัน ไม่ต้องจัดการกับอินพุตนั้น)

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • ใช้กฎมาตรฐานสำหรับคำตอบของคุณพร้อมกับกฎ I / O เริ่มต้นดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีพร้อมพารามิเตอร์ที่เหมาะสมและประเภทผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงก์พร้อมทดสอบรหัสของคุณ (เช่นTIO )
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ:

Inputs: [12-11-1991, 02-02-1992], 4
Outputs with leading 0s:    [20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 01-12-1991, 02-12-1991, 09-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 01-01-1992, 02-01-1992, 09-01-1992, 10-01-1992, 11-01-1992, 12-01-1992, 19-01-1992, 20-01-1992, 21-01-1992, 22-01-1992, 29-01-1992, 01-02-1992, 02-02-1992]
Outputs without leading 0s: [20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 3-12-1991, 4-12-1991, 5-12-1991, 6-12-1991, 7-12-1991, 8-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 3-1-1992, 4-1-1992, 5-1-1992, 6-1-1992, 7-1-1992, 8-1-1992, 10-1-1992, 13-1-1992, 14-1-1992, 15-1-1992, 16-1-1992, 17-1-1992, 18-1-1992, 20-1-1992, 23-1-1992, 24-1-1992, 25-1-1992, 26-1-1992, 27-1-1992, 28-1-1992, 31-1-1992]

Inputs: [19-09-2019, 30-09-2019], 5
Outputs (same with and without leading 0s): [23-09-2019, 24-09-2019, 25-09-2019, 26-09-2019, 27-09-2019, 28-09-2019, 30-09-2019]

Inputs: [19-09-2019, 30-09-2019], 8
Output (same with and without leading 0s): []

Inputs: [20-06-1749, 30-06-1749], 8
Outputs with leading 0s:    [23-06-1749, 25-06-1749, 28-06-1749]
Outputs without leading 0s: []

Inputs: [10-12-1969, 12-01-1970], 6
Outputs (same with and without leading 0s): [30-12-1969]

Inputs: [10-12-1969, 12-01-1970], 5
Outputs with leading 0s:    [10-12-1969, 13-12-1969, 14-12-1969, 15-12-1969, 17-12-1969, 18-12-1969, 20-12-1969, 23-12-1969, 24-12-1969, 25-12-1969, 27-12-1969, 28-12-1969, 31-12-1969, 02-01-1970, 03-01-1970, 04-01-1970, 05-01-1970, 06-01-1970, 08-01-1970, 12-01-1970]
Outputs without leading 0s: [10-12-1969, 13-12-1969, 14-12-1969, 15-12-1969, 17-12-1969, 18-12-1969, 20-12-1969, 23-12-1969, 24-12-1969, 25-12-1969, 27-12-1969, 28-12-1969, 31-12-1969, 2-1-1970, 3-1-1970, 4-1-1970, 5-1-1970, 6-1-1970, 8-1-1970, 12-1-1970]

Inputs: [11-11-1111, 11-11-1111], 1
Output (same with and without leading 0s): [11-11-1111]

ฉันรู้ว่ามันไม่ใช่รูปแบบที่เรียกร้องโดยเฉพาะ แต่ฉันแค่แสดงความคิดเห็นที่นี่เพื่อ "กระจายคำ": มีมาตรฐานสากลที่โปรแกรมเมอร์ควรพยายามใช้สำหรับวันที่ (ในบันทึกชื่อไฟล์ ฯลฯ ): en.wikipedia.org / (ใช้ 'T' เพื่อ desambiguate (โดยไม่มี T วันที่ + เวลาอาจเป็นอย่างอื่นทั้งหมด) และระบุตัวคั่นที่จะใช้และเมื่อไม่มีใครสามารถใช้ตัวคั่น [เช่นเสนอตัวแปรที่แตกต่างกัน (จากสั้นถึงยาว) ของเดียวกัน มาตรฐาน]: สิ่งที่สำคัญที่สุดคือ: YYYY-MM-DDThh:mm:ss.mmm +hh:mm, + hh: mm เป็นเวลาของสถานที่ของคุณซึ่งได้รับการชดเชยจาก UTC)
Olivier Dulac

คำตอบ:


2

Japt 23 ไบต์

รับอินพุตวันที่เป็นเวลาประทับของ Unix ส่งออกอาร์เรย์ของสตริงด้วยการจัดรูปแบบและการนำ0ขึ้นอยู่กับสถานที่ของคุณ จะสั้นกว่า 1 ไบต์ใน Japt v2 แต่ดูเหมือนว่าจะมีข้อบกพร่องเมื่อแปลงDateวัตถุเป็นสตริง

òV864e5@ÐX s7Ãf_¬â ʶWÄ

ลองมัน

òV864e5@ÐX s7Ãf_¬â ʶWÄ     :Implicit input of integers U=s,V=e & W=n
òV                          :Range [U,V]
  864e5                     :  With step 86,400,000 (24*60*60*1000)
       @                    :Map each X
        ÐX                  :  Convert to Date object
           s7               :  Convert to locale date string
             Ã              :End map
              f             :Filter
               _            :By passing each through the following function
                ¬           :  Split
                 â          :  Deduplicate
                   Ê        :  Length
                    ¶       :  Is equal to
                     WÄ     :  W+1, to account for the inclusion of the delimiting "/" or "-"


3

สีแดง 93 ไบต์

func[a b n][until[if n = length? exclude d: rejoin[a/4"-"a/3"-"a/2]"-"[print d]b < a: a + 1]]

ลองออนไลน์!

ไม่มีการนำ 0s สำหรับวัน / เดือน

น่าเสียดายที่Redแปลงภายใน09-10-2019เป็น9-Oct-2019- นั่นเป็นเหตุผลที่ฉันต้องแยกวัน / เดือน / ปีเป็นรายบุคคล


ฉันไม่คุ้นเคยกับเรด แต่ดูเหมือนว่ามีช่องว่างมากมายที่สามารถตัดออกจากสิ่งนี้ได้ ให้อภัยฉันถ้าฉันผิด
connectyourcharger

@connectyourcharger ไม่มีปัญหา! ดูเหมือนว่ามีช่องว่างที่ไม่จำเป็นหลายแห่ง แต่พวกเขาจำเป็นต้องแยกโทเค็น คำ (ตัวระบุ) ในสีแดงสามารถรวม-=+*<>?!~&ได้นั่นคือสาเหตุที่ต้องการพื้นที่ว่าง (หรือ(...)[...]"...")
Galen Ivanov

2

Python 3.8 (เผยแพร่ล่วงหน้า) , 84 ไบต์

-6 ไบต์ขอบคุณ Gloweye

lambda s,e,n:[d for i in range((e-s).days+1)if-len(set(d:=str(s+type(e-s)(i))))==~n]

ฟังก์ชั่นที่ไม่มีชื่อซึ่งจะส่งคืนรายการสตริง (การนับ / รวมศูนย์นำหน้า) ที่ยอมรับอาร์กิวเมนต์สามตัว:

  • sการเริ่มต้น -datetime.dateวัตถุ
  • eที่ปลาย - เป็นdatetime.dateวัตถุ และ
  • nจำนวนวัน - intวัตถุ

ลองออนไลน์!

หมายเหตุ: ในขณะที่ฟังก์ชั่นยอมรับdatetime.dateวัตถุฉันไม่ได้นับรหัสการนำเข้าสำหรับสิ่งนั้น (และทำงานเกี่ยวกับการนำเข้าdatetime.timedeltaวัตถุเนื่องจากสามารถเข้าถึงได้ทางอ้อมผ่านการลบวัตถุอินพุตเหล่านี้)


1
type(obj)คือ 3 obj.__class__ไบต์สั้นกว่า
Gloweye

@Gloweye ขอบคุณมาก!
Jonathan Allan

@Gloweye บันทึก 6 ในที่สุด (จุดไปและวงเล็บอยู่แล้ว)
Jonathan Allan

1
ฉันยังไม่ได้วิเคราะห์ความลึกนั้นเพียงแค่เห็น__class__และแสดงความคิดเห็นอย่างรวดเร็ว ยินดีให้ความช่วยเหลือเสมอ
Gloweye

1

JavaScript (ES6), 91 ไบต์

รับอินพุตเป็น(n)(end)(start)โดยที่วันที่คาดว่าจะเป็นเวลาประทับ Unix เป็นมิลลิวินาที ส่งคืนรายการวันที่คั่นด้วยช่องว่างในรูปแบบyyyy-mm-ddส่งกลับรายการพื้นที่ที่คั่นของวันที่ในรูปแบบ

รวม 0 นำ

n=>b=>g=a=>a>b?'':(new Set(d=new Date(a).toJSON().split`T`[0]).size+~n?'':d+' ')+g(a+864e5)

ลองออนไลน์!


1
ตัวอย่างนี้อาจล้มเหลวหากมีการเปลี่ยน DST (A + 864e5 อาจไม่ใช่พรุ่งนี้ในกรณีนี้) แต่โชคดีที่ใช้เขตเวลา UTC ซึ่งไม่มี DST - จากคนที่ใช้ตรรกะเดียวกันในเว็บไซต์ของผลิตภัณฑ์และตระหนักถึงสิ่งผิดปกติจนกระทั่งเวลาเปลี่ยน ...
TSH

1

PHP , 90 ไบต์

for([,$s,$e,$n]=$argv;$s<=$e;)$n-count(count_chars($d=date(Ymd,86400*$s++),1))||print$d._;

ลองออนไลน์!

นี่คือกับ 0s ชั้นนำ อินพุตเป็นอาร์กิวเมนต์คำสั่ง ( $argv) และวันที่เป็นเวลาประทับของ Unix เป็นวัน (โดยทั่วไปคือวินาทีมาตรฐาน / 86400) ฉันใช้รูปแบบนี้เนื่องจากเราไม่ต้องการเวลาในการท้าทายนี้และทำให้ฉันสามารถเล่นได้อีก 1 ไบต์ เก็บเพิ่มวันที่จะเริ่มต้นจนกว่าจะถึงจุดสิ้นสุดและพิมพ์วันที่ใด ๆ กับ$nตัวเลขที่ไม่ซ้ำกันในนั้นแยกจากกันโดย_ในYmdรูปแบบ

นอกจากนี้ยังมีตัวเลือก 89 ไบต์ซึ่งพิมพ์วันที่เพื่อส่งออกในรูปแบบเดียวกับอินพุต (การประทับเวลา Unix เป็นวัน)


1

Java (JDK) , 86 ไบต์

(s,e,n)->s.datesUntil(e.plusDays(1)).filter(d->(""+d).chars().distinct().count()==n+1)

ลองออนไลน์!

ฉันเลือกที่จะใช้0s นำ

เครดิต

  • -24 ต้องขอบคุณเควินครุยเซอร์ที่ไม่ทราบว่าเขาสามารถตีกอล์ฟออกไปได้มากขนาดไหน: p

1
บางทีผมอาจจะไม่ได้ทำให้มัน Inclusive ที่ปลายทั้งสองแล้วคุณจะได้ใช้ Java 9 datesUntilสำหรับ103 ไบต์ ;) คำตอบที่ดี ฉันไม่เห็นสิ่งใดที่สามารถเล่นกอล์ฟเป็นการส่วนตัวได้
Kevin Cruijssen

1
@KevinCruijssen เอ่อจริง ๆ แล้วคุณเล่นกอล์ฟเป็นวิธีที่ดีมาก! เพียงเพิ่ม.plusDays(1)และลบ.forEach(System.out::println)คำตอบนั้นเป็นคำตอบที่ได้อย่างมากเพราะตามที่คุณเขียนคุณสามารถส่งคืนวันที่ได้เมื่ออนุญาตวัตถุและลำธารที่มีค่า ;-) ฉันไม่มีเงื่อนงำที่datesUntilมีอยู่! ขอบคุณสำหรับสิ่งนั้น :-)
Olivier Grégoire

ว้าวลืมกฎของตัวเองที่ยอมให้กระแสคืนมาฮ่าฮ่า XD ฉันเป็นคนงี่เง่า แต่ดีใจที่ฉันสามารถช่วยคุณด้วยความงี่เง่าของฉัน ; p
Kevin Cruijssen

1

Ruby -rdate , 54 ไบต์

รับวัตถุวันที่ 2 และตัวเลขเป็นอินพุตและส่งกลับรายการของวัตถุวันที่เป็นผลลัพธ์ จัดการกับปีอธิกสุรทินและใช้เลขศูนย์นำหน้า

->a,b,n{(a..b).select{|d|d.to_s.chars.uniq.size==n+1}}

ลองออนไลน์!


1

C # (Visual C # Interactive คอมไพเลอร์)

ไม่มีการนำ 0s, 104 , 103 bytes

(s,e,n)=>new int[(e-s).Days+1].Select((x,i)=>s.AddDays(i)).Where(x=>$"{x:yyyMd}".Distinct().Count()>=n)

ลองออนไลน์!

ด้วยการนำหน้า 0s, 106 105 ไบต์

(s,e,n)=>new int[(e-s).Days+1].Select((x,i)=>s.AddDays(i)).Where(x=>$"{x:yyyMMdd}".Distinct().Count()>=n)

ลองออนไลน์!


คุณสามารถลบช่องว่างที่x =>$"ทั้งสองเวอร์ชันสำหรับ -1 :)
Kevin Cruijssen

@KevinCruijssen อามีเพศสัมพันธ์ขอบคุณ x) ฉันแน่ใจว่าบางคนสามารถหาวิธีแก้ปัญหาที่สั้นกว่านี้เช่นกันฉันไม่พอใจกับสิ่งนี้
Innat3

0

Kotlin, 119 ไบต์

fun f(a:LocalDate,b:LocalDate,c:Long)=a.datesUntil(b.plusDays(1)).filter{it.toString().chars().distinct().count()==c+1}

โดยไม่ต้อง 0s ชั้นนำจะใช้เวลาในสองjava.time.LocalDateและLong, ส่งกลับStreamของLocalDates


สวัสดียินดีต้อนรับสู่ CCGC! คุณสามารถเพิ่มลิงค์ลองออนไลน์ด้วยรหัสทดสอบเพื่อตรวจสอบว่ามันใช้งานได้หรือไม่ นอกจากนี้ฉันไม่รู้ Kotlin แต่สามารถแทนที่it.toString()ด้วย(it+"")เพื่อบันทึกไม่กี่ไบต์ได้หรือไม่ ฉันรู้ว่ามันเป็นไปได้ในภาษาอื่นเช่น Java หรือ. NET C #
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.