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.
01:54pm
akan berhasil, tetapi1:54pm
tidak?Jawaban:
V ,
2117 byteTerima kasih @DJMcMayhem untuk 4 byte!
Cobalah online! Ini mengambil format di
HH:MMx
manax
salah satua
ataup
, dan mengembalikannya dalam formatHH:MM
Hexdump:
Penjelasan:
sumber
[1-12]
benar? Dalam hal ini, saya pikir Anda bisa melakukannyaó^12/0
daripadacw^R=^R"%12
çp/12^A
yang setara dengan:g/p/norm 12<C-a>
di vimMATL , 4 byte
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 .sumber
Oktaf,
2117 byteDisimpan 4 byte berkat Luis Mendo. Saya dapat menentukan format nomor 15 sebagai ganti
'HHMM'
.Penjelasan:
Ini adalah fungsi anonim mengambil string
c
sebagai masukan pada format:'11:34 AM'
.datestr
mengenali format secara otomatis sebagai salah satu format tanggal standar , dan mengeluarkannya dalam format nomor 15 yang ditentukan, yaituHH:MM
.Karena format output yang ditentukan tidak memiliki
AM
atauPM
Oktaf secara otomatis mengubahnya menjadi apa yang Anda sebut sebagai waktu Militer.Cobalah online.
Versi tidak
datestr
menggunakan 35 bytePenjelasan:
Mengambil string input
c
pada format1134am
.Atau, pendekatan yang berbeda untuk 37 byte:
sumber
PowerShell ,
232019 byteCobalah online!
(Jika Anda menggunakan Windows, Anda dapat menghilangkan
get-
, untuk turun ke 19 byte. Pada TIO, tampaknya diperlukanGet-Date
nama lengkap .)Mengambil input sebagai string
$args[0]
, menggunakannya sebagai input keGet-Date
cmdlet, yang mem-parsingnya menjadidatetime
objek .NET . Itu dilewati dengan-f
parameter ormatHHmm
untuk mengubahnya menjadi waktu militer (ibukotaHH
menentukan waktu 24 jam). Output tersirat.Mesin parsing cukup kuat, sehingga input tambahan suka
12am
atau12:00am
diizinkan juga. Bermain-main dengan input pada TIO dan lihat apa lagi yang berfungsi.( Disimpan 3 byte berkat @admalledd ... disimpan byte lain berkat @briantist )
sumber
$args[0]
dan-f
, serta menghapus tanda kutip tunggal sekitar str Format:date $args[0]-f HHmm
. Setidaknya ini bekerja pada powershell saya ...Get-Date
dengan-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!Python 2, 44 byte
Format input:,
01:23am
opsionalm
dan spasi setelah menit.Format output:
123
sumber
Pyth,
2120 byteMengambil input dari formulir
01 23a
sebagai "01:23". 0 awal adalah opsional.Output berupa formulir
123
, dengan 0 awal dihilangkan.Dalam pseudocode:
Cobalah online!
sumber
PHP,
3532 byteformat input: case insensitive, memerlukan titik dua dan
m
, format outputhhmm
. menggunakan bawaan: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
.sumber
JavaScript (ES6), 40 byte
Input harus diformat seperti:
12:32 am
sumber
GNU Coreutils (
1816 bytes)Dari skrip shell:
Tidak menerima spasi putih di input
Pada titik mana, sebaiknya gunakan $ 1 dan abaikan argumen tambahan.
Asli
Untuk mengizinkan spasi kosong di input,
sumber
C #, 46 byte
String diambil dalam input seperti
12:00 AM
Melakukan hal yang sama tetapi melakukan substring pada output dari panggilan default ke
ToString
(Dengan asumsi budayaen-GB
) adalah 3 byte lebih lama untuk 49 byte:sumber
date
, 0 + 8 = 8 byteMengenai 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:
sumber
Java 7,
138106105104 byteCobalah 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
sumber
HHmm
keHmm
.Japt , 14 byte
Cobalah online!
Ini hanya berfungsi di Chrome. Berikut adalah versi yang berfungsi di semua browser:
Terima kasih lagi untuk produk ETH untuk bantuannya!
sumber
Perl,
452837byte2837 byte(c / o @Dada)
(36 byte kode, 1 byte untuk
-p
sakelar kompiler )Menerima
0145pm
format jenis, dengan am / pm atau a / p. Memimpin nol pada input yang dibutuhkan.Uji:
Jawaban asli saya
(juga direvisi dengan lembut)
(39 byte kode, 1 byte untuk
-p
sakelar kompiler .)Hanya menerima formulir seperti 0145p atau 0145a, dan tidak ada yang lain, dan membutuhkan
perl -p
mode untuk berfungsi.uji:
sumber
-p
diperlukan) jika Anda mengubah tanda kutip tunggal untuk tanda kutip ganda.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)Commodore 64 BASIC, 301 byte sebelum dijalankan, 321 byte digunakan setelah dijalankan
Untuk memasukkan ini pada Commodore 64 yang asli, Anda harus menggunakan singkatan kata kunci BASIC, seperti LE [shift] F for
LEFT$
, M [shift] I untukMID$
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 AndaPRINT A
akan melihat spasi sebelum nomor ditampilkan), saya telah menghapus ruang pembukaan pada angka untuk konversi string denganRIGHT$
perintah. Anda dapat menyimpan beberapa byte dengan mengubah garis nol menjadi:jadi Anda harus menyatakan waktu Anda untuk mengonversi sebelum menjalankan program, sebagai berikut:
Setiap saat sesudahnya, Anda dapat melihat waktu saat ini dengan:
sumber
Java, 171 byte
Format input adalah
HH:MM a/p
dan format output adalahHHMM
. Menyalahgunakan fakta bahwa fungsi utama memiliki serangkaian string untuk membagi input menjadi 3 bagian: jam, menit dan indikator / p.Contoh input dan output:
Versi tidak disatukan:
sumber
enum
memegangmain
. Bagus :)REXX, 33 byte
Menggunakan:
Ini bisa dipersingkat beberapa byte jika titik dua sebagai pembatas tidak digunakan.
sumber
C (dentang) , 94 byte
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!
sumber
printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
C,
8772 byteDisimpan 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 manaa/p
huruf kecila
atau kecilp
. Tidak ada ruang antara waktu dan specifier meridian diizinkan.Cobalah di ideone .
sumber
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;}
(p[5]!=97)*12;
alih-alih(p[5]^97?12:0);
tcl, 45
47Sekarang menggunakan built-in:
Diuji pada http://rextester.com/TSRXI8802 di mana ada skrip yang menjalankannya dari pukul 01:00 hingga 1259 malam
sumber
SmileBASIC, 67 byte
Memasukkan:
HH:MMa/p
Keluaran:
HH MM
sumber
R, 68 byte
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 menggunakansubstr()
untuk hanya mengembalikan waktu, namun, jika inputnya adalah tengah malam (misalnya12:00am
) output hanya"2017-01-06 CET"
yang merupakan alasan untukif
hal di akhir (harus ada beberapa solusi yang lebih pintar).sumber
lubridate
, tetapi nama paketnya terlalu panjang (di antara masalah lain).C,
159152 byteMasukkan format:
07:30am
sumber
Pyke, 15 byte
Coba di sini!
sumber
Mathematica, 33 byte
Fungsi anonim. Mengambil string sebagai input dan mengembalikan string sebagai output. Bekerja dengan sebagian besar format, termasuk
hh:mm AM/PM
.sumber
JavaScript, 67 byte
Masukan seperti pada contoh
sumber
12:00 am
atau12:00 pm
Haskell, 61 karakter
Versi pendek:
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:
Versi lebih panjang (dengan lebih banyak nama bermanfaat dan satu subtitusi
hs
):sumber
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.
0145pm
atau145p
dapat diterima (dengan ruang terdepan di posisi karakter pertama).PPRINT:
Lebih bagus tapi lebih besar
Hanya menggunakan
Common-Lisp
paket. Menerima (hanya) input dalam bentuk jam bilangan bulat (dengan atau tanpa memimpin0
), literal:
, menit dua digit, dan trailing opsionalam
ataupm
(hanya dalam huruf kecil). Izin spasi putih di sekitar waktu dan sekitar AM / PM, tetapi tidak secara langsung setelah:
.Uji:
pprint
definisi fungsi:De-dikaburkan:
sumber
Retina ,
6160 byteMasukan diberikan tanpa tanda titik dua, mandatory leading
0
, dan hanya menggunakana
ataup
alih-aliham
ataupm
, misalnya0134a
01: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 menjadi2430
, tapi saya ragu itu dapat diterima).Cobalah online!
Penjelasan
Dua kasus awal berurusan dengan jam "12", karena am / pm terbalik untuk 12:
Jika waktunya antara tengah malam (12 pagi) dan 1 pagi, ubah ke 00 bukan 12, dan hapus
a
.Jika waktunya antara siang hari (12 siang) dan 1 siang, hapus p untuk hanya mendapatkan waktu 24 jam.
Untuk jam lainnya:
Jika waktu sedang, cukup hapus
a
untuk mendapatkan waktu 24 jam.Jika waktu sudah sore, hapus
p
. Ubah komponen jam menjadi unary, tambahkan 12, dan konversi kembali ke desimal. Biarkan menit tidak berubah.sumber
Batch, 40 byte
Mengambil input sebagai tiga argumen. Asumsikan argumen kedua memiliki nol di mana diperlukan, argumen ketiga adalah salah satu
a
ataup
. 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.)
sumber