Countdown Hari Kerja


17

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.yyyydan harus hari ini atau sehari di masa depan.

Output seharusnya hanya jumlah hari yang tersisa.

Karena ini , 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 falsesebagai output alih-alih 0 <- tetapi itu tidak indah
  • Tidak perlu menghormati DST

9
Apakah ada alasan khusus di balik format input Eropa "tidak resmi" ini ? Konsensus kami adalah untuk memungkinkan input fleksibel kapan pun memungkinkan.
Arnauld

6
Apakah benar-benar ada gunanya menambahkan "tantangan ekstra" dari format tanggal yang sulit diproses? Itu sepertinya bahasa wrt tidak adil yang memiliki format tanggal fleksibel ...
Quintec

3
@Hille Saya tidak mengatakan itu "keras", hanya saja tidak perlu merepotkan, terutama dalam kode-golf ... jangan perhatikan tautan yang diposting Arnauld di atas ... biasanya input fleksibel adalah norma ...
Quintec

6
Omong-omong, Anda perhatikan bahwa ini adalah tantangan pertama Anda; Saya mengundang Anda untuk menggunakan The Sandbox untuk perbaikan sebelum memposting tantangan ke main! Kalau tidak, kerja bagus, dan aku akan senang melihat lebih banyak darimu!
Giuseppe

7
Tidak terlalu terkesan dengan format input yang ketat tetapi selain itu tantangan yang bagus.
ElPedro

Jawaban:


18

05AB1E , 130 128 133 131 124 123 byte

žežfžg)V0[Y`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()ćsO7%2@+Y`т‰0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVYI'.¡Q#

Saya 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;
2   Integer counter = 0;
3   Start an infinite loop:
4*    If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
5       Counter += 1;
6*    currentDate += 1; // Set currentDate to the next day in line
7     If(currentDate == parsed input-string):
8       Stop the infinite loop, and output the counter

1) Date currentDate = today;apakah ini bagian dari program 05AB1E:

že          # Push today's day
  žf        # Push today's month
    žg      # Push today's year
      )     # Wrap them into a single list
       V    # Pop and store this list in variable `Y`

2) Integer counter = 0;dan 3) Start an infinite loop:langsung di program 05AB1E:

0     # Push 0 to the stack
 [    # Start an infinite loop

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:

h=(q+13(m+1)5+K+K4+J42J)mod7,

Di mana untuk bulan Maret hingga Desember:

  • q adalahday of the month ([1, 31])
  • m adalah 1-diindeksmonth ([3, 12])
  • K adalah tahun abad (yearmod100 )
  • J adalah abad 0-diindeks (year100)

Dan untuk bulan Januari dan Februari:

  • q adalahday of the month ([1, 31])
  • m adalah 1-diindeksmonth+12 ([13, 14])
  • K adalah tahun abad untuk tahun sebelumnya ((year1)mod100 )
  • J adalah abad 0-diindeks untuk tahun sebelumnya (year1100)

Menghasilkan pada hari dalam minggu h , di mana 0 = Sabtu, 1 = Minggu, ..., 6 = Jumat.
Sumber: kesesuaian Zeller

Kita dapat melihat ini di bagian program 05AB1E ini:

Y             # Push variable `Y`
 `            # Push the day, month, and year to the stack
  U           # Pop and save the year in variable `X`
   Ð          # Triplicate the month
    3        # Check if the month is below 3 (Jan. / Feb.),
              # resulting in 1 or 0 for truthy/falsey respectively
      12*     # Multiply this by 12 (either 0 or 12)
         +    # And add it to the month
              # This first part was to make Jan. / Feb. 13 and 14

>             # Month + 1
 13*          # Multiplied by 13
    5÷        # Integer-divided by 5
s3           # Check if the month is below 3 again (resulting in 1 / 0)
   Xα         # Take the absolute difference with the year
     ©        # Store this potentially modified year in the register
      т%      # mYear modulo-100
D4÷           # mYear modulo-100, integer-divided by 4
®т÷©4÷        # mYear integer-divided by 100, and then integer-divided by 4
®·(           # mYear integer-divided by 100, doubled, and then made negative
)             # Wrap the entire stack into a list
 ć            # Extract the head (the counter variable that was also on the stack)
  s           # Swap so the calculated values above are as list at the top
   O          # Take the sum of this entire list
    7%        # And then take modulo-7 to complete the formula,
              # resulting in 0 for Saturday, 1 for Sunday, and [2, 6] for [Monday, Friday]

2@            # Check if the day is greater than or equal to 2 (so a working day)

5) Counter += 1;lurus lagi:

     # The >=2 check with `2@` results in either 1 for truthy and 0 for falsey
+    # So just adding it to the counter variable is enough

6) currentDate += 1; // Set currentDate to the next day in linesekali lagi lebih kompleks, karena kita harus melakukannya secara manual. Jadi ini akan diperluas ke pseudo-code berikut:

a   Integer isLeapYear = ...;
b   Integer daysInCurrentMonth = currentDate.month == 2 ?
c                                 28 + isLeapYear
d                                :
e                                 31 - (currentDate.month - 1) % 7 % 2;
f   If(currentDate.day < daysInCurrentMonth):
g     nextDate.day += 1;
h   Else:
i     nextDate.day = 1;
j     If(currentDate.month < 12):
k       nextDate.month += 1;
l     Else:
m       nextDate.month = 1;
n       nextDate.year += 1;

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:

Y             # Push variable `Y`
 `            # Push the days, month and year to the stack
  т‰          # Divmod the year by 100
    0K        # Remove all items "00" (or 0 when the year is below 100)
      θ       # Pop the list, and leave the last item
       4Ö     # Check if this number is visible by 4
         U    # Pop and save the result in variable `X`

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 + isLeapYeardilakukan seperti ini:

D            # Duplicate the month that is now the top of the stack
 2Q          # Check if it's equal to 2
   i         # And if it is:
    \        #  Remove the duplicated month from the top of the stack
     28X+    #  Add 28 and variable `X` (the isLeapYear) together

6d) :dan 6e) 31 - (currentDate.month - 1) % 7 % 2;dilakukan seperti ini:

