ถูกต้องตามกฎหมายวันที่กลับรายการ


18

การป้อนข้อมูล:

วันที่ (ที่มีdd, MMและyyyy) Date-object หรือจำนวนเต็มสามจำนวนที่แยกกันก็สามารถใช้เป็นอินพุตได้เช่นกัน

เอาท์พุท:

แต่ละส่วน ( dd, MMและyyyy) หวนกลับเป็นรายบุคคลและกว่าปัดเศษให้เป็นวันที่ถูกต้องที่ใกล้ที่สุด

ตัวอย่างเช่น (ในรูปแบบdd-MM-yyyy):
21-10-2016กลายเป็น12-01-6102

กฏท้าทาย:

  • เพียงdd, MM, yyyyถูกต้อง แต่การสั่งซื้อและการที่คุณใช้สัญลักษณ์แยก-เป็นทางเลือกของคุณเอง
    ดังนั้นนี่คือตัวอย่างรูปแบบที่ถูกต้อง: dd-MM-yyyy; MM/dd/yyyy; yyyy MM dd; ddMMyyyyฯลฯ
    และนี่คือตัวอย่างรูปแบบที่ไม่ถูกต้อง: dd MMM yyyy; dd-MM-'yy; เป็นต้น
  • นอกจากนี้คุณยังสามารถเลือกที่จะป้อนวันที่วัตถุหากภาษาของคุณสนับสนุนหรือพารามิเตอร์จำนวนเต็มสามแยกจากกันแทนสตริงที่เป็นตัวแทนของวันที่
  • โปรดระบุว่าคุณใช้รูปแบบวันที่ใด! (และอินพุตและเอาต์พุตจะต้องอยู่ในรูปแบบเดียวกัน) นอกจากนี้ยังได้รับอนุญาตให้ส่งออก Date-object ตราบใดที่สามารถจัดการกับกรณีทดสอบและกฎการท้าทายด้านล่าง
  • การเปลี่ยนแปลงปฏิทินจูเลียนเป็นเกรกอเรียนถูกละเว้นสำหรับความท้าทายนี้ ดังนั้นเป็นเพียงปีตรงกันข้ามที่ถูกต้องสำหรับ1582 ดูข้อมูลท้าทาย / เคล็ดลับสำหรับปีเดือนและวันที่ถูกต้องทั้งหมด2851
  • เนื่องจากคุณไม่สามารถมีกุมภาพันธ์ย้อนกลับของเดือนอื่น ๆ คุณไม่ต้องกังวลกับปีอธิกสุรทิน

กลับรายการทั้งหมดปีเดือนและวันที่:

  • ปีสามารถกลับรายการได้โดยไม่มีปัญหาเพิ่มจาก0001 (กลับรายการ1000) เป็น9999 (ยังคงอยู่9999) (ดังนั้น0000ไม่ใช่อินพุตที่ถูกต้องและไม่มีกรณีทดสอบสำหรับมัน)
  • เดือนเดียวที่คุณจะกลับรายการคือ: มกราคม (กลับจากเดือนตุลาคม / 10); ตุลาคม (กลับจากเดือนมกราคม / 01); พฤศจิกายน (เหลือพฤศจิกายน / 11); และธันวาคม (กลับรายการจากทุก ๆ เดือน / 02- 09, 12)
  • วันที่คุณจะกลับรายการคือ: 01 (กลับรายการจาก10), 02 (กลับรายการจาก20), 03 (กลับรายการจาก30), 10 (กลับรายการจาก01), 11 (เหลือ11), 12 (กลับรายการ21), 13 (กลับรายการจาก31) , 20 (กลับจาก02), 21 (กลับจาก12), 22 (เหลือ22), 30 (กลับจาก03หรือเท่ากับ31สำหรับเดือนพฤศจิกายน!), 31 (กลับจาก04- 09/ 13-19/ 23- 29)

กฎทั่วไป:

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

กรณีทดสอบ ( dd-MM-yyyyตามรูปแบบ):

