Hợp pháp hóa ngày hoàn nguyên


18

Đầu vào:

Một ngày (có chứa dd, MMyyyy). Một đối tượng ngày hoặc ba số nguyên riêng biệt cũng có giá trị làm đầu vào.

Đầu ra:

Mỗi phần (dd , MMyyyy) chuyển cá nhân và hơn làm tròn đến ngày hợp lệ gần nhất.

Ví dụ: (ở định dạng dd-MM-yyyy ):
21-10-2016trở thành12-01-6102

Quy tắc thử thách:

  • Chỉ dd, MM, yyyylà hợp lệ, nhưng trình tự, mà riêng-biểu tượng mà bạn sử dụng là sự lựa chọn của riêng bạn.
    Vì vậy, đây là một số ví dụ định dạng hợp lệ : dd-MM-yyyy; MM/dd/yyyy; yyyy MM dd; ddMMyyyy, Vân vân.
    Và đây là một số ví dụ định dạng không hợp lệ : dd MMM yyyy; dd-MM-'yy; Vân vân.
  • Bạn cũng có thể chọn chỉ nhập một đối tượng Ngày nếu ngôn ngữ của bạn hỗ trợ nó hoặc ba tham số nguyên riêng biệt, thay vì chuỗi đại diện cho một ngày.
  • Vui lòng cho biết định dạng ngày bạn đã sử dụng! (Và đầu vào và đầu ra phải có cùng định dạng.) Nó cũng được phép xuất ra một đối tượng Date, miễn là nó có thể xử lý tất cả các trường hợp thử nghiệm và quy tắc thử thách bên dưới.
  • Quá trình chuyển đổi Lịch Julian sang Gregorian bị bỏ qua cho thử thách này. Vì vậy, 1582chỉ là một năm đảo ngược hợp lệ cho 2851.
    Xem thông tin / mẹo về Thách thức cho tất cả các năm, tháng và ngày hợp lệ.
  • Vì bạn không thể có tháng hai như đảo ngược của bất kỳ tháng nào khác, bạn không phải lo lắng về năm nhuận.

Tất cả các năm, tháng và ngày đảo ngược:

  • Năm luôn có thể được đảo ngược mà không có vấn đề, đạt từ 0001 (đảo ngược 1000) đến 9999 (còn lại 9999). (Vì vậy, 0000không phải là một đầu vào hợp lệ và cũng không có trường hợp thử nghiệm nào cho nó.)
  • Các tháng duy nhất bạn sẽ đảo ngược là: Tháng một (đảo ngược từ tháng 10 / 10); Tháng 10 (đảo ngược từ tháng 1 / 01); Tháng 11 (vẫn là tháng 11 / 11); và tháng 12 (đảo ngược so với mọi tháng khác / 02- 09, 12).
  • Những ngày duy nhất bạn sẽ đảo ngược là: 01 (đảo ngược từ 10), 02 (đảo ngược từ 20), 03 (đảo ngược từ 30), 10 (đảo ngược từ 01), 11 (vẫn 11), 12 (đảo ngược từ 21), 13 (đảo ngược từ 31) , 20 (đảo ngược từ 02), 21 (đảo ngược từ 12), 22 (còn lại 22), 30 (đảo ngược từ 03hoặc giống như 31 cho tháng 11!), 31 (đảo ngược từ 04- 09/ 13-19/ 23- 29).

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và trả về câu lệnh / đầu ra, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm ( dd-MM-yyyydưới định dạng):

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 Không, 21-07-2016được hoàn nguyên 12-70-6102được làm tròn thành 12-12-6102. Không chắc chắn làm thế nào bạn có được kết quả ##-10-6107..
Kevin Cruijssen

@KevinCruijssen Được rồi, tôi nghĩ đó là tháng 70bao quanh, với năm tăng dần.
LegionMammal978

10-10-2đầu ra hợp lệ trong trường hợp thứ ba?
Luis Mendo

