มาสายดีกว่าไม่มาเลย!


12

โปรแกรม / ฟังก์ชั่นของคุณ ฯลฯ จะใช้เวลา 2 อินพุต ครั้งแรกจะเป็นรายชื่อของผู้ที่มาปาร์ตี้ของฉันและเมื่อ ตัวอย่าง:

Kevin 13:02  
Ruby 5  
Sam 3  
Lisa 6  
Bob 12  

นั่นหมายความว่าอย่างไร? หมายความว่าเควินไปงานปาร์ตี้ของฉันก่อน (เวลา 13:02 น. 24 ชั่วโมง) จากนั้นทับทิม 5 นาทีต่อมาจากนั้นแซม 3 นาทีต่อมาจากนั้นลิซ่า 6 นาทีต่อมาและอีก 6 นาทีต่อมาบ๊อบ

อินพุตที่สองจะเป็นเมื่อปาร์ตี้ของฉันเริ่มต้น ตัวอย่าง:

13:15

(เวลา 24 ชั่วโมง) ผลลัพธ์ของคุณจะต้องเป็นรายชื่อของคนที่มาสาย (ทุกคนตรงเวลาเป็นเรื่องปกติ) ตัวอย่างการคำนวณ (ตัวอย่างเช่นอย่าส่งออกสิ่งเหล่านี้)

Kevin 13:02
Ruby 13:07
Sam 13:10
Lisa 13:16
Bob 13:28

Lisa และ Bob มาถึงหลังจาก13:15นี้ดังนั้นโปรแกรมนี้ควรพิมพ์ "Lisa, Bob"

สมมติฐานการป้อนข้อมูล

  • อินพุต 1 จะเป็นชื่อ (regex [A-Z][a-z]*) จากนั้นเว้นวรรคจากนั้นเวลา 24 ชั่วโมงในรูปแบบhours:minutesของบรรทัดแรกจากนั้นชื่อชื่อช่องว่างและจำนวนเต็มบวก (จำนวนนาทีต่อมา) ในบรรทัดถัดไป . จะต้องมีอย่างน้อย 1 บรรทัดเสมอ
  • หากคุณต้องการคุณสามารถรับอินพุต 1 ด้วยอักขระอื่นแทนการขึ้นบรรทัดใหม่
  • อินพุต 2 hours:minutesจะอยู่ในรูปแบบ
  • คุณสามารถรับอินพุตเป็นสตริงเดียวโดยคั่นด้วยอักขระใดก็ได้หากคุณต้องการ นี่เป็นทางเลือก
  • ไม่ต้องกังวลกับครอสโอเวอร์วัน 23:59บุคคลที่ฉันไม่เคยที่จะหลังจาก

กฎเอาท์พุท

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

2
รูปแบบอินพุตที่เข้มงวดจำเป็นหรือไม่? ยกตัวอย่างเช่นการป้อนข้อมูลครั้งแรกอาจเป็นรายการรายการแต่ละรายการเป็น "บรรทัด" ที่มีรายการข้อมูลสองรายการ
Jonathan Allan

"อินพุต 1 จะเป็นชื่อเสมอ(regex [A-Z][a-z]*)"นี่แนะนำว่าชื่อว่างหรือไม่
HyperNeutrino

2
ฉันถือว่าคุณหมายถึง "ใช่จำเป็นต้องใช้รูปแบบอินพุตที่เข้มงวด"
Jonathan Allan

2
รูปแบบการป้อนข้อมูลที่เข้มงวดทำให้ความท้าทายนี้น่าสนใจน้อยลง
Luis Mendo

3
"ปาร์ตี้ของฉันไม่เคยทำหลังจาก 11:59 น." คุณหมายถึง23:59อะไร
tsh

คำตอบ:


3

MATL , 31 ไบต์

jYb1L&)1&)XUYs1440/0whwYO+jYO>)

อินพุตแรกใช้พื้นที่แทนการแบ่งบรรทัด (อนุญาตโดยการท้าทาย)

เอาต์พุตใช้ตัวแบ่งบรรทัดเป็นตัวคั่น

ลองออนไลน์!

คำอธิบาย

