Bộ chuyển đổi thời gian 12 giờ sang 24 giờ


27

Thật đáng ngạc nhiên, nhiệm vụ đơn giản này dường như chưa tồn tại, vì vậy ...

Nhiệm vụ của bạn là viết một chương trình lấy đầu vào là 12 giờ và chuyển đổi nó thành "giờ quân đội" hoặc định dạng thời gian 24 giờ.

Đầu vào sẽ ở dạng:

HH:MM am/pm

Mặc dù các biến thể nhẹ được cho phép:

  • Không gian ngăn cách sáng / chiều với phần còn lại của thời gian là tùy chọn.

  • Phần cuối cùng có thể là "am" / "pm" hoặc "a" / "p".

  • Bất kỳ viết hoa là tốt.

Đầu ra sẽ là thời gian nhập, chuyển thành định dạng 24 giờ. Nó có thể là một số, hoặc một chuỗi.

Đối với cả đầu vào và đầu ra:

  • 0s ở vị trí đầu tiên là tùy chọn. 0s trong 3 nơi cuối cùng là bắt buộc.

  • dấu phân cách giữa giờ và phút có thể là ":", "" (khoảng trắng) hoặc không có gì.

Ghi chú khác:

  • Nửa đêm có thể được biểu thị bằng 0000 hoặc 2400.

  • Nửa đêm sẽ được coi là "sáng", trong khi buổi trưa sẽ được coi là "chiều".

Chương trình của bạn có thể là một hàm hoặc một chương trình đầy đủ và sẽ trả về kết quả hoặc xuất nó ra thiết bị xuất chuẩn. Trailing khoảng trắng là ok.

Ví dụ (bạn không cần phải hỗ trợ mọi định dạng):

12:00am -> 0000
1200 pm -> 1200
1234Am  -> 00:34
134a    -> 134
01:34PM -> 13 34
1234pm  -> 1234  

Đây là mã golf, vì vậy số byte nhỏ nhất sẽ thắng. Vì việc này rất đơn giản để giải quyết bằng cách sử dụng tích hợp sẵn, nên sẽ rất tuyệt khi thấy một số mã tự giải quyết điều này (nhưng sử dụng tích hợp là tốt).

Chỉ cần làm rõ, bạn không cần phải hỗ trợ mọi định dạng có thể. Chỉ hỗ trợ một đầu vào duy nhất và một định dạng đầu ra duy nhất (theo lựa chọn của bạn) là ổn. Tuy nhiên tôi muốn giới hạn định dạng như đã nêu ở trên (vốn đã khá miễn phí). {1134,'pm'}, ví dụ, sẽ không được chấp nhận.


Những định dạng nào chúng tôi cần để hỗ trợ? Chỉ một?
redstarcoder

@redstarcoder Có. Bất kỳ định dạng nào phù hợp với các yêu cầu ở trên đều ổn, nhưng như đã lưu ý ở trên các trường hợp ví dụ, bạn không cần phải hỗ trợ mọi định dạng. Một định dạng đầu vào và một định dạng đầu ra là ổn.
Carcigenicate

các định dạng của chúng tôi được phép yêu cầu số không hàng đầu? Ví dụ, 01:54pmsẽ làm việc, nhưng 1:54pmsẽ không?
FlipTack

Vâng. Bạn có thể chọn định dạng đầu vào cần thiết.
Carcigenicate

Chúng tôi có được phép đưa giây vào đầu vào và đầu ra không?
12Me21

Câu trả lời:


8

V , 21 17 byte

Cảm ơn @DJMcMayhem cho 4 byte!

í12:/0:
çp/12
$x

Hãy thử trực tuyến! Này có định dạng HH:MMxxlà một trong hai ahoặc p, và trả về nó trong định dạngHH:MM

Hexdump:

00000000: ed31 323a 2f30 3a0a e770 2f31 3201 2478  .12:/0:..p/12.$x
00000010: 0ae7 612f 2478                           ..a/$x

Giải trình:

í12:/0:   | find and replace 12: with 0: (to avoid replacing HH:12)
ç         | on every line
 p/       | that contains a p
   12^A   | increment 12 times (the first number, hours)
$x        | delete the character at the end of the line

Đầu vào sẽ luôn ở [1-12]bên phải? Trong trường hợp đó, tôi nghĩ bạn có thể làm ó^12/0thay vìcw^R=^R"%12
DJMcMayhem