21-07-2016   ->   12-12-6102
12-11-1991   ->   21-11-1991
01-01-2000   ->   10-10-0002
27-08-1875   ->   31-12-5781
18-12-2010   ->   31-12-0102
13-01-1981   ->   31-10-1891
04-11-1671   ->   30-11-1761  // Semi-tricky case, since November has 30 days
28-11-2036   ->   30-11-6302  // Semi-tricky case, since November has 30 days
14-06-1855   ->   31-12-5581
30-10-9999   ->   03-01-9999
01-01-2851   ->   10-10-1582

@ LegionMammal978 ไม่มี21-07-2016จะหวนกลับซึ่งเป็นโค้งมนไป12-70-6102 12-12-6102ไม่แน่ใจว่าคุณจะได้รับผลที่ตามมา##-10-6107..
เควิน Cruijssen

@KevinCruijssen โอเคฉันคิดว่ามันเป็นเดือนที่70ล้อมรอบด้วยปีที่เพิ่มขึ้น
LegionMammal978

คือ10-10-2การส่งออกที่ถูกต้องในกรณีที่สาม?
Luis Mendo

@ LuisMendo ใช่แน่นอน ฉันเคยเห็นคนอื่นทำเช่นกัน ความท้าทายเกี่ยวกับการย้อนกลับและปัดเศษวันที่อย่างถูกต้องมากกว่ารูปแบบอิน - หรือเอาท์พุท
Kevin Cruijssen

มันจะเป็นที่ยอมรับที่จะใช้สามสายและคาดว่าศูนย์นำหน้า?
JustinM - Reinstate Monica

คำตอบ:


3

นูน 23 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส CP-1252

qS/Wf%_1=:=31^sCs¶.e<S*

I / O dd mm yyyyรูปแบบคือ

ลองออนไลน์!

นี่คือพอร์ตโดยตรงของคำตอบ CJam ของฉัน นูนขึ้นอยู่อย่างหนักใน CJam และดังนั้นจึงแตกต่างเพียงอย่างเดียวคือการใช้นูนของผู้ประกอบการที่แรปบนสององค์ประกอบสแต็คในรายการประหยัดกว่าไบต์[...]


8

CJam, 24 ไบต์

qS/Wf%[_1=:=31^sCs].e<S*

I / O dd mm yyyyรูปแบบคือ

ลองออนไลน์!

จำนวนไบต์เดียวกัน, รูปแบบ I / O mm dd yyyy:

qS/Wf%_0=:=1231^s2/.e<S*

ลองออนไลน์!

คำอธิบาย

qS/     e# Read input, split around spaces.
Wf%     e# Reverse each component.
[       e# Set marker for new list.
  _1=   e#   Duplicate reversed strings, extract reversed month.
  :=    e#   Check for equality of the characters. This gives 1 for
        e#   November (11) and 0 for everything else.
  31^   e#   XOR the result with 31, giving 30 for November and 31
        e#   for everything else.
  s     e#   Convert the result to a string, "30"/"31".
  Cs    e#   Push 12, convert to string, "12".
]       e# Wrap "30"/"31" and "12" in a list.
.e<     e# Element-wise minimum. This clamps the day and month to their
        e# respective maxima.
S*      e# Join the result with spaces.

รุ่นอื่น ๆ ที่ทำงานคล้ายยกเว้นว่าเราเริ่มต้นจากจำนวนเต็ม1230หรือ1231ก่อนที่จะแปลงหรือ["12" "30"] ["12" "31"]


2
ภาษาที่มีวันที่ในตัว ...
รั่วนูน

1
@LeakyNun นี่ไม่ได้ใช้วันที่ในตัวและฉันไม่เห็นว่ามันจะช่วยได้อย่างไร
Martin Ender

แล้วคุณจะรู้ได้อย่างไรว่าในเดือนพฤศจิกายนมี 30 วัน
Leun Nun

2
@LeakyNun ฉันจะเพิ่มคำอธิบายในภายหลัง แต่1=จะได้รับเดือนที่กลับรายการ:=ตรวจสอบว่าตัวเลขนั้นเท่ากันและ^xors ผลลัพธ์เป็น 31 โดยให้ 30 เป็นเดือน11และ 31 สำหรับทุกอย่างอื่น
Martin Ender

โอ้ฉันไม่ได้อ่านรายละเอียด ...
รั่วนูน

5

Pyth, 55 53 46 43 41 ไบต์

