ลดความซับซ้อนของวันที่


9

สิ่งนี้คล้ายกับเศษส่วนที่ทำให้ง่ายขึ้น แต่ใช้วันที่!

อินพุตของโปรแกรมของคุณจะต้องเป็นของแบบฟอร์มmm/dd ตัวอย่างเช่น

3/4 //March 4
12/15 //December 15
1/1 // January 1

เราคิดว่าข้อมูลจะถูกต้องเช่นเดือนที่มีจำนวนวันเหล่านี้:

January 31
February 28
March 31
April 30
May 31
June 30
July 31
August 31
September 30
October 31
November 30
December 31

งานของโปรแกรมของคุณคือการป้อนข้อมูลที่ถูกต้องสันนิษฐานและซ้ำแล้วซ้ำอีก (หรือเรียกซ้ำ) ทำให้วันที่ง่ายขึ้นและในแต่ละการวนซ้ำ (รวมทั้ง 0) ส่งออกวันที่ด้วยชื่อเต็มของเดือนตามที่เขียนไว้ด้านบน

ตัวอย่างเช่น:

รับอินพุต:

12/18

จะเอาท์พุท

December 18
June 9
February 3

อินพุตที่ถูกทำให้เรียบง่ายเอาต์พุตเท่านั้นเอง:

11/17

ขาออก:

November 17

ชื่อเดือนไม่สามารถมาจากฟังก์ชั่นในภาษาของคุณ สตริงสามารถทำให้ยุ่งเหยิงคำนวณ แต่คุณชอบ แต่คุณไม่สามารถใช้ฟังก์ชั่นมาตรฐานเช่น GetMonthString (4) หรืออะไรคุณต้องเขียนฟังก์ชั่นนั้นหรือหาวิธีที่จะส่งออกชื่อเดือนตามที่อธิบายไว้

ฉันไม่สามารถนึกถึงกรณีใด ๆ ที่วันที่เรียบง่ายสร้างวันที่ผิดกฎหมาย แต่ถ้าคุณเคยสร้างวันที่ผิดกฎหมายไปพร้อมกันผลลัพธ์:

Illegal Date

แต่ถ้าคุณแน่ใจว่าสิ่งนี้ไม่สามารถเกิดขึ้นได้คุณไม่จำเป็นต้องมีรหัสครอบคลุมกรณีนี้ วันที่แสดงผลจะต้องถูกต้องเสมอตามสิ่งที่อธิบายไว้ข้างต้น (ไปโดยไม่บอกว่าเดือนและวันเริ่มต้นที่ 1)

อัลกอริทึม:

ในการวนซ้ำแต่ละครั้งคุณหารด้วยจำนวนที่เล็กที่สุดที่หารตัวเศษและส่วน

นั่นคือคุณจะพบตัวเลขทั้งหมดเช่นนั้นหารทั้งตัวเศษและส่วนด้วยตัวเลขนี้จะสร้างตัวเศษและส่วนที่ใหม่ซึ่งเป็นทั้งจำนวนเต็ม (ปัจจัยทั่วไป) เลือกอันที่เล็กที่สุดแล้วหารตัวเศษและส่วนเพื่อแยกเศษส่วนใหม่ หากตัวเลขเพียงตัวเดียวที่คุณสามารถหารด้วย 1 คุณจะต้องทำให้ง่ายที่สุดและหยุด

ฉันหวังว่านี่ชัดเจน

ภาษาใดก็ได้ที่ได้รับอนุญาต นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดชนะ!


คำถามถูกปิดขณะที่ฉันโพสต์คำตอบ อ้าว!
t-clausen.dk

@ t-clausen.dk ความท้าทายได้รับการเปิดอีกครั้ง
AdmBorkBork