1
Ngoài ra, bạn có thể sử dụng "lệnh toàn cầu" để áp dụng lệnh cho các dòng khớp với biểu thức chính quy, ngắn hơn so với phá vỡ macro. çp/12^Atương đương với :g/p/norm 12<C-a>trong vim
DJMcMayhem

Tôi đã chấp nhận điều này bởi vì đó là câu trả lời cho điểm thấp nhất cho thấy rõ rằng nó không sử dụng tích hợp (mặc dù tôi không cấm sử dụng chúng). Nếu bất cứ ai có vấn đề với lựa chọn này, tôi có thể thay đổi câu trả lời của mình để công bằng. Tôi nghĩ rằng câu trả lời này là xứng đáng nhất mặc dù.
Carcigenicate


10

Octave, 21 17 byte

Đã lưu 4 byte nhờ Luis Mendo. Tôi có thể chỉ định định dạng số 15 thay vì 'HHMM'.

@(c)datestr(c,15)

Giải trình:

Đây là một hàm ẩn danh lấy một chuỗi clàm đầu vào trên định dạng : '11:34 AM'. datestrtự động nhận dạng định dạng là một trong các định dạng ngày chuẩn và xuất ra định dạng theo định dạng số 15, đó là HH:MM.

Vì định dạng đầu ra được chỉ định không có AMhoặc PMOctave sẽ tự động chuyển đổi nó thành thời gian bạn gọi là Giờ quân sự.

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


Một phiên bản không sử datestrdụng 35 byte

@(c)[c(1:4)+[1,2,0,0]*(c(5)>97),'']

Giải trình:

Có một chuỗi đầu vào ctrên định dạng 1134am.

@(c)                              % Anonymous function
[c(1:4)                           % First 4 elements of the string
       +[1,2,0,0]                 % Add 1 and 2 to the first to the ASCII-value of the 
                                    first two characters
                 *)c(5)>97)       % if the fifth element is larger than 97 
                                    (the ASCII code for `a`).
                            ,'']  % Implicitly convert to string

Hoặc, một cách tiếp cận khác cho 37 byte:

@(c)[c(1:4)+('1200'-48)*(c(5)>97),'']

7

PowerShell , 23 20 19 byte

date "$args"-f HHmm

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

(Nếu bạn đang ở trên Windows, bạn có thể bỏ qua get-, để giảm xuống còn 19 byte. Trên TIO, rõ ràng nó yêu cầu Get-Datetên đầy đủ .)

Lấy đầu vào dưới dạng một chuỗi $args[0], sử dụng đầu vào đó làm đầu vào cho Get-Datelệnh ghép ngắn, phân tích cú pháp nó thành một datetimeđối tượng .NET . Điều đó được thông qua với -ftham số ormat HHmmđể chuyển đổi nó thành thời gian quân sự (thủ đô HHchỉ định thời gian 24 giờ). Đầu ra là ẩn.

Công cụ phân tích cú pháp khá mạnh mẽ, vì vậy các đầu vào bổ sung như 12amhoặc 12:00amcũng được cho phép. Chơi xung quanh với đầu vào trên TIO và xem những gì khác hoạt động.

( Đã lưu 3 byte nhờ @admalledd ... đã lưu một byte khác nhờ @briantist )


Có thể xóa khoảng trắng giữa $args[0]-f, cũng như xóa các dấu ngoặc đơn xung quanh định dạng str : date $args[0]-f HHmm. Ít nhất điều này hoạt động trên quyền hạn của tôi ...
admalledd

@admalledd Vì khóc to, tôi luôn quên những trích dẫn đó. Nghiêm túc, tôi nghĩ rằng mỗi lần duy nhất tôi đã sử dụng Get-Datevới -f, ai đó đã nhắc nhở tôi rằng bạn không cần dấu ngoặc kép. Và cuộc gọi tốt với việc loại bỏ khoảng trống, vì trình phân tích cú pháp coi ]phần cuối của mã thông báo. Cảm ơn!
admBorkBork

5

Python 2, 44 byte

lambda s:`int(s[:2])%12+12*("p"in s)`+s[3:5]

Định dạng đầu vào : 01:23am, tùy chọn mvà khoảng trắng sau phút
Định dạng đầu ra:123


5