j       % Input first string
Yb      % Split at spaces. Gives cell array of strings
1L&)    % Separate into subarrays with odd and even indices. Odd are names, even
        % are time and increments in minutes
1&)     % Separate the subarray of even indices into first entry and remaining
        % entries. The first is a string representing the time of first arrival,
        % the rest are strings representing increments in minutes
XU      % Convert strings representing increments into the actual numbers
Ys      % Cumulative sum
1440/   % Divide by 1440 (number of minutes in a day)
0wh     % Prepend a 0
w       % Swap. Bring the string with time of first arrival to the top
YO      % Convert to serial date number. Fractional part indicates time
+       % Add. This gives all arrivals as serial date numbers
j       % Input second string
YO      % Convert to serial date number
>       % Less than?, element-wise
)       % Index: select the names for which the comparison gave true
        % Implicitly display

6

JavaScript (ES6), 98 97 ไบต์

บันทึก 1 ไบต์ขอบคุณ Neil

นำรายชื่อของผู้เข้าพักlและเวลาพรรคในไวยากรณ์h currying (l)(h)คาดว่าจะมี linebreak ต่อท้ายในรายการ Lisa Bobส่งกลับรายการพื้นที่ที่คั่นของชื่อเช่น

l=>h=>l.replace(/(.* )(.*)\n/g,(_,a,b)=>(t-=T(b))<0?a:'',t=(T=h=>eval(h.replace(/:/,'*60+')))(h))

จัดรูปแบบและแสดงความคิดเห็น

l => h =>                         // given a list of guests l and a party time h
  l.replace(                      // for each guest in l:
    /(.* )(.*)\n/g,               //   extract the name a and arrival time b
    (_, a, b) =>                  //   subtract the arrival time from the time counter
      (t -= T(b)) < 0 ?           //   if the result is negative:
        a                         //     the guest is late: keep the name
      :                           //   else:
        '',                       //     the guest is on time: remove this entry
    t = (                         //   initialize the time counter t
      T = h =>                    //   define T():
        eval(                     //     a function that takes either a time
          h.replace(/:/, '*60+')  //     in hh:mm format or an amount of minutes
        )                         //     and returns an amount of minutes   
    )(h)                          //   call it with the party time
  )                               // end of replace()

การสาธิต

let f =

l=>h=>l.replace(/(.* )(.*)\n/g,(_,a,b)=>(t-=T(b))<0?a:'',t=(T=h=>eval(h.replace(/:/,'*60+')))(h))

console.log(f(`Kevin 13:02
Ruby 5
Sam 3
Lisa 6
Bob 12
`)('13:15'))