ทำไม12/18ถึง6/9และไม่4/6(ฉันไม่ได้รับการทำซ้ำทั้งหมด ... เมื่อฉันทำให้เศษส่วนน้อยลง
edc65

คำตอบ:


2

เยลลี่ , 59 ไบต์

ṣ”/VµÆDf/2ị:@µÐĿị1¦€“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»ṣ⁶¤j€⁶j⁷

ลองออนไลน์!

มันทำงานอย่างไร

ṣ”/VµÆDf/2ị:@µÐĿị1¦€“...»ṣ⁶¤j€⁶j⁷  Main link. Argument: mm/dd

ṣ”/                                Split at slashes.
   V                               Eval each chunk, yielding [m, d] (integers).
    µ                              Begin a new, monadic chain. Argument: [m, d]
             µÐĿ                   Execute the chain to the left until the results
                                   are no longer unique. Yield the list of all
                                   intermediate results.
     ÆD                              Compute the divisors of each number.
       f/                            Intersect them.
         2ị                          Select the one at index 2. If there is only
                                     one divisor, ị wraps around and selects 1.
           :@                        Divide [m, d] by this common divisor.
                        ¤            Combine the links to the left into a chain.
                 “...»                 Yield the month's name, space-separated.
                      ṣ⁶               Split at spaces.
                €                    For each pair...
             ị                          index into the month's names...
              1¦                        for the first element.
                         j⁶€         Join each pair, separating by spaces.
                            j⁷       Join, separating by linefeeds.


0

TSQL 296 ไบต์

ไม่ได้รับอนุญาตให้ใช้ชื่อไฟล์มาตรฐานทำให้ฉันต้องเสียค่าใช้จ่ายจำนวนมาก แต่จะบันทึกสองสามไบต์ฉันใช้ตัวอักษร 3 ตัวแรกของคำอธิบายวันที่เริ่มต้น (ด้วยรูปแบบจันทร์ dy yyy hh: miAM (หรือ PM)) และเพิ่ม ส่วนที่เหลือของชื่อเดือน

แข็งแรงเล่นกอล์ฟ:

use master
DECLARE @ varchar(5) = '12/2'

DECLARE @m int=month('2000/'+@),@d INT=day('2000/'+@)WHILE @m>0BEGIN PRINT left(dateadd(d,@m*29,0),3)+choose(@m,'uary','uary','ch','il','','e','y','ust','tember','ober','ember','ember')+' '+LEFT(@d,2)SELECT @m/=min(n),@d/=min(n)FROM(SELECT number FROM spt_values)x(n)WHERE @m%n+@d%n=0 and n>1 END

ลองออนไลน์

Ungolfed:

use master
DECLARE @ varchar(5) = '12/2'

DECLARE @m int=month('2000/'+@),@d INT=day('2000/'+@)
WHILE @m>0
BEGIN
PRINT
 left(dateadd(d,@m*29,0),3)
 +choose(@m,'uary','uary','ch','il','','e','y','ust',
  'tember','ober','ember','ember')+' '+LEFT(@d,2)
SELECT @m/=min(n),@d/=min(n)
FROM
(
  SELECT number
  FROM spt_values
)x(n)
WHERE
  @m%n+@d%n=0
  and n>1
END

อืมม ... สองบรรทัดแรกทำอะไรกัน ???
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀบรรทัดแรกกำลังบอกว่าจะใช้ฐานข้อมูลใดสำหรับสคริปต์นี้บรรทัดที่สองกำลังประกาศตัวแปรอินพุต ฉันไม่ได้รวมพวกเขาไว้ในการนับตามที่พวกเขากำหนดที่จะรันสคริปต์และบอกว่าตัวแปรอินพุตคืออะไร
t-clausen.dk

ฉันเห็น'12/2'บรรทัดที่สองคุณแน่ใจหรือไม่ว่าคุณกำลังบอกความจริงกับฉัน
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀฉันกลัวว่าฉันไม่เข้าใจคำถามของคุณ
t-clausen.dk

ฉันคิดว่าคุณกำลังใช้วันที่ยากรหัสแม้ว่าผมไม่แน่ใจว่าถ้า STDIN รับการสนับสนุนใน SQL และสายพันธุ์ ... นอกจากนี้ดูเหมือนว่าคุณสะกดผิดด้วยSeptember Septemper'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.