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.

Carcigenicate
sumber
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
nmjcman101
sumber
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
12

MATL , 4 byte

15XO

Cobalah online!

Penjelasan

Fungsi bawaan: konversi string tanggal dengan deteksi otomatis format input dan dengan format output 15, yang sesuai dengan 'HH:MM'. Ini sama dengan jawaban oktaf @ StewieGriffin .

Luis Mendo
sumber
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),'']
Stewie Griffin
sumber
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 )

AdmBorkBork
sumber
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

busukxuan
sumber
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!

busukxuan
sumber
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];
Titus
sumber
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

Mwr247
sumber
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
BRPocock
sumber
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);
TheLethalCoder
sumber
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

sumber
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

Menyodok
sumber
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!

Oliver
sumber
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
BRPocock
sumber
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$
Shaun Bebbers
sumber
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]));
    }
}
Kue kering
sumber
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.

idrougge
sumber
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!

Abel Tom
sumber
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
1
75 byte
ceilingcat
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 .

owacoder
sumber
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

tcl, 45 47

Sekarang menggunakan built-in:

puts [clock f [clock sc $s -f %I:%M%p] -f %R]

Diuji pada http://rextester.com/TSRXI8802 di mana ada skrip yang menjalankannya dari pukul 01:00 hingga 1259 malam

sergiol
sumber
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

12Me21
sumber
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).

Billywob
sumber
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

Steadybox
sumber
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.

LegionMammal978
sumber
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

lhama butt
sumber
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
pengguna3389669
sumber
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))))
BRPocock
sumber
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.

Kucing Bisnis
sumber
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.)

Neil
sumber