Antes tarde do que nunca!

12

O seu programa / função, etc. terá 2 entradas. O primeiro será uma lista de quem veio à minha festa e quando. Exemplo:

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

O que isso significa? Isso significa que Kevin chegou à minha festa primeiro (às 13:02, horário de 24 horas), depois Ruby 5 minutos depois, Sam 3 minutos depois, Lisa 6 minutos depois e Bob 12 minutos depois.

A segunda entrada será quando minha festa começar. Exemplo:

13:15

(24 horas). Sua saída deve ser a lista de pessoas que estavam atrasadas. (Qualquer pessoa exatamente dentro do prazo é boa.) Exemplos de cálculos (apenas por exemplo, não os produzem)

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

Lisa e Bob chegaram depois 13:15, portanto este programa deve imprimir "Lisa, Bob".

Pressupostos de entrada

  • A entrada 1 sempre será um nome (regex [A-Z][a-z]*), depois um espaço, depois um horário de 24 horas no formulário hours:minutesna primeira linha, depois um nome, um espaço e um número inteiro positivo (número de minutos depois) nas próximas linhas . Sempre haverá pelo menos 1 linha.
  • Se desejar, você pode inserir a entrada 1 com qualquer outro caractere, em vez de uma quebra de linha.
  • A entrada 2 estará no formato hours:minutes.
  • Você pode considerar suas entradas como uma sequência separada por qualquer caractere, se desejar. Isso é opcional.
  • Não se preocupe com a passagem do dia. Minhas festas nunca para depois 23:59.

Regras de saída

  • A saída pode ser um valor de retorno de função ou uma sequência ecoada em STDIN, um arquivo etc. Você deve retornar uma sequência ou uma matriz / lista.
    • Se você retornar uma sequência, deve ser cada pessoa que se atrasou (o pedido não importa), separada por qualquer delimitador não alfanumérico.
    • Se você retornar uma matriz / lista, deve ser uma lista de todos os que estavam atrasados.
programmer5000
fonte
2
O formato de entrada estrito é necessário? Por exemplo, a primeira entrada poderia ser uma lista de listas, cada uma sendo uma "linha" contendo os dois itens de dados?
Jonathan Allan
"A entrada 1 sempre será um nome (regex [A-Z][a-z]*)" Isso sugere que os nomes podem estar vazios?
precisa saber é o seguinte
2
Suponho que você quis dizer "sim, o formato de entrada estrito é necessário".
Jonathan Allan
2
Formato de entrada estrita torna este desafio menos interessante
Luis Mendo
3
"Minhas festas nunca acontecem depois das 11h59." você quer dizer 23:59?
TSH

Respostas:

3

MATL , 31 bytes

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

A primeira entrada usa espaço em vez de quebra de linha (permitida pelo desafio).

A saída usa quebra de linha como separador.

Experimente online!

Explicação

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
Luis Mendo
fonte
6

JavaScript (ES6), 98 97 bytes

Guardado 1 byte graças a Neil

Leva a lista de convidados le o tempo da festa hpara currying sintaxe (l)(h). Espera uma quebra de linha à direita na lista. Retorna uma lista de nomes separados por espaço, como Lisa Bob.

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

Formatado e comentado

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

Demo

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

