Konverter waktu 12 jam hingga 24 jam


27

Hebatnya, tugas sederhana ini sepertinya belum ada, jadi ...

Tugas Anda adalah menulis program yang memakan waktu 12 jam, dan mengubahnya menjadi "waktu militer", atau format waktu 24 jam.

Masukan akan dalam bentuk:

HH:MM am/pm

Meskipun sedikit variasi diperbolehkan:

  • Ruang yang memisahkan am / pm dari sisa waktu adalah opsional.

  • Bagian terakhir dapat berupa "am" / "pm", atau "a" / "p".

  • Kapitalisasi apa pun baik-baik saja.

Output akan menjadi waktu yang diinput, diubah menjadi format 24 jam. Ini bisa berupa angka, atau string.

Untuk input dan output:

  • 0s di tempat pertama adalah opsional. 0s di 3 tempat terakhir adalah wajib.

  • pembatas yang memisahkan jam dan menit dapat berupa ":", "" (spasi), atau tidak sama sekali.

Catatan lain:

  • Tengah malam dapat dinyatakan sebagai 0000, atau 2400.

  • Midnight akan dianggap "am", sedangkan siang akan dianggap "pm".

Program Anda bisa berupa fungsi, atau program penuh, dan harus mengembalikan hasilnya, atau mengeluarkannya ke stdout. Trailing whitespace tidak apa-apa.

Contoh (Anda tidak diharuskan mendukung setiap format):

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

Ini adalah kode golf, sehingga jumlah byte terkecil menang. Karena ini sangat sepele untuk dipecahkan dengan menggunakan built-in, akan menyenangkan untuk melihat beberapa kode yang secara manual menyelesaikan ini (tetapi penggunaan built-in baik-baik saja).

Hanya untuk memperjelas, Anda tidak diharuskan mendukung setiap format yang memungkinkan. Mendukung hanya satu input dan satu format output (pilihan Anda) baik-baik saja. Namun saya ingin membatasi format seperti diuraikan di atas (yang sudah cukup gratis). {1134,'pm'}, misalnya, tidak dapat diterima.


Format apa yang harus kami dukung? Hanya satu?
redstarcoder

@redstarcoder Ya. Format apa pun yang sesuai dengan persyaratan di atas tidak apa-apa, tetapi seperti yang disebutkan di atas contoh kasus, Anda tidak diharuskan mendukung setiap format. Satu format input dan satu format output baik-baik saja.
Carcigenicate

apakah format kami diizinkan untuk mewajibkan angka nol di depan? Misalnya, 01:54pmakan berhasil, tetapi 1:54pmtidak?
FlipTack

Iya nih. Anda dapat memilih format input yang diperlukan.
Carcigenicate

Apakah kita diperbolehkan memasukkan detik dalam input dan output kita?
12Me21

Jawaban:


8

V , 21 17 byte

Terima kasih @DJMcMayhem untuk 4 byte!

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

Cobalah online! Ini mengambil format di HH:MMxmana xsalah satu aatau p, dan mengembalikannya dalam formatHH:MM

Hexdump:

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

Penjelasan:

í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

Masukan akan selalu [1-12]benar? Dalam hal ini, saya pikir Anda bisa melakukannya ó^12/0daripadacw^R=^R"%12
DJMcMayhem

1
Selain itu, Anda bisa menggunakan "perintah global" untuk menerapkan perintah ke baris yang cocok dengan regex, yang lebih pendek daripada melanggar makro. çp/12^Ayang setara dengan :g/p/norm 12<C-a>di vim
DJMcMayhem

Saya menerima ini karena itu adalah skor penilaian terendah yang membuatnya jelas itu tidak menggunakan built-in (meskipun saya tidak melarang menggunakannya). Jika ada yang punya masalah dengan pilihan ini, saya bisa mengubah jawaban saya menjadi adil. Saya pikir jawaban ini adalah yang paling layak.
Carcigenicate


