รูปแบบวันที่นี้คืออะไร


11

สำหรับปฏิทินเกรโกเรียนรูปแบบวันที่จะแตกต่างกันไปในแต่ละประเทศ มีสามรูปแบบหลักที่รู้จัก:

  1. YY-MM-DD (big-)
  2. DD-MM-YY (น้อย endian)
  3. MM-DD-YY (กลาง endian)

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

กฎระเบียบ

  • วันที่อินพุตอยู่ในรูปแบบxx-xx-xxโดยที่แต่ละฟิลด์มีสองหลักและไม่มีการเติมเบาะ
  • วันที่นั้นถูกต้องเสมอ (ดังนั้นคุณจะไม่สามารถรับสิ่งต่าง ๆ เช่น 14-13-17)
  • วันที่อยู่ในรูปแบบด้านบนอย่างน้อยหนึ่งรูปแบบเสมอ (ดังนั้นคุณจะไม่สามารถรับสิ่งต่าง ๆ เช่น 17-14-11)
  • เพราะในความเป็นจริงเราอยู่ในโลกคู่ขนานมี 31 วันสำหรับทุกเดือนของปีและดังนั้นจึงไม่มีปีอธิกสุรทิน
  • วันที่อยู่ระหว่าง 1 มกราคม 2001 และ 31 ธันวาคม 2099
  • หากมีเพียงหนึ่งรูปแบบสำหรับวันที่รหัสจะต้องพิมพ์เท่านั้น (อนุญาตให้ขึ้นบรรทัดใหม่ต่อท้ายเท่านั้น)
  • หากมีหลายรูปแบบสำหรับวันที่พวกเขาจะต้องคั่นด้วยเครื่องหมายจุลภาค, ช่องว่าง, การขึ้นบรรทัดใหม่หรือการรวมกันของเหล่านั้น
  • คุณต้องส่งออกชื่อที่แน่นอนของรูปแบบ ไม่อนุญาตให้ใช้ค่าตามอำเภอใจที่แตกต่างกัน
  • ไม่อนุญาตให้นำหน้าหรือต่อท้ายอักขระอื่นนอกเหนือจากพื้นที่ต่อท้าย
  • ผลลัพธ์จะต้องเป็นตัวพิมพ์เล็ก
  • คุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชันวันที่หรือปฏิทินในตัว
  • รูปแบบเอาต์พุตไม่จำเป็นต้องเรียงลำดับ

ตัวอย่าง

Input      Output
30-05-17   big-endian, little-endian
05-15-11   middle-endian
99-01-02   big-endian
12-11-31   big-endian, little-endian, middle-endian
02-31-33   middle-endian

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์จะชนะ คำอธิบายได้รับการสนับสนุน


3
คุณควรเพิ่มกรณีทดสอบโดยใช้วันที่ 31 กุมภาพันธ์เพื่อให้แน่ใจว่าคำตอบสนับสนุนกรณีแปลก ๆ : P
ETHproductions

เราสามารถส่งออกค่าที่แตกต่างกันสามค่าสำหรับรูปแบบที่ถูกต้องทั้งสามหรือไม่หรือต้องเป็นสตริงสามค่าที่แน่นอน?
ETHproductions

3
there are 31 days for every month of the year, and consequently no leap yearsดังนั้นนี่หมายความว่าไลบรารีวันที่ใด ๆ จะไม่มีประโยชน์อย่างมีประสิทธิภาพในตอนนี้?
TheLethalCoder

1
@TheLethalCoder ใช่ห้องสมุดส่วนใหญ่อาจไม่สามารถใช้งานได้
Jim

คำตอบ:


3

05AB1E , 40 ไบต์

'-¡©2£13‹`®Á2£32‹*)˜“Œ±„¥„ê“#Ï’-„–ian’«»

ลองออนไลน์!

คำอธิบาย