Bình thường, 21 20 byte

Aczd++*12}\pH%sG12PH

Có đầu vào của biểu mẫu 01 23alà "01:23 sáng". Ban đầu 0 là tùy chọn.
Đầu ra có dạng 123, với 0 ban đầu bị bỏ qua.

Trong mã giả:

                         z = input()
A                        G, H =
 czd                         z.split(" ")       # splits into the form ["1","23p"]
                         (
     +*12}\pH            12*('p' in H) +        # add 12 if 'p' is in the string
             %sG12         int(G) % 12
    +             PH     ) + H[:-1]             # prepend hour to minutes, with a/p removed

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


4

PHP, 35 32 byte

định dạng đầu vào: không phân biệt chữ hoa chữ thường, yêu cầu dấu hai chấm và mđịnh dạng đầu ra hhmm. sử dụng tích hợp:

<?=date(Hi,strtotime($argv[1]));

lấy đầu vào từ đối số dòng lệnh đầu tiên.

PHP, 45 byte, không tích hợp sẵn

định dạng đầu vào (h)h:mm a(m)chữ thường, định dạng đầu ra (h)hmm.

<?=($s=$argv[1])%12+12*($s[6]>a).$s[3].$s[4];

4
Tại sao các downvote?
Tít

Tôi chỉ đang suy đoán nhưng có lẽ đó là vì bạn đã sử dụng PHP và downvoter không thích PHP? : p
bash0r

3

JavaScript (ES6), 40 byte

a=>(new Date('1/1/1/'+a)+a).slice(16,21)

Đầu vào phải được định dạng như: 12:32 am


3

GNU Coreutils ( 18 16 byte)

Từ một kịch bản shell:

Không chấp nhận khoảng trắng trong đầu vào

Tại thời điểm đó, cũng có thể sử dụng $ 1 và bỏ qua các đối số bổ sung.

date -d$1 +%H%M

⇒ echo 'date -d$1 +%H%M' > time24
⇒ sh time24 1:45pm
1345
⇒ sh time24 1:45 pm
0145 # Wrong answer, “pm” ignored because of space

Nguyên

Để cho phép khoảng trắng trong đầu vào,

date -d"$@" +%H%M

3

C #, 46 byte

s=>System.DateTime.Parse(s).ToString("HH:mm");

Chuỗi được lấy trong đầu vào như 12:00 AM

Thực hiện tương tự nhưng cơ sở trên đầu ra từ lệnh gọi mặc định đến ToString(Giả sử văn hóa en-GB) dài hơn 3 byte cho 49 byte:

s=>(System.DateTime.Parse(s)+"").Substring(11,5);

3

date, 0 + 8 = 8 byte

Về vấn đề sử dụng công cụ phù hợp cho công việc

Đưa đầu vào như một đối số dòng lệnh. Chạy với +%H%M -d(hình phạt 8 byte). Không có chương trình thực tế ở đây; toàn bộ công việc được thực hiện bởi các đối số dòng lệnh. (Đây là một minh chứng khá tốt về lý do tại sao có một hình phạt cho các đối số dòng lệnh!)

Thí dụ:

$ date +%H%M -d "12:05 am"
0005

3

Java 7, 138 106 105 104 byte

String a(String a){return new java.text.SimpleDateFormat("Hmm").format(new java.util.Date("Ja1,0,"+a));}

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

Đầu vào được phân cách bằng dấu hai chấm và có khoảng cách giữa thời gian và sáng / chiều. Đầu ra không được phân định dấu hai chấm.

-1 byte nhờ Kevin Cruijssen


Bout ngắn như nó nhận được cho Java, 20% mã là vòng loại gói.
Bạch tuộc ma thuật Urn

Các quy tắc nêu rõ " Đối với cả đầu vào và đầu ra: - 0 ở vị trí đầu tiên là tùy chọn. 0 ở 3 vị trí cuối cùng là bắt buộc. ", Có nghĩa là bạn có thể thay đổi HHmmthành Hmm.
Kevin Cruijssen

@KevinCruijssen bắt đẹp!
Chọc

2

Japt , 14 byte

Ð"1/"+U s sG21

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

Điều này chỉ hoạt động trên Chrome. Đây là phiên bản hoạt động trong tất cả các trình duyệt:

Ð"1/"³+U s sG21