ทางออกที่ฉลาด! +1 Mineอยู่ไกล ....... :(
Arjun

ใช้งานไม่ได้(.*) (.*)\n?
Neil

@Neil ความโลภเป็นค่าเริ่มต้นคนแรก(.*)จะจับคู่ทั้งบรรทัด
Arnauld

แล้วอวกาศจะตรงกับอะไร?
Neil

@ Neil โอ้ขอโทษคุณพูดถูก
Arnauld

6

PHP, 118 98 95 91 ไบต์

while($n=$argv[++$i])$i&1?$p=$n:($t=($f=strtotime)($n)?:$t+60*$n)<=$f(end($argv))?:print$p;

รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่ง (คุณสามารถ interprete ว่าเป็นบรรทัดที่คั่นด้วยช่องว่างหากคุณต้องการ); พิมพ์ชื่อโดยไม่มีตัวคั่น ทำงานด้วย-rหรือทดสอบออนไลน์

แก้ไข 1: บันทึก 20 ไบต์ด้วยการพิมพ์โดยตรง
แก้ไข 2: บันทึก 3 ไบต์โดยการลบตัว
แก้ไข 3: บันทึก 4 ไบต์โดยใช้ประโยชน์ว่าจำนวนเต็มธรรมดาไม่มีวันที่ที่ถูกต้องสำหรับstrtotime

แตกหัก

while($n=$argv[++$i])       # loop through arguments, skip [0]
    $i&1                        # if index is odd   
    ?   $p=$n                   # then assign name to $p
    :   ($t=                    # else $t =
        ($f=strtotime)($n)          # if $n is a valid time, parse it
        ?:$t+60*$n                  # else add $n minutes to current $t
        )<=$f(end($argv))           # if $t <= parsed party start
        ?                           # then do nothing
        :print$p;                   # else print name


5

JavaScript ES6, 185 ไบต์

l=>t=>l.split`
`.map(p=>p.split` `).map((p,i,a)=>[p[0],i?d(a[0][1])+a.slice(1,i+1).reduce((a,p)=>a+=+p[1],0)*6e4:(d=x=>Date.parse(`2017T${x}`))(p[1])]).filter(p=>p[1]>d(t)).map(p=>p[0])

ลองออนไลน์!

const f = l=>t=>l.split`
`.map(p=>p.split` `).map((p,i,a)=>[p[0],i?d(a[0][1])+a.slice(1,i+1).reduce((a,p)=>a+=+p[1],0)*6e4:(d=x=>Date.parse(`2017T${x}`))(p[1])]).filter(p=>p[1]>d(t)).map(p=>p[0])


console.log(f('Kevin 13:02\nRuby 5\nSam 3\nLisa 6\nBob 12')('13:15'))


เท่าที่ฉันสามารถบอกได้จากสเป็ครูปแบบการป้อนข้อมูลอาจเข้มงวดมากขึ้น
Jonathan Allan

ฉันคิดว่ามันถูกต้องแล้ว
powelles

ใช่ - ฉันได้ถามเกี่ยวกับความเข้มงวดในการป้อนข้อมูลด้วย
Jonathan Allan

... จริงๆแล้วคุณมีเวลาในการป้อนข้อมูลของคุณไม่ใช่ offsets ควรเป็นf('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@JanathanAllan ขอบคุณ รับทันที
powelles

4

PowerShell , 215 196 180 ไบต์

param($a,$b)$x,[array]$a=$a-split',';$z=@{};$i,$j=-split$x;$z[$i]=($y=date $j);0..($a.count-1)|%{$i,$j=-split$a[$_];$z[$i]=($y=$y|% *es $j)};($z|% *or|?{$_.value-gt(date $b)}).Name

ลองออนไลน์!

ประมาณ 1 ใน 3 ของนี่คือการแยกวิเคราะห์อินพุตดังนั้นฉันไม่แน่ใจว่าฉันจะตีกอล์ฟได้ไกลแค่ไหน

รับอินพุต$aเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาคของชื่อและเวลา / นาทีและ$bเป็นhh:mmสตริง อันดับแรกเรา-split $aเปิด,เก็บผลลัพธ์แรกเข้า$xและส่วนที่เหลือเข้า$aด้วยการส่งซ้ำอย่างชัดเจน$aว่าเป็นarray(เพื่อให้ลูปทำงานได้อย่างถูกต้องในภายหลัง) เราเริ่มต้น hashtable ของเรา$zตั้งค่า$iและ$jจะ$x -splitอยู่ในช่องว่างและตั้ง$z[$i]ให้เป็นdateของ$j(เก็บไว้$yเพื่อใช้ในภายหลัง)

$aแล้วเราห่วงผ่านที่เหลือ การวนซ้ำแต่ละครั้งเราทำสิ่งที่คล้ายกัน - -splitสตริงบนช่องว่างตั้งค่า$zดัชนีที่เหมาะสมให้มากขึ้นกว่าที่เราอยู่ นี้ใช้ชื่อคุณสมบัติสั้นลงเคล็ดลับที่จะช่วยลดขนาดบางใช้แทน|% *es $j.AddMinutes($j)

สุดท้ายเรา.GetEnumerator()(อีกครั้งโดยใช้เคล็ดลับ) ของ Hashtable ของเราและWhere-Objectเลือกรายการที่ผู้ที่มีvalueที่-greater tฮัน$b(กล่าวคือพวกเขากำลังปลายไปงานเลี้ยง) จากนั้นเราเลือกเฉพาะ.Nameของมัน เอาท์พุทเป็นอาเรย์โดยปริยายซึ่งค่าเริ่มต้นWrite-Outputแทรกขึ้นบรรทัดใหม่ระหว่าง

บันทึกมัดขอบคุณนักเทศน์ที่เตือนฉันว่า [array] เป็นเรื่อง และอีกมากมายสำหรับเคล็ดลับชื่อคุณสมบัติที่สั้นลง


ฉันยอมรับว่าฉันอ่านและทดสอบสิ่งนี้น้อยที่สุด แต่คุณทำ$x,[array]$a=$a-split','ไม่ได้เหรอ?
ต้มตุ๋น

1
@ briantist ใช่ขอบคุณ ฉันพยายามหาวิธีใช้ตัวดำเนินการเครื่องหมายจุลภาคในการมอบหมายหลายครั้งและมันก็ไม่ทำงาน ฉันลืมไปเลยว่า[array]เป็นนักแสดงที่ถูกต้อง ฮ่าฮ่า การเล่นกอล์ฟมากเกินไปฉันเดา
AdmBorkBork

ฉันบนมือถือเพื่อออกจะเป็นเรื่องยากในการทดสอบ แต่ฉันคิดว่าGetEnumeratorและAddMinutesมีผู้สมัครที่ดีสำหรับ%วิธีไวยากรณ์
briantist

@ briantist ใช่ ประหยัดอีก 16 ขอขอบคุณ!
AdmBorkBork

4

Python 2 , 140,148, 144 ไบต์

t,h,n=map(str.split,input().replace(':','').split(';')),100,0
for a,v in t[:-1]:
 n+=int(v)
 if n%h/60:n=n/h*h+n%h%60+h
 if`n`>t[-1][0]:print a,

ลองออนไลน์!

รูปแบบอินพุต:

'Kevin 13:02;Ruby 5;Sam 3;Lisa 6;Bob 12;13:15'

จัดการอย่างถูกต้องไม่เกินนาที: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'พิมพ์อะไรเลยแม้ว่า Lisa และ Bob ยังคงมาสาย
L3viathan

1
ใช่เลย. มีความผิดพลาด! ซ่อมมัน. ขอบคุณ!
กีรนาปราการะรัน


3

CJam, 66 54 58 54 51 49 46 46 ไบต์

{{':/60b}:K~)rSrKs++q+S/2/z~:i[{1$+}*]2$+$@#>}

อินพุต 1 ถูกกำหนดผ่าน STDIN อินพุต 2 ถูกกำหนดเป็นสตริงบนสแต็ก เอาต์พุตเป็นอาร์เรย์บนสแต็ก สำหรับการป้อนข้อมูลแยก 1 Kevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12เป็นพื้นที่เช่น

การติดตามสแต็ก:

         e# Stack:               | "13:15"
{        e# Define K and run it:
  ':/    e#   Split on colon:    | ["13" "15"]
  60b    e#   From base 60:      | 795
}:K~     e# End def
)        e# Increment:           | 796
r        e# Read token:          | 796 "Kevin"
S        e# Push space:          | 796 "Kevin" " "
r        e# Read another token:  | 796 "Kevin" " " "13:02"
K        e# K()                  | 796 "Kevin" " " 782
s        e# Convert to string:   | 796 "Kevin" " " "782"
++       e# Add together:        | 796 "Kevin 782"
q        e# Read rest of input:  | 796 "Kevin 782" " Ruby 5 Sam 3 Lisa 6 Bob 12"
+        e# Add together:        | 796 "Kevin 782 Ruby 5 Sam 3 Lisa 6 Bob 12"
S/       e# Split on spaces:     | 796 ["Kevin" "782" "Ruby" "5" "Sam" "3" "Lisa" "6" "Bob" "12"]
2/       e# Group by 2:          | 796 [["Kevin" "782"] ["Ruby" "5"] ["Sam" "3"] ["Lisa" "6"] ["Bob" "12"]]
z        e# Transpose:           | 796 [["Kevin" "Ruby" "Sam" "Lisa" "Bob"] ["782" "5" "3" "6" "12"]]
~        e# Unpack:              | 796 ["Kevin" "Ruby" "Sam" "Lisa" "Bob"] ["782" "5" "3" "6" "12"]
:i       e# Convert all to int:  | 796 ["Kevin" "Ruby" "Sam" "Lisa" "Bob"] [782 5 3 6 12]
[{1$+}*] e# Accumulate:          | 796 ["Kevin" "Ruby" "Sam" "Lisa" "Bob"] [782 787 790 796 808]
2$       e# Copy back element:   | 796 ["Kevin" "Ruby" "Sam" "Lisa" "Bob"] [782 787 790 796 808] 796
+        e# Add into array:      | 796 ["Kevin" "Ruby" "Sam" "Lisa" "Bob"] [782 787 790 796 808 796]
$        e# Sort:                | 796 ["Kevin" "Ruby" "Sam" "Lisa" "Bob"] [782 787 790 796 796 808]
#        e# Find index:          | ["Kevin" "Ruby" "Sam" "Lisa" "Bob"] 3
>        e# Slice:               | ["Lisa" "Bob"]

คำอธิบาย:

  • ขั้นตอนการKแปลงระหว่างเวลาhh:mmและตัวเลขแสดงกี่นาทีนั่นคือตั้งแต่เที่ยงคืน
  • เราอ่านคนแรกและแทนที่เวลาด้วย K (เวลาของพวกเขา) จากนั้นเราจะเพิ่มสิ่งนี้ไว้ที่ด้านหน้าของอินพุต
  • จากนั้นเราจะ preform [782 5 3 6 12]การดำเนินงานสตริงที่จะได้รับรายชื่อและรายการเวลาเช่น
  • ด้วยการสะสมรายการนี้เราจะได้รับ[782 787 790 796 808]ซึ่งจะให้เวลาที่ทุกคนเข้ามา
  • วิธีที่สั้นที่สุดในการค้นหาผู้ที่มาสายคือการแทรกเวลาเริ่มต้นในอาเรย์แล้วเรียงลำดับใหม่เพื่อวางในตำแหน่งที่ควรจะเป็น จากนั้นเราจะหาดัชนีเพื่อหาว่ามันอยู่ตรงไหนจากนั้นแบ่งรายชื่อจากดัชนีนั้น

2

JavaScript, 285 283 ไบต์

นำรายชื่อของผู้เข้าพักiและเวลาพรรคในไวยากรณ์p currying ส่งกลับรายการคั่นด้วยเครื่องหมายจุลภาคของชื่อเช่น(i)(p)Lisa,Bob

i=>p=>{n=i.split`
`,a=new Date(0,0,0,...n[0].split` `[1].split`:`),y=new Date(0,0,0,...p.split`:`),t=[a];w=a;n.slice(1).map((j,k,l)=>{h=l[k].split` `[1]*6e4;t.push(new Date(w.getTime()+h));w=new Date(w.getTime()+h)});return n.filter((j,k,l)=>t[k]>y).map(j=>j.split` `[0]).join()}

ฉันรู้ว่ามันค่อนข้างยาวและในที่สุดก็ถึงจุดจบที่ยุติธรรม แต่นั่นคือสิ่งที่ฉันสามารถทำได้

f=i=>p=>{n=i.split`
`,a=new Date(0,0,0,...n[0].split` `[1].split`:`),y=new Date(0,0,0,...p.split`:`),t=[a];w=a;n.slice(1).map((j,k,l)=>{h=l[k].split` `[1]*6e4;t.push(new Date(w.getTime()+h));w=new Date(w.getTime()+h)});return n.filter((j,k,l)=>t[k]>y).map(j=>j.split` `[0]).join()}

console.log(f(`Kevin 13:02
Ruby 5
Sam 3
Lisa 6
Bob 12
`)('13:15'))


2

C # , 269 267 ไบต์


แข็งแรงเล่นกอล์ฟ

(l,t)=>{var h=System.DateTime.MinValue;var s=System.DateTime.ParseExact(t,"HH:mm",null);var o="";foreach(var p in l.Split('\n')){var i=p.Split(' ');h=h.Ticks<1?System.DateTime.ParseExact(i[1],"HH:mm",null):h.AddMinutes(int.Parse(i[1]));if(h>s)o+=i[0]+" ";}return o;};

Ungolfed

( l, t ) => {
   var h = System.DateTime.MinValue;
   var s = System.DateTime.ParseExact( t, "HH:mm", null );
   var o = "";

   foreach( var p in l.Split( '\n' ) ) {
      var i = p.Split( ' ' );

      h = h.Ticks < 1
         ? System.DateTime.ParseExact( i[ 1 ], "HH:mm", null )
         : h.AddMinutes( int.Parse( i[ 1 ] ) );

      if( h > s )
         o += i[ 0 ] + " ";
   }

   return o;
};

อ่านได้ไม่ดี

( l, t ) => {
   // var to check the time of arrival
   var h = System.DateTime.MinValue;

   // var to store the start time of the party
   var s = System.DateTime.ParseExact( t, "HH:mm", null );

   // var with the names of those who arrived late
   var o = "";

   // Cycle through which line
   foreach( var p in l.Split( '\n' ) ) {
      // Split the name and time
      var i = p.Split( ' ' );

      // Check if the time of arrival still has the initial value
      h = h.Ticks < 1

         // If so, grab the time of the first person
         //   Expects to have a time format of 'hh:mm'
         ? System.DateTime.ParseExact( i[ 1 ], "HH:mm", null )

         // Otherwise, add the difference to the var
         : h.AddMinutes( int.Parse( i[ 1 ] ) );

      // Check if the current time is later than the party start time
      if( h > s )

         // If so, add the name to the list
         o += i[ 0 ] + " ";
   }

   // Return the names of the persons who arrived late
   return o;
};

รหัสเต็ม

using System;
using System.Collections.Generic;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
         Func<String, String, String> f = ( l, t ) => {
            var h = System.DateTime.MinValue;
            var s = System.DateTime.ParseExact( t, "HH:mm", null );
            var o = "";

            foreach( var p in l.Split( '\n' ) ) {
               var i = p.Split( ' ' );

               h = h.Ticks < 1
                  ? System.DateTime.ParseExact( i[ 1 ], "HH:mm", null )
                  : h.AddMinutes( int.Parse( i[ 1 ] ) );

               if( h > s )
                  o += i[ 0 ] + " ";
            }

            return o;
         };

         List<KeyValuePair<String, String>>
            testCases = new List<KeyValuePair<String, String>> {
               new KeyValuePair<String, String>(
                  "Kevin 13:02\nRuby 5\nSam 3\nLisa 6\nBob 12",
                  "13:15"
               ),
               new KeyValuePair<String, String>(
                  "Kevin 13:15\nRuby 5\nSam 3\nLisa 6\nBob 12",
                  "13:15"
               ),
            };

         foreach( KeyValuePair<String, String> testCase in testCases ) {
            Console.WriteLine( $" Input:\n{testCase.Key}\n\n{testCase.Value}\n\nOutput:\n{f( testCase.Key, testCase.Value )}\n" );
         }

         Console.ReadLine();
      }
   }
}

