Mieux vaut tard que jamais!


12

Votre programme / fonction, etc. prendra 2 entrées. Le premier sera une liste des personnes qui sont venues à ma fête et quand. Exemple:

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

Qu'est-ce que ça veut dire? Cela signifie que Kevin est arrivé à ma fête en premier (à 13h02, heure 24 heures), puis Ruby 5 minutes plus tard, puis Sam 3 minutes plus tard, puis Lisa 6 minutes plus tard, et Bob dernier 12 minutes plus tard.

La deuxième entrée sera lorsque ma fête a commencé. Exemple:

13:15

(24 heures). Votre sortie doit être la liste des personnes en retard. (N'importe qui exactement à l'heure est très bien.) Exemples de calculs (juste par exemple, ne les affichez pas)

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

Lisa et Bob sont arrivés après 13:15, donc ce programme devrait imprimer "Lisa, Bob".

Hypothèses d'entrée

  • L'entrée 1 sera toujours un nom (expression régulière [A-Z][a-z]*), puis un espace, puis un temps de 24 heures dans le formulaire hours:minutessur la première ligne, puis un nom, un espace et un entier positif (nombre de minutes plus tard) sur les lignes suivantes . Il y aura toujours au moins 1 ligne.
  • Si vous le souhaitez, vous pouvez prendre l'entrée 1 avec n'importe quel autre caractère au lieu d'un saut de ligne.
  • L'entrée 2 sera au format hours:minutes.
  • Vous pouvez prendre vos entrées comme une chaîne séparée par n'importe quel caractère si vous le souhaitez. C'est facultatif.
  • Ne vous inquiétez pas du crossover de jour. Mes soirées à jamais 23:59.