Một lần nữa xin cảm ơn ETHproductions vì sự giúp đỡ!


2

Perl, 45 28 37 byte

28 37 byte

(c / o @Dada)

(Mã 36 byte, 1 byte cho trình biên dịch -p chuyển đổi )

Chấp nhận 0145pmcác định dạng loại, với am / pm hoặc a / p. Số không hàng đầu về đầu vào cần thiết.

s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1

Kiểm tra:

⇒ echo 0145pm | perl -p time24
1345
⇒ echo 0245pm | perl -p time24
1445
⇒ echo 1245pm | perl -p time24
1245
⇒ echo 1245am | perl -p time24
045

Câu trả lời ban đầu của tôi

(cũng nhẹ nhàng sửa đổi)

(Mã 39 byte, 1 byte cho trình biên dịch -p chuyển đổi .)

Chỉ chấp nhận các hình thức như 0145p hoặc 0145a, và không có hình thức nào khác, và yêu cầu perl -pchế độ để hoạt động.

s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e

kiểm tra:

⇒ echo 0145p | perl -p time24
1345
⇒ echo 1222a | perl -p time24
022
⇒ echo 1234p | perl -p time24
1234

Chào mừng bạn đến với PPCG. Câu trả lời đầu tiên tốt đẹp. Bạn có thể sử dụng các công tắc, nhưng chúng được tính bằng bytecount của bạn (như được giải thích ở đây ). Trong trường hợp của bạn, đó sẽ là 1 byte (vì chỉ -pcần thiết) nếu bạn thay đổi dấu ngoặc đơn cho dấu ngoặc kép.
Dada

Cảm ơn. Không thể tìm thấy Câu hỏi thường gặp đó, tự hỏi liệu nhóm Stack Exchange có thể ghim nó trên trang câu trả lời hay không?
BRPocock

OK, tôi đã Perling kể từ loạt 4 và điều đó làm tôi đau đầu, bạn nên lấy tín dụng và tự đăng bài với nó. ☺
BRPocock

Tôi nghĩ rằng nên bao gồm nó bây giờ?
BRPocock

Tôi đã mắc lỗi, giải pháp này sẽ không hoạt động khi số phút nằm trong khoảng từ 0 đến 9. Mã này hoạt động sau đó: s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1(37 byte). Và nhân tiện, giải pháp đầu tiên của bạn có thể được đánh xuống một chút: s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e(40 byte)
Dada

2

Hàng hóa 64 BASIC, 301 byte trước khi chạy, 321 byte được sử dụng một lần chạy

0 A$="12:34AM":A=VAL(LEFT$(A$,2)+MID$(A$,4,2)):ON-(RIGHT$(A$,2)="AM")+1GOSUB1,2:TI$=A$:PRINTTI$:END
1 ON-(A=>1200ANDA<=1259)GOTO3:A=A+1200:GOTO3
2 ON-(A=>1200ANDA<=1259)GOTO4:ON-(A<=959)GOTO7:RETURN
3 A$=RIGHT$(STR$(A)+"00",6):RETURN
4 A=A-1200:IFA=0THENA$="000000":RETURN
5 IFA<10THENA$="000"+RIGHT$(STR$(A),1)+"00":RETURN
6 A$="00"+RIGHT$(STR$(A),2)+"00":RETURN
7 A$="0"+RIGHT$(STR$(A),3)+"00":RETURN

Để nhập cái này trên một hàng hóa thực 64, bạn sẽ cần sử dụng các từ viết tắt BASIC, chẳng hạn như LE [shift] F cho LEFT$, M [shift] I cho MID$v.v ... hoặc bạn có thể thử CBM PRG STUDIO.

Các TI$biến trong Commodore BASIC trình bày thời gian trong định dạng đồng hồ 24 giờ như HHMMSS khi in. Lấy không gian ra sau số dòng không lưu bất kỳ bộ nhớ nào vì Commodore BASIC sẽ tự động thêm vào khoảng trống khi bạn liệt kê chương trình sau khi nhập.

Khi chuyển đổi một số thành một chuỗi bằng STR$, Commodore BASIC sẽ thêm vào khoảng trắng (vì vậy nếu bạn PRINT Asẽ thấy một khoảng trắng trước khi số được hiển thị), tôi đã xóa không gian mở trên chuyển đổi số thành chuỗi bằng RIGHT$lệnh. Bạn có thể lưu một vài byte bằng cách sửa đổi dòng 0 thành:

