ช่วยฉันจัดการเวลาของฉัน


15

ฉันเพิ่งได้รับคำสั่งให้อ่านตำราฟิสิกส์ทั้งหมดในปีใหม่ (เรื่องจริงน่าเสียดาย) ฉันต้องการความช่วยเหลือของคุณเพื่อกำหนดบทที่ฉันควรอ่านในแต่ละวัน นี่คือที่ที่คุณเข้ามา

อินพุต

  • สองวันในรูปแบบใด ๆ วันที่ที่สองจะช้ากว่าวันแรกเสมอ
  • รายการหมายเลขบท รายการที่คั่นด้วยเครื่องหมายจุลภาคนี้สามารถมีบทเดียว ( 12) หรือช่วงรวม ( 1-3) อดีต 1-3,5,6,10-13.
  • รายการวันทำงาน (แสดงด้วยตัวอักษรสองตัวแรกของชื่อMonday -> Mo:) เพื่อแยกออกจากตาราง อดีต Mo,Tu,Fr.

เอาท์พุต

เอาต์พุตจะเป็นรายการวันที่และบรรทัดของบทที่คั่นด้วยการขึ้นบรรทัดใหม่ (ดูรูปแบบด้านล่าง) ควรมีการกระจายบทอย่างสม่ำเสมอตลอดทุกวันในช่วงยกเว้นวันธรรมดาที่มีให้ หากบทที่ไม่กระจายอย่างสม่ำเสมอให้วันที่มีจำนวนบทที่ต่ำกว่าในตอนท้ายของช่วงเวลา วันที่ในเอาต์พุตสามารถอยู่ในรูปแบบที่แตกต่างจากอินพุต วันที่ไม่มีบทสามารถถูก ommited หรือเพียงแค่ไม่มีบทด้วย

ตัวอย่าง:

การป้อนข้อมูล: 9/17/2015 9/27/2015 1-15 Tu

เอาท์พุท:

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

อินพุตในตัวอย่างควรเป็น `9/17/2015 9/27/2015 1-15 Tu 'เพราะ 9/22 เป็นวันอังคาร
DavidC

@DavidCarraher คุณพูดถูกเมื่อฉันป้อนตัวอย่างนั้นฉันคิดถึงพฤศจิกายนด้วยเหตุผลบางอย่าง
GamrCorps

7
ถ้ามันเป็นฉันวันสุดท้ายจะมีทุกบท :)
MickyT

@MickyT เป็นแรงบันดาลใจสำหรับความท้าทายนี้อย่างแม่นยำ
GamrCorps

ในไม่ช้าคุณจะค้นพบว่าฟิสิกส์ที่น่าทึ่งมากแค่ไหน คุณโชคดีจริงๆ
Fabrizio Calderan

คำตอบ:


2

PowerShell v4, 367 357 323 313 308 307 305 277 ไบต์

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

แก้ไข - golfed 28 ไบต์โดยใช้การจัดรูปแบบอินพุตที่ชัดเจน

อธิบาย:

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

การใช้

คาดว่าวันที่จะอยู่ในDateTimeรูปแบบ. NET คาดว่าวันที่ "ข้าม" จะอยู่ในอาร์เรย์ (PowerShell เทียบเท่ารายการ)

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
มีเครื่องหมายดอลลาร์มากมายที่นี่ ... มันจะต้องมีราคาแพง! : D
kirbyfan64sos

@ kirbyfan64sos มีเพียง 12% ของตัวละครที่นี่$... จริง ๆ แล้วค่อนข้างธรรมดาสำหรับ PowerShell golfs ซึ่งดูเหมือนจะอยู่ที่ประมาณ 10% ถึง 15% (ขึ้นอยู่กับการคำนวณคำตอบอย่างไม่เป็นทางการของตัวเองที่ฉันโพสต์)
AdmBorkBork

ไปหาคุณอีกครั้ง :-)
วิลเล็ม

อืม 308 สำหรับเหมืองเช่นกัน ...
วิลเล็ม

ทำได้ดีมากใน 305! 300 ทันที :-)
วิลเล็ม

3

JavaScript (ES6), 317 310 291 ไบต์

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

การใช้

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,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

ที่นี่เราไปรับลูกบอลกลิ้ง ...

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]

อินพุตตัวอย่าง:

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

ตัวอย่างผลลัพธ์:

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.]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.