12時間から24時間のタイムコンバーター


27

驚くべきことに、この単純なタスクはまだ存在していないようです...

あなたの仕事は、入力として12時間の時間を取り、それを「軍事時間」または24時間の時間形式に変換するプログラムを書くことです。

入力は次の形式になります。

HH:MM am/pm

わずかなバリエーションが許可されていますが:

  • am / pmと残りの時間を区切るスペースはオプションです。

  • 最後の部分は、「am」/「pm」または「a」/「p」のいずれかです。

  • 大文字でも大丈夫です。

出力は、24時間形式に変換された入力時間になります。数値または文字列を指定できます。

入力と出力の両方について:

  • 最初の0はオプションです。最後の3桁の0は必須です。

  • 時間と分を区切る区切り文字は、「:」、「」(スペース)、またはなしです。

その他の注意事項:

  • 真夜中は0000または2400のいずれかで表現できます。

  • 真夜中は「午前」と見なされ、正午は「午後」と見なされます。

プログラムは関数または完全なプログラムであり、結果を返すか、標準出力に出力する必要があります。末尾の空白は問題ありません。

例(すべての形式をサポートする必要はありません):

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

これはコードゴルフであるため、最小バイト数が優先されます。これはビルトインを使用して解決するのは非常に簡単なので、これを手動で解決するコードを見るといいでしょう(ただし、ビルトインの使用は問題ありません)。

明確にするために、考えられるすべての形式をサポートする必要はありません。(選択した)単一の入力および単一の出力形式のみをサポートすることは問題ありません。ただし、上記で概要を説明したようにフォーマットを制限したいと思います(これは既にかなり無料です)。{1134,'pm'}、たとえば、受け入れられません。


サポートするにはどの形式が必要ですか?一つだけ?
-redstarcoder

@redstarcoderはい。上記の要件に準拠する形式であれば問題ありませんが、上記の例のように、すべての形式をサポートする必要はありません。単一の入力形式と単一の出力形式で十分です。
発癌性

私たちのフォーマット先行ゼロを要求することを許可されていますか?たとえば、01:54pm動作しますが、動作し1:54pmませんか?
FlipTack

はい。必要な入力形式を選択できます。
発癌性

入力と出力に秒を含めることはできますか?
12Me21

回答:


8

V21 17バイト

4バイトありがとう@DJMcMayhem!

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

オンラインでお試しください! これは、フォーマット取るのいずれかであるか、そして形式で返しますHH:MMxxapHH:MM

Hexdump:

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>in vim と同等です
DJMcMayhem

私はこれを受け入れたのは、それが組み込みのものを使用していないことを明らかにした最も低い得点の答えだったからです(それらを使用することを禁止していませんでしたが)。誰かがこの選択に関して問題を抱えている場合、私は私の答えを公平に変更できます。しかし、この答えは最もふさわしいと思います。
発癌性


10

オクターブ、21 17バイト

Luis Mendoのおかげで4バイト節約されました。代わりにフォーマット番号15を指定できます'HHMM'

@(c)datestr(c,15)

説明:

これは、形式の入力として文字列を受け取る匿名関数cです'11:34 AM'datestrは、標準の日付形式の 1つとして形式を自動的に認識し、指定された形式番号15で出力しますHH:MM

指定された出力形式にはないため AMか、PMOctaveが自動的にミリタリータイムと呼ばれる変換するためです。

オンラインでお試しください。


datestr35バイトを使用していないバージョン

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

説明:

cformatの入力文字列を受け取ります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

PowerShell23 20 19バイト

date "$args"-f HHmm

オンラインでお試しください!

(Windowsを使用している場合は、省略できます get-、をして19バイトまで減らす。TIOでは、明らかにフルネームが必要Get-Dateです。)

入力を文字列$args[0]として受け取りGet-Date、それをコマンドレットへの入力として使用し、コマンドレットはそれを.NET datetimeオブジェクトに解析します。-formatパラメータで渡され、HHmm軍事時間に変換HHされます(大文字は24時間を指定します)。出力は暗黙的です。

解析エンジンは非常に堅牢であるため、12amまたは12:00amなどの追加入力も許可されます。TIOの入力をいじって、他に何が機能するかを確認してください。

@admalleddのおかげで3バイト保存されました... @briantistのおかげでもう1バイト保存されました


$args[0]との間のスペースを削除し-f、フォーマットstr:を囲む一重引用符を削除できる必要がありますdate $args[0]-f HHmm。少なくともこれは私のPowerShellで動作します...-
1

@admalledd大声で叫ぶために、私はいつもそれらの引用を忘れます。まじめな話、私は私が使用した一つ一つの時間を考えるGet-Date-f、誰かがあなたが引用符を必要としないことを思い出しましたが。また、パーサーは]トークンの最後として処理するため、スペースを削除することも適切です。ありがとう!
AdmBorkBork

5

Python 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
なぜ下票なのですか?
タイタス

私は推測していますが、おそらくあなたはPHPを使用しており、ダウンボッターはPHPが好きではないのですか?:p
bash0r

3

