Muộn còn hơn không!


12

Chương trình / chức năng của bạn, vv sẽ có 2 đầu vào. Đầu tiên sẽ là danh sách những người đã đến bữa tiệc của tôi và khi nào. Thí dụ:

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

Điều đó nghĩa là gì? Điều đó có nghĩa là Kevin đã đến bữa tiệc của tôi trước (lúc 13:02, giờ 24 giờ), sau đó là Ruby 5 phút sau, rồi Sam 3 phút sau, rồi Lisa 6 phút sau, và cuối cùng là Bob 12 phút sau.

Đầu vào thứ hai sẽ là khi bữa tiệc của tôi bắt đầu. Thí dụ:

13:15

(Thời gian 24 giờ). Đầu ra của bạn phải là danh sách những người đến trễ. (Bất cứ ai chính xác về thời gian đều ổn.) Ví dụ tính toán (ví dụ: không xuất ra những thứ này)

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

Lisa và Bob đến sau 13:15 , do đó chương trình này sẽ in "Lisa, Bob".

Giả định đầu vào

  • Đầu vào 1 sẽ luôn là một tên (regex [A-Z][a-z]*), sau đó là khoảng trắng, sau đó là thời gian 24 giờ ở dạnghours:minutes trên dòng đầu tiên, sau đó là tên, khoảng trắng và số nguyên dương (số phút sau) trên các dòng tiếp theo . Sẽ luôn có ít nhất 1 dòng.
  • Nếu bạn muốn, bạn có thể lấy đầu vào 1 với bất kỳ ký tự nào khác thay vì ngắt dòng.
  • Đầu vào 2 sẽ ở định dạng hours:minutes .
  • Bạn có thể lấy đầu vào của mình dưới dạng một chuỗi được phân tách bằng bất kỳ ký tự nào nếu bạn muốn. Đây là tùy chọn.
  • Đừng lo lắng về ngày giao nhau. Các bữa tiệc của tôi không bao giờ đến sau 23:59.

Quy tắc đầu ra

  • Đầu ra có thể là giá trị trả về của hàm hoặc một chuỗi được lặp lại cho STDIN, một tệp, v.v. Bạn phải trả về một chuỗi hoặc một mảng / danh sách.
    • Nếu bạn trả về một chuỗi, thì đó phải là mỗi người trễ (thứ tự không quan trọng), được phân tách bằng bất kỳ dấu phân cách không chữ và số nào.
    • Nếu bạn trả về một mảng / danh sách, nó phải là một danh sách của tất cả những người đến trễ.

2
Là định dạng đầu vào nghiêm ngặt cần thiết? Chẳng hạn, đầu vào đầu tiên có thể là một danh sách các danh sách, mỗi danh sách là một "dòng" chứa hai mục dữ liệu?
Jonathan Allan

"Đầu vào 1 sẽ luôn là một tên (regex [A-Z][a-z]*)" Điều này có gợi ý rằng tên có thể trống không?
HyperNeutrino

2
Tôi giả sử bạn có nghĩa là "có định dạng đầu vào nghiêm ngặt là cần thiết".
Jonathan Allan

2
Định dạng đầu vào nghiêm ngặt làm cho thử thách này bớt thú vị hơn
Luis Mendo

3
"Các bữa tiệc của tôi không bao giờ đến sau 11:59." ý bạn là 23:59sao
tsh

Câu trả lời:


3

MATL , 31 byte

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

Đầu vào đầu tiên sử dụng không gian thay vì ngắt dòng (được cho phép bởi thử thách).

Đầu ra sử dụng ngắt dòng làm dấu phân cách.

Hãy thử trực tuyến!

Giải trình

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 byte

Đã lưu 1 byte nhờ Neil

Đưa danh sách khách mời lvà thời gian tiệc htheo cú pháp cà ri (l)(h). Mong đợi một dấu ngắt dòng trong danh sách. Trả về một danh sách các tên được phân tách bằng dấu cách, chẳng hạn như Lisa Bob.

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

Định dạng và nhận xét

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()

Bản giới thiệu

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'))