ë           # Else:
 <          #  Month - 1
  7%        #  Modulo-7
    É       #  Is odd (shortcut for %2)
     31     #  Push 31
       α    #  Absolute difference between both
}           # Close the if-else

6f) If(currentDate.day < daysInCurrentMonth):dilakukan seperti ini:

     # Check if the day that is still on the stack is smaller than the value calculated
 i    # And if it is:

6g) nextDate.day += 1;dilakukan seperti ini:

Y       # Push variable `Y`
 ¬      # Push its head, the days (without popping the list `Y`)
  >     # Day + 1
   0    # Push index 0

        # (This part is done after the if-else clauses to save bytes)
}}      # Close the if-else clauses
  ǝ     # Insert the day + 1 at index 0 in the list `Y`
   V    # Pop and store the updated list in variable `Y` again

6h) Else:dan 6i) nextDate.day = 1;kemudian dilakukan seperti ini:

ë        # Else:
 Y       #  Push variable `Y`
  1      #  Push a 1
   ¾     #  Push index 0
    ǝ    #  Insert 1 at index 0 (days part) in the list `Y`

6j) If(currentDate.month < 12)::

D           # Duplicate the list `Y`
 Ås         # Pop and push its middle (the month)
   D12     # Check if the month is below 12
       i    # And if it is:

6k) nextDate.month += 1;:

>       # Month + 1
 1      # Push index 1

        # (This part is done after the if-else clauses to save bytes)
}}      # Close the if-else clauses
  ǝ     # Insert the month + 1 at index 1 in the list `Y`
   V    # Pop and store the updated list in variable `Y` again

6l) Else:, 6m) nextDate.month = 1;dan 6n) nextDate.year += 1;kemudian dilakukan seperti ini:

ë        # Else:
 \       #  Delete the top item on the stack (the duplicated month)
  1      #  Push 1
   D     #  Push index 1 (with a Duplicate)
    ǝ    #  Insert 1 at index 1 (month part) in the list `Y`

 ¤       #  Push its tail, the year (without popping the list `Y`)
  >      #  Year + 1
   2     #  Index 2

         # (This part is done after the if-else clauses to save bytes)
}}       # Close the if-else clauses
  ǝ      # Insert the year + 1 at index 2 in the list `Y`
   V     # Pop and store the updated list in variable `Y` again