JavaScript(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-GB)からの出力のサブストリング化は、49バイトに対して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));}

オンラインでお試しください!

入力はコロンで区切られ、時間と午前/午後の間にスペースがあります。出力はコロン区切りではありません。

-1バイト、Kevin Cruijssenに感謝


Javaの場合と同じくらい短い、コードの20%はパッケージ修飾子です。
魔法のタコUr

ルールは「この状態を入力と出力の両方のために: -最初の場所で0はオプションで、最後の3ヶ所で0は必須です。。」、あなたが変更できる手段HHmmHmm
ケビンクルーッセン

@KevinCruijssenいいね!
ポケ


2

Perl、45 28 37バイト

28 37バイト

(c / o @Dada)

(36バイトコード、コンパイラ-pスイッチ用に1バイト)

0145pmam / pmまたはa / pのタイプ形式を受け入れます。入力の先行ゼロが必要です。

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バイトになります(必要なだけです)。
ダダ

ありがとう。そのFAQが見つかりませんでした。StackExchangeチームが回答ページなどにそれをピン留めできるかどうか疑問に思いましたか?
BRPocock

わかりました、私は4シリーズからPerlingをしており、それが私の頭を痛めています。☺
BRPocock

今それでカバーすべきだと思う?
BRPocock

ミスを犯しました。分が0〜9の場合、このソリューションは機能しません。このコードはs/(..)(.)$//;$_=$_%12+12*(p eq$2).$1(37バイト)で機能します。ちなみに、最初の解決策を少しだけ説明します。s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e(40バイト)
ダダ

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 などのBASICキーワードの略語を使用する必要があります。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ビットマシンでコードゴルフをプレイすることは、現代のプログラマーがそれについて考える必要すらなくても、どれだけのことが行われるかを示しているため、非常に興味深いものです。
ショーンビバーズ

2

Java、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関数には、入力を3つのセクション(時間、分、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]));
    }
}

私が抱きしめるのを見たことはなかっenummain。ニース:)
ロバートベンソン

メインメソッドシグネチャでスペースを省略できます。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

区切り文字としてのコロンが使用されていない場合、これは数バイト短縮される可能性があります。


コロン区切り文字はオプションです。
発癌性

はい、しかし見た目が良くありません。
idrougge

これはコードゴルフの課題であるため、きれいな出力の長いプログラムまたはい出力の短いプログラムのオプションがある場合は、後者を選択してください。誰もあなたを裁かないでしょう。
発癌性

2

C(clang)、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);
ヨハン・デュToit

1
@JohanduToit私が入力するのは6:00pcですか?:)
アベルトム・

1
それは時空の連続体に取り返しのつかない損害を引き起こすでしょう。
ヨハンデュトワ


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;}
ヨハン・デュToit

提案する(p[5]!=97)*12;代わりに(p[5]^97?12:0);
ceilingcat


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

Mathematica、33バイト

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

匿名関数。入力として文字列を受け取り、出力として文字列を返します。など、ほとんどの形式で動作しhh:mm AM/PMます。


1

JavaScript、67バイト

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

入力は例のようです


以下のために動作しません12:00 am12:00 pm
ハーマンL

1

Haskell、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)括弧なし「」や「P」のいずれかです。

出力フォーマット: (hs, MM) –整数としての時間と文字列としてのMMを含むタプル。

例:

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

より長いバージョン(より便利な名前と1つの置換を含む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

Common Lisp(151 122バイト)

わかりました、CLは「簡潔」であるように意図されていませんが、私はそれがこの1つのための最も冗長ではないことにただ驚いています。

以下は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)))

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

いいけど大きい

Common-Lispパッケージのみを使用します。整数時間(先頭または末尾なし0)、リテラル:、2桁の分、オプションの末尾amまたはpm(小文字のみ)の形式の(のみ)入力を受け入れます。時間前後および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、例えば0134a1:34午前です。真夜中として0000を使用して、ミリタリータイムで出力します。(たとえば、午前12:30に変換することが許可されている場合、いくつかのバイトを節約できます。2430が、それが許容範囲であるとは思えません)。

オンラインでお試しください!

説明

最初の2つのケースは「12」時間を扱います。これは、午前/午後が12で逆転するためです。

^12(.*)a
00$1

時刻が深夜(午前12時)から午前1時の間である場合は、12ではなく00に変更し、 aます。

^(12.*)p
$1

時間が正午(午後12時)から午後1時の場合、pを削除して24時間の時間を取得します。

その他の時間の場合:

a
 

時間が午前の場合は、単にを削除しaて24時間の時間を取得します。

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

入力を3つの引数として受け取ります。必要に応じて、三番目の引数のいずれかである2番目の引数がゼロをリードしている前提としてa又はpです。3番目の引数を間接変数名として扱うことにより機能し、時間数に加算されます。分数は影響を受けないため、そのまま直接出力されます。異なる形式を混在させても問題ない場合は、最後のスペースを削除してバイトを節約できます。

(むしろ迷惑なことに、この質問は最初に読み込んだときに質問ページに表示されませんでした。別の質問を探していたため、偶然見つけました。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.