Arnauld
fonte
Solução inteligente! +1. Mina é maneira distante ....... :(
Arjun
Não (.*) (.*)\nfunciona?
Neil
@ Neil Por ser ganancioso por padrão, o primeiro (.*)corresponderia a toda a linha.
Arnauld
Então, qual seria o espaço correspondente?
Neil
@ Neil Oh, desculpe, você está certo.
Arnauld
6

PHP, 118 98 95 91 bytes

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

recebe entrada dos argumentos da linha de comando (você pode interpretar isso como linhas separadas por espaços, se desejar); imprime nomes sem um delimitador. Execute -rou teste on-line .

editar 1: economizou 20 bytes com impressão direta
editar 2: economizou 3 bytes removendo o delimitador
editar 3: economizou 4 bytes explorando que números inteiros simples não são datas válidas parastrtotime

demolir

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
Titus
fonte
6

c, 178 bytes

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

Experimente online

Johan du Toit
fonte
5

JavaScript ES6, 185 bytes

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

Experimente online!

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
fonte
Tanto quanto eu posso dizer pelas especificações, o formulário de entrada pode ser mais rigoroso.
Jonathan Allan
Eu acho que está correto agora.
powelles
Sim - eu também perguntei sobre o rigor da entrada.
Jonathan Allan
... na verdade você tem as vezes em sua entrada, não as compensações que deveria serf('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan
1
@JonathanAllan Thanks. Tenho agora.
powelles
4

PowerShell , 215 196 180 bytes

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

Experimente online!

Aproximadamente 1/3 disso é análise de entrada, portanto, não tenho certeza quanto mais posso jogar.

Toma de entrada $acomo uma cadeia delimitada por vírgulas de nomes e horários / minutos, e $bcomo hh:mmcomo uma string. Primeiro, -split $aem ,, armazenar o primeiro resultado em $xeo restante em $a, com uma re-conversão explícita de $acomo um array(para que o loop mais tarde funciona corretamente). Nós a inicializar o nosso hashtable $z, set $ie $jestar $x -splitno espaço em branco, e definir $z[$i]a ser o datede $j(armazenado em $ypara uso posterior).

Depois, percorremos o restante $a. A cada iteração, fazemos a mesma coisa - -splita string no espaço em branco, define o $zíndice apropriado para ser muito mais minutos além do local em que estamos atualmente. Isso usa um truque de nome de propriedade reduzido para salvar alguns bytes, usando em |% *es $jvez de .AddMinutes($j).

Finalmente, nós .GetEnumerator()(novamente usando o truque) de nossa hashtable e Where-Objectselecionamos essas entradas com um valueque é -greater than $b(ou seja, eles estão atrasados ​​para a festa). Em seguida, selecionamos apenas os .Names. A saída é como uma matriz implícita, na qual o padrão Write-Outputinsere novas linhas.

Economizei muito graças ao briantist por me lembrar que [array] é uma coisa. E muito mais por dica de nome de propriedade encurtado.

AdmBorkBork
fonte
Admito que fiz um mínimo de leitura e teste disso, mas você não poderia simplesmente fazer$x,[array]$a=$a-split',' ?
precisa saber é o seguinte
1
@ briantist Sim, obrigado. Continuei tentando encontrar uma maneira de usar o operador de vírgula na atribuição múltipla, e simplesmente não estava funcionando. Eu tinha esquecido completamente que [array]é um elenco válido. Haha Muito golfe, eu acho.
AdmBorkBork
Estou no celular tão fora seria difícil teste, mas eu acho que GetEnumeratore AddMinutessão bons candidatos para a %sintaxe do método
briantist
@briantist Sim. Economiza mais 16. Obrigado!
AdmBorkBork
4

Python 2 , 140.148, 144 bytes

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,

Experimente online!

Formato de entrada:

'Kevin 13:02;Ruby 5;Sam 3;Lisa 6;Bob 12;13:15'
Keerthana Prabhakaran
fonte
Não lida corretamente com excesso de minutos: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'não imprime nada, mesmo que Lisa e Bob ainda estejam atrasados.
precisa saber é o seguinte
1
Oh sim. Houve uma falha! Corrigido. Te agradece!
Keerthana Prabhakaran
3

Bash, 135 124 115 bytes

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

Experimente online!

betseg
fonte
3

CJam, 66 54 58 54 51 49 46 bytes

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

A entrada 1 é fornecida por STDIN, a entrada 2 é fornecida como uma sequência na pilha. A saída é uma matriz na pilha. O separador para a entrada 1 é um espaço, por exemplo Kevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12.

Rastreio de pilha:

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

Explicação:

  • O procedimento Kconverte entre um horário hh:mme um número que representa quantos minutos são desde a meia-noite.
  • Lemos a primeira pessoa e substituímos seu tempo por K (seu tempo). Em seguida, adicionamos isso à frente da entrada.
  • Em seguida, executamos algumas operações de string para obter uma lista de nomes e uma lista de horários, como [782 5 3 6 12].
  • Ao acumular essa lista, chegamos [782 787 790 796 808], o que indica os horários em que todos chegaram.
  • A maneira mais curta de descobrir quem está atrasado é inserir o horário de início na matriz e, em seguida, reorganizá-lo para colocá-lo onde deveria estar. Em seguida, localizamos o índice para descobrir onde ele coloca e dividimos a lista de nomes desse índice.
Esolanging Fruit
fonte
2

JavaScript, 285 283 bytes

Leva a lista de convidados ie o tempo da festa ppara currying sintaxe (i)(p). Retorna uma lista de nomes separados por vírgula, como 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()}

Eu sei que é muito longo e atualmente em último lugar por uma margem justa, mas é o que eu poderia fazer.

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

Arjun
fonte
2

C # , 269 267 bytes


Golfe

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

Ungolfed legible

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

Código completo

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

Lançamentos

  • v1.1 - - 2 bytes- Graças a VisualMelon
  • v1.0 - 269 bytes- Solução inicial.

Notas

  • Formato de saída: gera os nomes separados por espaços
auhmaan
fonte
Você pode salvar alguns bytes adicionando uma using D=System.DateTime;diretiva (não se esqueça de substituir os var!). Você realmente deve fornecer tipos para os parâmetros lambda para tornar esse código completamente inequívoco (ou seja (string l,string f)). Eu também acho que há um pequeno erro, você precisa em h>svez de h>=s(economia de 1 byte!) Conforme "(Qualquer pessoa exatamente na hora certa está bem.)". Você pode fazer h.Ticks<1? Você pode encontrar um valor nulo DateTimemais barato do que usar DateTime.Min, mas não verifiquei todas as implicações aqui. Com a cláusula using, ==D.Mindeve funcionar também.
VisualMelon
Sobre o uso , duvido que ainda pudesse fazer uma expressão lambda com ele. Tenho certeza de que não posso adicioná-lo no meio do código . Tipos lambda explícitos são outra coisa que eu não vi pessoas fazendo isso, e eu fui com isso - se for ilegal , diga, mas mesmo os mods não disseram nada, talvez esteja tudo bem? h>sEu vou fazer isso. h.Ticks<1e este também.
auhmaan
Estou confiante de que permitimos usingse, com lambdas, não consigo encontrar nada dizendo isso explicitamente na meta, mas essa pergunta sugere fortemente que isso é permitido. Existe um consenso razoável de que tipos explícitos de parâmetros devem ser necessários (devo acrescentar que sou totalmente a favor). A propósito, os Mods estão lá para manter as coisas civis da perspectiva da SE, não para impor as próprias regras do PPCG.
VisualMelon
Sou um pouco contra usings, principalmente porque acho que isso exigiria um código completo; portanto, estou dizendo que duvido que possa executar uma função como solução - talvez adicionando dois blocos, um para se usingoutro para o função lambda? Sobre o consenso, acho que adicionando a falta Func<...> f = ...;iria resolvê-lo, embora deva ser especificado o nome completoSystem.Func<...> f = ...;
auhmaan
Você pode estar melhor apenas tendo uma função bem nomeada (apenas adicionada string scom a sintaxe C # 7 (6? Não me lembro)) se preferir não misturar lambdas e usos.
VisualMelon
2

CJam , 43 41 bytes

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

Experimente online!

Explicação

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.
Gato de negócios
fonte
2

Lua, 211 206 bytes

O primeiro codegolf do ano para mim ainda deve ser jogável.

Editar: salvou 5 bytes usando uma abreviação de 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

Explicações

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                                 

se você quiser experimentar esse código, poderá usar o seguinte snippet

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
Katenkyo
fonte
2

Java, 346 304 284 275 bytes

  • -9 bytes, graças a @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]));}