Dan akhirnya jam 8) If(currentDate == parsed input-string):dan 9) Stop the infinite loop, and output the counter:

Y          # Push variable `Y`
 I         # Push the input
  '.¡     '# Split it on dots
     Q     # Check if the two lists are equal
      #    # And if they are equal: stop the infinite loop
           # (And output the top of the stack (the counter) implicitly)

5
Anda orang gila ... memiliki suara positif.
AdmBorkBork

1
Program 05AB1E terpanjang yang pernah ada?
Luis Mendo

2
@LuisMendo Tutup, tapi saya takut saya punya satu jawaban 05AB1E sendiri yang bahkan lebih lama , dan yang terlalu dekat .. ;) Saya yakin saya bisa bermain golf beberapa byte di sini sana dan menyederhanakan bagian dari implementasi pseudo-code pada hari berikutnya. Akan melihat besok pagi, tetapi baru saja kembali dari olahraga dan akan segera tidur.
Kevin Cruijssen

11

Excel 24 Bytes

Mengasumsikan input dalam Sel A1

=NETWORKDAYS(NOW()+1,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: masukkan deskripsi gambar di sini


Meskipun ini bekerja dengan nilai tanggal, gagal menerima input seperti yang dinyatakan. Artinya (setidaknya dalam versi AS) 10.12.2018adalah string ketika dipegang dalam sel daripada tanggal. Solusi yang jelas tetapi panjang untuk memperbaiki ini adalah dengan mengubah A1ke DATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))dalam solusi Anda
Taylor Scott

sayangnya, komunitas telah memutuskan bahwa bahasa perlu dijalankan di bawah pengaturan default mereka untuk menjadi valid (satu-satunya pengecualian yang saya lihat adalah bahasa - IE, jika bahasa Anda mendukung bahasa Inggris dan Spanyol, Anda dapat segera menggunakan keduanya, tetapi ini harus diperhatikan.) Lebih jauh, OP (@hille) belum menyatakan bahwa formatnya fleksibel, dan bahkan sebaliknya menyatakan sebaliknya (lihat komentar kedua pada pertanyaan ini)
Taylor Scott

2
Formatnya tidak standar, ini berbasis lokal. Excel membaca format dari HKCU\Control Panel\International\sDecimalstring registri. Pada instalasi Windows AS default itu MM / hh / tttt. Di sebagian besar negara Uni Eropa ini akan menjadi default.
Erik A

@luisMendo Ya, itu berhasil. Saya tidak melihat klarifikasi. Jika bukan karena menghitung hari terakhir sebagai gantinya, saya bisa memiliki = JARINGAN (SEKARANG (), A1-1). Saya tahu itu akan selalu menjadi byte byte yang sama tidak peduli klarifikasi mana.
Keeta - mengembalikan Monica

Senang itu berhasil. Saya menghapus downvote
Luis Mendo


8

Java 10, 233 232 226 byte

import java.util.*;d->{int r=0;var s=Calendar.getInstance();s.setTime(new Date());var e=s.getInstance();for(e.setTime(new java.text.SimpleDateFormat("dd.MM.yyyy").parse(d));!s.after(e);s.add(5,1))if(s.get(7)%7>1)r++;return r;}

Date 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.LocalDateyang baru sejak Java 8 oleh @ OlivierGrégoire .

Cobalah online.

Penjelasan:

import java.util.*;            // Required import for both Calendar and Date
d->{                           // Method with String parameter and integer return-type
  int r=0;                     //  Result-integer, starting at 0
  var s=Calendar.getInstance();//  Create a Calendar instance for the start-date
  s.setTime(new Date());       //  Set the start date to today
  var e=s.getInstance();       //  Create a Calendar instance for the end-date
  for(e.setTime(               //  Set the end date to:
        new java.text.SimpleDateFormat("dd.MM.yyyy")
                               //   Create a formatter for the "dd.MM.yyyy" format
         .parse(d));           //   And parse the input-String to a Date
      !s.after(e)              //  Loop as long as we haven't reached the end date yet
      ;                        //    After every iteration:
       s.add(5,1))             //     Increase the start-date by 1 day
    if(s.get(7)%7>1)           //   If the day of the week is NOT a Saturday or Sunday:
                               //   (SUNDAY = 1, MONDAY = 2, ..., SATURDAY = 7)
      r++;                     //    Increase the result-sum by 1
  return r;}                   //  Return the result-sum