ข่าว

  • v1.1 -- 2 bytes - ด้วยVisualMelon
  • v1.0 -269 bytes - โซลูชั่นเริ่มต้น

หมายเหตุ

  • รูปแบบผลลัพธ์:แสดงชื่อที่คั่นด้วยช่องว่าง

คุณสามารถบันทึกไม่กี่ไบต์โดยเพิ่มusing D=System.DateTime;คำสั่ง (อย่าลืมแทนที่vars!) คุณควรระบุประเภทสำหรับพารามิเตอร์แลมบ์ดาเพื่อทำให้โค้ดนี้ไม่โปร่งใสอย่างสมบูรณ์ (เช่น(string l,string f)) ฉันยังคิดว่ามีข้อผิดพลาดเล็กน้อยคุณต้องการh>sมากกว่าh>=s(ประหยัด 1 ไบต์!) ตาม "(ทุกคนตรงเวลาเป็นเรื่องปกติ") คุณสามารถทำh.Ticks<1อะไร คุณอาจพบว่ามีค่าDateTimeถูกกว่าการใช้DateTime.Minงาน แต่ฉันไม่ได้ตรวจสอบความหมายเต็มรูปแบบที่นี่ ด้วยข้อใช้==D.Minควรทำงานด้วย
VisualMelon