@LuisMendo Vâng chắc chắn rồi. Tôi đã thấy những người khác cũng làm điều đó. Thách thức liên quan nhiều hơn đến việc đảo ngược và làm tròn chính xác các ngày so với định dạng đầu vào hoặc đầu ra.
Kevin Cruijssen

Có thể chấp nhận lấy ba chuỗi và mong đợi các số 0 đứng đầu không?
JustinM - Tái lập Monica

Câu trả lời:


3

Lồi , 23 byte

Số lượng byte giả định mã hóa CP-1252.

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

Định dạng I / O là dd mm yyyy.

Hãy thử trực tuyến!

Đây là một cổng trực tiếp của câu trả lời CJam của tôi . Convex chủ yếu dựa vào CJam, và do đó, sự khác biệt duy nhất là việc sử dụng toán tử của Convex bao bọc hai phần tử ngăn xếp hàng đầu trong một danh sách, tiết kiệm một byte [...].


8

CJam, 24 byte

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

Định dạng I / O là dd mm yyyy.

Hãy thử trực tuyến!

Cùng một số byte, định dạng I / O mm dd yyyy:

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

Hãy thử trực tuyến!

Giải trình

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.

Phiên bản khác hoạt động tương tự, ngoại trừ việc chúng tôi bắt đầu từ số nguyên 1230hoặc 1231trước khi chuyển đổi nó thành ["12" "30"] hoặc ["12" "31"].


2
Các ngôn ngữ được tích hợp sẵn ...
Leaky Nun

1
@LeakyNun Điều này không sử dụng ngày tích hợp và tôi không thấy nó sẽ giúp ích như thế nào.
Martin Ender

Vậy thì làm sao bạn biết rằng có 30 ngày trong tháng 11?
Nữ tu bị rò rỉ

2
@LeakyNun Tôi sẽ thêm một lời giải thích sau, nhưng 1=sẽ nhận được tháng đảo ngược, :=kiểm tra xem các chữ số của nó có bằng nhau hay không và ^kết quả là 31, đưa ra 30 cho tháng 11và 31 cho mọi thứ khác.
Martin Ender

Ồ, tôi đã không đọc thông số kỹ thuật ...
Leaky Nun

5

Pyth, 55 53 46 43 41 byte

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

trong đó ❤❤có hai không thể in được, tương ứng là U + 001C và U + 001F.

Bộ thử nghiệm.


3

Python 3, 82 byte

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

Hàm ẩn danh lấy đầu vào, thông qua đối số, của ngày dưới dạng danh sách các chuỗi của biểu mẫu ['dd', 'mm', 'yyyy']và trả về ngày đảo ngược được xác thực theo cùng định dạng.

Làm thế nào nó hoạt động

Python so sánh các ký tự và chuỗi bằng các điểm mã Unicode của chúng. Điều này có nghĩa là mọi so sánh trên hai hoặc nhiều số nguyên đều trả về giống như so sánh trên các số nguyên đó dưới dạng chuỗi. Do đó, gọi minhai số nguyên là chuỗi trả về số nguyên nhỏ nhất dưới dạng chuỗi; bằng cách lấy phần ngày bị đảo ngược làm một đối số và giá trị tối đa làm phần khác, ngày và tháng được kẹp vào phạm vi mong muốn. Ngày-phần bị đảo ngược bởi chỉ mục với các bước của -1( [::-1]), và giá trị lớn nhất trong tháng được thay đổi từ '31'để '30'nếu tháng đó là tháng mười một của chỉ mục vào một danh sách với kết quả Boolean của một điều kiện.

Hãy thử nó trên Ideone


2

APL Dyalog , 32 33 byte

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

I / O là danh sách ba chuỗi ( 'dd' 'mm' 'yyyy').

TryAPL , nhưng lưu ý rằng (dấu nhắc nhập) đã được thay thế bằng và toàn bộ dòng được đính kèm trong {... }để cho phép kiểm tra trực tuyến và (biểu thức thực thi) đã được thay thế bằng 2⊃⎕VFI(xác minh và sửa lỗi đầu vào) vì việc thực thi mã tùy ý bị chặn .