0 A=VAL(LEFT$(A$,2)+MID$(A$,4,2)):ON-(RIGHT$(A$,2)="AM")+1GOSUB1,2:TI$=A$:PRINTTI$:END

vì vậy bạn sẽ cần khai báo thời gian để chuyển đổi trước khi chạy chương trình, như sau:

A$="01:22AM":GOTO 0

Bất cứ lúc nào sau đó, bạn có thể thấy thời gian hiện tại với:

? TI$

Chơi golf mã trên các máy 8 bit thực sự thú vị vì nó cho thấy bao nhiêu được thực hiện cho một lập trình viên thời hiện đại mà không cần phải suy nghĩ về nó.
Shaun Bebbers

2

Java, 171 byte

enum t{;public static void main(String[] a){a=a[0].split("[: ]");System.out.format("%02d%02d",(Long.parseLong(a[0])+(a[2].charAt(0)=='p'?12:0))%24,Long.parseLong(a[1]));}}

Định dạng đầu vào là HH:MM a/pvà định dạng đầu ra là HHMM. Lạm dụng thực tế là hàm chính có một chuỗi các chuỗi để chia đầu vào thành 3 phần: chỉ báo giờ, phút và / p.

Ví dụ đầu vào và đầu ra:

Input: 01:02 a
Output: 0102

Input: 01:02 p
Output: 13:02

Input: 12:22 p
Output: 0022

Phiên bản bị đánh cắp:

enum t {
    ;

    public static void main(String[] a) {
        a = a[0].split("[: ]");
        System.out.format("%02d%02d", (Long.parseLong(a[0]) + (a[2].charAt(0) == 'p' ? 12 : 0)) % 24, Long.parseLong(a[1]));
    }
}

Tôi đã không thấy enumđược sử dụng để giữ main. Đẹp :)
Robert Benson

Bạn có thể bỏ qua một khoảng
trắng

2

REXX, 33 byte

arg h':'m a
say h+((a=pm)*12)':'m

Sử dụng:

12:34 pm -> 24:34
1:34 pm -> 13:34
1:34 am -> 1:34
0:34 AM -> 0:34

Điều này có thể được rút ngắn bằng một vài byte nếu dấu hai chấm làm dấu phân cách không được sử dụng.


Dấu phân cách đại tràng là tùy chọn.
Carcigenicate

Vâng, nhưng nó không nhìn tốt.
idrougge

Vì đây là một thử thách chơi gôn mã, nếu bạn có tùy chọn chương trình dài hơn với đầu ra đẹp hoặc chương trình ngắn hơn với đầu ra xấu hơn, hãy chọn cái sau. Sẽ không ai phán xét bạn.
Carcigenicate

2

C (tiếng kêu) , 94 byte

h,m;f(){char a,b;scanf("%d:%d%c%c",&h,&m,&a,&b);printf("%02d%02d",a=='a'?(h%12):(12+h%12),m);}

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

Tôi ở đây để tìm hiểu, vì vậy mọi lời khuyên về cách tôi có thể tối ưu hóa mã đều được chào đón.

@ Johan du Toit Cảm ơn, vì đã tiết kiệm một vài byte!


Bạn không phải kiểm tra nếu b == 'm' và bạn có thể làm cho nó ngắn hơn nhiều bằng cách sử dụng câu lệnh if:printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
Johan du Toit

1
@JohanduToit Đầu vào của tôi là 6: 00pc? :)
Abel Tom

1
Điều đó sẽ gây ra tác hại không thể khắc phục đối với tính liên tục không-thời gian.
Johan du Toit


2

C, 87 72 byte

Đã lưu 15 byte nhờ @Johan du Toit

Gọi f()với một chuỗi có thể thay đổi như một đối số, đầu vào là đầu ra.

Các định dạng là HH:MMa/p, a/pchữ thường ahoặc chữ thường p. Không có khoảng cách giữa thời gian và chỉ định kinh tuyến được cho phép.

i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}

Hãy thử nó trên ideone .


bạn có thể lưu một vài byte bằng cách sử dụng như sau:i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}
Johan du Toit

Đề xuất (p[5]!=97)*12;thay vì(p[5]^97?12:0);
trần mèo


2

SmileBASIC, 67 byte