เกี่ยวกับการใช้ฉันสงสัยว่าฉันยังสามารถดึงแสดงออกแลมบ์ดากับมัน ผมค่อนข้างมั่นใจว่าฉันไม่สามารถเพิ่มได้ในช่วงกลางรหัส แลมบ์ดาชนิดที่ชัดเจนเป็นอีกสิ่งหนึ่งที่ฉันไม่ได้เห็นคนทำและฉันก็ไปกับมัน - ถ้ามันผิดกฎหมายก็พูดเช่นนั้น แต่แม้แต่ mods ยังไม่ได้พูดอะไรเลย h>sฉันจะทำอย่างนั้น h.Ticks<1และอันนี้ด้วย
auhmaan

ฉันมั่นใจว่าเราอนุญาตusingsและด้วย lambdas ฉันไม่สามารถหาคำพูดที่ชัดเจนเกี่ยวกับ meta นี้ได้แต่คำถามนี้แสดงให้เห็นอย่างชัดเจนว่าได้รับอนุญาต มีฉันทามติที่สมเหตุสมผลว่าควรกำหนดประเภทพารามิเตอร์ที่ชัดเจน (ฉันควรเพิ่มว่าฉันชอบมาก) โดย Mods อยู่ที่นั่นเพื่อป้องกันสิ่งต่าง ๆ จากมุมมองของ SE ไม่ใช่เพื่อบังคับใช้กฎของ PPCG
VisualMelon

