12 시간에서 24 시간 시간 변환기


27

놀랍게도이 간단한 작업은 아직 존재하지 않는 것 같습니다.

당신의 임무는 12 시간의 시간을 입력으로 받아 "군사 시간"또는 24 시간 시간 형식으로 변환하는 프로그램을 작성하는 것입니다.

입력 형식은 다음과 같습니다.

HH:MM am/pm

약간의 변형이 허용되지만 :

  • 남은 시간과 am / pm을 분리하는 공간은 선택 사항입니다.

  • 마지막 부분은 "am"/ "pm"또는 "a"/ "p"일 수 있습니다.

  • 모든 대문자는 괜찮습니다.

출력은 입력 된 시간이며 24 시간 형식으로 변환됩니다. 숫자 또는 문자열 일 수 있습니다.

입력과 출력 모두 :

  • 우선 0은 선택 사항입니다. 마지막 3 곳의 0은 필수입니다.

  • 시간과 분을 구분하는 분리 문자는 ":", ""(공백) 또는 아무것도 될 수 없습니다.

기타 참고 사항 :

  • 자정은 0000 또는 2400으로 표현 될 수 있습니다.

  • 자정은 "am"으로, 정오는 "pm"으로 간주됩니다.

프로그램은 함수 또는 전체 프로그램 일 수 있으며 결과를 리턴하거나 stdout에 출력해야합니다. 후행 공백은 괜찮습니다.

예 (모든 형식을 지원할 필요는 없음) :

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

이것은 코드 골프이므로 가장 적은 바이트 수가 이깁니다. 이것은 내장을 사용하여 해결하는 것이 쉽지 않기 때문에 수동 으로이 문제를 해결하는 코드를 보는 것이 좋습니다 (그러나 내장 기능을 사용하는 것이 좋습니다).

명확히하기 위해 가능한 모든 형식을 지원할 필요 는 없습니다 . 단일 입력과 단일 출력 형식 (원하는 선택) 만 지원하면됩니다. 그러나 위에서 설명한대로 형식을 제한하고 싶습니다 (이미 무료입니다). {1134,'pm'}예를 들어 허용되지 않습니다.


어떤 형식을 지원해야합니까? 딱 하나만?
redstarcoder

@redstarcoder 예. 위의 요구 사항을 준수하는 모든 형식은 괜찮지 만 위의 예와 같이 모든 형식을 지원할 필요는 없습니다. 단일 형식의 입력과 단일 형식의 출력이 좋습니다.
Carcigenicate

형식에 선행 0 이 필요 합니까? 예를 들어 01:54pm작동하지만 작동 1:54pm하지 않습니까?
FlipTack

예. 필요한 입력 형식을 선택할 수 있습니다.
Carcigenicate

입력과 출력에 초를 포함시킬 수 있습니까?
12Me21

답변:


8

V , 21 17 바이트

4 바이트에 대해 @DJMcMayhem에게 감사합니다!

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

온라인으로 사용해보십시오! 이 형식을 취 중 하나입니다 또는 형식, 반환을HH:MMxxapHH:MM

16 진 덤프 :

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

설명:

í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

입력이 항상 [1-12]옳습니까? 이 경우, ó^12/0대신에 할 수 있다고 생각합니다.cw^R=^R"%12
DJMcMayhem

1
또한 "전역 명령"을 사용하여 매크로를 깨는 것보다 짧은 정규 표현식과 일치하는 행에 명령을 적용 할 수 있습니다. çp/12^A이것은 :g/p/norm 12<C-a>vim
DJMcMayhem

나는 그것을 사용하는 것을 금지하지 않았음에도 불구하고 내장 된 것을 사용하지 않았다는 것을 분명히하는 가장 낮은 점수의 답변이기 때문에 이것을 받아 들였습니다. 누구 든지이 선택에 문제가 있으면 공정하게 답변을 변경할 수 있습니다. 나는이 대답이 가장 가치 있다고 생각합니다.
Carcigenicate


