¡Mejor tarde que nunca!


12

Su programa / función, etc. tomará 2 entradas. La primera será una lista de quién vino a mi fiesta y cuándo. Ejemplo:

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

Qué significa eso? Significa que Kevin llegó primero a mi fiesta (a las 13:02, 24 horas), luego a Ruby 5 minutos más tarde, luego a Sam 3 minutos más tarde, luego a Lisa 6 minutos más tarde, y al último Bob 12 minutos más tarde.

La segunda entrada será cuando comenzó mi fiesta. Ejemplo:

13:15

(Tiempo de 24 horas). Su salida debe ser la lista de personas que llegaron tarde. (Cualquier persona exactamente a tiempo está bien). Cálculos de ejemplo (solo por ejemplo, no envíe estos)

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

Lisa y Bob llegaron después 13:15, por lo tanto, este programa debería imprimir "Lisa, Bob".

Suposiciones de entrada

  • La entrada 1 siempre será un nombre (regex [A-Z][a-z]*), luego un espacio, luego un tiempo de 24 horas en el formulario hours:minutesen la primera línea, luego un nombre, un espacio y un entero positivo (número de minutos más tarde) en las siguientes líneas . Siempre habrá al menos 1 línea.
  • Si lo desea, puede tomar la entrada 1 con cualquier otro carácter en lugar de un salto de línea.
  • La entrada 2 estará en el formato hours:minutes.
  • Puede tomar sus entradas como una cadena separada por cualquier carácter si lo desea. Esto es opcional
  • No te preocupes por el crossover del día. Mis fiestas nunca para después 23:59.

Reglas de salida

  • La salida puede ser un valor de retorno de función o una cadena reflejada en STDIN, un archivo, etc. Debe devolver una cadena o una matriz / lista.
    • Si devuelve una cadena, debe ser cada persona que llegó tarde (el orden no importa), separado por un delimitador no alfanumérico.
    • Si devuelve una matriz / lista, debe ser una lista de todos los que llegaron tarde.

2
¿Es necesario el formato de entrada estricto? ¿Podría, por ejemplo, la primera entrada ser una lista de listas, cada una de las cuales es una "línea" que contiene los dos elementos de datos?
Jonathan Allan

"La entrada 1 siempre será un nombre (regex [A-Z][a-z]*)" ¿Esto sugiere que los nombres pueden estar vacíos?
HyperNeutrino

2
Supongo que quiso decir "sí, el formato de entrada estricto es necesario".
Jonathan Allan

2
Formato de entrada estricta hace que este desafío menos interesante
Luis Mendo

3
"Mis fiestas nunca después de las 11:59". Qué quiere decir 23:59?
tsh

Respuestas:


3

MATL , 31 bytes

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

La primera entrada usa espacio en lugar de salto de línea (permitido por el desafío).

La salida utiliza el salto de línea como separador.

Pruébalo en línea!

Explicación

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 bytes

Guardado 1 byte gracias a Neil

Toma la lista de invitados ly el tiempo de fiesta hen sintaxis curry (l)(h). Espera un salto de línea final en la lista. Devuelve una lista de nombres separados por espacios como Lisa Bob.

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

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

Manifestación

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