INPUT T$P=POP(T$)>"a
TMREAD"00:"+T$OUT,H,M?H MOD 12+12*P,T$[3];T$[4]

Đầu vào: HH:MMa/p

Đầu ra: HH MM


1

R, 68 byte

x=substr(strptime(scan(,""),"%I:%M %p"),12,16);`if`(x=="","00:00",x)

Đọc đầu vào từ stdin và nó được cho là ở một trong các định dạng sau:

  • 12:00 AM
  • 12:00 am
  • 12:00AM
  • 12:00am

và đầu ra là trên định dạng: [1] "00:00"

Trong hầu hết các trường hợp, strptime()đầu ra là ở định dạng: "2017-01-06 12:00:00 CET"trong đó ngày là ngày cục bộ. Vì vậy, chúng ta cần sử dụng substr()để chỉ trả về thời gian, tuy nhiên, nếu đầu vào là nửa đêm (ví dụ 12:00am) thì đầu ra chỉ "2017-01-06 CET"là lý do cho sự ifviệc ở cuối (phải có một cách giải quyết thông minh hơn).


Tôi thực sự muốn tìm một cách ngắn hơn với lubridate, nhưng tên của gói quá dài (trong số các vấn đề khác).
BLT

1

C, 159 152 byte

#define C c[0]
main(i,c)char**c;{scanf("%s",C);i=atoi(C);if(C[5]-97){i+=i-12?12:0;sprintf(C,"%d",i);}else if(i==12)C[0]=C[1]=48;C[2]=58;C[5]=0;puts(C);}

Định dạng đầu vào: 07:30am



1

Toán học, 33 byte

#~DateString~{"Hour24","Minute"}&

Chức năng ẩn danh. Lấy một chuỗi làm đầu vào và trả về một chuỗi là đầu ra. Hoạt động với hầu hết các định dạng, bao gồm hh:mm AM/PM.


1

JavaScript, 67 byte

f=s=>!~s.indexOf`pm`?s.slice(0,5):((+s.slice(0,2)+12)+s.slice(2,5))

Đầu vào giống như trong ví dụ


Không hoạt động cho 12:00 amhoặc12:00 pm
Herman L

1

Haskell, 61 ký tự

Phiên bản ngắn:

c[a,b,c,d,e]=(mod(read[a,b]::Int)12+f e,[c,d])
f 'a'=0
f _=12

Định dạng đầu vào: HHMM(a/p)trong đó (a/p)là 'a' hoặc 'p' mà không có dấu ngoặc đơn.

Định dạng đầu ra: (hs, MM)- một bộ chứa số giờ dưới dạng số nguyên và MM vẫn là chuỗi.

Thí dụ:

> c "1200p"
(12,"00")
> c "1200a"
(0,"00")

Phiên bản dài hơn (với tên hữu ích hơn và một thay thế hs):

conv [h0,h1,m0,m1,ap] = (mod hs 12 + offset ap, [m0,m1])
    where hs = read [h0,h1] :: Int

offset 'a'=  0
offset  _ = 12

1

Lisp thường gặp ( 151 122 byte)

OK, CL không có nghĩa là là ter terse, nhưng tôi chỉ ngạc nhiên rằng nó không phải là dài dòng nhất cho cái này.

Đây là phiên bản 122 byte, yêu cầu đầu vào vị trí cố định. 0145pmhoặc 145pđược chấp nhận (với không gian hàng đầu ở vị trí ký tự đầu tiên).