Bisakah kamu melakukannya e=s.clone()?
Quintec

1
Kita juga bisa (saya berasumsi) melakukannya Calendar s=Calendar.getInstance(),e=s.getInstance(), yang sayangnya panjangnya persis sama.
Misha Lavrov

1
@MishaLavrov Ah, statis Cmemang tidak perlu. Itu dari bagian lama dari kode di mana saya juga menggunakan Ctempat lain. Sudah bisa golf 1 byte dengan menggunakan var s=Calendar.getInstance();var e=s.getInstance();terima kasih. :)
Kevin Cruijssen

1
150 byte , menggunakan java.time.
Olivier Grégoire

1
Selesai! Ini sangat dekat dengan byte ke jawaban lain, tetapi belum mengalahkannya.
Olivier Grégoire

7

JavaScript (ES6), 116 103 byte

f=(d,n=+new Date)=>(D=new Date(n)).toJSON()<d.split`.`.reverse().join`-`&&(D.getDay()%6>0)+f(d,n+864e5)

Cobalah online!

Bagaimana?

n

nD.toJSON()

YYYY - MM - DD T hh : mm : ss.sss Z

YYYY-MM-DDdYYYY-MM-DDDD.MM.YYYY

d.split`.`.reverse().join`-`

D.getDay()0606

(D.getDay() % 6 > 0) + f(d, n + 864e5)

86,400,000n


6

MATL , 24 byte

46tQZt24&YO:Z':X-9XO83-z

Cobalah online!

Saya tidak ingin memiliki format input apa pun sehingga bahasa golf kode tertentu mendapat keuntungan besar

Anda setengah berhasil :-)

Penjelasan

46      % Push 46 (ASCII for '.')
tQ      % Duplicate, add 1: gives 47 (ASCII for '/')
Zt      % Implicit input. Replace '.' by '/' in the input string
24&YO   % Convert string with date format 24 ('dd/mm/yyyy') to serial date number.
        % This is an integer representing day starting at Jan-1-0000
:       % Inclusive range from 1 to that
Z'      % Push current date and time as a serial number. Integer part is day;
        % decimal part represents time of the day
:       % Inclusive range from 1 to that
X-      % Set difference. Gives serial numbers of days after today, up to input
9XO     % Convert each number to date format 9, which is a letter for each day
        % of the week: 'M', 'T', 'W', 'T', ' F', 'S', 'S'
83-     % Subtract 83 (ASCII for 'S')
z       % Number of nonzeros. Implicit display

Jika saya memahami tantangan dengan benar, Anda hanya mengambil satu input tanggal, dan membandingkannya dengan tanggal hari ini. Misalnya, 16.10.2018apakah hari ini (Senin 01-10-2018) akan menghasilkan 11, besok 10, dll.
Kevin Cruijssen

@KevinCruijssen Whoops. Terima kasih! Diperbaiki sekarang
Luis Mendo

1
Dan dengan byte-count yang sama. :) Bagus, +1 dari saya.
Kevin Cruijssen

6

Bahasa Wolfram (Mathematica) , 64 56 byte

DayCount[Today,""<>#~StringTake~{{4,6},3,-4},"Weekday"]&

Cobalah online!

DayCount[x,y,"Weekday"]menghitung jumlah hari kerja antara xdan y.

Masukan xdan ybisa banyak hal, termasuk yang mewahDateObject seperti yang dikembalikan oleh Today, atau string dalam format (sayangnya) mm.dd.yyyy.

Upaya saya sebelumnya mencoba mengubah dd.mm.yyyy input menjadi DateObjectdengan 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 seperti 31.12.2018, yang tidak mungkin berarti "hari ke-12 hari ke-31 bulan". Jadi benar lebih dari 60% dari waktu :)



5

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


1
Lebih pendek dan lebih umum juga. Jawaban yang bagus dan selamat datang di suaka.
ngm

