Zamanımı yönetmeme yardım et


15

Geçenlerde yeni yıla kadar tüm fizik ders kitabını okumam söylendi (maalesef gerçek hikaye). Her gün hangi bölümleri okumam gerektiğini belirlemek için yardımınıza ihtiyacım var. Geldiğin yer burası.

Giriş

  • Herhangi bir formatta iki tarih. İkinci tarih her zaman ilkinden daha geç olacaktır.
  • Bölüm numaralarının listesi. Virgülle ayrılmış liste tekli bölümler ( 12) veya kapsayıcı aralıklar ( 1-3) içerebilir . Ör.1-3,5,6,10-13.
  • Monday -> MoProgramdan hariç tutulacak hafta içi bir liste (adın ilk iki harfiyle gösterilir :). Ör. Mo,Tu,Fr.

Çıktı

Çıktı, satırlarla ayrılmış tarih ve bölüm numaralarının bir listesi olacaktır (aşağıdaki biçime bakın). Bölümler, verilen hafta içi günler hariç, aralıktaki tüm günlere eşit olarak dağıtılmalıdır. Bölümler eşit olarak dağıtılmazsa, zaman periyodunun sonunda daha düşük bölümlere sahip günler geçirin. Çıktıdaki tarihler girdiden farklı bir biçimde olabilir. Bölümleri olmayan günler görevlendirilebilir veya sadece bölümleri yoktur.

Misal:

Giriş: 9/17/2015 9/27/2015 1-15 Tu

Çıktı:

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

Örnekteki girdi `` 17/17/2015 9/27/2015 1-15 Tu '' olmalıdır, çünkü 9/22 Salı günüdür.
DavidC

@DavidCarraher haklısın, o örnek girişi yaptığımda Kasım'ın bir nedenden dolayı düşündüğünü.
GamrCorps

7
Eğer o olsaydım son tarih tüm bölümlere sahip olurdu :)
MickyT

@MickyT tam da bu meydan okuma için ilham kaynağım.
GamrCorps

Yakında fiziğin ne kadar şaşırtıcı olduğunu keşfedeceksiniz. Aslında şanslısın.
Fabrizio Calderan

Yanıtlar:


2

PowerShell V4, 367 357 323 313 308 307 305 277 bayt

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

Düzenle - müstehcen giriş biçimlendirmesi kullanarak 28 bayt golf.

Açıklaması:

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

kullanım

Tarihlerin .NET DateTimebiçiminde olmasını bekler . "Atlanan" günlerin bir dizide olmasını bekler (listenin PowerShell eşdeğeri).

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
Burada çok fazla dolar işareti var ... Bu pahalı olmalı! : D
kirbyfan64sos

@ kirbyfan64sos Buradaki karakterlerin sadece% 12'si $... Bu aslında ortalama 10 ila% 15 gibi görünen PowerShell golfleri için oldukça ortalama (kendi cevapladığım kendi gayri resmi cevaplarıma dayanarak).
AdmBorkBork

Tekrar sana :-)
Willem

Benim için de Hmm 308 ...
Willem

305'te iyi iş çıkardın! 300 şimdi :-)
Willem

3

JavaScript (ES6), 317 310 291 bayt

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

kullanım

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"

açıklama

(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

İşte topun yuvarlanmasına gidiyoruz ...

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]

Örnek girdi:

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

Örnek Çıktı:

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.]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.