Helfen Sie mir, meine Zeit zu verwalten

15

Mir wurde kürzlich gesagt, ich solle bis zum neuen Jahr ein ganzes Physiklehrbuch lesen (wahre Geschichte, leider). Ich brauche Ihre Hilfe, um zu bestimmen, welche Kapitel ich jeden Tag lesen sollte. Hier kommst du rein.

Eingang

  • Zwei Daten in jedem Format. Das zweite Datum liegt immer nach dem ersten.
  • Eine Liste der Kapitelnummern. Diese durch Kommas getrennte Liste kann einzelne Kapitel ( 12) oder inklusive Bereiche ( 1-3) enthalten. Ex. 1-3,5,6,10-13.
  • Eine Liste der Wochentage (dargestellt durch die ersten beiden Buchstaben des Namens Monday -> Mo:), die vom Zeitplan ausgeschlossen werden sollen. Ex. Mo,Tu,Fr.

Ausgabe

Die Ausgabe erfolgt in einer durch Zeilenumbrüche getrennten Liste mit Datums- und Kapitelnummern (siehe Format unten). Die Kapitel sollten gleichmäßig über alle Tage im Bereich verteilt sein, ausgenommen die angegebenen Wochentage. Wenn die Kapitel nicht gleichmäßig verteilt sind, lassen Sie die Tage am Ende des Zeitraums weniger Kapitel enthalten. Datumsangaben in der Ausgabe können ein anderes Format als die Eingabe haben. Tage ohne Kapitel können ausgelassen werden oder haben einfach keine Kapitel.

Beispiel:

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

Ausgabe:

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
quelle
Die Eingabe im Beispiel sollte "9/17/2015 9/27/2015 1-15 Tu" sein, da 9/22 ein Dienstag ist.
DavidC
@ DavidCarraher Sie haben Recht, als ich diese Beispieleingabe machte, dachte ich aus irgendeinem Grund an November.
GamrCorps
7
Wenn ich es wäre, hätte das letzte Date alle Kapitel :)
MickyT
@MickyT genau meine Inspiration für diese Herausforderung.
GamrCorps
Sie werden bald feststellen, wie erstaunlich Physik ist. Du hast tatsächlich Glück.
fcalderan

Antworten:

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

Bearbeiten - 28 Bytes mit expliziter Eingabeformatierung.

Erklärt:

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

Verwendung

Erwartet, dass die Daten im .NET- DateTimeFormat vorliegen. Erwartet, dass sich die übersprungenen Tage in einem Array befinden (PowerShell-Entsprechung einer 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
quelle
3
Es gibt so viele Dollarzeichen hier ... Das muss teuer sein! : D
kirbyfan64sos 18.11.15
@ kirbyfan64sos Nur 12% der Charaktere hier sind $... Das ist eigentlich ein ziemlich durchschnittlicher Wert für PowerShell-Golf, der bei 10% bis 15% zu liegen scheint (basierend auf meinen eigenen informellen Berechnungen der von mir geposteten Antworten).
AdmBorkBork
Wieder zu dir :-)
Willem
Hmm 308 auch für mich ...
Willem
Gute Arbeit auf 305! 300 jetzt :-)
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`
`}

Verwendung

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"

Erläuterung

(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
quelle
2

Python 2 - 338 317 308 304 300

Hier geht es los, um den Ball ins Rollen zu bringen ...

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]

Beispiel Eingabe:

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

Beispielausgabe:

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
quelle