Giải pháp thông minh! +1. Của tôi là rất xa ....... :(
Arjun

Không (.*) (.*)\nhoạt động?
Neil

@Neil Theo mặc định, tham lam (.*)sẽ phù hợp với toàn bộ dòng.
Arnauld

Sau đó, không gian sẽ phù hợp với những gì?
Neil

@Neil Oh, xin lỗi, bạn nói đúng.
Arnauld

6

PHP, 118 98 95 91 byte

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

lấy đầu vào từ các đối số dòng lệnh (bạn có thể hiểu đó là các dòng được phân tách bằng dấu cách nếu bạn muốn); in tên mà không có dấu phân cách Chạy với -rhoặc kiểm tra nó trực tuyến .

chỉnh sửa 1: lưu 20 byte với in trực tiếp
chỉnh sửa 2: lưu 3 byte bằng cách xóa dấu phân cách
chỉnh sửa 3: lưu 4 byte bằng cách khai thác rằng các số nguyên đơn giản không có ngày hợp lệ chostrtotime

phá vỡ

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

6

c, 178 byte

main(c,o,d,e,g,O,l,f,x,y)char**o,d[80],*O,*l,*f;{for(sscanf(o[2],"%d:%d",&e,&g),x=e*60+g,l=";",f=o[1];O=strtok(f,l);f=0)(y=sscanf(O,"%s%d:%d",d,&e,&g)^2?e*60+g:y+e)>x?puts(d):0;}

Dùng thử trực tuyến


5

JavaScript ES6, 185 byte

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])

Hãy thử trực tuyến!

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'))


Theo như tôi có thể nói từ thông số kỹ thuật thì hình thức nhập có thể nghiêm ngặt hơn.
Jonathan Allan

Tôi nghĩ rằng nó là chính xác bây giờ.
powelles

Đúng - Tôi cũng đã hỏi về tính nghiêm ngặt đầu vào.
Jonathan Allan