ฉันค่อนข้างจะต่อต้านusingsเพราะส่วนใหญ่แล้วฉันจะรู้สึกว่ามันต้องใช้รหัสเต็มดังนั้นฉันบอกว่าฉันสงสัยว่าฉันสามารถดึงฟังก์ชั่นออกเป็นวิธีแก้ปัญหา - อาจเพิ่มสองช่วงตึกหนึ่งสำหรับusingอีกและสำหรับ ฟังก์ชั่นแลมบ์ดา? เกี่ยวกับฉันทามติฉันคิดว่าการเพิ่มสิ่งที่ขาดหายไปFunc<...> f = ...;จะแก้ไขได้แม้ว่ามันควรจะระบุชื่อเต็มSystem.Func<...> f = ...;
auhmaan

คุณอาจจะดีกว่าแค่มีฟังก์ชั่นที่มีชื่อดี (เพิ่มเฉพาะstring sกับ C # 7 (6? ฉันจำไม่ได้) ไวยากรณ์) ถ้าคุณไม่อยากผสมผสาน lambdas และการใช้
VisualMelon

2

CJam , 43 41 ไบต์

q~':/60b:Y;Sf/()':/60b+a\+{)iT+:TY>{;}|}%

ลองออนไลน์!

คำอธิบาย