¡Solución inteligente! +1. El mío está muy lejos ....... :(
Arjun

No (.*) (.*)\nfunciona
Neil

@Neil Siendo codicioso por defecto, el primero (.*)coincidiría con la línea completa.
Arnauld

Entonces, ¿con qué coincidiría el espacio?
Neil

@Neil Oh, lo siento, tienes razón.
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;

toma datos de los argumentos de la línea de comandos (si lo desea, puede interpretarlos como líneas separadas por espacios); imprime nombres sin delimitador. Ejecutar -ro probarlo en línea .

edición 1: guardado 20 bytes con impresión directa
edición 2: guardado 3 bytes al eliminar el delimitador
edición 3: guardado 4 bytes al explotar que los enteros simples no son fechas válidas parastrtotime

Descompostura

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

Pruébalo en línea


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

Pruébalo en línea!

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


Por lo que puedo decir de la especificación, el formulario de entrada puede ser más estricto.
Jonathan Allan

Creo que es correcto ahora.
Powelles

Sí, también he preguntado sobre la rigidez de entrada.
Jonathan Allan

... en realidad tiene los tiempos en su entrada, no las compensaciones que debería serf('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@ JonathanAllan Gracias. Ya lo pillo.
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

Pruébalo en línea!

Aproximadamente 1/3 de esto es análisis de entrada, por lo que no estoy seguro de cuánto más puedo jugarlo.

Toma de entrada $acomo una cadena delimitada por comas de nombres y tiempos / minuto, y $bcomo hh:mmforma de cadena. En primer lugar, -split $aen ,, almacenar el resultado en la primera $xy la restante en $a, con una explícita refundición de $acomo array(por lo que el bucle más tarde funciona correctamente). Inicializamos nuestra tabla hash $z, establecemos $iy $jestar $x -spliten espacios en blanco, y establecemos $z[$i]para ser el datede $j(almacenado $ypara su uso posterior).

Luego recorremos el resto $a. En cada iteración, hacemos algo similar: -splitla cadena en el espacio en blanco establece el $zíndice apropiado para que esté muchos minutos más allá de donde estamos actualmente. Esto usa un truco de nombre de propiedad acortado para guardar algunos bytes, usando en |% *es $jlugar de .AddMinutes($j).

Por último, .GetEnumerator()(de nuevo usando el truco) de nuestra tabla hash, y Where-Objectseleccionar esas entradas con una valueque es -greater tHan $b(es decir, llegan tarde a la fiesta). Luego seleccionamos solo los .Names de los mismos. La salida es como una matriz implícita, en la que el valor predeterminado Write-Outputinserta nuevas líneas entre ellas.

Ahorré un montón gracias a briantist por recordarme que [array] es una cosa. Y un montón más por la punta del nombre de la propiedad acortada.


Admito que leí y probé un mínimo de esto, pero, ¿no podrías simplemente hacerlo$x,[array]$a=$a-split',' ?
briantist

1
@briantist Sí, gracias. Seguí tratando de encontrar una manera de usar el operador de coma en la asignación múltiple, y simplemente no estaba funcionando. Había olvidado por completo que [array]es un elenco válido. Jaja. Demasiado golf, supongo.
AdmBorkBork

Estoy en el móvil tan fuera sería difícil de probar, pero creo GetEnumeratory AddMinutesson buenos candidatos para la %sintaxis del método
briantist

@briantist Sí. Ahorra otros 16. ¡Gracias!
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,

Pruébalo en línea!

Formato de entrada

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

No maneja correctamente el desbordamiento de minutos: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'no imprime nada, a pesar de que Lisa y Bob todavía llegan tarde.
L3viathan

1
Oh si. Hubo una falla! Arreglado. ¡Gracias!
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

Pruébalo en línea!


3

CJam, 66 54 58 54 51 49 46 bytes

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

La entrada 1 se da a través de STDIN, la entrada 2 se da como una cadena en la pila. La salida es una matriz en la pila. El separador para la entrada 1 es un espacio, por ejemplo Kevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12.

Seguimiento de pila:

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

Explicación:

  • El procedimiento Kconvierte entre una hora hh:mmy un número que representa cuántos minutos han pasado desde la medianoche.
  • Leemos a la primera persona y reemplazamos su tiempo con K (su tiempo). Luego agregamos esto al frente de la entrada.
  • Luego realizamos algunas operaciones de cadena para obtener una lista de nombres y una lista de veces, como [782 5 3 6 12].
  • Al acumular esta lista, obtenemos [782 787 790 796 808], lo que da los tiempos en que todos vinieron.
  • La forma más corta de encontrar quién llega tarde es insertar la hora de inicio en la matriz y luego volver a ordenarla para colocarla donde debería estar. Luego encontramos el índice para averiguar dónde se ubica, y luego dividimos la lista de nombres de ese índice.

2

JavaScript 285 283 bytes

Toma la lista de invitados iy el tiempo de fiesta pen sintaxis curry (i)(p). Devuelve una lista de nombres separados por comas 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()}

Sé que es bastante largo y actualmente en el último lugar por un margen justo, pero eso es lo que se me ocurre.

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 bytes


Golfed

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

Sin golf

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

Legible sin golf

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

Lanzamientos

  • v1.1 - - 2 bytes- Gracias a VisualMelon
  • v1.0 - 269 bytes- Solución inicial.

Notas

  • Formato de salida: muestra los nombres separados por espacios

Puede guardar algunos bytes agregando una using D=System.DateTime;directiva (¡no olvide reemplazar el vars!). Realmente debería proporcionar tipos para los parámetros lambda para que este código sea completamente inequívoco (es decir (string l,string f)). También creo que hay un pequeño error, necesita h>smás que h>=s(¡1byte de ahorro!) Según "(Cualquier persona exactamente a tiempo está bien)". Puedes hacer h.Ticks<1? Es posible que encuentre un valor anulable DateTimemás barato que el uso DateTime.Min, pero no he verificado las implicaciones completas aquí. Con la cláusula de uso, ==D.Mindebería funcionar también.
VisualMelon

Sobre el uso , dudo que aún pueda lograr una expresión lambda con él. Estoy bastante seguro de que no puedo agregarlo a mitad de código . Los tipos de lambda explícitos son otra cosa que no he visto personas haciéndolo, y seguí con eso: si es ilegal , dilo, pero incluso los mods no han dicho nada, ¿tal vez está bien? h>sYo haré eso. h.Ticks<1y ésta también.
auhmaan

Estoy seguro de que permitimos usingsy con lambdas, no puedo encontrar nada que diga esto explícitamente en meta, pero esta pregunta sugiere que está permitido. Existe un consenso razonable de que se deben requerir tipos de parámetros explícitos (debo agregar que estoy firmemente a favor). Por cierto, los Mods están ahí para mantener las cosas civiles desde la perspectiva de SE, no para hacer cumplir las propias reglas de PPCG.
VisualMelon

Estoy un poco en contra de la usingsmayoría, principalmente porque luego sentiría que requeriría un código completo, por lo tanto, digo que dudo que pueda lograr una función como solución, tal vez agregando dos bloques, uno para usingsy otro para el función lambda? Sobre el consenso, creo que agregar los desaparecidos Func<...> f = ...;lo resolvería, aunque debería especificarse el nombre completoSystem.Func<...> f = ...;
auhmaan

Puede que sea mejor simplemente tener una función bien nombrada (solo se agrega string scon la sintaxis C # 7 (6? No puedo recordar)) si prefiere no mezclar lambdas y usos.
VisualMelon

2

CJam , 43 41 bytes

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

Pruébalo en línea!

Explicación

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 bytes

El primer codegolf del año para mí, todavía debería ser golfable.

Editar: Guardado 5 Bytes usando una taquigrafía para 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

Explicaciones

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                                 

si quieres probar este código, puedes usar el siguiente fragmento

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 bytes

  • -9 bytes, gracias 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]));}

Detallado en vivo

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
Buen golf (para Java). ¿Necesita el espacio entre String[] n,y String[] a?
programmer5000

@ programmer5000 no, también eliminé la variable horas y las acumulé como minutos.
Khaled.K

1
Se puede reemplazar Integer.parseInt(n)con new Short(n). Y según los comentarios del desafío, LisaBobtambién es un resultado válido, por lo que puede cambiar el printlna 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

Toma entrada en STDIN. La primera línea es la hora de inicio de la fiesta, luego la lista de invitados. Utiliza el truco de @ Arnauld para convertir hh: mm en minutos.

La entrada preferida de Batch para esto sería como una serie de parámetros de línea de comandos (comenzando con la hora de la fiesta, luego cada invitado y hora como argumentos separados). Esto solo tomaría 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

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

1

PowerShell, 170160 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}

Pruébalo en línea!


¡Mejor tarde que nunca!
programmer5000

Hoy estoy en reposo, por lo tanto, tenga algo de tiempo para divertirme
Andrei Odegov
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.