10

Oktaf, 21 17 byte

Disimpan 4 byte berkat Luis Mendo. Saya dapat menentukan format nomor 15 sebagai ganti 'HHMM'.

@(c)datestr(c,15)

Penjelasan:

Ini adalah fungsi anonim mengambil string csebagai masukan pada format: '11:34 AM'. datestrmengenali format secara otomatis sebagai salah satu format tanggal standar , dan mengeluarkannya dalam format nomor 15 yang ditentukan, yaitu HH:MM.

Karena format output yang ditentukan tidak memiliki AMatau PMOktaf secara otomatis mengubahnya menjadi apa yang Anda sebut sebagai waktu Militer.

Cobalah online.


Versi tidak datestrmenggunakan 35 byte

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

Penjelasan:

Mengambil string input cpada format 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

Atau, pendekatan yang berbeda untuk 37 byte:

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

7

PowerShell , 23 20 19 byte

date "$args"-f HHmm

Cobalah online!

(Jika Anda menggunakan Windows, Anda dapat menghilangkan get-, untuk turun ke 19 byte. Pada TIO, tampaknya diperlukan Get-Datenama lengkap .)

Mengambil input sebagai string $args[0], menggunakannya sebagai input ke Get-Datecmdlet, yang mem-parsingnya menjadi datetimeobjek .NET . Itu dilewati dengan -fparameter ormat HHmmuntuk mengubahnya menjadi waktu militer (ibukota HHmenentukan waktu 24 jam). Output tersirat.

Mesin parsing cukup kuat, sehingga input tambahan suka 12amatau 12:00amdiizinkan juga. Bermain-main dengan input pada TIO dan lihat apa lagi yang berfungsi.

( Disimpan 3 byte berkat @admalledd ... disimpan byte lain berkat @briantist )


Harus mampu menghapus ruang antara $args[0]dan -f, serta menghapus tanda kutip tunggal sekitar str Format: date $args[0]-f HHmm. Setidaknya ini bekerja pada powershell saya ...
admalledd

@admalledd Untuk menangis dengan keras, saya selalu lupa kutipan itu. Serius, saya pikir setiap kali saya telah menggunakan Get-Datedengan -f, seseorang telah mengingatkan saya bahwa Anda tidak perlu tanda kutip. Dan panggilan yang bagus dengan menghilangkan ruang juga, karena parser memperlakukannya ]sebagai akhir token. Terima kasih!
AdmBorkBork

5

Python 2, 44 byte

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

Format input:, 01:23amopsional mdan spasi setelah menit.
Format output:123


5

Pyth, 21 20 byte

Aczd++*12}\pH%sG12PH

Mengambil input dari formulir 01 23asebagai "01:23". 0 awal adalah opsional.
Output berupa formulir 123, dengan 0 awal dihilangkan.

Dalam pseudocode:

                         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

Cobalah online!


4

PHP, 35 32 byte

format input: case insensitive, memerlukan titik dua dan m, format output hhmm. menggunakan bawaan:

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

mengambil input dari argumen baris perintah pertama.

PHP, 45 byte, tidak ada built-in

input format (h)h:mm a(m)huruf kecil, format output (h)hmm.

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

4
Mengapa downvote?
Titus

Saya hanya berspekulasi tapi mungkin itu karena Anda menggunakan PHP dan downvoter tidak suka PHP? : p
bash0r

3

JavaScript (ES6), 40 byte

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

Input harus diformat seperti: 12:32 am


3

GNU Coreutils ( 18 16 bytes)

Dari skrip shell:

Tidak menerima spasi putih di input

Pada titik mana, sebaiknya gunakan $ 1 dan abaikan argumen tambahan.

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

Asli

Untuk mengizinkan spasi kosong di input,

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

3

C #, 46 byte

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

String diambil dalam input seperti 12:00 AM