APJ_Mczd = HhS, 12sH = GhS, sGC @. "❤❤ó»î" H% "% 02d% 02d% s" [GHeJ 
APJ_Mczd = hS, 12sH = hS, sGC @. "❤❤ó»î" H% "% 02d% 02d% s" [GHeJ 
APJ_Mcz \ -% "% 02d% 02d% s" [hS, sGx31q11sHhS, 12sHeJ 
APJ_Mczdjd [> 2+ \ 0hS, sGx31q11sH> 2+ \ 0hS, 12GH
APJ_Mczdjd. [L \ 02 [ `HS, sGx31q11sH`hS, 12sHeJ

โดยที่❤❤มีสอง unprintables ตามลำดับ U + 001C และ U + 001F

ชุดทดสอบ


3

Python 3, 82 ไบต์

lambda x:[min(x[0][::-1],['31','30'][x[1]=='11']),min(x[1][::-1],'12'),x[2][::-1]]

ฟังก์ชั่นที่ไม่ระบุชื่อที่รับอินพุตผ่านอาร์กิวเมนต์ของวันที่เป็นรายการสตริงของฟอร์ม['dd', 'mm', 'yyyy']และส่งคืนวันที่ที่ตรวจสอบความถูกต้องในรูปแบบเดียวกัน

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

Python เปรียบเทียบอักขระและสตริงตาม Unicode code-points ซึ่งหมายความว่าการเปรียบเทียบใด ๆ กับจำนวนเต็มสองตัวหรือมากกว่านั้นจะคืนค่าเหมือนกับการเปรียบเทียบในจำนวนเต็มเหล่านั้นเป็นสตริง ดังนั้นการเรียกminเลขจำนวนเต็มสองตัวเป็นสตริงจะส่งคืนจำนวนเต็มที่น้อยที่สุดเป็นสตริง โดยนำส่วนวันที่กลับด้านเป็นอาร์กิวเมนต์หนึ่งตัวและค่าสูงสุดเป็นอีกวันและเดือนจะถูกยึดเป็นช่วงที่ต้องการ ส่วนวันที่จะถูกกลับรายการโดยการทำดัชนีด้วยขั้นตอน-1( [::-1]) และค่าสูงสุดสำหรับเดือนนั้นเปลี่ยนจาก'31'เป็น'30'หากเดือนพฤศจิกายนโดยการทำดัชนีในรายการที่มีผลลัพธ์บูลีนแบบมีเงื่อนไข

ลองใช้กับ Ideone


2

Dyalog APL , 32 33 ไบต์

⍕¨{⍵-3↑31 11≡2↑⍵}31 12 1E4⌊⍎∊⍕⌽¨⎕

I / O คือรายการของสามสาย ( 'dd' 'mm' 'yyyy')

TryAPLแต่โปรดทราบว่า(พร้อมท์สำหรับอินพุต) ถูกแทนที่ด้วยและบรรทัดทั้งหมดที่อยู่ใน{... }เพื่อเปิดใช้งานการทดสอบออนไลน์และ(นิพจน์เรียกใช้) ถูกแทนที่ด้วย2⊃⎕VFI(ตรวจสอบและแก้ไขอินพุต) เนื่องจากการทำงานของรหัสโดยพลการ .


2

C # 314 305 299 249 232 223 ไบต์

using System.Linq;string f(int d,int m,int y){Func<int,string>r=i=>string.Concat((""+i).PadLeft(2,'0').Reverse());Func<string,int,string>x=(j,k)=>int.Parse(j)>k?""+k:j;return x(r(d),m==11?30:31)+"-"+x(r(m),12)+"-"+r(y);}

ขอบคุณ @KevinCruijssen ที่ชี้ให้เห็นว่าฉันสามารถทำให้การประกาศตัวแปรของฉันสั้นลงซึ่งทำให้สตริง aliasing สามารถบันทึกไบต์ได้บางส่วน

บันทึก 50 ไบต์เพื่อจัดเก็บฟังก์ชันการย้อนกลับเพื่อนำมาใช้ซ้ำและอีก 13 รายการโดยทำเช่นเดียวกันสำหรับการปัดเศษและลบการประกาศตัวแปร

การอัปเดตครั้งล่าสุดทำให้สตริงนามแฝงไม่ได้เป็นการประหยัดแบบไบต์อีกต่อไป

เวอร์ชันที่ไม่ถูกปรับแต่ง:

using System.Linq;
    string dateReverse(int day, int month, int year)
{
    //setup a resuable function to reverse
    Func<int, string> reverse = intToReverse => string.Concat((""+intToReverse).PadLeft(2, '0').Reverse());

    //another function for rounding
    Func<string, int, string> round = (strToRound, maxVal) => int.Parse(strToRound) > maxVal ? "" + maxVal : strToRound;

    //Join the strings into the "dd-mm-yyyy" date format
    return 
        //Round down the day value, if november cap to 30 otherwise cap to 31
        round(reverse(day), month == 11 ? 30 : 31) + "-" +

        //Round the month down
        round(reverse(month), 12) + "-" +

        //we can use the reverse function here too and pad left just won't do anything
        reverse(year);
}

ทดสอบที่นี่


คุณสามารถข้ามช่องว่างระหว่างusing System.Linq;และฟังก์ชันได้นั่นคือ -1 ไบต์ นอกจากนี้ยังvar n=...;var e=...;สามารถเล่นกอล์ฟได้ 1 ไบต์โดยใช้สิ่งนี้แทน: string n=...,e=...;มันไม่มาก แต่ก็ยัง -2 ไบต์ ;)
Kevin Cruijssen

จับได้ดีในพื้นที่นั้นแม้ว่ามันจะดูเหมือนว่าจำนวนไบต์ของฉันจริง ๆ แล้วไม่ได้นับมันแย่มากดังนั้นจึงทำให้ปัญหาการคัดลอกวางไม่ดี นอกจากนี้ฉันคิดว่าการใช้รูปแบบการประกาศตัวแปรนั้นจะสามารถชนะได้อีกสองสามไบต์โดยใช้นามแฝงสตริง
JustinM - Reinstate Monica

2

Javascript, 106 105 94 ไบต์

d=>d.split`,`.map((a,b,r)=>(e=[...a].reverse().join``,f=!b?r[1]==11^31:b<2&&12,f&&f<e?f:e))+''

ชุดทดสอบ (ฉบับที่ 3)


คำอธิบาย

d=>d.split`,`                 // split into sections by `,`

.map((a,b,r)=>(               // map each section

e=[...a].reverse().join``,    // spread a date section into array and reverse and 
                              // join with `` to get string result

f=!b?r[1]==11^31              // if section being mapped is day (section 0), 
                              // then max (f) is 30 for November(month 11) or else 31

:b<2&&12,                     // if part being mapped is month (section 1), then max (f) is 12

f&&f<e?f:e))                  // if there is a max (f)
                              // and the max (f) is less than the reversed string (e),
                              // then return the max (f), 
                              // else return the reversed string (e)

+''                           // join all the sections back together with `,` 
                              // (concatenating [] with a string will do this)

ขอขอบคุณสำหรับการบันทึก @KevinCruijssen 1 ไบต์สำหรับการb==1 b<2ขอบคุณ @Neil สำหรับการบันทึก 11 ไบต์โดยการแนะนำเทมเพลตและ,ตัวคั่นเทมเพลต ES6


ฉันค่อนข้างแย่ที่ JS ดังนั้นแก้ไขให้ถูกต้องถ้าฉันพูดอะไรผิดปกติ แต่ไม่b==1สามารถลงสนามb<2เพื่อบันทึกไบต์ได้ใช่ไหม ไม่สามารถเป็น 0 ได้อีกต่อไปเนื่องจากคุณได้ตรวจสอบแล้วที่!b?ส่วนของรหัส ดูเหมือนว่าจะทำงานในชุดทดสอบของคุณเมื่อฉันเปลี่ยน
Kevin Cruijssen

@KevinCruijssen ใช่คุณพูดถูกแล้วขอบคุณ! ฉันแค่มองข้ามมัน ฉันยังไม่ได้เล่นกอล์ฟในจาวาสคริปต์เพื่อให้ดูดีดังนั้นฉันจึงพลาดบางสิ่งเช่นนั้น
CShark

* ฉันหมายถึง 'นานมาก' ไม่ใช่ 'เพราะดูมาก'
CShark

2
ในขณะที่คุณกำหนดเป้าหมาย ES6 คุณสามารถใช้แม่แบบสตริงเพื่อย่อรหัสของคุณ - join``แทนที่จะjoin('')เป็นตัวอย่าง - แต่คุณสามารถประหยัดได้อีกเล็กน้อยโดยใช้,เป็นตัวคั่นของคุณซึ่งช่วยให้คุณใช้+''เพื่อรวมสามค่าเข้าด้วยกัน
Neil

@ คุณหมายความว่า,เป็นตัวคั่นในอินพุตหรือไม่
CShark



0

Python 2, 154 ไบต์

z=input().split("-");r=[x[::-1]for x in z];z[1]=r[1]if r[1]<'12'else '12';z[0]=r[0]if r[0]<'31'else '30'if z[1]=='11'else '31';z[2]=r[2];print "-".join(z)

รับอินพุตเป็นสตริงดังนั้นต้องระบุเครื่องหมายคำพูดในอินพุตเช่น "11-04-2016"


z=[x[::-1]for x in z];z[1]=min(z[1],'12');z[0]=min(z[0],['31','30'][z[1]=='11']);print"-".join(z)เพียงแค่การปรับปรุงขั้นพื้นฐานตั้งแต่ฉันไม่ได้เป็นนักกอล์ฟหลาม: โดยพื้นฐานแล้วคุณไม่จำเป็นต้องใช้rเลยและminทำสิ่งต่าง ๆ ที่คุณต้องการให้สำเร็จ
หมึกมูลค่า

0

05AB1E , 24 ไบต์

#íÐÅsË31^12‚øεßт+¦}sθªðý

ท่าเรือ@MartinEnder 's คำตอบ CJamdd MM yyyyจึงยังอินพุตและเอาเป็นสตริงในรูปแบบที่

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

#                         # Split the (implicit) input by spaces
                          #  i.e. "04 11 1671" → ["04","11","1671"]
                          #  i.e. "20 01 2000" → ["20","01","2000"]
 í                        # Reverse each string
                          #  i.e. ["04","11","1671"] → ["40","11","1761"]
                          #  i.e. ["20","01","2000"] → ["02","10","0002"]
  Ð                       # Triplicate this list
   Ås                     # Pop one of them, and push it's middle element (the months)
                          #  i.e. ["40","11","1761"] → "11"
                          #  i.e. ["02","10","0002"] → "10"
     Ë                    # Check if the digits are the same (1 for 11; 0 otherwise)
                          #  i.e. "11" → 1 (truthy)
                          #  i.e. "10" → 0 (falsey)
      31^                 # Bitwise-XOR with 31 (30 for November, 31 for other months)
                          #  i.e. 1 → 30
                          #  i.e. 0 → 31
         12              # Pair it with 12
                          #  i.e. 30 → [30,12]
                          #  i.e. 31 → [31,12]
            ø             # Zip/transpose; swapping rows and columns
                          # (implicitly removes year)
                          #  i.e. ["40","11","1761"] and [30,12] → [["40",30],["11",12]]
                          #  i.e. ["02","10","0002"] and [31,12] → [["02",31],["10",12]]
             ε    }       # Map each pair to:
              ß           # Get the minimum (implicitly converts to integer unfortunately)
                          #  i.e. [["40",30],["11",12]] → [30,11]
                          #  i.e. [["02",31],["10",12]] → [2,10]
               т+         # Add 100
                          #  i.e. [30,11] → [130,111]
                          #  i.e. [2,10] → [102,110]
                 ¦        # Remove the first character
                          #  i.e. [130,111] → ["30","11"]
                          #  i.e. [102,110] → ["02","10"]
                   s      # Swap so the triplicated list is at the top of the stack again
                    θ     # Pop and only leave it's last element (the year)
                          #  i.e. ["40","11","1761"] → "1761"
                          #  i.e. ["02","10","0002"] → "0002"
                     ª    # Append it to the list
                          #  i.e. ["30","11"] and "1761" → ["30","11","1761"]
                          #  i.e. ["02","10"] and "0002" → ["02","10","0002"]
                      ðý  # Join the list by spaces (and output implicitly)
                          #  i.e. ["30","11","1761"] → "30 11 1761"
                          #  i.e. ["02","10","0002"] → "02 10 0002"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.