Règles de sortie

  • La sortie peut être une valeur de retour de fonction ou une chaîne renvoyée en écho à STDIN, un fichier, etc. Vous devez renvoyer une chaîne ou un tableau / liste.
    • Si vous retournez une chaîne, ce doit être chaque personne en retard (l'ordre n'a pas d'importance), séparé par un délimiteur non alphanumérique.
    • Si vous retournez un tableau / liste, il doit s'agir d'une liste de tous ceux qui étaient en retard.

2
Le format d'entrée strict est-il nécessaire? Par exemple, la première entrée pourrait-elle être une liste de listes, chacune étant une "ligne" contenant les deux éléments de données?
Jonathan Allan

"L'entrée 1 sera toujours un nom (regex [A-Z][a-z]*)" Cela suggère-t-il que les noms peuvent être vides?
HyperNeutrino

2
Je suppose que vous vouliez dire "oui, le format d'entrée strict est nécessaire".
Jonathan Allan

2
Le format d'entrée strict rend ce défi moins intéressant
Luis Mendo

3
"Mes fêtes ne se terminent jamais après 11h59." tu veux dire 23:59?
tsh

Réponses:


3

MATL , 31 octets

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

La première entrée utilise l'espace au lieu du saut de ligne (autorisé par le défi).

La sortie utilise le saut de ligne comme séparateur.

Essayez-le en ligne!

Explication

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 octets

1 octet enregistré grâce à Neil

Prend la liste des invités let le temps de la fête hdans la syntaxe de curry (l)(h). Attend un saut de ligne de fin dans la liste. Renvoie une liste de noms séparés par des espaces tels que Lisa Bob.

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

Formaté et commenté

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

Démo

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


Solution intelligente! +1. Le mien est loin ....... :(
Arjun

Ça ne (.*) (.*)\nmarche pas ?
Neil

@Neil Étant gourmand par défaut, le premier (.*)correspondrait à toute la ligne.
Arnauld

Alors, à quoi correspondrait l'espace?
Neil

@Neil Oh, désolé, tu as raison.
Arnauld

6

PHP, 118 98 95 91 octets

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

prend l'entrée des arguments de ligne de commande (vous pouvez l'interpréter comme des lignes séparées par des espaces si vous le souhaitez); imprime les noms sans délimiteur. Exécutez-le -rou testez-le en ligne .

édition 1: 20 octets enregistrés avec impression directe
édition 2: 3 octets enregistrés en supprimant le délimiteur
édition 3: 4 octets enregistrés en exploitant le fait que les nombres entiers ne sont pas des dates valides pourstrtotime

panne

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 octets

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

Essayez-le en ligne


5

JavaScript ES6, 185 octets

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

Essayez-le en ligne!

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


Pour autant que je sache d'après les spécifications, le formulaire de saisie peut être plus strict.
Jonathan Allan

Je pense que c'est correct maintenant.
powelles

Oui - j'ai également posé des questions sur la rigueur des entrées.
Jonathan Allan

... en fait, vous avez les temps dans votre entrée, pas les décalages qu'il devrait êtref('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@JonathanAllan Merci. Je l'ai maintenant.
powelles du

4

PowerShell , 215 196 180 octets

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

Essayez-le en ligne!

Environ 1/3 de ceci est une analyse des entrées, donc je ne sais pas à quel point je peux jouer au golf.

Prend entrée $acomme une chaîne de noms séparés par des virgules et / minutes fois, et $bcomme hh:mmune chaîne. Tout d' abord, nous -split $asur ,, stocker le premier résultat dans $xet le reste dans $a, avec une refondue explicite $acomme array( de sorte que la boucle fonctionne correctement plus tard). Nous initialize notre Hashtable $z, ensemble $iet $jd'être $x -splitsur les espaces, et mis $z[$i]à la datede $j(stocké dans une $yutilisation ultérieure).

Ensuite, nous parcourons le reste $a. À chaque itération, nous faisons la même chose - -splitla chaîne sur les espaces blancs, définit l' $zindex approprié comme étant beaucoup plus de minutes que l'endroit où nous en sommes actuellement. Cela utilise une astuce de nom de propriété raccourci pour enregistrer certains octets, en utilisant |% *es $jau lieu de .AddMinutes($j).

Enfin, nous .GetEnumerator()(encore une fois en utilisant l'astuce) de notre table de hachage, et Where-Objectsélectionnez ces entrées avec un valuequi est -greater than $b(c'est-à-dire, ils sont en retard à la fête). Nous en sélectionnons ensuite uniquement les .Names. La sortie est sous la forme d'un tableau implicite, entre lequel la valeur par défaut Write-Outputinsère des retours à la ligne.

J'ai sauvé un tas grâce à briantist pour m'avoir rappelé que [array] est une chose. Et un tas de plus pour une astuce de nom de propriété raccourci.


J'avoue avoir fait un minimum de lecture et de test sur ce sujet, mais ne pourriez -$x,[array]$a=$a-split',' vous pas simplement le faire ?
briantist

1
@briantist Oui, merci. J'ai continué à essayer de trouver un moyen d'utiliser l'opérateur virgule dans les affectations multiples, et cela ne fonctionnait tout simplement pas. J'avais complètement oublié que [array]c'est un casting valide. Haha. Trop de golf, je suppose.
AdmBorkBork

Je suis sur mobile, donc sortir serait difficile à tester, mais je pense GetEnumeratoret je suis un AddMinutesbon candidat pour la %syntaxe de la méthode
briantist

@briantist Yep. Économise encore 16. Merci!
AdmBorkBork

4

Python 2 , 140, 148, 144 octets

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,

Essayez-le en ligne!

Format d'entrée:

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

Ne gère pas correctement le débordement des minutes: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'n'imprime rien, même si Lisa et Bob sont encore en retard.
L3viathan

1
Oh oui. Il y avait un problème! A corrigé. Merci!
Keerthana Prabhakaran

3

Bash, 135 124 115 octets

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

Essayez-le en ligne!


3

CJam, 66 54 58 54 51 49 46 octets

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

L'entrée 1 est donnée via STDIN, l'entrée 2 est donnée sous forme de chaîne sur la pile. La sortie est un tableau sur la pile. Le séparateur pour l'entrée 1 est un espace, par exemple Kevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12.

Trace de la pile:

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

Explication:

  • La procédure Kconvertit entre une heure hh:mmet un nombre représentant le nombre de minutes écoulées depuis minuit.
  • Nous lisons la première personne et remplaçons leur temps par K (leur temps). Nous ajoutons ensuite cela au début de l'entrée.
  • Nous effectuons ensuite quelques opérations de chaîne pour obtenir une liste de noms et une liste d'heures, comme [782 5 3 6 12].
  • En accumulant cette liste, nous obtenons [782 787 790 796 808], ce qui donne les moments où tout le monde est venu.
  • Le moyen le plus court de trouver qui est en retard est d'insérer l'heure de début dans le tableau, puis de la trier à nouveau pour la placer là où elle devrait être. Nous trouvons ensuite l'index pour déterminer où il se trouve, puis découpons la liste des noms de cet index.

2

JavaScript, 285 283 octets

Prend la liste des invités iet le temps de la fête pdans la syntaxe de curry (i)(p). Renvoie une liste de noms séparés par des virgules tels que 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()}