Melakukan hal yang sama tetapi melakukan substring pada output dari panggilan default ke ToString(Dengan asumsi budaya en-GB) adalah 3 byte lebih lama untuk 49 byte:

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

3

date, 0 + 8 = 8 byte

Mengenai masalah menggunakan alat yang tepat untuk pekerjaan itu ...

Mengambil input sebagai argumen baris perintah. Jalankan dengan +%H%M -d(penalti 8 byte). Tidak ada program aktual di sini; seluruh pekerjaan dilakukan oleh argumen baris perintah. (Ini adalah demonstrasi yang cukup bagus tentang mengapa ada penalti untuk argumen baris perintah!)

Contoh:

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

Cobalah online!

Input dibatasi dengan titik dua dan memiliki ruang antara waktu dan pagi / malam. Output tidak dibatasi usus besar.

-1 byte terima kasih kepada Kevin Cruijssen


Tapi sesingkat yang didapat untuk Java, 20% dari kode menjadi kualifikasi paket.
Magic Octopus Urn

Aturan menyatakan ini " Untuk input dan output: - 0s di tempat pertama adalah opsional. 0s di 3 tempat terakhir adalah wajib. ", Yang berarti Anda dapat mengubah HHmmke Hmm.
Kevin Cruijssen

@KevinCruijssen tangkapan bagus!
Poke

2

Japt , 14 byte

Ð"1/"+U s sG21

Cobalah online!

Ini hanya berfungsi di Chrome. Berikut adalah versi yang berfungsi di semua browser:

Ð"1/"³+U s sG21

Terima kasih lagi untuk produk ETH untuk bantuannya!


2

Perl, 45 28 37 byte

28 37 byte

(c / o @Dada)

(36 byte kode, 1 byte untuk -psakelar kompiler )

Menerima 0145pmformat jenis, dengan am / pm atau a / p. Memimpin nol pada input yang dibutuhkan.

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

Uji:

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

Jawaban asli saya

(juga direvisi dengan lembut)

(39 byte kode, 1 byte untuk -psakelar kompiler .)

Hanya menerima formulir seperti 0145p atau 0145a, dan tidak ada yang lain, dan membutuhkan perl -pmode untuk berfungsi.

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

uji:

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

Selamat datang di PPCG. Jawaban pertama yang bagus. Anda dapat menggunakan sakelar, tetapi sakelar itu dihitung dalam bytecount Anda (seperti dijelaskan di sini ). Dalam kasus Anda, itu akan menjadi +1 byte (karena hanya -pdiperlukan) jika Anda mengubah tanda kutip tunggal untuk tanda kutip ganda.
Dada

Terima kasih. Tidak dapat menemukan FAQ itu, bertanya-tanya apakah tim Stack Exchange dapat menyematkannya di halaman jawaban atau apa?
BRPocock

OK, saya sudah Perling sejak seri 4 dan itu membuat kepala saya sakit, Anda harus mengambil kredit dan memposting diri Anda dengan yang itu. ☺
BRPocock

Saya pikir itu harus menutupinya sekarang?
BRPocock

Saya membuat kesalahan, solusi ini tidak akan berfungsi ketika risalah antara 0 dan 9. Kode ini bekerja kemudian: s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1(37 byte). Omong-omong, solusi pertama Anda bisa bermain golf sedikit: s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e(40 byte)
Dada

2

Commodore 64 BASIC, 301 byte sebelum dijalankan, 321 byte digunakan setelah dijalankan

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

Untuk memasukkan ini pada Commodore 64 yang asli, Anda harus menggunakan singkatan kata kunci BASIC, seperti LE [shift] F for LEFT$, M [shift] I untuk MID$etc ... atau Anda bisa mencoba CBM PRG STUDIO.

The TI$variabel di Commodore BASIC menyajikan waktu dalam format 24 jam sebagai HHMMSS saat dicetak. Membuang ruang setelah nomor baris tidak menghemat memori karena Commodore BASIC menambahkan ruang secara otomatis ketika Anda mendaftar program setelah memasukkannya.

