Giúp tôi quản lý thời gian


15

Gần đây tôi đã được yêu cầu đọc toàn bộ sách giáo khoa vật lý vào năm mới (thật không may). Tôi cần sự giúp đỡ của bạn để xác định những chương tôi nên đọc mỗi ngày. Đây là nơi bạn đến.

Đầu vào

  • Hai ngày, trong bất kỳ định dạng. Ngày thứ hai sẽ luôn muộn hơn ngày đầu tiên.
  • Một danh sách các số chương. Danh sách được phân tách bằng dấu phẩy này có thể chứa các chương đơn ( 12) hoặc phạm vi bao gồm ( 1-3). Ví dụ. 1-3,5,6,10-13.
  • Danh sách các ngày trong tuần (được biểu thị bằng hai chữ cái đầu tiên của tên Monday -> Mo:) để loại trừ khỏi lịch trình. Ví dụ. Mo,Tu,Fr.

Đầu ra

Đầu ra sẽ là một danh sách các ngày và số chương được phân tách bằng dòng mới (xem định dạng bên dưới). Các chương nên được phân bổ đều trong tất cả các ngày trong phạm vi, ngoại trừ các ngày trong tuần được cung cấp. Nếu các chương không phân phối đồng đều, có những ngày có số lượng chương thấp hơn vào cuối khoảng thời gian. Ngày ở đầu ra có thể ở một định dạng khác với đầu vào. Những ngày không có chương có thể bị bỏ qua, hoặc chỉ không có chương nào với nó.

Thí dụ:

Đầu vào: 9/17/2015 9/27/2015 1-15 Tu

Đầu ra:

9/17/2015: 1 2
9/18/2015: 3 4
9/19/2015: 5 6
9/20/2015: 7 8
9/21/2015: 9 10
9/23/2015: 11
9/24/2015: 12
9/25/2015: 13
9/26/2015: 14
9/27/2015: 15