10

옥타브, 21 17 바이트

Luis Mendo 덕분에 4 바이트를 절약했습니다. 대신 형식 번호 15를 지정할 수 'HHMM'있습니다.

@(c)datestr(c,15)

설명:

다음 형식 의 문자열 을 입력으로 받는 익명 함수 입니다. 형식을 표준 날짜 형식 중 하나로 자동 인식하여 지정된 형식 번호 15 (즉)로 출력합니다 .c'11:34 AM'datestrHH:MM

지정된 출력 형식에 AM없거나 PMOctave가 자동으로이를 군사 시간이라고하는 것으로 변환합니다.

온라인으로 사용해보십시오.


datestr35 바이트 를 사용 하지 않는 버전

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

설명:

c형식으로 입력 문자열 을 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

또는 37 바이트에 대한 다른 접근 방식 :

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

7

PowerShell , 23 20 19 바이트

date "$args"-f HHmm

온라인으로 사용해보십시오!

(Windows 인 경우을 생략하여 get-19 바이트로 줄일 수 있습니다. TIO에서는 전체 Get-Date이름이 필요합니다 .)

입력을 문자열 $args[0]로 가져 Get-Date와서이를 입력으로 .NET datetime개체 로 구문 분석 하는 cmdlet에 대한 입력으로 사용 합니다. 그것은 -format 매개 변수 와 함께 전달되어 HHmm군사 시간으로 변환합니다 (자본 HH은 24 시간을 지정합니다). 출력은 암시 적입니다.

구문 분석 엔진은 같은 매우 강력하므로 추가 입력입니다 12am또는 12:00am뿐만 아니라 사용할 수 있습니다. TIO의 입력을 가지고 놀아보고 다른 것이 작동하는지 확인하십시오.

( @admalledd 덕분에 3 바이트를 저장했습니다 ... @briantist 덕분에 다른 바이트를 저장했습니다 )


$args[0]및 사이의 공백을 제거하고 -fstr : 형식의 작은 따옴표 를 제거 할 수 있어야합니다 date $args[0]-f HHmm. 적어도 이것은 내 파워 쉘에서 작동합니다 ...
22 분 29 초에 admalledd

@admalledd 크게 울부 짖기 위해 나는 항상 그 인용문을 잊어 버립니다. 진심으로, 나는 Get-Date함께 사용할 때마다 -f누군가가 당신이 따옴표가 필요하지 않다고 상기 시켰습니다. 파서는 ]토큰의 끝으로 취급하기 때문에 공간을 제거하는 것도 좋습니다 . 감사!
AdmBorkBork

5

파이썬 2, 44 바이트

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

입력 형식 : 01:23am, 선택적 m및 몇 분 후 공백
출력 형식 :123


5

Pyth, 21 20 바이트

Aczd++*12}\pH%sG12PH

01 23a"01:23 am"으로 양식 을 입력합니다 . 초기 0은 선택 사항입니다.
출력은 형식 123이며 초기 0은 생략됩니다.

의사 코드에서 :

                         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

온라인으로 사용해보십시오!


4

PHP, 35 32 바이트

입력 형식 : 대소 문자를 구분하지 않으며 콜론 및 m, 출력 형식이 필요 합니다 hhmm. 내장 사용 :

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

첫 번째 명령 행 인수에서 입력을받습니다.

PHP, 45 바이트, 내장되지 않음

입력 형식 (h)h:mm a(m)소문자, 출력 형식 (h)hmm.

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

4
왜 공감해야합니까?
Titus

방금 추측하지만 아마도 PHP를 사용하고 downvoter가 PHP를 좋아하지 않기 때문일 수 있습니다. : p
bash0r

3

자바 스크립트 (ES6), 40 바이트

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

입력은 다음과 같은 형식이어야합니다. 12:32 am


3

GNU Coreutils ( 18 16 바이트)

쉘 스크립트에서 :

입력에 공백을 허용하지 않습니다