Saat mengonversi angka menjadi string dengan STR$, Commodore BASIC akan menambahkan spasi (jadi jika Anda PRINT Aakan melihat spasi sebelum nomor ditampilkan), saya telah menghapus ruang pembukaan pada angka untuk konversi string dengan RIGHT$perintah. Anda dapat menyimpan beberapa byte dengan mengubah garis nol menjadi:

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

jadi Anda harus menyatakan waktu Anda untuk mengonversi sebelum menjalankan program, sebagai berikut:

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

Setiap saat sesudahnya, Anda dapat melihat waktu saat ini dengan:

? TI$

Bermain golf kode pada mesin 8-bit benar-benar menarik karena menunjukkan berapa banyak yang dilakukan untuk programmer modern tanpa perlu memikirkannya.
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]));}}

Format input adalah HH:MM a/pdan format output adalah HHMM. Menyalahgunakan fakta bahwa fungsi utama memiliki serangkaian string untuk membagi input menjadi 3 bagian: jam, menit dan indikator / p.

Contoh input dan output:

Input: 01:02 a
Output: 0102

Input: 01:02 p
Output: 13:02

Input: 12:22 p
Output: 0022

Versi tidak disatukan:

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

Saya belum pernah melihat enummemegang main. Bagus :)
Robert Benson

Anda dapat menghilangkan spasi di tanda tangan metode utama: public static void main (String [] a) {...
staticmethod

2

REXX, 33 byte

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

Menggunakan:

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

Ini bisa dipersingkat beberapa byte jika titik dua sebagai pembatas tidak digunakan.


Pembatas titik dua adalah opsional.
Carcigenicate

Ya, tapi itu tidak terlihat bagus.
idrougge

Mengingat ini adalah tantangan kode-golf, jika Anda memiliki pilihan program yang lebih panjang dengan output yang cantik, atau program yang lebih pendek dengan output yang lebih buruk, pilih yang terakhir. Tidak ada yang akan menghakimi kamu.
Carcigenicate

2

C (dentang) , 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);}

Cobalah online!

Saya di sini untuk belajar, jadi setiap tips tentang bagaimana saya dapat mengoptimalkan kode dipersilahkan.

@ Johan du Toit Terima kasih, untuk menghemat beberapa byte!


Anda tidak perlu menguji apakah b == 'm' dan Anda dapat membuatnya lebih pendek dengan menggunakan inline if statement:printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
Johan du Toit

1
@JohanduToit Apa yang saya masukan adalah 6: 00pc? :)
Abel Tom

1
Itu akan menyebabkan kerusakan yang tidak dapat diperbaiki pada kontinum ruang-waktu.
Johan du Toit


2

C, 87 72 byte

Disimpan 15 byte berkat @Johan du Toit

Panggilan f() dengan string yang bisa berubah-ubah sebagai argumen, input adalah output.

Formatnya adalah HH:MMa/p, di mana a/phuruf kecil aatau kecil p. Tidak ada ruang antara waktu dan specifier meridian diizinkan.

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

Cobalah di ideone .


Anda dapat menyimpan beberapa byte dengan menggunakan yang berikut: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

Sarankan (p[5]!=97)*12;alih-alih(p[5]^97?12:0);
ceilingcat


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]

Memasukkan: HH:MMa/p

Keluaran: HH MM


1

R, 68 byte

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

Membaca input dari stdin dan diasumsikan dalam salah satu format berikut:

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

dan output dalam format: [1] "00:00"

Dalam kebanyakan kasus, strptime()output dalam format: di "2017-01-06 12:00:00 CET"mana tanggal adalah tanggal lokal. Karena itu, kita perlu menggunakan substr()untuk hanya mengembalikan waktu, namun, jika inputnya adalah tengah malam (misalnya 12:00am) output hanya "2017-01-06 CET"yang merupakan alasan untuk ifhal di akhir (harus ada beberapa solusi yang lebih pintar).