... thực sự bạn có thời gian trong đầu vào của bạn, không phải là sự bù đắpf('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@Jonathan ALLan Cảm ơn. Giờ đã hiểu.
powelles

4

PowerShell , 215 196 180 byte

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

Hãy thử trực tuyến!

Khoảng 1/3 trong số này là phân tích cú pháp đầu vào, vì vậy tôi không chắc mình có thể đánh gôn thêm bao nhiêu nữa.

Lấy đầu vào $adưới dạng một chuỗi tên và thời gian / phút được phân tách bằng dấu phẩy và $bdưới hh:mmdạng một chuỗi. Đầu tiên, chúng tôi -split $abật ,, lưu trữ kết quả đầu tiên vào $xvà còn lại vào $a, với sự tái xuất rõ ràng $alà một array(để vòng lặp sau hoạt động chính xác). Chúng tôi khởi tạo hashtable của chúng tôi $z, thiết lập $i$jđược$x -split trên khoảng trắng, và thiết lập$z[$i]datecủa $j(được lưu trữ vào$y để sử dụng sau).

Sau đó, chúng tôi lặp qua phần còn lại $a. Mỗi lần lặp, chúng tôi thực hiện tương tự - -splitchuỗi trên khoảng trắng, đặt $zchỉ mục thích hợp ở xa hơn nhiều phút so với nơi chúng tôi hiện đang ở. Cái này dùng tên tài sản rút ngắn thủ thuật để lưu một số byte, sử dụng |% *es $jthay vì .AddMinutes($j).

Cuối cùng, chúng tôi .GetEnumerator()(một lần nữa bằng cách sử dụng thủ thuật) của Hashtable của chúng tôi, và Where-Objectchọn những mục với valueđó là -greater than $b(tức là, họ đang muộn để đảng). Chúng tôi sau đó chọn chỉ .Namecủa họ. Đầu ra là một mảng ẩn, mặc định Write-Outputsẽ chèn các dòng mới giữa.

Lưu lại một bó nhờ briantist đã nhắc nhở tôi rằng [mảng] là một thứ. Và một bó nhiều hơn cho đầu tên tài sản rút ngắn.


Tôi thừa nhận tôi đã đọc và kiểm tra tối thiểu về điều này, nhưng, bạn không thể làm gì$x,[array]$a=$a-split',' ?
briantist

1
@briantist Vâng, cảm ơn bạn. Tôi tiếp tục cố gắng tìm cách sử dụng toán tử dấu phẩy trong phép gán nhiều lần và nó không hoạt động. Tôi đã hoàn toàn quên rằng đó [array]là một diễn viên hợp lệ. Haha. Quá nhiều golf, tôi đoán.
admBorkBork

Tôi đang sử dụng điện thoại di động nên rất khó kiểm tra nhưng tôi nghĩ GetEnumeratorAddMinuteslà ứng cử viên tốt cho %cú pháp phương pháp
briantist

@briantist Yep. Tiết kiệm khác 16. Cảm ơn!
admBorkBork

4

Python 2 , 140,148, 144 byte

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,

Hãy thử trực tuyến!

Định dạng đầu vào:

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

Không xử lý chính xác lỗi tràn phút: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'không in gì cả, mặc dù Lisa và Bob vẫn trễ.
L3viathan

1
oh vâng Có một trục trặc! Đã sửa nó. Cảm ơn bạn!
Keerthana Mitchhakaran


3

CJam, 66 54 58 54 51 49 46 byte

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

Đầu vào 1 được đưa ra thông qua STDIN, đầu vào 2 được đưa ra dưới dạng một chuỗi trên ngăn xếp. Đầu ra là một mảng trên ngăn xếp. Dấu phân cách cho đầu vào 1 là khoảng trắng, vdKevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12 .

Dấu vết ngăn xếp:

         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"]

Giải trình:

  • Thủ tục K chuyển đổi giữa một thời gian hh:mmvà một con số biểu thị bao nhiêu phút kể từ nửa đêm.
  • Chúng tôi đọc người đầu tiên và thay thế thời gian của họ bằng K (thời gian của họ). Chúng tôi sau đó thêm phần này vào phía trước của đầu vào.
  • Sau đó, chúng tôi tạo ra một số thao tác chuỗi để có danh sách tên và danh sách thời gian, như [782 5 3 6 12] .
  • Bằng cách tích lũy danh sách này, chúng tôi nhận được [782 787 790 796 808] , đưa ra thời gian mà mọi người đã đến.
  • Cách ngắn nhất để tìm ra người đến trễ là chèn thời gian bắt đầu vào mảng và sau đó sắp xếp lại để đặt nó ở nơi cần đến. Sau đó, chúng tôi tìm thấy chỉ mục để tìm ra vị trí của nó, và sau đó cắt danh sách các tên từ chỉ mục đó.

2

JavaScript, 285 283 byte

Đưa danh sách khách mời ivà thời gian tiệc ptheo cú pháp cà ri (i)(p). Trả về một danh sách các tên được phân tách bằng dấu phẩy, chẳng hạn như 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()}

Tôi biết nó khá dài và hiện đang ở vị trí cuối cùng bởi một biên độ công bằng, nhưng đó là những gì tôi có thể nghĩ ra.

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 byte


Chơi gôn

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

Ung dung

( 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 có thể đọc được

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

Mã đầy đủ

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();
      }
   }
}

Phát hành

  • v1.1 - - 2 bytes- Nhờ VisualMelon
  • v1.0 - 269 bytes- Giải pháp ban đầu.

Ghi chú

  • Định dạng đầu ra : Xuất ra các tên được phân tách bằng dấu cách

Bạn có thể lưu một vài byte bằng cách thêm một lệnh using D=System.DateTime;(đừng quên thay thế vars!). Bạn thực sự nên cung cấp các loại cho các tham số lambda để làm cho mã này hoàn toàn không rõ ràng (nghĩa là (string l,string f)). Tôi cũng nghĩ rằng có một lỗi nhỏ, bạn cần h>sthay vì h>=s(tiết kiệm 1byte!) Theo "(Bất cứ ai chính xác về thời gian đều ổn.)". Bạn có thể làm được h.Ticks<1không Bạn có thể thấy DateTimegiá rẻ hơn so với sử dụng DateTime.Min, nhưng tôi chưa kiểm tra đầy đủ ý nghĩa ở đây. Với mệnh đề sử dụng, ==D.Mincũng nên làm việc.
VisualMelon