이 시점에서 $ 1을 사용하고 추가 인수를 무시할 수 있습니다.

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

기발한

입력에 공백을 허용하려면

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

3

C #, 46 바이트

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

문자열은 다음과 같은 입력으로 가져옵니다. 12:00 AM

기본 호출 ToString(이라고 가정) 에 대한 출력에서 ​​하위 문자열을 사용하지만 동일한 작업을 수행하면 en-GB49 바이트에 대해 3 바이트가 길어집니다.

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

3

date, 0 + 8 = 8 바이트

작업에 적합한 도구를 사용하는 주제

입력을 명령 행 인수로 사용합니다. +%H%M -d(8 바이트 페널티)로 실행하십시오 . 실제 프로그램은 없습니다. 전체 작업은 명령 행 인수로 수행됩니다. (이것은 명령 줄 인수에 대한 페널티 가 있는지에 대한 꽤 좋은 데모입니다 !)

예:

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

3

자바 7 138 106 105 104 바이트

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

온라인으로 사용해보십시오!

입력은 콜론으로 구분되며 시간과 오전 / 오후 사이에 공백이 있습니다. 출력은 콜론으로 구분되지 않습니다.

Kevin Cruijssen 덕분에 -1 바이트


Java의 경우 코드의 20 %가 패키지 한정자입니다.
Magic Octopus Urn

"규칙은이 상태 . : - 처음에 0은 선택 사항 지난 3 곳에서 0은 필수 입력 및 출력이 모두 들어. ", 변경할 수있는 수단 HHmm으로 Hmm.
Kevin Cruijssen

@KevinCruijssen 멋진 캐치!
Poke


2

펄, 45 28 37 바이트

28 37 바이트

(c / o @Dada)

(36 바이트 코드, 1 바이트 컴파일러 -p전환)

0145pmam / pm 또는 a / p와 함께 형식 형식을 허용 합니다. 입력에 선행 0이 필요합니다.

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

테스트:

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

내 원래 답변

(또한 부드럽게 수정)

(39 바이트 코드, 1 바이트 컴파일러 -p전환)

0145p 또는 0145a와 같은 형식 만 허용하고 다른 형식은 허용하지 않으며 perl -p작동 하려면 모드가 필요 합니다.

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

테스트:

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

PPCG에 오신 것을 환영합니다. 좋은 첫 대답. 스위치를 사용할 수 있지만 여기에 설명 된대로 바이트 수로 계산됩니다 . -p큰 따옴표로 작은 따옴표를 변경하면 +1 바이트가됩니다 (단지 필요 하기 때문에 ).
Dada

감사. FAQ를 찾을 수 없었습니다. Stack Exchange 팀이 답변 페이지 나 다른 곳에 고정시킬 수 있는지 궁금하십니까?
BRPocock

OK, 나는 4 시리즈 이후 Perling 봤는데 그하게 머리의 상처를, 당신은 신용을 가지고 하나 자신을 게시해야한다. ☺
BRPocock

나는 지금 그것을 커버해야한다고 생각합니까?
BRPocock

실수했습니다. 분이 0에서 9 사이 일 때이 솔루션이 작동하지 않습니다.이 코드는 다음과 같이 작동합니다 s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1(37 바이트). 그건 그렇고, 첫 번째 솔루션은 조금만 골라 낼 수 있습니다 : s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e(40 바이트)
Dada

2

Commodore 64 BASIC, 실행 전 301 바이트, 실행 후 321 바이트

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

실제 Commodore 64에 이것을 입력하려면 LE [shift] F for LEFT$, M [shift] I for MID$등 ... 과 같은 기본 키워드 약어를 사용해야합니다 . 그렇지 않으면 CBM PRG STUDIO를 사용해 볼 수 있습니다.

TI$Commodore BASIC 의 변수는 인쇄시 시간을 24 시간 형식으로 HHMMSS로 표시합니다. Commodore BASIC은 프로그램을 시작한 후 프로그램을 나열 할 때 자동으로 공간을 추가하므로 줄 번호 다음에 공백을 제거해도 메모리가 절약되지 않습니다.