Saya benar-benar ingin mencari jalan yang lebih pendek lubridate, tetapi nama paketnya terlalu panjang (di antara masalah lain).
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);}

Masukkan format: 07:30am



1

Mathematica, 33 byte

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

Fungsi anonim. Mengambil string sebagai input dan mengembalikan string sebagai output. Bekerja dengan sebagian besar format, termasuk 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))

Masukan seperti pada contoh


Tidak bekerja untuk 12:00 amatau12:00 pm
Herman L

1

Haskell, 61 karakter

Versi pendek:

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

Masukkan format: HHMM(a/p) mana (a/p)'a' atau 'p' tanpa tanda kurung.

Format output: (hs, MM)- tupel yang berisi jam sebagai bilangan bulat dan MM masih sebagai string.

Contoh:

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

Versi lebih panjang (dengan lebih banyak nama bermanfaat dan satu subtitusi 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

Gangguan Umum ( 151) 122 bytes)

OK, CL tidak dimaksudkan untuk menjadi "singkat" tapi saya hanya terkejut bahwa itu bukan yang paling tepat untuk yang satu ini.

Ini versi 122 byte, yang memerlukan input posisi tetap. 0145pmatau 145pdapat diterima (dengan ruang terdepan di posisi karakter pertama).

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

Lebih bagus tapi lebih besar

Hanya menggunakan Common-Lisppaket. Menerima (hanya) input dalam bentuk jam bilangan bulat (dengan atau tanpa memimpin 0), literal :, menit dua digit, dan trailing opsional amatau pm(hanya dalam huruf kecil). Izin spasi putih di sekitar waktu dan sekitar AM / PM, tetapi tidak secara langsung setelah :.

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

Uji:

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 definisi fungsi:

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

De-dikaburkan:

(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

Retina , 61 60 byte

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

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

Masukan diberikan tanpa tanda titik dua, mandatory leading 0, dan hanya menggunakan aatau palih-alih amatau pm, misalnya 0134a01:34 pagi. Output dalam waktu militer lurus menggunakan 0000 sebagai tengah malam. (Saya dapat menyimpan beberapa byte jika saya diizinkan untuk mengkonversi, misalnya, 12:30 menjadi 2430, tapi saya ragu itu dapat diterima).

Cobalah online!

Penjelasan

Dua kasus awal berurusan dengan jam "12", karena am / pm terbalik untuk 12:

^12(.*)a
00$1

Jika waktunya antara tengah malam (12 pagi) dan 1 pagi, ubah ke 00 bukan 12, dan hapus a.

^(12.*)p
$1

Jika waktunya antara siang hari (12 siang) dan 1 siang, hapus p untuk hanya mendapatkan waktu 24 jam.

Untuk jam lainnya:

a
 

Jika waktu sedang, cukup hapus auntuk mendapatkan waktu 24 jam.

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

Jika waktu sudah sore, hapus p. Ubah komponen jam menjadi unary, tambahkan 12, dan konversi kembali ke desimal. Biarkan menit tidak berubah.


1

Batch, 40 byte

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

Mengambil input sebagai tiga argumen. Asumsikan argumen kedua memiliki nol di mana diperlukan, argumen ketiga adalah salah satu aataup . Bekerja dengan memperlakukan argumen ketiga sebagai nama variabel tidak langsung oleh karena itu menambahkannya ke jumlah jam; jumlah menit tidak terpengaruh sehingga hanya keluaran langsung. Jika mencampur format yang berbeda adalah OK maka ruang terakhir dapat dihapus untuk menghemat satu byte.

(Agak menjengkelkan, pertanyaan ini tidak muncul di halaman pertanyaan ketika saya awalnya memuatnya, dan saya hanya tersandung di sana karena saya sedang mencari pertanyaan lain.)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.