Live detalhado

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]));
}
Khaled.K
fonte
1
Bom golfe (para Java.) Você precisa do espaço entre String[] n,e String[] a?
programmer5000
@ programmer5000 não, também removi a variável horas e as acumulei em minutos.
precisa saber é o seguinte
1
Você pode substituir Integer.parseInt(n)por new Short(n). E com base nos comentários do desafio, LisaBobtambém é uma saída válida, para que você possa alterar o printlnpara print.
Kevin Cruijssen
1

Lote, 163 bytes

@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

Recebe entrada em STDIN. Primeira linha é o horário de início da festa e, em seguida, a lista de convidados. Usa o truque de @ Arnauld para converter o hh: mm em minutos.

A entrada preferida do lote para isso seria como uma série de parâmetros de linha de comando (começando com a hora da festa, depois cada convidado e hora como argumentos separados). Isso levaria apenas 129 bytes:

@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
Neil
fonte
1

Groovy, 121 bytes

{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}}
Urna de polvo mágico
fonte
1

PowerShell, 170 160 bytes

select-string '(?m)^((\w*) )?((\d\d):)?(\d?\d)$'-a|% matches|%{,$_.groups[2,4,5].value}|%{}{$b+=($c=60*$_[1]+$_[2]);$a+=,@{n=$_[0];t=$b}}{$a|? n|? t -gt $c|% n}

Experimente online!

Andrei Odegov
fonte
Antes tarde do que nunca!
programmer5000
Hoje estou em descanso, portanto, divirto-me um pouco
Andrei Odegov