를 사용하여 숫자를 문자열로 변환 할 때 STR$Commodore BASIC은 공백을 추가합니다 (따라서 PRINT A숫자가 표시되기 전에 공백이 표시되면) RIGHT$명령 을 사용하여 숫자의 문자열을 문자열로 변환합니다 . 줄 0을 수정하여 몇 바이트를 절약 할 수 있습니다.

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

따라서 다음과 같이 프로그램을 실행하기 전에 변환 할 시간을 선언해야합니다.

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

그 후 언제든지 다음을 사용하여 현재 시간을 볼 수 있습니다.

? TI$

8 비트 머신에서 코드 골프를하는 것은 현대 프로그래머가 생각할 필요없이 얼마나 많은 일을하는지 보여 주므로 정말 흥미 롭습니다.
Shaun Bebbers

2

자바, 171 바이트

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

입력 형식은 HH:MM a/p이고 출력 형식은 HHMM입니다. main 함수에는 입력을 시간, 분 및 a / p 표시기의 세 섹션으로 나누는 문자열 배열이 있다는 사실을 남용합니다.

입력 및 출력 예 :

Input: 01:02 a
Output: 0102

Input: 01:02 p
Output: 13:02

Input: 12:22 p
Output: 0022

언 골프 버전 :

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

나는 enum을 붙잡는 데 사용 되지 않았다 main. Nice :)
Robert Benson

기본 메소드 서명에서 공백을 생략 할 수 있습니다. public static void main (String [] a) {...
staticmethod

2

REXX, 33 바이트

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

용도:

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

분리 문자로서의 콜론이 사용되지 않으면 이것은 몇 바이트 단축 될 수 있습니다.


콜론 구분 기호는 선택 사항입니다.
Carcigenicate

예, 그러나 좋지 않습니다.
idrougge

코드 골프 문제로, 출력이 꽤 긴 프로그램 또는 출력이 더 짧은 프로그램을 선택할 수있는 경우 후자를 선택하십시오. 아무도 당신을 판단하지 않습니다.
Carcigenicate

2

C (클랑) , 94 바이트

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

온라인으로 사용해보십시오!

배우려고 왔으므로 코드를 최적화하는 방법에 대한 팁을 환영합니다.

@ Johan du Toit 몇 바이트를 절약 해 주셔서 감사합니다!


b == 'm'인지 테스트 할 필요가 없으며 인라인 if 문을 사용하여 훨씬 짧게 만들 수 있습니다.printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
Johan du Toit

1
@JohanduToit 입력 한 내용은 6 : 00pc입니까? :)
Abel Tom

1
그것은 시공간 연속체에 돌이킬 수없는 해를 입힐 것입니다.
Johan du Toit


2

C, 87 72 바이트

@Johan du Toit 덕분에 15 바이트 절약

f()가변 문자열을 인수로 호출 하면 입력이 출력입니다.

형식은 HH:MMa/p여기서 a/p소문자 중 하나입니다 a소문자가 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;}

ideone에서 사용해보십시오 .


다음을 사용하여 몇 바이트를 절약 할 수 있습니다.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

(p[5]!=97)*12;대신 추천(p[5]^97?12:0);
천장 고양이


2

SmileBASIC, 67 바이트

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

입력: HH:MMa/p

산출: HH MM


1

R, 68 바이트

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

stdin에서 입력을 읽고 다음 형식 중 하나로 가정합니다.

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

출력 형식은 다음과 같습니다. [1] "00:00"

대부분의 경우 strptime()출력 형식은 다음과 같습니다. "2017-01-06 12:00:00 CET"여기서 날짜는 현지 날짜입니다. 따라서 substr()입력 시간이 자정 (예 :) 인 경우 12:00am출력이 마지막에 "2017-01-06 CET"있는 이유 if일 뿐이 므로 더 영리한 해결 방법이 있어야합니다.