Đầu vào trong ví dụ phải là `9/17/2015 9/27/2015 1-15 Tu 'vì 9/22 là thứ ba.
DavidC

@DavidCarraher bạn đã đúng, khi tôi thực hiện đầu vào mẫu đó tôi đã nghĩ đến tháng 11 vì một số lý do.
GamrCorps

7
Nếu là tôi thì ngày cuối cùng sẽ có tất cả các chương :)
MickyT

@MickyT chính xác là nguồn cảm hứng của tôi cho thử thách này.
GamrCorps

Bạn sẽ sớm khám phá ra bao nhiêu vật lý tuyệt vời. Bạn thật may mắn.
fcalderan

Câu trả lời:


2

PowerShell v4, 367 357 323 313 308 307 305 277 byte

param($a,$b,$c,$d)$e=@();$c=-split('('+($c-replace'-','..'-replace',','),(')+')'|iex|%{$_-join' '});while($a-le$b){if(-join"$($a.DayOfWeek)"[0,1]-notin$d){$e+=$a;$z++}$a=$a.AddDays(1)}$g=,0*$z;$c|%{$g[$c.IndexOf($_)%$z]++};1..$z|%{"$($e[$_-1]): "+$c[$i..($i+=$g[$_-1]-1)];$i++}

Chỉnh sửa - đánh gôn 28 byte bằng cách sử dụng định dạng đầu vào rõ ràng.

Giải thích:

param($a,$b,$c,$d)    # Parameters, takes our four inputs
$e=@()                # This is our array of valid output dates

$c=-split('('+($c-replace'-','..'-replace',','),(')+')'|iex|%{$_-join' '})
# Ridiculously complex way to turn the input chapters into an int array
# The first part changes "1,5-9,12" into a "(1),(5..9),(12)" format that
# PowerShell understands, then executes that with iex, which creates an 
# array of arrays. Then iterate through each inner array and joins them all
# together with spaces, then finally splits on spaces to create a 1D array

while($a-le$b){       # Until we reach the end day
  if(-join"$($a.DayOfWeek)"[0,1]-notin$d){
    # Not an excluded day of the week
    $e+=$a            # Add it to our list of days
    $z++              # Increment our count of total days
  }
  $a=$a.AddDays(1)    # Move to the next day in the range
}

$g=,0*$z              # Populate a new array with zeroes, same length as $e

$c|%{$g[$c.IndexOf($_)%$z]++}
# This populates $g for how many chapters we need each day

1..$z|%{"$($e[$_-1]): "+$c[$i..($i+=$g[$_-1]-1)];$i++}
# Goes through the days in $e, prints them, and slices $c based on $g

Sử dụng

Dự kiến ​​ngày sẽ ở DateTimeđịnh dạng .NET . Dự kiến ​​những ngày "bị bỏ qua" sẽ nằm trong một mảng (tương đương với PowerShell của một danh sách).

PS C:\Tools\Scripts\golfing> .\help-me-manage-my-time.ps1 (Get-Date '9/17/2015') (Get-Date '9/27/2015') '5,1-3,6,10-13,20-27' @('Su','Tu')
09/17/2015 00:00:00: 5 1 2
09/18/2015 00:00:00: 3 6
09/19/2015 00:00:00: 10 11
09/21/2015 00:00:00: 12 13
09/23/2015 00:00:00: 20 21
09/24/2015 00:00:00: 22 23
09/25/2015 00:00:00: 24 25
09/26/2015 00:00:00: 26 27

3
Có rất nhiều ký hiệu đô la ở đây ... Cái này phải đắt! : D
kirbyfan64sos

@ kirbyfan64sos Chỉ có 12% số nhân vật ở đây là $... Đó thực sự là mức trung bình khá đối với các gôn PowerShell, dường như khoảng 10% đến 15% (dựa trên các tính toán không chính thức của tôi về câu trả lời tôi đã đăng).
admBorkBork

Lại một lần nữa :-)
Willem

Hmm 308 cũng là của tôi ...
Willem

Tốt công việc trên 305! 300 ngay bây giờ :-)
Willem

3

JavaScript (ES6), 317 310 291 byte

(a,b,c,d)=>{u=0;c.split`,`.map(m=>{p=m[s]`-`;for(q=n=p[0];n<=(p[1]||q);r=++u)c+=","+n++},c="");c=c.split`,`;x=d.map(p=>"SuMoTuWeThFrSa".search(p)/2);for(g=[];a<b;a.setTime(+a+864e5))x.indexOf(a.getDay())<0&&(t=y=g.push(a+" "));return g.map(w=>w+c.slice(u-r+1,u-(r-=r/y--+.99|0)+1)).join`
`}

Sử dụng

f(new Date("2015-09-17"),new Date("2015-09-27"),"5,1-4,6,10-13,20-27",["Su","Tu"])
=> "Thu Sep 17 2015 10:00:00 GMT+1000 (AUS Eastern Standard Time) 5,1,2
Fri Sep 18 2015 10:00:00 GMT+1000 (AUS Eastern Standard Time) 3,4,6
Sat Sep 19 2015 10:00:00 GMT+1000 (AUS Eastern Standard Time) 10,11
Mon Sep 21 2015 10:00:00 GMT+1000 (AUS Eastern Standard Time) 12,13
Wed Sep 23 2015 10:00:00 GMT+1000 (AUS Eastern Standard Time) 20,21
Thu Sep 24 2015 10:00:00 GMT+1000 (AUS Eastern Standard Time) 22,23
Fri Sep 25 2015 10:00:00 GMT+1000 (AUS Eastern Standard Time) 24,25
Sat Sep 26 2015 10:00:00 GMT+1000 (AUS Eastern Standard Time) 26,27"

Giải trình

(a,b,c,d)=>{

  u=0;                                                 // u = total chapters
  c.split`,`.map(m=>{                                  // c = array of each chapter
    p=m[s]`-`;
    for(q=n=p[0];n<=(p[1]||q);r=++u)                   // get each chapter from ranges
      c+=","+n++
  },c="");
  c=c.split`,`;

  x=d.map(p=>"SuMoTuWeThFrSa".search(p)/2);            // x = days to skip
  for(g=[];a<b;a.setTime(+a+864e5))                    // for each day between a and b
    x.indexOf(a.getDay())<0&&                          // if this day is not skipped
      (t=y=g.push(a+" "));                             // add it to the list of days
                                                       // t = total days
                                                       // y = days remaining

  return g.map(w=>w+
    c.slice(u-r+1,u-(r-=r/y--+.99|0)+1)                // add the chapters of the day
  ).join`
`
}

2

Con trăn 2 - 338 317 308 304 300

Ở đây chúng tôi đi để có được quả bóng lăn ...

def f(a,b,c,d):
 from pandas import*;import numpy as n
 s=str.split;e=n.array([])
 for g in s(c,','):h=s(g,'-');e=n.append(e,range(int(h[0]),int(h[-1])+1))
 k=[t for t in date_range(a,b) if s('Mo Tu We Th Fr Sa Su')[t.weekday()]not in d];j=len(k);e=array_split(e,j)
 for u in range(j):print k[u],e[u]

Ví dụ đầu vào:

f('9/17/2015','9/27/2015','5,1-3,6,10-13,20-27',['Su','Tu'])

Kết quả ví dụ:

2015-09-17 00:00:00 [ 5.  1.  2.]
2015-09-18 00:00:00 [ 3.  6.]
2015-09-19 00:00:00 [ 10.  11.]
2015-09-21 00:00:00 [ 12.  13.]
2015-09-23 00:00:00 [ 20.  21.]
2015-09-24 00:00:00 [ 22.  23.]
2015-09-25 00:00:00 [ 24.  25.]
2015-09-26 00:00:00 [ 26.  27.]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.