Bantu saya mengatur waktu saya

15

Saya baru-baru ini diberitahu untuk membaca seluruh buku teks fisika pada tahun baru (kisah nyata, sayangnya). Saya membutuhkan bantuan Anda untuk menentukan bab apa yang harus saya baca setiap hari. Ini adalah di mana Anda datang.

Memasukkan

  • Dua tanggal, dalam format apa pun. Tanggal kedua akan selalu lebih lambat dari tanggal pertama.
  • Daftar nomor bab. Daftar yang dipisahkan koma ini dapat berisi bab tunggal ( 12) atau rentang inklusif ( 1-3). Ex. 1-3,5,6,10-13.
  • Daftar hari kerja (diwakili oleh dua huruf pertama dari nama Monday -> Mo:) untuk dikecualikan dari jadwal. Ex. Mo,Tu,Fr.

Keluaran

Keluaran akan berupa daftar tanggal dan nomor bab yang dipisahkan baris baru (lihat format di bawah). Bab-bab harus didistribusikan secara merata sepanjang hari dalam kisaran, tidak termasuk hari kerja yang disediakan. Jika bab-bab tidak mendistribusikan secara merata, miliki hari-hari dengan jumlah bab yang lebih rendah pada akhir periode waktu. Tanggal dalam output dapat dalam format yang berbeda dari input. Hari-hari tanpa bab dapat dihilangkan, atau tidak ada bab dengan itu.

Contoh:

Memasukkan: 9/17/2015 9/27/2015 1-15 Tu

Keluaran:

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
GamrCorps
sumber
Masukan dalam contoh harus `9/17/2015 9/27/2015 1-15 Tu 'karena 9/22 adalah hari Selasa.
DavidC
@ Davidvidar Anda benar, ketika saya membuat input sampel yang saya pikirkan November untuk beberapa alasan.
GamrCorps
7
Jika itu saya, tanggal terakhir akan memiliki semua bab :)
MickyT
@MickyT justru inspirasi saya untuk tantangan ini.
GamrCorps
Anda akan segera menemukan betapa menakjubkannya fisika. Kamu sebenarnya beruntung.
Fabrizio Calderan

Jawaban:

2

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

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++}

Edit - golf 28 byte dengan menggunakan format input eksplisit.

Dijelaskan:

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

Pemakaian

Perkiraan tanggal dalam DateTimeformat .NET . Mengharapkan hari "yang dilewati" berada dalam array (setara PowerShell dari daftar).

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
AdmBorkBork
sumber
3
Ada begitu banyak tanda dolar di sini ... Ini pasti mahal! : D
kirbyfan64sos
@ kirbyfan64sos Hanya 12% dari karakter di sini adalah $... Itu sebenarnya cukup rata-rata untuk golf PowerShell, yang tampaknya sekitar 10% hingga 15% (berdasarkan perhitungan informal saya sendiri atas jawaban yang telah saya posting).
AdmBorkBork
Sekali lagi :-)
Willem
Hmm 308 untuk saya juga ...
Willem
Kerja bagus di 305! 300 sekarang :-)
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`
`}

Pemakaian

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"

Penjelasan

(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`
`
}
pengguna81655
sumber
2

Python 2 - 338 317 308 304 300

Di sini kita pergi untuk mendapatkan bola bergulir ...

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]

Input contoh:

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

Contoh Output:

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.]
Willem
sumber