1
Selamat datang di PPCG! Anda dapat menambahkan tautan TIO - mudah dan memformat jawaban untuk Anda :)
JayCe

5

Java (OpenJDK 8) , 174 166 165 byte

Dengan 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

import java.util.*;d->{long r=0,s=new Date().getTime(),e=Date.parse(d.replaceAll("(..).(..).","$2/$1/"));for(;s<=e;s+=864e5)r-=-new Date(s).getDay()%6>>-1;return r;}

Cobalah online!

Penjelasan

import java.util.*;                         // Required import for Date 
long r=0,                                   // Initialise result variable
     s=new Date().getTime(),                // Current date in millis
     e=Date.parse(
         d.replaceAll("(..).(..).","$2/$1/")// Use regex to convert to MM/dd/yyyy
     );                                     // Parse date arg using deprecated API
for(;s<=e;                                  // Loop while current millis are less than date arg (e.g. date is before)       
    s+=864e5)                               // Add 86400000 ms to current date (equiv of 1 day)
    r-=-new Date(s).getDay()%6>>-1;        // If day is Sunday (0) or Saturday (6) don't increment, else add 1
return r;                                   // When loop finished return result

1
Jawaban bagus! Penggunaan cerdas varargs dengan d=d[0].splitdan usang .parsedengan format MM/dd/yyyyformat default . Satu kesalahan kecil dalam posting Anda, Anda miliki import java.text.*;alih - alih import java.util.*;dalam kode Anda, dan // Required import for both Calendar and Datedalam penjelasan Anda (meskipun Anda tidak menggunakan Calendar).
Kevin Cruijssen

@KevinCruijssen Tidak tahu kenapa saya harus java.textmemperbaikinya sekarang! Terima kasih!
Luke Stevens

1
Meskipun saya suka d=d[0].splitdengan varargs, mengubah input ke String biasa, menghapus d=d[0].split("\\.");dan mengubah d[1]+"/"+d[0]+"/"+d[2]untuk d.replaceAll("(..).(..).","$2/$1/") menghemat 7 byte .
Kevin Cruijssen

1
Dan 1 byte lagi dengan mengubah r+=new Date(s).getDay()%6<1?0:1,s+=864e5);ke s+=864e5)r+=new Date(s).getDay()%6<1?0:1;. :)
Kevin Cruijssen

1
-1 byte:r-=-new Date(s).getDay()%6>>-1;
Nevay

4

Merah , 72 byte

func[a][b: now/date s: 0 until[if b/weekday < 6[s: s + 1]a < b: b + 1]s]

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

func[a][a: do replace/all a".""-"b: now/date s: 0 until[if b/weekday < 6[s: s + 1]a < b: b + 1]s]

Cobalah online!

Bonus:

Mengembalikan daftar tanggal / hari kerja pada hari kerja hingga tanggal yang diberikan:

Merah , 235 byte

f: func [ a ] [
    b: now/date
    d: system/locale/days
    collect [ 
        until [ 
            if b/weekday < 6 [ 
                keep/only reduce [ b ":" d/(b/weekday) ]
            ]
            a < b: b + 1
        ]
    ]
]

Cobalah online!


Agh, tidak adil, dengan python saya harus mengeluarkan sekitar 72 byte untuk memproses format IO ini ...: P
Quintec

1
Biasanya solusi Merah saya termasuk yang paling lama, tetapi untungnya Merah menangani dengan sangat baik dengan tanggal :)
Galen Ivanov

1
90 byte untuk memproses python ... saya sudah selesai, saya berhenti sampai ada format input yang lebih fleksibel: P
Quintec


3

Python 2 , 163 156 149 147 byte

lambda s:sum((date.today()+timedelta(x)).weekday()<5for x in range((date(*map(int,(s.split(".")[::-1])))-date.today()).days))
from datetime import*