(defun a(x)(let((h(parse-integer(subseq x 0 2)))(m(subseq x 2 4)))(format nil "~a~a" (+(mod h 12)(if(find #\p x)12 0))m)))

PPRINT:

(DEFUN A (X)
  (LET ((H (PARSE-INTEGER (SUBSEQ X 0 2)))
        (M (SUBSEQ X 2 4)))
    (FORMAT NIL
            "~a~a"
            (+ (MOD H 12) (IF (FIND #\p X) 12 0))
            M)))

Nicer nhưng lớn hơn

Chỉ sử dụng Common-Lispgói. Chấp nhận (chỉ) đầu vào dưới dạng số nguyên giờ (có hoặc không có đầu 0), bằng chữ :, phút hai chữ số và theo dõi tùy chọn amhoặc pm(chỉ trong trường hợp chữ thường). Cho phép khoảng trắng trong khoảng thời gian và xung quanh AM / PM, nhưng không trực tiếp sau :.

(defun a(x)(let*((c(position #\: x))(h(parse-integer(subseq x 0 c)))(m(subseq x(1+ c)(+ 3 c))))(format nil "~a~a" (+(mod h 12)(if(find #\p x)12 0))m)))

Kiểm tra:

GOLF> (a "  1:45 am ")
"1:45"
GOLF> (a "  1:45 pm ")
"13:45"
GOLF> (a " 12:45 am ")
"0:45"
GOLF> (a "12:45p")
"12:45"

pprint định nghĩa hàm:

(DEFUN A (X)
  (LET* ((C (POSITION #\: X))
         (H (PARSE-INTEGER (SUBSEQ X 0 C)))
         (M (SUBSEQ X (1+ C) (+ 3 C))))
    (FORMAT NIL "~a~a"
            (+ (MOD H 12)
               (IF (FIND #\p X)
                   12
                   0))
            M)))

Khử nhiễu:

(defun 12->24-hour (timestring) 
  "Given a  TIMESTRING with  hours:minutes and a  trailing “am”  or “pm”
   \(lowercase-only), return the 24-hour time without a delimiter as
   a  string \(eg,  \"1:45am\" →  \"0145\"). Spaces  surrounding the
   time or  meridian markers are ignored  \(eg, \" 02:22 pm  \") but
   other junk in the string may cause incorrect behavior."
  (let ((colon (position #\: timestring)))
    (let ((hours (parse-integer (subseq timestring 0 colon)))
          (minutes (subseq timestring (+ 1 colon) (+ 3 colon))))
      (format nil "~a~a"
              (+ (mod hours 12) (if (find #\p timestring) 12 0))
              minutes))))

1

Võng mạc , 61 60 byte

^12(.*)a
00$1
^(12.*)p
$1
a

(\d\d)(.*)p
$1$*x12$*x$2
x+
$.&

Đầu vào được đưa ra mà không có dấu hai chấm riêng biệt, dẫn đầu bắt buộc 0và chỉ sử dụng ahoặc pthay vì amhoặc pm, ví dụ: 0134a01:34 sáng. Đầu ra trong thời gian quân sự thẳng bằng cách sử dụng 0000 như nửa đêm. (Tôi có thể lưu một số byte nếu tôi được phép chuyển đổi, ví dụ: 12:30 sáng 2430, nhưng tôi nghi ngờ điều đó có thể chấp nhận được).

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

Giải trình

Hai trường hợp ban đầu liên quan đến "12" giờ, vì sáng / chiều được đảo ngược trong 12:

^12(.*)a
00$1

Nếu thời gian là từ nửa đêm (12 giờ sáng) đến 1 giờ sáng, hãy đổi nó thành 00 thay vì 12 và xóa a.

^(12.*)p
$1

Nếu thời gian là giữa trưa (12 giờ tối) và 1 giờ chiều, hãy xóa p để chỉ nhận thời gian 24 giờ.

Đối với bất kỳ giờ nào khác:

a
 

Nếu thời gian là sáng, chỉ cần loại bỏ ađể có được thời gian 24 giờ.

(\d\d)(.*)p
$1$*x12$*x$2
x+
$.&

Nếu thời gian là chiều, loại bỏ p. Chuyển đổi thành phần giờ thành đơn nguyên, thêm 12 và chuyển đổi lại thành số thập phân. Để lại số phút không thay đổi.


1

Hàng loạt, 40 byte

@set/aa=0,p=12,h=%1%%12+%3
@echo %h% %2

Lấy đầu vào là ba đối số. Giả sử đối số thứ hai có số 0 khi cần thiết, đối số thứ ba là ahoặcp . Hoạt động bằng cách coi đối số thứ ba là một tên biến gián tiếp do đó thêm nó vào số giờ; số phút không bị ảnh hưởng vì vậy chỉ là đầu ra trực tiếp. Nếu trộn các định dạng khác nhau là OK thì không gian cuối cùng có thể bị xóa để lưu một byte.

(Khá khó chịu, câu hỏi này đã không xuất hiện trên trang câu hỏi khi tôi tải nó ban đầu và tôi chỉ vấp phải nó vì tôi đang tìm kiếm một câu hỏi khác.)

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.