Aidez-moi à gérer mon temps

15

On m'a récemment dit de lire tout un manuel de physique d'ici la nouvelle année (histoire vraie, malheureusement). J'ai besoin de votre aide pour déterminer quels chapitres je devrais lire chaque jour. C'est là que vous intervenez.

Contribution

  • Deux dates, dans n'importe quel format. La deuxième date sera toujours postérieure à la première.
  • Une liste de numéros de chapitre. Cette liste séparée par des virgules peut contenir des chapitres uniques ( 12) ou des plages inclusives ( 1-3). Ex. 1-3,5,6,10-13.
  • Une liste des jours de la semaine (représentés par les deux premières lettres du nom Monday -> Mo:) à exclure du planning. Ex. Mo,Tu,Fr.

Production

La sortie sera une liste de dates et de numéros de chapitre séparés par des sauts de ligne (voir le format ci-dessous). Les chapitres doivent être répartis également sur tous les jours de la plage, à l'exception des jours de semaine fournis. Si les chapitres ne se répartissent pas uniformément, ayez les jours avec des quantités inférieures de chapitres à la fin de la période de temps. Les dates en sortie peuvent être dans un format différent de celui en entrée. Les jours sans chapitres peuvent être omis ou tout simplement sans chapitres.

Exemple:

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

Production:

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
la source
L'entrée dans l'exemple doit être «17/09/2015 27/09/2015 1-15 Tu» car le 22/09 est un mardi.
DavidC
@DavidCarraher vous avez raison, quand j'ai fait cet exemple d'entrée, je pensais à novembre pour une raison quelconque.
GamrCorps
7
Si c'était moi, la dernière date aurait tous les chapitres :)
MickyT
@MickyT précisément mon inspiration pour ce défi.
GamrCorps
Vous découvrirez bientôt à quel point la physique est incroyable. Tu as vraiment de la chance.
Fabrizio Calderan

Réponses:

2

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

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

Modifier - golfé 28 octets en utilisant un formatage d'entrée explicite.

Expliqué:

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

Usage

Attend que les dates soient au DateTimeformat .NET . S'attend à ce que les jours "ignorés" soient dans un tableau (équivalent PowerShell d'une liste).

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
la source
3
Il y a tellement de signes dollar ici ... Ça doit être cher! : D
kirbyfan64sos
@ kirbyfan64sos Seuls 12% des personnages ici sont $... C'est en fait assez moyen pour les golfs PowerShell, qui semble être d'environ 10% à 15% (sur la base de mes propres calculs informels des réponses que j'ai publiées).
AdmBorkBork
À vous de nouveau :-)
Willem
Hmm 308 pour le mien aussi ...
Willem
Bon travail sur 305! 300 maintenant :-)
Willem
3

JavaScript (ES6), 317 310 291 octets

(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`
`}

Usage

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"

Explication

(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`
`
}
user81655
la source
2

Python 2 - 338 317 308 304 300

C'est parti pour lancer le bal ...

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]

Exemple d'entrée:

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

Exemple de sortie:

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
la source