Aiutami a gestire il mio tempo


15

Recentemente mi è stato detto di leggere un intero libro di testo di fisica dal nuovo anno (storia vera, sfortunatamente). Ho bisogno del tuo aiuto per determinare quali capitoli dovrei leggere ogni giorno. Questo è dove entri.

Ingresso

  • Due date, in qualsiasi formato. La seconda data sarà sempre successiva alla prima.
  • Un elenco di numeri di capitolo. Questo elenco separato da virgole può contenere singoli capitoli ( 12) o intervalli inclusivi ( 1-3). Ex. 1-3,5,6,10-13.
  • Un elenco di giorni feriali (rappresentati dalle prime due lettere del nome Monday -> Mo:) da escludere dal programma. Ex. Mo,Tu,Fr.

Produzione

L'output sarà un elenco separato da righe di date e numeri di capitolo (vedere il formato seguente). I capitoli dovrebbero essere distribuiti uniformemente su tutti i giorni dell'intervallo, esclusi i giorni feriali forniti. Se i capitoli non vengono distribuiti uniformemente, avere i giorni con quantità inferiori di capitoli alla fine del periodo di tempo. Le date nell'output possono essere in un formato diverso rispetto all'input. I giorni senza capitoli possono essere preferiti, o semplicemente non avere capitoli con esso.

Esempio:

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

Produzione:

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

L'input nell'esempio dovrebbe essere `17/09/2015 27/09/2015 1-15 Tu 'perché il 22/09 è un martedì.
DavidC,

@DavidCarraher hai ragione, quando ho fatto l'input di esempio stavo pensando a novembre per qualche motivo.
GamrCorps,

7
Se fossi in me l'ultimo appuntamento avrebbe tutti i capitoli :)
MickyT

@MickyT proprio la mia ispirazione per questa sfida.
GamrCorps,

Scoprirai presto quanta incredibile fisica è. Sei fortunato in realtà.
Fabrizio Calderan,

Risposte:


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

Modifica: golfizzato 28 byte utilizzando la formattazione di input esplicita.

Ha spiegato:

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

uso

Si aspetta che le date siano in DateTimeformato .NET . Si aspetta che i giorni "saltati" si trovino in un array (equivalente di PowerShell di un elenco).

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
Ci sono così tanti segni di dollaro qui ... Questo deve essere costoso! : D
kirbyfan64sos,

@ kirbyfan64sos Solo il 12% dei personaggi qui sono $... In realtà è piuttosto nella media per i golf PowerShell, che sembra essere tra il 10% e il 15% (sulla base dei miei calcoli informali delle risposte che ho pubblicato).
AdmBorkBork,

Di nuovo a te :-)
Willem,

Hmm 308 anche per il mio ...
Willem,

Ottimo lavoro con 305! 300 ora :-)
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`
`}

uso

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"

Spiegazione

(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

Python 2 - 338 317 308 304 300

Qui andiamo a far rotolare la palla ...

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]

Esempio di input:

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

Esempio di 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.]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.