Je sais que c'est assez long et actuellement à la dernière place avec une bonne marge, mais c'est ce que je pourrais trouver.

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 octets


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

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

Non lisible non lisible

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

Code complet

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

Communiqués

  • v1.1 - - 2 bytes- Merci à VisualMelon
  • v1.0 - 269 bytes- Solution initiale.

Remarques

  • Format de sortie: affiche les noms séparés par des espaces

Vous pouvez économiser quelques octets en ajoutant une using D=System.DateTime;directive (n'oubliez pas de remplacer le vars!). Vous devez vraiment fournir des types pour les paramètres lambda pour rendre ce code complètement sans ambiguïté (c'est-à-dire (string l,string f)). Je pense également qu'il y a un léger bug, vous avez besoin h>splutôt que h>=s(1 octet d'économie!) Selon "(N'importe qui exactement à l'heure est bien.)". Pouvez-vous faire h.Ticks<1? Vous pouvez trouver une valeur nulle DateTimemoins chère que l'utilisation DateTime.Min, mais je n'ai pas vérifié toutes les implications ici. Avec la clause using, ==D.Mindevrait également fonctionner.
VisualMelon

À propos de l'utilisation, je doute que je puisse encore tirer une expression lambda avec. Je suis presque sûr que je ne peux pas l'ajouter en milieu de code . Les types de lambda explicites sont une autre chose que je n'ai pas vu de gens le faire, et je suis allé avec ça - si c'est illégal , dites-le, mais même les mods n'ont rien dit, peut-être que ça va? h>sJe vais le faire. h.Ticks<1et celui-ci aussi.
auhmaan

Je suis confiant que nous permettons usingset tel avec les lambdas, je ne trouve rien qui dit cela explicitement sur les méta, mais cette question suggère fortement que c'est permis. Il existe un consensus raisonnable sur la nécessité de types de paramètres explicites (je dois ajouter que je suis fermement en faveur). D'ailleurs, les Mods sont là pour garder les choses civiles du point de vue de SE, pas pour appliquer les propres règles de PPCG.
VisualMelon

Je suis un peu contre le usings, principalement parce que je sentirais alors qu'il faudrait un code complet, donc je dis que je doute que je puisse retirer une fonction comme solution - peut-être en ajoutant deux blocs, un pour usings et un autre pour le fonction lambda? À propos du consensus, je pense que l'ajout des manquants Func<...> f = ...;le résoudrait, bien qu'il faille préciser le nom completSystem.Func<...> f = ...;
auhmaan

Vous pourriez être mieux d'avoir juste une fonction bien nommée (ajoute seulement string savec la syntaxe C # 7 (6? Je ne me souviens pas)) si vous préférez ne pas mélanger les lambdas et les utilisations.
VisualMelon

2

CJam , 43 41 octets

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

Essayez-le en ligne!

Explication

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 octets

Le premier golf de code de l'année pour moi devrait toujours être jouable au golf.

Modifier: enregistré 5 octets en utilisant un raccourci pour 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

Explications

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 vous voulez essayer ce code, vous pouvez utiliser l'extrait de code suivant

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 octets

  • -9 octets, merci à @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 détaillé

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
Bon golf (pour Java.) Avez-vous besoin d'espace entre String[] n,et String[] a?
programmer5000

@ programmer5000 non, j'ai également supprimé la variable heures et les ai accumulées en minutes.
Khaled.K

1
Vous pouvez remplacer Integer.parseInt(n)par new Short(n). Et sur la base des commentaires du défi, LisaBobest également une sortie valide, vous pouvez donc changer le printlnen print.
Kevin Cruijssen

1

Lot, 163 octets

@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

Prend entrée sur STDIN. La première ligne est l'heure de début de la fête, puis la liste des invités. Utilise l'astuce de @ Arnauld pour convertir le hh: mm en minutes.

L'entrée préférée de Batch pour cela serait une série de paramètres de ligne de commande (en commençant par l'heure de la fête, puis chaque invité et l'heure comme arguments séparés). Cela ne prendrait que 129 octets:

@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 octets

{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 octets

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}

Essayez-le en ligne!


Mieux vaut tard que jamais!
programmer5000

Je suis au repos aujourd'hui donc j'ai du temps pour m'amuser
Andrei Odegov
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.