Tanggal dapat diwakili oleh integer yang tidak ditandai seperti itu: YYYYMMDD. Yang perlu Anda lakukan adalah menulis program atau fungsi terpendek yang mencari tahu tanggal terbaru yang jumlahnya dapat dibagi dengan angka yang diberikan n
(termasuk tanggal hari ini) dan kemudian mengembalikan tanggal itu dalam format yang ditunjukkan di atas. Jika tidak pernah ada tanggal (antara 00000101 dan hari ini inklusif) yang dapat dibagi oleh bilangan bulat yang diberikan, Anda harus mengembalikan -1.
Contohnya
Current Date Input Output
30 July, 2014 4 20140728
30 July, 2014 7 20140729
28 July, 2014 4 20140728
28 July, 2014 7 20140722
28 July, 5 90000 -1
Memasukkan
Anda dapat membaca dari STDIN atau mengambil argumen fungsi atau bahkan berharap input disimpan dalam variabel. Input akan berupa bilangan bulat yang tidak ditandatangani.
Keluaran
Menulis ke STDOUT atau mengembalikan (atau menyimpan dalam variabel) integer yang mewakili tanggal dalam format YYYYMMDD.
Batasan
Anda dapat menggunakan perpustakaan standar apa pun yang ditawarkan bahasa Anda. Celah standar berlaku.
Kondisi menang
Ini adalah kode-golf , sehingga program terkecil (dalam byte) menang. Dalam kasus seri, jawaban dengan suara terbanyak menang.
Jawaban:
Mathematica,
9360 byteDiharapkan input untuk disimpan
n
.Perhatikan bahwa garis vertikal
∣
adalah karakter unicode untuk "membagi", yang saya hitung sebagai 3 byte (UTF-8).Sunting: Ditemukan trik yang rapi untuk menghindari
DateString
spesifikasi kembung dan format :).Sunting: Benar-benar lupa tentang
-1
persyaratan. Diperbaiki sekarangBerikut ini penjelasannya
Perhatikan bahwa saya telah menggunakan
|
bukannya∣
dalam penjelasan, karena Unicode yang mengacaukan monospacing.sumber
Python 2 - 150
Terima kasih @ chill0r untuk saran untuk menghapus hari =, dan Jason S untuk tip bahwa blok coba dapat dikurangi menjadi satu baris.
sumber
days=
dit-=d.timedelta(days=1)
. Ini juga berfungsi dengan baik (setidaknya dalam python3)int(t.strftime("%Y%m%d"))
dan lepasre
, (2) gunakan satu baristry
karena hanyat-=d.timedelta(1)
perlu ada di dalamnya.strftime
pada tanggal yang lebih lama berfungsi di python3, diperiksa dan saya mendapatkan kesalahan di python2C # 136
Dengan spesifikasi yang direvisi, fungsi yang mengambil int yang tidak ditandatangani dan mengembalikan int.
152 karakter dengan input / output variabel
Mengambil keuntungan dari persyaratan input / output yang longgar, input harus disimpan dalam variabel
n
(saat ini menghitung semua karakter kecuali bilangan bulat literal), dan output disediakan dengan variabels
.204 karakter dengan STDIN / STDOUT:
sumber
T-SQL (2012) - 148
Asumsikan ada variabel bebas @n dengan nilai n.
sumber
Golflua
9086Versi Lua ungolfed akan menjadi,
sumber
MATLAB: 61
Asumsikan pembagi disimpan dalam
n
. Hasilnya akan disimpan dalam variabel yang disebutans
.Versi yang dikomentari:
Akan menghasilkan kesalahan jika tidak ada hasil ditemukan, tetapi jawabannya masih tersedia dalam variabel meskipun begitu.
Kesalahan dapat dihindari dengan biaya 2 karakter tambahan:
sumber
PHP (92 = 85 + 7)
Diharapkan input untuk disimpan
$n
.Saya baru ingat mengapa saya tidak suka PHP lagi =)
EDIT: Sekarang -1 dari spesifikasi juga diterapkan.
sumber
JavaScript (ES6) 115
Mengharapkan angka dalam variabel n, hasil disimpan dalam variabel r. Setiap hari diperiksa, dimulai dengan tanggal saat ini dan pengurangan - harus ada cara yang lebih baik.
Selain itu, dengan menggunakan fungsi tanggal javascript standar, semua tanggal adalah gregorian hingga tahun 1 (dengan tahun kabisat salah sebelum reformasi gregorian).
sumber
C # - 144 (Atau 124 dalam LINQPad) +1 untuk setiap digit dalam
n
Ini mengharapkan input berada dalam variabel
n
. Pada akhir eksekusi, nilai yang diinginkan akan berada dalam variabelr
. Ini dianggap00010101
sebagai kencan pertama, karena tanggal00000101
tersebut tidak ada. Saran untuk perbaikan selalu diterima.Versi LINQPad:
sumber
Groovy -
301300 karakterSangat sederhana (dan lambat), tanpa trik untuk menyembunyikan fakta bahwa ia menggunakan Joda Time.
Golf:
Contoh dijalankan (pada 7/30/2014):
Tidak Disatukan:
sumber
R,
146139Semoga beruntung dengan kencan yang tidak berfungsi.
microbenchmark
melaporkan dibutuhkan sekitar setengah detik untuk kembali 15 hari. Pada 31 Juli 2014, ini akan memakan waktu sekitar 20 juta detik (~ 23 hari) untuk dimuntahkan-1
, setidaknya sesuai dengan bagian belakang amplop.sunting : beberapa pintasan dalam komentar
sumber
!d
lebih pendek darid==F
dan!z%%n
dariz%%n==0
. Juga, menjadikanas.numeric(gsub("-","",...)
fungsi harus mengurangi jumlah karakter juga. Tetap saja, pekerjaan bagus!as.real
sering kali merupakan alternatif yang baik, lebih pendekas.numeric
.as.real
tidak berfungsi pada R 3.0.0. Tapi kita masih punyaas.double
satu karakter yang lebih pendek.paste0
di.Rprofile
alami saya :)Matlab 104
Tidak Terkumpul:
EDIT: Saya berhasil sedikit mengoptimalkannya, tetapi @DennisJaheruddin memiliki solusi nyata di sini
sumber
-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Python 3 -
151148 byte, generatorTerima kasih @ nyuszika7h untuk
import*
sarannyasumber
Ruby 103
Memasukkan
Mengharapkan nilai pembagi hadir dalam variabel
n
.Keluaran
Nilai pengembalian
f
fungsiContoh daring: http://ideone.com/LoYxG4
sumber
Java: 373 karakter
Ini adalah port dari jawaban Groovy, dan menggunakan Joda Time.
Golf:
Sampel berjalan (dengan joda-time-2.4.jar di classpath:
Tidak Disatukan:
sumber
java.time.*
versi Java terbaru.Bash + coreutils (8.21), 67 byte
seq
menghasilkan bilangan bulat dari 1 hingga 9 , satu per baris, dan memformatnya sebagai-<x>day
date -f
yang menginterpretasikan setiap baris dan menampilkan tanggal yang diformat menjadidc
ekspresi seperti[pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p
(spasi ditambahkan untuk dibaca)[pq]
tentukan makro untuk mencetak bagian atas tumpukan, lalu keluarsp
simpan makro dalam register h[pq]
tentukan makro untuk mendorong -1, mencetak bagian atas tumpukan, lalu keluarsq
simpan makro dalam register q20140728
integer tanggal tertanamd
duplikat atas tumpukanA1
push 101 (00000101)=q
pop top 2 nilai stack: bandingkan tanggal dan 101, dan panggil makroq
jika sama7
dorong pembagi%
pembagi pop dan pembagi, membagi dan mendorong sisanya0
tekan 0=p
pop top 2 nilai stack: bandingkan sisa dan 0, dan panggil makrop
jika samad
duplikat atas tumpukanp
disebut: mencetak integer tanggal dan berhentidc
seluruhnyadc
ekspresi disalurkandc
untuk evaluasi. Setelahdc
mencetak nilai yang tepat dan berhenti, sisa pipa akan dirobohkanKeluaran:
Sejak program ini menghasilkan bilangan bulat dari 1 sampai 9 9 , maka akan berlaku sampai dengan lebih dari 1 juta tahun ke depan. Saya harap batasan ini dapat diterima ;-)
Terima kasih @ WumpusQ.Wumbley untuk mempersingkat kembalinya -1.
sumber
|grep .||echo -1
ke ujung pipa, atau gunakan zsh di mana Anda dapat membuat sarang ekspansi sepertiecho ${$(cmd):-1}
(ini akan membebani Anda backslash di tempat lain ...)sizeof time_t
masalah, karena batas di mana batasnya adalah 2 ** 31 detik sebelum 1/1/1970. Instalasi saya yang lebih lama juga menyedihkan 32-bitPYTHON: 134 byte
Tidak akan bisa mengalahkan pemimpin saat ini, dan itu tidak jauh lebih baik daripada jawaban Python terbaik, tapi saya memutuskan untuk mengirim solusi Python terbaik saya.
Tidak Disatukan:
sumber
from datetime import*
bukanimport datetime as d
,timedelta(1)
bukannyad.timedelta(1)
danyield
bukannyareturn
.JavaScript (ES5) - 94
Ia mengharapkan input dalam variabel
x
, dan menempatkan output dalamo
.sumber
k4
(84)(73)Ini hanya potongan awal dengan algoritma pertama yang muncul di pikiran; Saya yakin lebih baik mungkin dalam performa dan panjang.
Versi ini mengubah kode bagian "hari ini" (itulah
.z.D
); ubah ke tanggal literal (yyyy.mm.dd
) atau bilangan bulat dalam sistem tanggal q (hari sejak 1 Januari 2000) untuk menjalankan test case. (q tidak akan menguraikan literal tanggal lebih awal dari awal abad kedelapan belas, jadi untuk tanggal sebelum itu, Anda harus menghitung nilainya dan menggunakan bilangan bulat yang tepat secara langsung. 1 Januari, "0 AD", dari spec, belokan out to be-730457
, yang digunakan dalam kode fungsi. 28 Juli, 5 M, dari test case terakhir, ternyata-728450
.)Kasus uji yang diberikan:
edit:
Ini adalah pendekatan yang berbeda yang menggunakan salah satu operator konvergensi untuk mengurangi tanggal sampai menemukan tanggal yang dapat dibagi atau melintasi batas 1/1/0000. Itu juga melakukan konversi dari tanggal ke bilangan bulat sedikit berbeda.
Kasing uji, kali ini sekaligus:
sumber
VBA 343 byte (modul)
sumber
Sub d(i):a=Now:b=a:Do Until b/i=Int(b/i):a=DateAdd("d",-1,a):b=Format(a,"yyyymmdd"):If b="01000101"Then:b=-1:Exit Sub:Loop:Debug.?b:End Sub
139 BytesPowerShell - 76
Ini tergantung pada jumlah yang disimpan dalam variabel
$n
.sumber