2

C # 314 305 299 249 232 223 byte

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

Cảm ơn @KevinCruijssen đã chỉ ra rằng tôi có thể rút ngắn khai báo biến của mình, điều này cũng làm cho chuỗi bí danh có thể lưu một số byte.

Đã lưu 50 byte lưu trữ hàm đảo ngược để sử dụng lại và 13 khác bằng cách thực hiện tương tự cho làm tròn và loại bỏ các khai báo biến.

Cập nhật mới nhất làm cho chuỗi bí danh không còn là trình tiết kiệm byte.

Phiên bản Ungolfed:

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

Kiểm tra nó ở đây


Bạn có thể bỏ qua khoảng trắng giữa using System.Linq;và hàm, vì vậy đó là -1 byte. Ngoài ra, var n=...;var e=...;có thể được đánh gôn bằng 1 byte bằng cách này thay vào đó: string n=...,e=...;Nó không nhiều, nhưng vẫn là -2 byte. ;)
Kevin Cruijssen

Bắt tốt trên không gian đó, mặc dù có vẻ như số byte của tôi thực sự không đếm được, vì vậy, điều đó gây ra vấn đề sao chép. Ngoài ra tôi nghĩ rằng bằng cách sử dụng kiểu khai báo biến đó, Ill có thể giành được thêm một vài byte bằng cách đặt chuỗi bí danh.
JustinM - Tái lập Monica

2

Javascript, 106 105 94 byte

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))+''

Bộ thử nghiệm (sửa đổi 3)


Giải trình

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)

Cảm ơn @KevinCruijssen để lưu 1 byte cho b==1đến b<2. Cảm ơn @Neil vì đã lưu 11 byte bằng cách đề xuất mẫu và ,phân tách mẫu ES6 .


Tôi khá tệ ở JS, vì vậy hãy sửa tôi nếu tôi nói điều gì đó sai, nhưng không b==1thể đánh gôn b<2để tiết kiệm một byte? Nó không thể là 0 nữa, vì bạn đã kiểm tra nó ở !b?phần mã. Nó dường như hoạt động trong bộ thử nghiệm của bạn khi tôi thay đổi nó.
Kevin Cruijssen

@KevinCruijssen yep, bạn nói đúng, cảm ơn! Tôi chỉ bỏ qua nó. Đôi khi tôi đã chơi golf trong javascript vì vậy đôi khi tôi rất nhớ những thứ như thế
CShark

* Ý tôi là 'rất lâu', không phải 'vì rất nhìn'
CShark

2
Khi bạn đang nhắm mục tiêu ES6, bạn có thể sử dụng chuỗi mẫu để rút ngắn mã của mình - join``thay vì join('')ví dụ - nhưng bạn có thể tiết kiệm thêm một chút bằng cách sử dụng ,làm dấu phân cách, cho phép bạn sử dụng +''để nối ba giá trị lại với nhau.
Neil

@ Bạn có nghĩa ,là dấu phân cách trong đầu vào?
CShark

1

Ruby, 92 84 + 1 ( -pcờ) = 93 85 byte

Sử dụng -như là ngăn cách.

d,m,y=chomp.split(?-).map &:reverse
$_=[[d,m=="11"?"30":"31"].min,[m,"12"].min,y]*?-


0

Python 2, 154 byte

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)

Lấy đầu vào dưới dạng một chuỗi, vì vậy dấu ngoặc kép cần được chỉ định trong đầu vào, ví dụ: "11-04-2016".


Chỉ là một cải tiến cơ bản vì tôi không phải là người chơi gôn Python : 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). Về cơ bản, bạn hoàn toàn không cần sử dụng rminhoàn thành rất nhiều việc bạn muốn làm.
Mực giá trị

0

05AB1E , 24 byte

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

Cảng @MartinEnder 's CJam câu trả lời , vì vậy cũng đầu vào và đầu ra dưới dạng chuỗi trong định dạng dd MM yyyy.

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

#                         # 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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.