Về việc sử dụng tôi nghi ngờ tôi vẫn có thể sử dụng biểu thức lambda với nó. Tôi khá chắc chắn rằng tôi không thể thêm nó vào giữa mã . Các loại lambda rõ ràng là một điều khác mà tôi chưa từng thấy mọi người làm, và tôi đã làm điều đó - nếu đó là bất hợp pháp , hãy nói như vậy, nhưng ngay cả các mod cũng không nói gì, có lẽ nó ổn chứ? h>sTôi sẽ làm điều đó. h.Ticks<1Va cai nay cung vay.
auhmaan

Tôi tự tin rằng chúng tôi cho phép usingsvà như vậy với lambdas, tôi không thể tìm thấy bất cứ điều gì nói điều này rõ ràng trên meta, nhưng câu hỏi này cho thấy nó được cho phép. Có một sự đồng thuận hợp lý rằng các loại tham số rõ ràng nên được yêu cầu (tôi nên thêm rằng tôi chắc chắn ủng hộ). Nhân tiện, Mod có mặt để giữ mọi thứ dân sự theo quan điểm của SE, không thực thi các quy tắc riêng của PPCG.
VisualMelon

Tôi chống lại usings, chủ yếu là vì sau đó tôi sẽ cảm thấy rằng nó sẽ yêu cầu một mã đầy đủ, do đó tôi nói rằng tôi nghi ngờ rằng tôi có thể rút ra một chức năng như một giải pháp - có thể thêm hai khối, một khối usingvà một khối khác cho Chức năng lambda? Về sự đồng thuận, tôi nghĩ rằng việc thêm mất tích Func<...> f = ...;sẽ giải quyết nó, mặc dù nó phải được chỉ định tên đầy đủSystem.Func<...> f = ...;
auhmaan

Bạn có thể tốt hơn nếu chỉ có một hàm được đặt tên tốt (chỉ thêm string sbằng cú pháp C # 7 (6? Tôi không thể nhớ)) nếu bạn không muốn trộn lambdas và cách sử dụng.
VisualMelon

2

CJam , 43 41 byte

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

Hãy thử trực tuyến!

Giải trình

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

Lua, 211 206 byte

Codegolf đầu tiên của năm đối với tôi, vẫn nên chơi golf.

Chỉnh sửa: Đã lưu 5 byte bằng cách sử dụng tốc ký cho 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

Giải thích

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                                 

nếu bạn muốn thử mã này, bạn có thể sử dụng đoạn mã sau

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 byte

  • -9 byte, nhờ @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]));}

Chi tiết trực tiếp

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
Chơi golf đẹp (cho Java.) Bạn có cần không gian giữa String[] n,String[] akhông?
lập trình

@ lập trình5000 không, tôi cũng loại bỏ biến số giờ & tích lũy chúng dưới dạng phút.
Khaled.K

1
Bạn có thể thay thế Integer.parseInt(n)bằng new Short(n). Và dựa trên các ý kiến ​​của thử thách, LisaBobcũng là một đầu ra hợp lệ, vì vậy bạn có thể thay đổi printlnthành print.
Kevin Cruijssen

1

Hàng loạt, 163 byte

@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

Đưa đầu vào vào STDIN. Dòng đầu tiên là thời gian bắt đầu của bữa tiệc, sau đó là danh sách khách mời. Sử dụng thủ thuật của @ Arnauld để chuyển đổi hh: mm thành phút.

Đầu vào ưa thích của Batch cho điều này sẽ là một loạt các tham số dòng lệnh (bắt đầu bằng thời gian của bữa tiệc, sau đó mỗi khách và thời gian là các đối số riêng biệt). Điều này sẽ chỉ mất 129 byte:

@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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.