Cobalah 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):-(


2
Tidak ada butuhkan untuk ini: (0,1)[t.weekday()<5]. Python booleans adalah subclass dari intdan True, Falsedapat digunakan dalam operasi aritmatika sebagai 1,0. Ganti dengan c+=t.weekday()<5untuk menyimpan 7 byte.
mypetlion

1
149 byte sebagai lambda.
Ovs

Terima kasih @ mypetlion. Seharusnya aku tidak melewatkan yang itu.
ElPedro

Terima kasih @ovs. Kedua kalinya Anda baru saja membantu. Terakhir kali adalah -30 yang sangat mengesankan. Sedang berusaha mencari cara untuk mendapatkan ini menjadi lambda.
ElPedro

3

Java (JDK 10) , 171 byte

s->{int c=0;for(var t=java.time.LocalDate.now();!t.parse(s.replaceAll("(..).(..).(.*)","$3-$2-$1")).equals(t);t=t.plusDays(1))c-=t.getDayOfWeek().getValue()/6-1;return c;}

Cobalah online!

Kredit


1
Anda dapat mengubah (.*)\\.(.*)\\.(.*)ke (..).(..).(.*).
Kevin Cruijssen

Namun, dengan replaceAllteknik Anda , jawabannya bisa dipagari dengan 7 byte, jadi jawaban Anda masih sedikit lebih lama. ;)
Kevin Cruijssen

@KevinCruijssen Terima kasih atas regex! Dan jangan khawatir: Saya tidak keberatan memiliki jawaban yang lebih panjang;)
Olivier Grégoire

3

JavaScript (Node.js) , 168 160 139 133 byte

35 byte lebih sedikit berkat Quintec dan Kevin Cruijssen

D=>{var i=D.split('.'),n=0;for(var d=new Date();d<=new Date(i[2],i[1]-1,i[0]);d.setDate(d.getDate()+1))n+=-~d.getDay()%7>1;return n;}

Cobalah online!

D=>{
  var i=D.split('.'),                 // Splits the date string by .
      n=0;                            // Counter variable
  for(var d=new Date();               // For the actual date
      d<=new Date(i[2],i[1]-1,i[0]);      // As long as the date is less or equal the requested date
      d.setDate(d.getDate()+1))           // Count the date one up
    n+=-~d.getDay()%7>1;                // If the date is not a Sunday or Saturday
  return n;                           // Return the counter variable
}

1
158 byte dengan lambda
Quintec

1
139 byte dengan peningkatan jika kondisi
Quintec

1
Karena metode Anda tidak rekursif, Anda tidak perlu menambahkan 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 mengubah if((d.getDay()+1)%7>1)n++;untuk n+=-~d.getDay()%7>1;golf untuk 133 byte .
Kevin Cruijssen


1
Beberapa tips lagi untuk referensi di masa mendatang.
Shaggy

3

Python3 & Numpy , 96 byte

Saya tidak bisa lebih kecil dari solusi membosankan yang dibuat sebelumnya ...

from numpy import*
d=datetime64
lambda s:busday_count(d('today'),d(f'{s[6:]}-{s[3:5]}-{s[:2]}'))

Cobalah online!


Harus masuk ke Python 3;)
ElPedro

Berdasarkan impor Anda, Anda tidak menggunakan Python 3 , melainkan Python 3 dengan numpy .
Jonathan Frech

@JonathanFrech haruskah itu dalam judul? yang lain menggunakan python juga telah menggunakan perpustakaan karena python tidak memiliki tipe data bawaan untuk tanggal atau waktu.
Aaron

1
Ini tergantung pada definisi Anda tentang modul builtin seperti datetime adalah modul library standar dan karenanya saya akan menghitungnya sebagai bagian dari bahasa inti. Namun, ketika seseorang menggunakan modul pihak ketiga seperti numpy , seseorang meningkatkan kemampuan bahasa dan karena itu saya akan melihatnya sebagai bahasa lain.
Jonathan Frech

2

PowerShell , 107 99 byte

-8 byte berkat mazzy

$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

Cobalah online!

Melakukan regex -splitpada input $args, masing-masing menyimpan nilai dalam $days, $months, dan $ytelinga. Kemudian, masukkan satu forlingkaran, inisialisasi $ake tanggal hari ini. Loop berlanjut sementara$a adalah -less than target masukan kami. Setiap iterasi kami menambahkan 1da ysuntuk $a, dan memeriksa apakah saat ini D*k(singkatan DayOfWeek) adalah dalam kisaran 1..5(yaitu, Senin sampai Jumat). Hasil Boolean itu diakumulasikan ke dalam $odan begitu kita keluar dari loop nilai itu ditinggalkan di pipeline dan output tersirat.


