迟到总比不到好!


12

您的程序/功能等将需要2个输入。第一个是谁参加我的聚会以及何时参加的清单。例:

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

这意味着什么?这意味着凯文首先参加了我的聚会(24小时的13:02),然后是5分钟的Ruby,然后是3分钟的Sam,然后是6分钟的Lisa,最后是Bob的12分钟。

第二个输入将是我的聚会开始的时间。例:

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]*),然后是空格,然后是hours:minutes第一行形式的24小时制时间,然后是名称,空格和下一行的正整数(分钟数)。 。总会有至少1行。
  • 如果愿意,可以将输入1与其他任何字符一起使用,而不用换行符。
  • 输入2将采用格式hours:minutes
  • 如果需要,您可以将输入作为一个字符串,以任何字符分隔。这是可选的。
  • 不用担心跨日活动。我的派对从没参加过23:59

输出规则

  • 输出可以是函数返回值,也可以是回显到STDIN的字符串,文件等。您必须返回字符串或数组/列表。
    • 如果返回字符串,则必须是每个迟到的人(顺序无关紧要),并用任何非字母数字分隔符分隔。
    • 如果返回数组/列表,则它必须是所有迟到的所有人的列表。

2
严格的输入格式是否必要?例如,第一个输入是否可以是一个列表列表,每个列表都是包含两个数据项的“行”?
乔纳森·艾伦,

“输入1将始终是名称(regex [A-Z][a-z]*)”这是否表明名称可以为空?
HyperNeutrino

2
我认为您的意思是“是的,必须输入严格的格式”。
乔纳森·艾伦,

2
严格的输入格式使这一挑战变得不那么有趣了
Luis Mendo

3
“我的聚会永远不会在11:59之后。” 你的意思是23:59
tsh

Answers:


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字节

感谢Neil,节省了1个字节