와 함께 더 짧은 방법을 찾고 싶었지만 lubridate패키지 이름이 너무 길었습니다 (다른 문제 중에서도).
BLT

1

C, 159 152 바이트

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

입력 형식 : 07:30am



1

수학, 33 바이트

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

익명의 기능. 문자열을 입력으로 받아서 문자열을 출력으로 반환합니다. 를 포함한 대부분의 형식에서 작동합니다 hh:mm AM/PM.


1

자바 스크립트, 67 바이트

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

입력은 예제와 같습니다


작동하지 12:00 am않거나12:00 pm
Herman L

1

하스켈, 61 자

짧은 버전 :

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

입력 형식 : HHMM(a/p)여기서 (a/p)'A'또는 'P'는 괄호없이 중 하나입니다.

출력 형식 : (hs, MM)– 시간을 정수로 포함하고 MM을 여전히 문자열로 포함하는 튜플.

예:

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

더 긴 버전 (더 유용한 이름과 하나의 대체가 있음 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

공통 리스프 ( 151122 바이트)

좋아, CL은 "더 간결한"것은 아니지만 이것이 가장 장황하지 않은 것에 놀랐다.

고정 위치 입력이 필요한 122 바이트 버전입니다. 0145pm또는 145p수용 가능합니다 (첫 번째 문자 위치에 선행 공백이 있음).

(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)))

인쇄 :

(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)))

더 좋지만 더 큰

Common-Lisp패키지 만 사용 합니다. 정수 시간 (리딩 유무에 관계없이 0), 리터럴 :, 두 자리 분 및 선택적 후행 am또는 pm(소문자 만) 의 형식으로 입력 만 허용 합니다. 시간과 오전 / 오후에 공백을 허용하지만 :. 바로 뒤에는 허용되지 않습니다 .

(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)))

테스트:

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 함수 정의 :

(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)))

난독 처리 :

(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

망막 , 61 60 바이트

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

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

입력은 분리 대장, 필수 선도없이 주어 0, 만 사용 a또는 p대신에 am또는 pm예를 들면, 0134a오전 1시 34분입니다. 자정으로 0000을 사용하여 군사 시간으로 출력합니다. (예를 들어 오전 12시 30 분으로 변환 할 수 있으면 바이트를 절약 할 수 2430있지만 수용 할 수는 없습니다).

온라인으로 사용해보십시오!

설명

처음 두 경우는 "12"시간을 처리합니다. 오전 / 오후 12 시가 바뀌기 때문입니다.

^12(.*)a
00$1

시간이 자정 (오전 12시)과 오전 1시 사이이면 12 대신 00으로 변경하고을 제거하십시오 a.

^(12.*)p
$1

시간이 정오 (오후 12시)와 오후 1시 사이이면 p를 제거하여 단순히 24 시간 시간을 얻으십시오.

다른 시간 동안 :

a
 

시간이 오전이면 간단히 a24 시간을 얻기 위해 를 제거하십시오 .

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

시간이 오후이면을 제거하십시오 p. 시간 구성 요소를 단항으로 변환하고 12를 더한 다음 다시 10 진수로 변환하십시오. 분을 그대로 두십시오.


1

배치, 40 바이트

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

입력을 세 개의 인수로 취합니다. 두 번째 인수가 필요한 경우 앞에 0이 있다고 가정하고 세 번째 인수는 a또는 p입니다. 세 번째 인수를 간접 변수 이름으로 취급하여 시간 수에 추가하여 작동합니다. 분 수는 영향을받지 않으므로 직접 출력됩니다. 다른 형식을 혼합해도 문제가 없으면 마지막 공간을 삭제하여 바이트를 저장할 수 있습니다.

(당황 스럽게도이 질문은 처음로드 할 때 질문 페이지에 나타나지 않았으며 다른 질문을 검색했기 때문에 넘어졌습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.