100 byte? $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
mazzy

1
@ Mazzy Memang. Plus, titik koma di antara for(...){...}dan $odapat dihapus, jadi kita sekarang di bawah 100!
AdmBorkBork

2

Python 2 , 147 143 141 140 byte

from datetime import*
lambda e,s=date.today():sum((s+timedelta(x+1)).weekday()<5for x in range((date(*map(int,e.split(".")[::-1]))-s).days))

Cobalah 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!)


1
Sama-sama! Jawaban yang bagus :)
ElPedro

1
Ini adalah konvensi yang dapat Anda f=hilangkan dari ekspresi lambda di sini
Aaron

1
"Penguraian waktu adalah yang terburuk, kalian" Hahahaha merasakan sakitku, kamu berhasil di mana aku gagal: P
Quintec

@ Harun Saya tidak pernah yakin apakah itu boleh dengan beberapa fungsi atau dengan pernyataan impor, terima kasih!
Triggernometri

1
Anda juga dapat menggunakan rangedaripada xrangeharus tetap bekerja dengan baik.
Aaron

2

PHP, 66 byte

for($t=time();$t<strtotime($argn);)$r+=date(N,$t+=86400)<6;echo$r;

output kosong untuk 0; masukkan di +antara echodan $runtuk memperbaiki.

Jalankan sebagai pipa dengan -nratau coba online .


60 byte dengan output unary:

for($t=time();$t<strtotime($argn);)echo date(N,$t+=86400)<6;

1

PHP (dengan Karbon ), 107 byte

function a($d){return Carbon\Carbon::parse($d)->diffInDaysFiltered(function($e){return!$e->isWeekend();});}

1

IBM / Lotus Notes Formula - 99 byte

d:=i;c:=0;@While(d>@Today;@Set("c";c+@If(@Weekday(d)=1:7;0;1));@Set("d";@Adjust(d;0;0;-1;0;0;0)));c

Mengambil input dari bidang tanggal / waktu i. Format input dari idiatur 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 @Fordan @Whilediperkenalkan 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:

enter image description here



1

K4 , 40 byte

Larutan:

{+/1<.q.mod[d+!(."."/:|"."\:x)-d:.z.d]7}

Penjelasan:

Hitung perbedaan antara tanggal, gunakan modulo 7 untuk mengabaikan akhir pekan, jumlah.

{+/1<.q.mod[d+!(."."/:|"."\:x)-d:.z.d]7} / the solution
     .q.mod[                         ]7  / modulo with 7
                                 .z.d    / UTC date
                               d:        / save as d
                              -          / subtract from
               (             )           / do this together
                       "."\:x            / split input on "."
                      |                  / reverse
                 "."/:                   / join back with "."
                .                        / take the value
              !                          / range 0..the difference
            d+                           / add today's date to range
   1<                                    / is 1 less than the modulo (ie is this mon-fri)?
 +/                                      / sum up

Catatan:

  • alternatif byte yang sama dengan parsing tanggal: "D"$,/|"."\:x

1

C (dentang) , 209 208 205 byte

Bendera kompiler -DU=u=localtime(&b) -DW=tm_wday -DY=tm_year -DT=tm_yday(52 byte).

#import<time.h>
i;f(char*a){long b;struct tm t,*u;time(&b);U;strptime(a,"%d.%m.%Y",&t);for(i=0;u->T^t.T|u->Y^t.Y;u->W&&u->W^6&&i++,b+=86400,U);return i;}

Cobalah online!

-1 byte terima kasih kepada @JonathanFrech


?i++:0-> &&++i.
Jonathan Frech

0

q, 52 79 byte

{x:"D"$"."sv reverse"."vs x;i:0;while[x-.z.d;$[2>x mod 7;x-:1;[i+:1;x-:1]]];:i}

dalam 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


1
Terbaik yang saya buat adalah {sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7}untuk 48 byte tanpa menggunakan kata kerja K.
streetster

Menggunakan indeks daftar jauh lebih elegan daripada terbalik, dan daripada menggunakan loop, menerapkan mod ke daftar. Jawaban bagus +1
Thaufeki
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.