以curry语法获取客人名单l和聚会时间。期望列表上有尾随的换行符。返回以空格分隔的名称列表,例如。h(l)(h)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。的路很远.......::(
Arjun

不行(.*) (.*)\n
尼尔

@Neil默认情况下是贪婪的,第一个(.*)将匹配整行。
Arnauld

那么空间会匹配什么?
尼尔

@尼尔,对不起,你是对的。
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;

从命令行参数获取输入(如果愿意,您可以将其解释为用空格分隔的行);打印不带分隔符的名称。在线运行-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

6

c,178字节

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

在线尝试


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


据我所知,输入格式可能更严格。
乔纳森·艾伦,

我认为现在是正确的。
powelles

是的-我还询问了输入严格性。
乔纳森·艾伦,

...实际上,您输入的是时间,而不是应该输入的偏移量f('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@JonathanAllan谢谢。现在明白了。
Powelles'Apr 14'17

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

在线尝试!

其中大约三分之一是输入解析,因此我不确定我还能打多远。

需要输入$a一个逗号分隔的名称和次/分钟的字符串,并$b作为hh:mm一个字符串。首先,我们-split $a在上将,第一个结果存储在中$x,将其余结果存储在中$a,并显式重铸为$aas array(以便循环以后可以正常使用)。我们的初始化我们的哈希表$z,设置$i$j$x -split对空白,并设置$z[$i]date$j(存储$y以备后用)。

然后我们遍历其余的$a。每次迭代,我们都执行类似的操作- -split在空白字符串上,将适当的$z索引设置为比我们当前所在的位置多出几分钟。这使用缩短的属性名称技巧来保存一些字节,|% *es $j而不是使用.AddMinutes($j)

最后,我们.GetEnumerator()(再次使用的伎俩),我们的哈希表,并Where-Object选择与这些条目value这是-greater t$b(即,他们是迟到了)。然后,我们仅选择.Name其中的。输出为隐式数组,默认情况下Write-Output在其之间插入换行符。

感谢briantist提醒我[array]是一件事,这节省了一大堆。还有更多用于缩短属性名称的提示。


我承认我对此进行了最少的阅读和测试,但是,您不能这样做$x,[array]$a=$a-split','吗?
briantist

1
@briantist是的,谢谢。我一直试图找到一种在多重分配中使用逗号运算符的方法,但是它却无法正常工作。我完全忘记了这[array]是有效的演员表。哈哈。我想打高尔夫球太多了。
AdmBorkBork

我在移动设备上,因此很难测试,但我认为GetEnumerator并且AddMinutes是该%方法语法的很好候选者
briantist '17

@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 '17

1
哦耶。有一个小故障!固定它。谢谢!
Keerthana Prabhakaran

3

击,135个 124 115字节

a=($1)
for i in `seq 3 2 ${#a[@]}`
do((v+=a[i]))
((`date -d${a[1]} +%s`+v*60>`date -d$2 +%s`))&&echo ${a[i-1]}
done

在线尝试!


3

CJam,66 54 58 54 51 49 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(他们的时间)。然后,将其添加到输入的前面。
  • 然后,我们执行一些字符串操作以获取名称列表和时间列表,例如[782 5 3 6 12]
  • 通过累积此列表,我们得到[782 787 790 796 808],它给出了每个人来的时间。
  • 查找谁迟到的最短方法是将开始时间插入数组,然后重新排序以将其放置在应有的位置。然后,我们找到索引以找出其放置位置,然后从该索引中切出名称列表。

2

JavaScript, 285 283字节

以curry语法获取客人名单i和聚会时间。返回以逗号分隔的名称列表,例如。p(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#269267字节


打高尔夫球

(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 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
  • 1.0 - 269 bytes-初始溶液。

笔记

  • 输出格式:输出以空格分隔的名称

您可以通过添加using D=System.DateTime;指令来节省一些字节(不要忘记替换vars!)。您实际上应该为lambda参数提供类型,以使此代码完全明确(​​即(string l,string f))。我还认为存在一个小错误,h>s而不是h>=s按照“(任何人都准时就可以了。”)来代替(节省1个字节!)。你可以h.Ticks<1吗?您可能会发现可以使用nullable的方法DateTime比使用便宜DateTime.Min,但我尚未在此处检查全部含义。使用using子句,==D.Min也应该起作用。
VisualMelon

关于使用,我怀疑我是否仍然可以使用它进行lambda表达式。我敢肯定我不能在中间代码中添加它。显式lambda类型是我从未见过的另一件事,我同意了这一点-如果它是非法的,可以这么说,但是即使mod都没说什么,也许可以吗?h>s我会做那个。h.Ticks<1还有这个
auhmaan

我相信我们可以允许usings使用lambdas之类的东西,但我在meta上找不到任何明确说明这一点的东西,但是这个问题强烈表明它是允许的。有一个合理的共识,那就是需要明确的参数类型(我要补充一点,我坚决赞成)。顺便说一句,从SE的角度来看,Mods可以使事情保持文明,而不是强制执行PPCG自己的规则。
VisualMelon

我有点反对usings,主要是因为我当时觉得这将需要完整的代码,因此我说我怀疑我能否提出一个函数作为解决方案-可能添加两个块,一个用于usings,另一个用于lambda函数?关于共识,我认为添加缺失内容Func<...> f = ...;可以解决问题,尽管应指定全名System.Func<...> f = ...;
auhmaan

string s如果您不希望混合使用lambda和uses,则最好只拥有一个命名函数(仅添加C#7(6?我不记得了)语法)。
VisualMelon

2

CJam43 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

Lua中,211个 206字节

对我来说,今年的第一个高尔夫,应该还是可以打高尔夫球的。

编辑:通过使用速记保存了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不,我还删除了小时变量并将其累积为分钟。
Khaled.K

1
您可以替换Integer.parseInt(n)new Short(n)。根据挑战的注释,LisaBob它也是有效的输出,因此您可以将更println改为print
凯文·克鲁伊森

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转换为分钟。

Batch对此的首选输入将是一系列命令行参数(从聚会的时间开始,然后每个来宾和时间作为单独的参数)。这只会占用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

1

Groovy,121个字节

{g,t->y={Date.parse('hh:mm',it)};u=y(t);d=y(g.remove(0)[1]);g.find{z=it[1];use(groovy.time.TimeCategory){d+z.minutes}>u}}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.