Tantangan
Tulis program terpendek yang mengubah interval waktu yang dapat dibaca manusia menjadi komponen-komponen formulir:
{±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS}
Contoh kasus
Setiap test case adalah dua baris, input diikuti oleh output:
1 year 2 months 3 seconds
{1|2|0|0|0|3}
-2 day 5 year 8months
{5|8|-2|0|0|0}
3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds
{17|0|3|0|-5|1}
Aturan
- Anda tidak dapat menggunakan
strtotime
atau fungsi bawaan yang melakukan seluruh pekerjaan. - Kemenangan kode terpendek (byte)
- Anda dapat mencetak output Anda ke
stdout
atau file, hasilnya juga dapat dikembalikan oleh suatu fungsi, terserah Anda - Token bisa dalam bentuk tunggal atau jamak.
- Komponen mungkin dalam urutan acak
- Mungkin tidak ada spasi putih antara nomor dan token
- Tanda opsional jika interval waktu positif (input dan output)
- Jika suatu komponen muncul lebih dari satu kali nilai harus ditambahkan
- Setiap komponen memiliki tanda tersendiri
- Komponen-komponen harus ditangani secara terpisah (mis.
80 minutes
Tetap sebagai 80 dalam output) - Masukan dijamin huruf kecil
Selamat Golf!
Sign is optional when the time interval is positive
Apakah itu berarti bahwa input mungkin mengandung+
tanda?Jawaban:
CJam, 60 byte
Setelah terjebak dalam 60-an untuk waktu yang lama, saya akhirnya berhasil memeras ini hingga 60 byte. Cukup baik! Kirimkan!
Cobalah online
Terjepit:
Diperluas dan dikomentari:
Saya awalnya mulai menggunakan pendekatan berbasis token, tapi itu cukup macet di ... 61 byte. Mendesah. Jadi saya benar-benar mengubah persneling dan beralih ke pendekatan berbasis karakter ini, yang jauh lebih menarik.
Metode parsing saya berfungsi dengan menambahkan karakter numerik yang valid yang dicapai (
0
-9
dan-
) ke buffer dan mengurai buffer sebagai integer ketika karakter tertentu dari salah satu nama unit waktu tercapai. Karakter-karakter yangy
,t
,d
,h
,i
, danc
, yang semuanya memenuhi persyaratan bahwa mereka muncul dalam nama unit waktu dan tidak muncul sebelum karakter pengenalan dalam nama unit waktu lainnya. Dengan kata lain, ketika salah satu karakter pengenalan unit waktu ini tercapai, buffer numerik akan diisi dengan angka terakhir yang terlihat jika ini benar-benar menandakan unit waktu, atau buffer numerik akan kosong jika ini hanya muncul di, tetapi tidak boleh sinyal t, beberapa unit waktu lainnya. Dalam kedua kasus, buffer numerik diuraikan sebagai integer, atau 0 jika kosong, dan ini ditambahkan ke nilai satuan waktu yang sesuai. Jadi karakter pengenalan muncul di unit waktu lain setelah karakter pengenalannya tidak berpengaruh.Peretasan gila lainnya termasuk:
Bagi siapa pun yang penasaran dengan solusi berbasis token saya yang macet pada 61 byte, saya akan mempostingnya di sini juga. Saya tidak pernah sempat mengembangkan atau berkomentar.
CJam, 61 byte
sumber
Perl: 61 karakter
Terima kasih kepada @nutki.
Contoh dijalankan:
Upaya saya yang buruk:
7877 karaktersumber
s/(-?\d+) *(..)/$$2+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./${$&}+0/ge
s/-?\d+ *(m.|.)/$$1+=$&/ge;$_="{y|mo|d|h|mi|s}";s/\w+/${$&}+0/ge
(m.|.)
->m?(.)
hemat ekstra 4.Ruby,
119106868584 byteSatu byte disimpan berkat Sp3000.
Ini adalah fungsi yang tidak disebutkan namanya, yang mengambil input sebagai string, dan mengembalikan hasilnya (juga sebagai string). Anda dapat mengujinya dengan menugaskan
f
, mengatakan, dan menyebutnya sepertisumber
Python 2, 99 byte
Ini adalah fungsi lambda yang mengambil string dan hanya menggunakan regex untuk mengekstrak angka yang diperlukan.
Terima kasih kepada Martin karena menunjukkan hal itu
\s*
itu<space>*
. Sangat mudah untuk melupakan bahwa regex mencocokkan ruang secara harfiah ...sumber
JavaScript 100
105 112Edit Menambahkan string template (pertama kali diterapkan pada Desember 2014, sangat valid untuk tantangan ini) - saat itu saya tidak menyadarinya
Sunting Eureka, akhirnya saya mendapatkan makna dari
m?
semua jawaban lainnya!Uji
sumber
R, 197 byte
Saya menyadari ini bukan entri kompetitif sama sekali, saya sebagian besar hanya ingin datang dengan solusi di R. Setiap bantuan memperpendek ini tentu saja disambut baik.
Seperti jawaban Martin, ini adalah fungsi yang tidak disebutkan namanya. Untuk memanggilnya, tetapkan ke
f
dan berikan string.Ini sangat mengerikan, jadi mari kita lihat versi un-golf.
Berdasarkan struktur saja mudah untuk melihat apa yang terjadi, bahkan jika Anda tidak terlalu akrab dengan R. Saya akan menguraikan beberapa aspek yang terlihat asing.
paste0()
adalah bagaimana R menggabungkan string tanpa pemisah.The
str_extract_all()
Fungsi berasal dari Hadley Wickhamstringr
paket. Penanganan R ekspresi reguler dalam paket dasar menyisakan banyak yang diinginkan, yang manastringr
masuk. Fungsi ini mengembalikan daftar kecocokan ekspresi reguler dalam string input. Perhatikan bagaimana regex dikelilingi dalam suatu fungsiperl()
- ini hanya mengatakan bahwa regex adalah gaya-Perl, bukan gaya-R.gsub()
melakukan find-and-replace menggunakan regex untuk setiap elemen dari vektor input. Di sini kami mengatakannya untuk mengganti semua yang bukan angka atau tanda minus dengan string kosong.Dan begitulah. Penjelasan lebih lanjut akan dengan senang hati diberikan atas permintaan.
sumber
library(stringr)
sumber Anda?Cobra - 165
sumber
C ++ 14,
234229 byteSunting: kurangi 5 byte dengan menggunakan deklarasi gaya lama alih-alih
auto
.Saya tahu pemenangnya telah dipilih, dan bahwa ini akan menjadi pengiriman terpanjang sejauh ini, tetapi saya hanya harus memposting solusi C ++, karena saya yakin tidak ada yang mengharapkannya sama sekali :)
Sejujurnya, saya cukup senang dengan betapa singkatnya ternyata (dengan pengukuran C ++, tentu saja), dan saya yakin itu tidak bisa lebih pendek dari ini (hanya dengan satu komentar, lihat di bawah) . Ini juga koleksi yang cukup bagus dari fitur-fitur baru untuk C ++ 11/14.
Tidak ada perpustakaan pihak ketiga di sini, hanya perpustakaan standar yang digunakan.
Solusinya adalah dalam bentuk fungsi lambda:
Tidak Terkumpul:
Untuk beberapa alasan, saya harus menulis
bukannya adil
karena iterator hanya akan mengembalikan satu kecocokan jika saya lulus dalam objek sementara. Ini sepertinya tidak benar bagi saya, jadi saya ingin tahu apakah ada masalah dengan implementasi regex GCC.
File tes lengkap (dikompilasi dengan GCC 4.9.2 dengan
-std=c++14
):Keluaran:
sumber
PHP, 141 byte
mengambil input dari argumen baris perintah pertama; digunakan
[,]
untuk output, bukan{|}
. Jalankan dengan-r
.kerusakan
sumber