'-¡©                                      # split on "-" and store a copy in register
    2£13‹                                 # compare the first 2 elements to 13
         `                                # split as separate to stack
                                          # the bottom element is true if it is middle endian
                                          # the top value is true if it can be big/little
          ®Á                              # retrieve the list from register and rotate right
            2£32‹                         # compare the first 2 elements to 32
                 *                        # multiply with the result of the comparison to 13
                  )˜                      # wrap in a flattened list
                    “Œ±„¥„ê“#             # push the list ['middle', 'big', 'little']
                             Ï            # index into this with the flattened list
                                          # this leaves the types the date could be
                              ’-„–ian’«   # append "-endian" to each
                                       »  # join on newlines

4

Python 2 , 123 ไบต์

a,b,c=map(int,input().split('-'))
for a,b,c in[[b,c,'big'],[b,a,'little'],[a,b,'middle']]:print(c+'-endian')*(a<13)*(b<32),

ลองออนไลน์!


Python 2 การแยกวิเคราะห์อินพุตน้อยกว่า 123 ไบต์

d=input()
for a,b,c in[[3,6,'big'],[3,0,'little'],[0,3,'middle']]:print(c+'-endian')*(int(d[a:a+2])<13)*(int(d[b:b+2])<32),

ลองออนไลน์!


คุณได้รับอนุญาตให้คั่นด้วยการขึ้นบรรทัดใหม่ดังนั้นสามารถลบการติดตาม,ได้
Jonathan Allan

4

JavaScript (ES6), 121 119 118 112 ไบต์

ส่งคืนสตริงที่คั่นด้วยช่องว่างด้วยช่องว่างต่อท้าย

s=>['big','little','middle'].map((v,i)=>[b<13&c<32,b<13&a<32,a<13][i]?v+'-endian ':'',[a,b,c]=s.split`-`).join``

อย่างไร?

เราแบ่งการป้อนข้อมูลลงใน, และค เนื่องจากวันที่รับประกันถูกต้องเราจึงรู้ว่าbน้อยกว่า 32 ดังนั้นจึงเพียงพอที่จะทดสอบว่าaน้อยกว่า 13 เพื่อตรวจสอบรูปแบบของคนชั้นกลาง รูปแบบ Little-endian และ big-endian ต้องการให้bต้องน้อยกว่า 13 และอีกแบบทดสอบสำหรับaและcตามลำดับเพื่อตรวจสอบความถูกต้องของวัน

ดังนั้นการทดสอบ 3 ครั้ง:

  • Big-endian: b <13 & c <32
  • Little-endian: b <13 & a <32
  • ชนชั้นกลาง: a <13

กรณีทดสอบ


3

Bash, 240 125 116 112 ไบต์

IFS=- read a b c<<<$1
d=-endian
((b<13))&&(((a<32))&&echo little$d;((c<32))&&echo big$d);((a<13))&&echo middle$d

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

ขอบคุณ manatwork สำหรับคำแนะนำ

บันทึกแล้ว 9 ไบต์นำการตรวจสอบออกน้อยกว่า 32 คำตอบในคำตอบกลางๆ

บันทึก 4 ไบต์โดยใช้ตัวแปรที่แตกต่างกันแทนที่จะเป็นอาร์เรย์

ทดสอบ!


มีคู่ของมีเคล็ดลับที่เกี่ยวข้องกับคณิตศาสตร์ในเคล็ดลับสำหรับการเล่นกอล์ฟในทุบตี คุณสามารถลดได้บ้าง ลองใช้ออนไลน์!
จัดการ

ขอบคุณ @ manatwork ฉันมีคำถามที่คั่นหน้าไว้ว่ามีประโยชน์มากจะตีมันโดยมัน
DrnglVrgs

1

C #, 180 ไบต์

t=(n,m)=>int.Parse(n)<13&int.Parse(m)<32;s=>{var a=s.Split('-');return$"{(t(a[1],a[2])?"big-endian":"")} {(t(a[1],a[0])?"little-endian":"")} {(t(a[0],a[1])?"middle-endian":"")}";};

เอาต์พุตที่มีค่าคั่นด้วยช่องว่างเท่านั้นยังสามารถมีช่องว่างนำหน้าและต่อท้าย จะอัปเดตเมื่อ OP ได้ชี้แจงในจุดนั้นหากจำเป็น

เวอร์ชันเต็ม / ฟอร์แมต:

Func<string, string, bool> t = (n, m) => int.Parse(n) < 13 & int.Parse(m) < 32;

Func<string, string> f = s =>
{
    var a = s.Split('-');

    return $"{(t(a[1], a[2]) ? "big-endian" : "")} {(t(a[1], a[0]) ? "little-endian" : "")} {(t(a[0], a[1]) ? "middle-endian" : "")}";
};

ฉันทำให้กฎชัดเจนมากขึ้น:No leading or trailing characters others than a trailing space are allowed
Jim


1

แบตช์ 138 ไบต์

@echo off
set/ps=
call:l little %s:-= %
exit/b
:l
call:e big %4 %3
call:e middle %3 %2
:e
if %2 leq 31 if %3 leq 12 echo %1-endian

ตามคำตอบของ @ ovs อย่างระมัดระวัง


1

Java 232 ไบต์

(String s)=>{String[]i=s.split("-");String e="-endian",b="big"+e,m="middle"+e,l="little"+e;int p=Integer.valueOf(i[0]);System.out.print(p<13?Integer.valueOf(i[1])<13?Integer.valueOf(i[2])<32?b+","+m+","+l:m+","+l:m:p<32?b+","+l:b);}

นี่คือรุ่นที่ดีกว่า

String[] i = s.split("-");

String e = "-endian",
       b = "big" + e,
       m = "middle" + e,
       l = "little" + e;

int p = Integer.valueOf(i[0]);

ฉันไม่รู้วิธีการฟอร์แมตส่วนนี้ ...

System.out.print(
        p < 13 ? Integer.valueOf(I[1]) < 13 ? Integer.valueOf(I[2]) < 32 ? b + "," + m + "," + l
                                                                         : m + "," + l
                                            : m 

               : p < 32 ? b + "," + l 
                        : b
);

1
ชาวเอเชียหลายคนเกินไป: String e="-endian",b="big"+e,m="middle"+e,l="little"+e;.
จัดการ

จุดที่ดีเมื่อฉันตัดสินใจที่จะไม่ทำอย่างนั้นฉันก็รวม "สตริง" พิเศษในการนับไบต์ของฉัน @manatwork
cheemcheem

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.