q~        e# Read and eval all input.

':/       e# Split the start time on colons.
60b       e# Convert the result from base 60, to get the start time in minutes.
:Y;       e# Store this time in variable Y, and discard it from the stack.

Sf/       e# Split each string in the guest list on spaces.
(         e# Pull out the first guest from the list.
)         e# Pull out the time from the guest.
':/60b+   e# Convert the time to a number of minutes (same way as before), then add it back
          e#   to the guest.
a\+       e# Add the guest back to the start of the guest list.

          e# At this point, the first guest has his/her arrival time in minutes, and everyone
          e#  else still has their original number.

{         e# Apply this block to each guest:
 )i       e#  Pull out the number and cast it to an integer.
 T+       e#  Add the value of variable T to it (T is initially 0).
 :T       e#  Store the result back into T.
 Y>{;}|   e#  If the resulting number of minutes is not after the start time, delete the 
          e#    guest's name.
}%        e# (end of block)

          e# Implicit output.

2

ลัวะ 211 206 ไบต์

Codegolf ครั้งแรกของปีสำหรับฉันยังคงสามารถเล่นกอล์ฟได้

แก้ไข: บันทึก 5 ไบต์โดยใช้ชวเลข string.match

function f(l,T)m=T.match
r=function(X)return
m(X,"^%d+")*3600+60*m(X,"%d+$")end
T=r(T)z={}y=0
for i=1,#l do
h=m(l[i],"%d.*")h=i>1 and y+h*60or r(h)y=h
z[#z+1]=h>T and m(l[i],"%u%l*")or nil
end return z end

คำอธิบาย

function f(l,T)                         -- declare the function f(list,partyTime)
  r=function(X)                         -- declare a function r that convert hh:mm in seconds
    return X:match("^%d+")*3600         -- return the sum of seconds the hours
          +60*X:match("%d+$")           -- and in the seconds
  end                                   
  T=r(T)                                -- convert the partyTime in seconds
  z={}                                  -- create the shameList for late partygoers
  y=0                                   -- y will keep us updated on the second count
  for i=1,#l                            -- iterate over l
  do                                    
    h=l[i]:match("%d.*")                -- h is a shorthand for the time of arrival
    h=i>1                               -- if we're on the second line at least
        and y+h*60                      -- update h with the time of arrival in second
      or r(h)                           -- else use r()(for the first partygoer only)
    y=h                                 -- update our reference for adding time
    z[#z+1]=h>T                         -- if the last partygoer was late
                and l[i]:match("%u%l*") -- add its name to the shameList
              or nil                    -- else, don't do anything
  end                                   
  return z                              -- return the shameList
end                                 

หากคุณต้องการลองใช้รหัสนี้คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้

function f(l,T)r=function(X)return
X:match("^%d+")*3600+60*X:match("%d+$")end
T=r(T)z={}y=0
for i=1,#l do
h=l[i]:match("%d.*")h=i>1 and y+h*60or r(h)y=h
z[#z+1]=h>T and l[i]:match("%u%l*")or nil
end return z end

retour = f({"Kevin 13:02","Ruby 5","Sam 3","Lisa 6","Bob 12"},"13:15")
for i=1,#retour
do
  print(retour[i])
end

2

Java, 346 304 284 275 ไบต์

  • -9 ไบต์ขอบคุณ @KevinCruijssen
void g(int m,String[]n,String[]a,int M){for(int i=0;i<n.length;i++)if((M+=i>0?p(a[i]):0)>m)System.out.print(n[i]);}
int p(String n){return new Short(n);}
int h(String t){return p(t.split(":")[0])*60+p(t.split(":")[1]);}
void f(String[]n,String[]a,String b){g(h(b),n,a,h(a[0]));}

รายละเอียด สด

public static void g(int m, String[] n, String[] a, int M)
{
    for(int i = 0; i < n.length; i++)
    {
        if((M += i>0 ? p(a[i]) : 0) > m)
        {
            System.out.println(n[i]);
        }
    } 
}

public static int p(String n)
{
    return Integer.parseInt(n);
}

public static int h(String t)
{
    return p(t.split(":")[0])*60+p(t.split(":")[1]);
}

public static void f(String[] n, String[] a, String b)
{
    g(h(b),n,a,h(a[0]));
}

1
การตีกอล์ฟที่ดี (สำหรับ Java) คุณต้องการพื้นที่ว่างระหว่างString[] n,และString[] a?
programmer5000

@ programmer5000 ไม่ฉันยังลบตัวแปรชั่วโมงและสะสมเป็นนาที
Khaled.K

1
คุณสามารถแทนที่ด้วยInteger.parseInt(n) new Short(n)และขึ้นอยู่กับความเห็นของความท้าทายที่LisaBobยังเป็นผลผลิตที่ถูกต้องเพื่อให้คุณสามารถเปลี่ยนไปprintln print
Kevin Cruijssen

1

แบตช์ 163 ไบต์

@set/pp=
@set/ap=%p::=*60+%
:l
@set g=
@set/pg=
@if "%g%"=="" exit/b
@set t=%g:* =%
@set/ap-=%t::=*60+%
@for %%g in (%g%)do @(if %p% lss 0 echo %%g)&goto l

ใช้อินพุตบน STDIN บรรทัดแรกคือเวลาเริ่มต้นของปาร์ตี้แล้วตามด้วยรายชื่อแขก ใช้เคล็ดลับ @ Arnauld เพื่อแปลง hh: mm เป็นนาที

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

@set p=%1
@set/ap=%p::=*60+%
:l
@set t=%3
@set/ap-=%t::=*60+%
@if %p% lss 0 echo %2
@shift
@shift
@if not "%2"=="" goto l


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