Saya hanya punya ide jenius untuk membuat kehidupan kerja lebih mudah - hitungan mundur ke tanggal tertentu yang hanya dihitung hari kerja.
Tugas dasar adalah membuat hitung mundur ke tanggal tertentu yang hanya mencakup hari kerja dalam hitung mundur.
Seperti hari kerja , Senin , Selasa , Rabu , Kamis , dan Jumat .
Masukan harus berupa tanggal khusus dalam format standar Eropa "tidak resmi" dd.MM.yyyy
dan harus hari ini atau sehari di masa depan.
Output seharusnya hanya jumlah hari yang tersisa.
Karena ini kode-golf , kode terpendek akan menang
Kasus cobaan:
Today | Input | Output
10.12.2018 | 17.12.2018 | 5
02.10.2018 | 16.10.2018 | 10
Jika saya melewatkan beberapa hal dalam pertanyaan, mohon maafkan saya - ini pertanyaan pertama saya :)
EDIT:
- Anda dapat menggunakan
false
sebagai output alih-alih0
<- tetapi itu tidak indah - Tidak perlu menghormati DST
Jawaban:
05AB1E ,
130128133131124123 byteSaya keluar dari pikiran saya ..
Untuk bahasa golf 05AB1E, tidak masalah sama sekali apakah inputnya dengan
.
atau-
. Namun, 05AB1E tidak memiliki builtin untuk objek atau perhitungan Date. Satu-satunya bawaan tentang tanggal yang dimilikinya adalah tahun / bulan / hari / jam / menit / detik / hari ini hari ini.Jadi karena itu, hampir semua kode yang Anda lihat adalah perhitungan manual untuk hari berikutnya, dan menghitung hari dalam seminggu.
+5 byte karena bagian yang saya lupa dalam rumus Zeller (tahun-1 untuk bulan Januari dan Februari) ..
Cobalah secara online atau Coba online dengan tanggal 'hari ini' yang ditentukan sendiri yang ditiru .
Penjelasan:
Dinding teks yang masuk.
Secara umum, kode mengikuti pseudo-code berikut:
1)
Date currentDate = today;
apakah ini bagian dari program 05AB1E:2)
Integer counter = 0;
dan 3)Start an infinite loop:
langsung di program 05AB1E:4)
If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
adalah bagian sulit pertama dengan perhitungan manual. Karena 05AB1E tidak memiliki tanggal bawaan, kami harus menghitung Hari Minggu secara manual.Formula umum untuk melakukan ini adalah:
Di mana untuk bulan Maret hingga Desember:
[1, 31]
)[3, 12]
)Dan untuk bulan Januari dan Februari:
[1, 31]
)[13, 14]
)Menghasilkan pada hari dalam mingguh , di mana 0 = Sabtu, 1 = Minggu, ..., 6 = Jumat.
Sumber: kesesuaian Zeller
Kita dapat melihat ini di bagian program 05AB1E ini:
5)
Counter += 1;
lurus lagi:6)
currentDate += 1; // Set currentDate to the next day in line
sekali lagi lebih kompleks, karena kita harus melakukannya secara manual. Jadi ini akan diperluas ke pseudo-code berikut:Sumber:
Algoritma untuk menentukan apakah satu tahun adalah tahun kabisat.(EDIT: Tidak lagi relevan, karena saya menggunakan metode alternatif untuk memeriksa tahun kabisat yang menghemat 7 byte.)Algoritma untuk menentukan jumlah hari dalam sebulan.
6a)
Integer isLeapYear = ...;
dilakukan seperti ini dalam program 05AB1E:Juga digunakan dalam jawaban saya pada 05AB1E ini , jadi ada beberapa contoh tahun ditambahkan untuk menggambarkan langkah-langkahnya.
6b)
currentDate.month == 2 ?
dan 6c)28 + isLeapYear
dilakukan seperti ini:6d)
:
dan 6e)31 - (currentDate.month - 1) % 7 % 2;
dilakukan seperti ini:6f)
If(currentDate.day < daysInCurrentMonth):
dilakukan seperti ini:6g)
nextDate.day += 1;
dilakukan seperti ini:6h)
Else:
dan 6i)nextDate.day = 1;
kemudian dilakukan seperti ini:6j)
If(currentDate.month < 12):
:6k)
nextDate.month += 1;
:6l)
Else:
, 6m)nextDate.month = 1;
dan 6n)nextDate.year += 1;
kemudian dilakukan seperti ini:Dan akhirnya jam 8)
If(currentDate == parsed input-string):
dan 9)Stop the infinite loop, and output the counter
:sumber
Excel 24 Bytes
Mengasumsikan input dalam Sel A1
Menggunakan fungsi bawaan. Sayangnya fungsi ini mencakup hari ini dan tanggal akhir. OP telah mengklarifikasi untuk tidak menghitung hari ini, jadi saya menambahkan satu ke SEKARANG agar tidak menghitung hari ini.
Untuk membahas komentar pada format angka, sekali lagi, ini adalah standar Excel:
sumber
10.12.2018
adalah string ketika dipegang dalam sel daripada tanggal. Solusi yang jelas tetapi panjang untuk memperbaiki ini adalah dengan mengubahA1
keDATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))
dalam solusi AndaHKCU\Control Panel\International\sDecimal
string registri. Pada instalasi Windows AS default itu MM / hh / tttt. Di sebagian besar negara Uni Eropa ini akan menjadi default.R , 76 byte
Silakan juga melihat jawaban 72 byte R ini yang juga tidak bergantung pada lokal.
Cobalah online!
weekdays
memberikan teks hari dalam seminggu, jadi kami menghitung hari dalam urutan antara hari ini dan input yang tidak mengandungS
, dan menambahkan satu ke hasilnya.sumber
Java 10,
233232226 byteDate selalu mengingatkan saya bagaimana sebenarnya Java verbose ..
CATATAN: Sekarang ada dua jawaban Java yang lebih pendek (di bawah 175 byte), satu dengan penggunaan cerdas metode usang dari versi Java sebelumnya oleh @LukeStevens , dan satu menggunakan
java.time.LocalDate
yang baru sejak Java 8 oleh @ OlivierGrégoire .Cobalah online.
Penjelasan:
sumber
e=s.clone()
?Calendar s=Calendar.getInstance(),e=s.getInstance()
, yang sayangnya panjangnya persis sama.C
memang tidak perlu. Itu dari bagian lama dari kode di mana saya juga menggunakanC
tempat lain. Sudah bisa golf 1 byte dengan menggunakanvar s=Calendar.getInstance();var e=s.getInstance();
terima kasih. :)java.time
.JavaScript (ES6),
116103 byteCobalah online!
Bagaimana?
.toJSON()
YYYY-MM-DD
YYYY-MM-DD
DD.MM.YYYY
D.getDay()
sumber
MATL , 24 byte
Cobalah online!
Anda setengah berhasil :-)
Penjelasan
sumber
16.10.2018
apakah hari ini (Senin01-10-2018
) akan menghasilkan11
, besok10
, dll.Bahasa Wolfram (Mathematica) ,
6456 byteCobalah online!
DayCount[x,y,"Weekday"]
menghitung jumlah hari kerja antarax
dany
.Masukan
x
dany
bisa banyak hal, termasuk yang mewahDateObject
seperti yang dikembalikan olehToday
, atau string dalam format (sayangnya)mm.dd.yyyy
.Upaya saya sebelumnya mencoba mengubah
dd.mm.yyyy
input menjadiDateObject
dengan memberi tahu Mathematica cara menguraikannya; solusi baru hanya mengatur ulang string untuk meletakkan hari dan bulan dalam urutan yang diharapkan Mathematica.Perlu dicatat bahwa solusi 28-byte
DayCount[Today,#,"Weekday"]&
tidak hanya bekerja dengan sempurna untuk format input bulan-hari-tahun, tetapi juga dengan benar menangani input hari-bulan-tahun yang tidak ambigu seperti31.12.2018
, yang tidak mungkin berarti "hari ke-12 hari ke-31 bulan". Jadi benar lebih dari 60% dari waktu :)sumber
Perl 6 , 61 byte
Cobalah online!
sumber
R, 72 karakter
Variasi pada jawaban yang diberikan oleh @ngm yang menghindari grepl untuk menyimpan beberapa karakter dan berfungsi di lokal non-Inggris.
sum(strftime(seq(Sys.Date(),as.Date(scan(,""),"%d.%m.%Y"),1),'%u')<6)+1
sumber
Java (OpenJDK 8) ,
174166165 byteDengan sedikit inspirasi dari jawaban Kevin dan trawl yang bagus melalui Date API yang sudah usang, saya telah berhasil mendapatkan solusi Java yang lebih ringkas.
-8 byte berkat parsing tanggal regex inventif Kevin
-1 byte, berkat operasi bitwise pintar Nevay
Cobalah online!
Penjelasan
sumber
d=d[0].split
dan usang.parse
dengan formatMM/dd/yyyy
format default . Satu kesalahan kecil dalam posting Anda, Anda milikiimport java.text.*;
alih - alihimport java.util.*;
dalam kode Anda, dan// Required import for both Calendar and Date
dalam penjelasan Anda (meskipun Anda tidak menggunakanCalendar
).java.text
memperbaikinya sekarang! Terima kasih!d=d[0].split
dengan varargs, mengubah input ke String biasa, menghapusd=d[0].split("\\.");
dan mengubahd[1]+"/"+d[0]+"/"+d[2]
untukd.replaceAll("(..).(..).","$2/$1/")
menghemat 7 byte .r+=new Date(s).getDay()%6<1?0:1,s+=864e5);
kes+=864e5)r+=new Date(s).getDay()%6<1?0:1;
. :)r-=-new Date(s).getDay()%6>>-1;
Merah , 72 byte
Cobalah online!
Mengambil tanggal dalam format dd-mm-yyyy, misalnya 31-10-2018 (juga berfungsi dengan 10-Okt-2018)
Input yang ketat:
Merah , 97 byte
Cobalah online!
Bonus:
Mengembalikan daftar tanggal / hari kerja pada hari kerja hingga tanggal yang diberikan:
Merah , 235 byte
Cobalah online!
sumber
JavaScript,
8785 bytePengembalian
false
untuk0
.Cobalah online atau periksa 31 hari ke depan
sumber
Python 2 ,
163156149147 byteCobalah online!
-7 dengan terima kasih kepada @mypetlion
-7 lagi dengan terima kasih kepada @ovs
+30 karena format input yang sangat ketat yang hanya saya perhatikan sebelum saya memposting kode saya sebelumnya yang mengambil input seperti
(2018,11,1)
:-(sumber
(0,1)[t.weekday()<5]
. Python booleans adalah subclass dariint
danTrue, False
dapat digunakan dalam operasi aritmatika sebagai1,0
. Ganti denganc+=t.weekday()<5
untuk menyimpan 7 byte.Java (JDK 10) , 171 byte
Cobalah online!
Kredit
sumber
(.*)\\.(.*)\\.(.*)
ke(..).(..).(.*)
.replaceAll
teknik Anda , jawabannya bisa dipagari dengan 7 byte, jadi jawaban Anda masih sedikit lebih lama. ;)JavaScript (Node.js) ,
168160139133 byte35 byte lebih sedikit berkat Quintec dan Kevin Cruijssen
Cobalah online!
sumber
f=
ke byte-count (dan pada TIO Anda dapat meletakkannya di header), itulah sebabnya @Quintec menyatakan itu 139 byte, bukan 141 byte. Selain itu, Anda dapat mengubahif((d.getDay()+1)%7>1)n++;
untukn+=-~d.getDay()%7>1;
golf untuk 133 byte .-~i
sama dengan(i+1)
Juga, jika Anda belum melihatnya, Tips untuk bermain golf di JavaScript dan Tips untuk bermain golf di <semua bahasa> mungkin menarik untuk dibaca. :)Python3 & Numpy , 96 byte
Saya tidak bisa lebih kecil dari solusi membosankan yang dibuat sebelumnya ...
Cobalah online!
sumber
PowerShell ,
10799 byte-8 byte berkat mazzy
Cobalah online!
Melakukan regex
-split
pada input$args
, masing-masing menyimpan nilai dalam$d
ays,$m
onths, dan$y
telinga. Kemudian, masukkan satufor
lingkaran, inisialisasi$a
ke tanggal hari ini. Loop berlanjut sementara$a
adalah-l
esst
han target masukan kami. Setiap iterasi kami menambahkan1
days
untuk$a
, dan memeriksa apakah saat iniD*k
(singkatanDayOfWeek
) adalah dalam kisaran1..5
(yaitu, Senin sampai Jumat). Hasil Boolean itu diakumulasikan ke dalam$o
dan begitu kita keluar dari loop nilai itu ditinggalkan di pipeline dan output tersirat.sumber
$d,$m,$y=$args-split'\.';for($a=date;$a-lt(date "$y-$m-$d");$a=$a|% *ys 1){$o+=($a|% D*k)-in1..5};$o
for(...){...}
dan$o
dapat dihapus, jadi kita sekarang di bawah 100!Python 2 ,
147143141140 byteCobalah online!
Mengambil string, e, yang mewakili tanggal akhir dalam format "dd.MM.YYYY". Secara opsional juga mengambil tanggal mulai, tetapi ini diharapkan menjadi datetime.date.
Tanggal mulai, s, default ke tanggal hari ini sebagai objek datetime.date untuk mengabaikan waktu. Waktu akhir diuraikan menjadi objek datetime.datetime kemudian dikonversi ke tanggal, karena objek datetime.date tidak memiliki metode parse dan datetimes tidak dapat ditambahkan ke / dikurangi dari tanggal. Iterasi setiap hari dalam (mulai, akhir) dan tambahkan 1 ke total jika angka hari kerja adalah <5. ([0-4] adalah [Sen-Jum], [5-6] adalah [Sat-Sun]).
Mengurai datetime adalah yang terburuk, kalian.
EDIT: Mencuri ElPedro 's map (int, thing) trik untuk menyimpan 4 byte.
EDIT 2: ELECTRIC BOOGALOO: Disimpan 2 byte dengan menjadikannya fungsi anonim. (Terima kasih Aaron!)
EDIT 3: xrange -> range. (Terima kasih lagi Aaron!)
sumber
f=
hilangkan dari ekspresi lambda di sinirange
daripadaxrange
harus tetap bekerja dengan baik.PHP, 66 byte
output kosong untuk
0
; masukkan di+
antaraecho
dan$r
untuk memperbaiki.Jalankan sebagai pipa dengan
-nr
atau coba online .60 byte dengan output unary:
sumber
PHP (dengan Karbon ), 107 byte
sumber
IBM / Lotus Notes Formula - 99 byte
Mengambil input dari bidang tanggal / waktu
i
. Format input darii
diatur ke.
dipisahkan sehingga tidak perlu mengkonversi input. Catatan dapat mengambil input tanggal dengan pemisah apa pun selama Anda memberi tahu sebelum apa yang akan terjadi (harapan itu tidak curang!). Formula dalam bidang numerik yang dihitungo
pada formulir yang sama.Selain menarik: Sejak saat itu
@For
dan@While
diperkenalkan ke dalam bahasa Formula di (saya pikir) R6 oleh Damien Katz yang hebat , satu-satunya kegunaan yang saya temukan untuk mereka adalah kode golf. Saya belum pernah menggunakannya dalam aplikasi produksi.Tidak ada TIO yang tersedia untuk formula jadi di sini adalah tangkapan layar yang diambil pada 02.10.2018:
sumber
Ruby , 81 byte
Cobalah online!
sumber
K4 , 40 byte
Larutan:
Penjelasan:
Hitung perbedaan antara tanggal, gunakan modulo 7 untuk mengabaikan akhir pekan, jumlah.
Catatan:
"D"$,/|"."\:x
sumber
C (dentang) ,
209208205 byteBendera kompiler
-DU=u=localtime(&b)
-DW=tm_wday
-DY=tm_year
-DT=tm_yday
(52 byte).Cobalah online!
-1 byte terima kasih kepada @JonathanFrech
sumber
?i++:0
->&&++i
.q,
5279 bytedalam q, setiap tanggal memiliki nilai integer yang mendasarinya, berdasarkan pada berapa hari telah berlalu sejak awal milenium. Dengan menerapkan 'mod 7' untuk ini, Anda mendapatkan nilai unik untuk setiap hari dalam seminggu (0 untuk Sabtu, 6 untuk Jumat). Jadi ketika 2> x mod 7, jangan menambah penghitung, untuk menghindari penghitungan akhir pekan.
EDIT: Format tanggal ketat terlewatkan, pengeditan
EDIT2: Termasuk
sumber
{sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7}
untuk 48 byte tanpa menggunakan kata kerja K.