Karena hari ini menandai kesempatan lompatan ke-26 yang pernah terjadi, tantangan Anda adalah mengeluarkan tanggal dan waktu setiap detik kabisat dalam GMT atau UTC yang telah terjadi sejauh ini, serta yang terjadi hari ini.
Memasukkan
Tidak ada input.
Keluaran
1972-06-30 23:59:60
1972-12-31 23:59:60
1973-12-31 23:59:60
1974-12-31 23:59:60
1975-12-31 23:59:60
1976-12-31 23:59:60
1977-12-31 23:59:60
1978-12-31 23:59:60
1979-12-31 23:59:60
1981-06-30 23:59:60
1982-06-30 23:59:60
1983-06-30 23:59:60
1985-06-30 23:59:60
1987-12-31 23:59:60
1989-12-31 23:59:60
1990-12-31 23:59:60
1992-06-30 23:59:60
1993-06-30 23:59:60
1994-06-30 23:59:60
1995-12-31 23:59:60
1997-06-30 23:59:60
1998-12-31 23:59:60
2005-12-31 23:59:60
2008-12-31 23:59:60
2012-06-30 23:59:60
2015-06-30 23:59:60
Aturan
Karena saya ragu ada banyak built-in yang memungkinkan lompatan-detik, saya akan mengizinkannya.
Celah standar tidak diijinkan.
Kode terpendek menang.
Format tanggal harus memiliki bulan nol-empuk dan tahun 4-digit, serta waktu militer dan ruang yang memisahkan waktu dari tanggal. Menempatkan UTC
pada bagian akhir adalah opsional. Pilihan tanda hubung atau garis miring.
EDIT: Ya seperti yang diperkirakan, ini menjadi tantangan penyandian. Jika hanya penyandian yang dapat memperbaiki masalah lompatan kedua, ... maka semua kode kita akan jauh lebih praktis. Mungkin kita membutuhkan beberapa ide untuk tantangan yang lebih menyenangkan dengan penggunaan praktis?
sumber
Jawaban:
CJam,
72706964 byteCobalah online di juru bahasa CJam .
Ide
Kita mulai dengan pengkodean setiap lompatan kedua sebagai 2 * (Y - 1972) + D , di mana D adalah 1 jika terjadi pada bulan Desember dan 0 sebaliknya.
Array dari semua detik kodekan adalah:
Mari kita sebut array ini L .
Karena array dalam urutan menaik, kita dapat menyimpan perbedaan berurutan daripada angka yang sebenarnya:
Memperlakukan array ini sebagai digit nomor 15 basis, kita mendapatkan integer
yang angka dalam basis 240 (dilemparkan ke karakter) adalah
Kode
sumber
R,
7875 byteBuilt-in, katamu? Baik...
R memiliki variabel otomatis
.leap.seconds
yang berisi tanggal dan waktu setiap penyisipan lompatan kedua, yang diberikan dalam waktu lokal sistem. Pada R versi 3.2.0, ini tidak termasuk hari ini, jadi saya telah menambahkannya secara manual.Penjelasan + tidak dikumpulkan:
Anda dapat mencobanya secara online !
sumber
HTML, 594 byte
¯ \ _ (ツ) _ / ¯
sumber
working
kode htmlcode golf
tantangan.C,
160146141140 bytePertama kali memposting, tidak yakin apa "celah standar" itu. Saya punya peringatan printf tentu saja.
160 byte:
Gagasan asli adalah untuk menyandikan detik kabisat menggunakan dua bit per tahun: satu untuk Juni dan satu untuk Desember. Pengkodean dikonsumsi satu per satu oleh loop sementara dalam. Tanpa integer 128-bit, loop sementara luar diperlukan. Sisanya adalah pembukuan dan matematika. :-)
141 byte:
Menerapkan tip yang disarankan akan turun hingga 146 byte. Kemudian saya menemukan cara untuk menyederhanakan kondisi outer sementara (dari Y <2000 menjadi hanya Z), membawanya ke 141 byte. Begitu dekat dengan tweet!
140 byte:
Saya perhatikan tanda hubung pada tanggal tersebut dapat dihilangkan dengan membuat hari menjadi negatif. Tidak dapat melakukannya dengan bulan juga karena memimpin nol pada bulan Juni. Tapi setidaknya itu pas di tweet sekarang!
Versi cantik:
Versi bonus:
Saya menghilangkan loop luar dengan menggeser bit satu integer 64-bit ke yang lain, tapi itu 150 byte, karena agak lama "unsigned long long"; jika saya bisa menggunakan sesuatu seperti "uint64" itu akan menjadi 138 byte.
sumber
for
loop akan menghemat beberapa byte. BTW,int main()
->main()
. Anda mungkin menemukan ini sangat membantu.X>>=1
sama denganX/=2
,6*(2-Z)
sama dengan12-6*Z
, dan4362608640
satu byte lebih pendek dari0x104082000
. Theint
di depanmain()
tidak diperlukan, dan jika Anda mengubahmain()
kemain(Z)
maka Anda dapat menghapus deklarasiZ=1
.if(X&1)printf(...);
denganX&1?printf(...):1;
yang menghemat 1 bytewhile(X){...}
menggunakan koma sehingga Anda dapat menghapus kawat gigi-while(X)X&1?printf("%d-%02d-%d 23:59:60\n",Y,6*(2-Z),31-Z):1,Y+=Z^=1,X>>=1;
menghemat 2 byte lainnyaPython 3, 91
Menggunakan penyandian dan pemformatan string oleh Sp3000 , tetapi menyimpan nilai-nilai dalam objek Python 3 byte daripada angka ajaib.
Pengkodean hanya membutuhkan 86 dari 256 nilai yang mungkin dari byte, sehingga berbagai karakter yang dapat dicetak digunakan untuk membuatnya terlihat lebih bagus.
sumber
Brainfuck, 806
Anda dapat menjalankannya pada juru bahasa online ini.
sumber
Python 2,
111104 byteEncoding basis dan lebih banyak encoding basis.
sumber
GNU sed + date: 112
Distribusi Linux pada umumnya memiliki lompatan detik bawaan. Menggunakan sed dan tanggal GNU:
GNU sed + date: 90
Menyimpan beberapa karakter dengan memotong jalan:
GNU sed + date disetel oleh Toby Speight: 84
Versi golf yang diusulkan dalam komentar:
sumber
date
(GNU 8.23) saya menampilkannya sebagai detik pertama pada menit berikutnya. Apa yang Anda gunakan yang memahami 60 menit?-r
bendera, menggantikandate
dengans///e
pengubah, dan mengganti%Y-%m-%d
dengan%F
didate
: TZ = UTCsed -nr 's/^([0-9]+).*/date -d "1900-1-1 \1sec" "+%F %T"/ep' /u*/s*/z*/leap*
1899-12-31 \1sec
tanggal, dan hardcoding23:59:60
sebagai waktu:sed -nr 's/^([0-9]+).*/date -d "1899-12-31 \1sec" "+%F 23:59:60"/ep' /u*/s*/z*/leap*
JavaScript ( ES6 ) 125
Baris baru di dalam `` signifikan dan dihitung.
Untuk menguji, jalankan cuplikan di bawah ini (menjadi EcmaScript 6, khusus Firefox)
sumber
PHP, 198 byte
Sayangnya, saya tidak tahu apakah saya bisa memasukkan
\n
fungsi tanggal. Jika demikian, ini kurang dari 3 byte karena.""
.sumber
(int)
dan menghapus spasi putih. Tanggal melempar kesalahan, jika zona waktu default tidak disetel, diamkan dengan@
. 187 byte:foreach([.5,1,2,3,4,5,6,7,8,9.5,10.5,11.5,13.5,16,18,19,20.5,21.5,22.5,24,25.5,27,34,37,40.5,43.5]as$d){$h=$d-ceil($d);echo@date("Y-m-d 23:59:60",mktime(0,0,0,-6*$h,31+$h,$d+1972))."\n";}
8086 kode mesin + DOS, 92 byte
Hexdump kode:
Untuk menjalankan, tulis 92 byte ke
com
-file dan jalankan di bawah 32-bit Windows atau DOSBox.Kode ini menggunakan bitmap dengan 87 bit, satu per setengah tahun. Bit disusun dalam kelompok 16, mulai dari MSB.
Decoding bitmap:
Karena struktur kode, beberapa bit hilang selama decoding, jadi saya harus mengulanginya. Pengulangan ini tidak mengasapi bitmap karena saya harus memasukkan 87 bit menjadi 96 bit.
Setelah mencetak (atau tidak mencetak) lompatan kedua, kode meningkatkan tanggal setengah tahun, menggunakan manipulasi pada kode ASCII dari pesan keluaran.
Kode sumber (dapat dirakit dengan
tasm
):sumber
Pyth -
8884 byteKonversi ke char untuk mengompresi data dan menyimpan data
06-30
versus12-31
sebagai angka biner.(ada ruang di sana di akhir)
Coba di sini online .
sumber
Python 2,
123121116114111Saya sudah berhasil membuatnya cukup pendek, tapi saya tidak yakin seberapa pendek itu bisa didapat. Saya mencoba menggunakan
exec
, tetapi pemformatan menjadi terlalu mahal.Saya menggunakan basis 16 pengkodean tabel dari halaman Wikipedia yang ditautkan.
Sunting: Menggunakan hex encoding lebih pendek dari base 36 (lihat versi yang kurang golf).
Coba di sini
Kurang bermain golf:
sumber
C,
155149147 byteBerikut pendekatan lain dalam C, menggunakan string dan menjalankan encoding panjang. Tidak sesingkat solusi C saya yang lain, tapi mungkin itu bisa diperbaiki?
155 byte:
Menggunakan string untuk menahan bulan / hari.
149 byte:
Menghilangkan string bulan / hari.
147 byte:
Menghilangkan inisialisasi tahun.
144 byte:
Jika saya me-encode ulang buffer untuk membuat jumlah lompatan berlaku sebelum (bukan setelah) jalankan, maka saya bisa menyusun ulang pernyataan di loop sementara luar, menggunakan operator koma, dan menghilangkan kawat gigi, menghemat 2 byte.
Saya dapat menyimpan byte lain dengan membuat hari menjadi negatif (seperti pada solusi saya yang lain).
Cantik:
Penjelasan:
Proses dikodekan dalam byte. Setiap byte memiliki satu bit untuk mengatakan apakah itu Juni atau Desember, 3 bit untuk jumlah panjang, 3 bit untuk jumlah lewati, dan 1 bit tinggi yang tidak digunakan.
Hitungan loncatan adalah jumlah tahun untuk dilewati setelah berlari; itu diimbangi dengan -1 untuk memungkinkan dua detik kabisat pada tahun 1972. Panjangnya adalah berapa tahun dalam menjalankan; mungkin dapat diimbangi dengan +1 tetapi saat ini tidak.
Jadi satu byte berarti: "Lakukan PANJANG tahun JUNI (atau DESEMBER) tahun kabisat detik, kemudian lewati SKIP-1 tahun" sebelum pindah ke byte berikutnya.
Bytes diimbangi oleh 33 untuk membuatnya dapat dibaca dan menghindari pengkodean mewah.
Ini berarti meskipun kami memiliki cukup lewati bit untuk mencakup 1998-2005, kami berada di luar kisaran ASCII, jadi kami memiliki jangka panjang nol ekstra. Juga, 1979 muncul dengan sendirinya karena panjangnya 1972-1979 terlalu panjang.
Ada cukup banyak bit dalam byte, sehingga masalah-masalah itu akhirnya bisa diperbaiki.
sumber
q / kdb +,
959493 bytePenjelasan
Untuk setiap tahun +1 , penyandian selama bertahun-tahun sejak 1905 sebagai karakter ASCII, misalnya:
6h$x
bergantian"D"
kembali ke68
. Karenaq
zaman tanggal adalah2000.01.01
, kami mengurangi95
dan melakukan konversi bilangan bulat ke tanggal"d"$"m"$-12*95-6h$x
.Alasan kami memberi +1 di atas adalah untuk mengurangi jumlah hari dari awal tahun depan untuk mendapatkan tahun sebenarnya 31 Desember atau 30 Juni, yaitu 1 atau 185 hari. Oleh karena itu,
"DEFGHIJKSUV[^eh"
mewakili tahun-tahun dengan lompatan kedua pada bulan Desember, dan"DMNOQXYZ]lo"
bagi mereka pada bulan Juni. Pengurangan-pasangan dilakukan melalui(a;b){x-y}'(c;d)
, di manaa
danb
adalah tahun-tahun yang akan dikurangkan olehc
dand
jumlah hari masing-masing." "0:([]...)
menyiapkan hasilnya untuk memberi kita format yang benar, dengan peringatan kecil bahwa header kolom akan dihasilkan.1_
menjatuhkan tajuk itu dan akhirnya berlakuasc
untuk mendapatkan pemesanan yang benar.sunting : 're-base' untuk mengurangi 95 tahun alih-alih 100 (menyimpan 1 karakter).
edit 2 : memesan ulang posisi operan di dalam fungsi konversi integer-to-date.
sumber
Python,
204201Anda dapat bermain dengan pada repl.it .
Sunting: Dipukul habis! Jawaban kompresi sangat pendek.
sumber
PHP, 164 byte
Ini hanya beberapa modifikasi pada ide @ Voitcus
sumber
Python,
221217Beberapa Wawasan
Pada dasarnya,
d(x)
dekompresi vektor 3 bilangan bulat dari bilangan bulat 2 digit.d(x)
dikonstruksikan sebagai fungsi terbalik (lebih dari 26 detik detik kabisat) daric(v)
, yang pada gilirannya adalah fungsi kompresi yang mengubah 3-uple seperti (1998,12,31) menjadi angka seperti 85. Untuk memperoleh daftar [20 , 21 ... 28,58] Saya merancang algoritma lain untuk memverifikasi bahwa fungsi kompresi bijective atas domain. Yaitu, saya memastikan bahwa program berikut ini tidak menghasilkan duplikat, dan saya menggunakan hasilnya sebagai daftar program di atas.Fungsi kompresi
c(v)
dirancang menjadi bijective dengan menggunakan skema yang sangat sederhana. Mari kita ambil sebagai contoh (1998,12,31).Saya menulis program untuk memverifikasi bahwa ini benar, dan kemudian saya mendefinisikan
d(x)
sebagai kebalikan daric(v)
. Dalam contoh kita, c ((1998,12,31)) adalah 85 dan d (85) dicetak dengan benar1998-12-31 23:59:60
.sumber
q=x%10
dan gantiq
denganx%10
mana saja. Lebih pendek. Saya juga memberikan deskripsi bermanfaat tentang beberapa golf tambahan di program Anda di sini . Saya sarankan melihat Tips untuk Golf di halaman Python .gzip, 114 byte
Hexdump:
1f8b080853f9975502006c006dd04b0a80300c84e1bde01dbc40218fa6697aff8309e2a6fa6f3f86cc10adb426a3b95ce62b6a0d398f07d59aeb8e4ed80983701026e1242cc0a9307e1aa11306615211b59710527b3961270cba9994fc7fc944829092faeedc313e7803993cfafb20020000
Buat file dengan byte yang dijelaskan di atas.
Ekstrak menggunakan gunzip atau program dekompresi lain untuk mendapatkan file baru bernama "l". File ini berisi output yang diinginkan.
sumber