Besser spät als nie!


12

Ihr Programm / Ihre Funktion usw. nimmt 2 Eingaben entgegen. Die erste ist eine Liste, wer wann zu meiner Party gekommen ist. Beispiel:

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

Was bedeutet das? Das bedeutet, dass Kevin zuerst zu meiner Party kam (um 13:02 Uhr, 24 Stunden), dann 5 Minuten später zu Ruby, dann 3 Minuten später zu Sam, dann 6 Minuten später zu Lisa und zuletzt 12 Minuten später zu Bob.

Der zweite Eingang wird sein, als meine Party begann. Beispiel:

13:15

(24 Stunden). Ihre Ausgabe muss die Liste der Personen sein, die sich verspätet haben. (Jeder, der genau pünktlich ist, ist in Ordnung.) Beispielberechnungen (nur zum Beispiel, diese nicht ausgeben)

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

Lisa und Bob kamen nach 13:15, daher sollte dieses Programm "Lisa, Bob" ausgeben.

Eingangsannahmen

  • Eingabe 1 ist immer ein Name (regulärer Ausdruck [A-Z][a-z]*), dann ein Leerzeichen, dann eine 24-Stunden-Zeit im Formular hours:minutesin der ersten Zeile, dann ein Name, ein Leerzeichen und eine positive Ganzzahl (Anzahl der Minuten später) in den nächsten Zeilen . Es wird immer mindestens 1 Zeile geben.
  • Wenn Sie möchten, können Sie Eingabe 1 mit einem beliebigen anderen Zeichen anstelle eines Zeilenumbruchs übernehmen.
  • Eingang 2 wird im Format sein hours:minutes.
  • Sie können Ihre Eingaben als eine durch ein beliebiges Zeichen getrennte Zeichenfolge annehmen, wenn Sie möchten. Dies ist optional.
  • Mach dir keine Sorgen über Tag Crossover. Meine Partys nie nach 23:59.

Ausgaberegeln

  • Die Ausgabe kann ein Funktionsrückgabewert oder eine an STDIN zurückgegebene Zeichenfolge, eine Datei usw. sein. Sie müssen eine Zeichenfolge oder ein Array / eine Liste zurückgeben.
    • Wenn Sie eine Zeichenfolge zurückgeben, muss es sich um jede Person handeln, die sich verspätet hat (Reihenfolge spielt keine Rolle), getrennt durch ein nicht-alphanumerisches Trennzeichen.
    • Wenn Sie ein Array / eine Liste zurückgeben, muss es sich um eine Liste aller Personen handeln, die sich verspätet haben.

2
Ist das strikte Eingabeformat notwendig? Könnte die erste Eingabe beispielsweise eine Liste von Listen sein, wobei jede eine "Zeile" ist, die die zwei Datenelemente enthält?
Jonathan Allan

"Eingang 1 wird immer ein Name sein (regex [A-Z][a-z]*)" Bedeutet dies, dass Namen leer sein können?
HyperNeutrino

2
Ich nehme an, Sie meinten "ja, das strikte Eingabeformat ist notwendig".
Jonathan Allan

2
Strenges Eingabeformat macht diese Herausforderung weniger interessant
Luis Mendo

3
"Meine Partys nie nach 11:59." meinst du 23:59?
TSH

Antworten:


3

MATL , 31 Bytes

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

Die erste Eingabe verwendet Leerzeichen anstelle von Zeilenumbrüchen (gemäß der Abfrage zulässig).

Die Ausgabe verwendet einen Zeilenumbruch als Trennzeichen.

Probieren Sie es online!

Erläuterung

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 bis 97 Byte

1 Byte dank Neil gespeichert

Übernimmt die Liste der Gäste lund die hPartyzeit in der Currysyntax (l)(h). Erwartet einen nachgestellten Zeilenumbruch in der Liste. Gibt eine durch Leerzeichen getrennte Liste von Namen zurück, z Lisa Bob.

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

Formatiert und kommentiert

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


Clevere Lösung! +1. Meins ist weit weg ....... :(
Arjun

Nicht (.*) (.*)\nfunktioniert?
Neil

Da @Neil standardmäßig gierig ist, würde der erste (.*)der gesamten Zeile entsprechen.
Arnauld

Was würde dann der Raum passen?
Neil

@ Neil Oh, sorry, du hast recht.
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;

Nimmt Eingaben von Befehlszeilenargumenten entgegen (Sie können diese als durch Leerzeichen getrennte Zeilen interpretieren, wenn Sie möchten). druckt Namen ohne Trennzeichen. Laufen Sie mit -roder testen Sie es online .

edit 1: speicherte 20 Bytes beim direkten Drucken
edit 2: speicherte 3 Bytes durch Entfernen des Trennzeichens
edit 3: speicherte 4 Bytes, indem ausgenutzt wurde, dass einfache Ganzzahlen keine gültigen Daten für sindstrtotime

Nervenzusammenbruch

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

Probieren Sie es online aus


5

JavaScript ES6, 185 Byte

l=>t=>l.split`
`.map(p=>p.split` `).map((p,i,a)=>[p[0],i?d(a[0][1])+a.slice(1,i+1).reduce((a,p)=>a+=+p[1],0)*6e4:(d=x=>Date.parse(`2017T${x}`))(p[1])]).filter(p=>p[1]>d(t)).map(p=>p[0])

Probieren Sie es 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'))


Soweit ich aus der Spezifikation ersehen kann, ist das Eingabeformular möglicherweise strenger.
Jonathan Allan

Ich denke es ist jetzt richtig.
Powelles

Ja - ich habe auch nach der Eingabestärke gefragt.
Jonathan Allan

... eigentlich hast du die Zeiten in deiner Eingabe, nicht die Offsets, die es sein solltef('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@ JonathanAllan Danke. Ich habe es verstanden.
Powelles

4

PowerShell , 215 196 180 Byte

param($a,$b)$x,[array]$a=$a-split',';$z=@{};$i,$j=-split$x;$z[$i]=($y=date $j);0..($a.count-1)|%{$i,$j=-split$a[$_];$z[$i]=($y=$y|% *es $j)};($z|% *or|?{$_.value-gt(date $b)}).Name

Probieren Sie es online!

Etwa 1/3 davon ist Input-Parsing, daher bin ich mir nicht sicher, wie weit ich noch Golf spielen kann.

Nimmt Eingaben $aals durch Kommas getrennte Zeichenfolge von Namen und Zeiten / Minuten sowie $bals hh:mmZeichenfolge an. Erstens haben wir -split $aauf ,, speichern Sie das erste Ergebnis in $xund die restlichen in $a, mit einer expliziten Wieder Besetzung $aals ein array(so dass die Schleife später richtig funktioniert). Wir , die initialisieren unsere hashtable $z, Satz $iund $jsein $x -splitauf Leerzeichen, und stellen Sie $z[$i]die zu dateder $j(gespeicherte in $yspäter für die Anwendung).

Dann durchlaufen wir die restlichen $a. Bei jeder Iteration machen wir es ähnlich - -splitdie Zeichenfolge im Leerraum legt den entsprechenden $zIndex so fest, dass er um so mehr Minuten länger ist, als wir gerade sind. Dies verwendet einen verkürzten Eigenschaftsnamen- Trick, um einige Bytes zu speichern, |% *es $janstatt .AddMinutes($j).

Schließlich verwenden wir .GetEnumerator()(wieder mit dem Trick) unsere Hash - Tabelle und Where-Objectwählen diese Einträge mit einem besseren Han aus (dh, sie kommen zu spät zur Party). Wir wählen dann nur das s davon aus. Die Ausgabe erfolgt als implizites Array, zwischen dem standardmäßig Zeilenumbrüche eingefügt werden.value-gt$b.NameWrite-Output

Vielen Dank an Briantist, der mich daran erinnert hat, dass [array] eine Sache ist. Und ein paar mehr für verkürzte Eigenschaftsnamen.


Ich gebe zu, dass ich dies nur minimal gelesen und getestet habe, aber können Sie das nicht einfach tun$x,[array]$a=$a-split',' ?
Briantist

1
@briantist Ja, danke. Ich habe immer wieder versucht, eine Möglichkeit zu finden, den Komma-Operator in der Mehrfachzuweisung zu verwenden, und es hat einfach nicht funktioniert. Ich hatte völlig vergessen, dass dies [array]eine gültige Besetzung ist. Haha. Zu viel Golf, denke ich.
AdmBorkBork

Ich bin auf dem Handy, also raus wäre schwer zu testen, aber ich denke GetEnumeratorund bin AddMinutesgute Kandidaten für die %Methodensyntax
Briantist

@ Briantist Yep. Speichert weitere 16. Danke!
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,

Probieren Sie es online!

Eingabeformat:

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

Behandelt Minutenüberlauf nicht richtig: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'Druckt nichts, obwohl Lisa und Bob immer noch zu spät sind.
L3viathan

1
Oh ja. Es gab eine Panne! Repariert. Danke!
Keerthana Prabhakaran


3

CJam, 66 54 58 54 51 49 46 Bytes

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

Eingang 1 wird durch STDIN gegeben, Eingang 2 wird als Zeichenkette auf dem Stapel gegeben. Die Ausgabe ist ein Array auf dem Stapel. Trennzeichen für Eingabe 1 ist ein Leerzeichen, z Kevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12.

Stack-Trace:

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

Erläuterung:

  • Das Verfahren K konvertiert zwischen einer Zeit hh:mmund einer Zahl, die angibt, wie viele Minuten seit Mitternacht verstrichen sind.
  • Wir lesen die erste Person und ersetzen ihre Zeit durch K (ihre Zeit). Wir fügen dies dann der Vorderseite der Eingabe hinzu.
  • Wir führen dann einige Zeichenkettenoperationen durch, um eine Liste von Namen und eine Liste von Zeiten zu erhalten, wie z [782 5 3 6 12] .
  • Durch das Sammeln dieser Liste erhalten wir [782 787 790 796 808] die Zeiten, zu denen alle gekommen sind.
  • Der kürzeste Weg, um herauszufinden, wer zu spät ist, besteht darin, die Startzeit in das Array einzufügen und sie dann neu zu sortieren, um sie dort zu platzieren, wo sie sein sollte. Wir finden dann den Index, um herauszufinden, wo er platziert ist, und schneiden dann die Liste der Namen aus diesem Index heraus.

2

JavaScript, 285 283 Bytes

Übernimmt die Liste der Gäste iund die pPartyzeit in der Currysyntax (i)(p). Gibt eine durch Kommas getrennte Liste von Namen zurück, z 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()}

Ich weiß, dass es ziemlich lang ist und momentan mit ziemlicher Sicherheit der letzte Platz ist, aber genau das könnte ich mir einfallen lassen.

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


Golf gespielt

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

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

Vollständiger Code

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

Releases

  • v1.1 - - 2 bytes- Dank VisualMelon
  • v1.0 - 269 bytes- Anfangslösung.

Anmerkungen

  • Ausgabeformat: Gibt die durch Leerzeichen getrennten Namen aus

Sie können ein paar Bytes sparen, indem Sie eine using D=System.DateTime;Direktive hinzufügen (vergessen Sie nicht, das vars zu ersetzen !). Sie sollten wirklich Typen für die Lambda-Parameter bereitstellen, um diesen Code vollständig eindeutig zu machen (dh (string l,string f)). Ich denke auch, dass es einen kleinen Fehler gibt, den Sie h>slieber als h>=s(1 Byte speichern!) Laut "(Jeder, der genau pünktlich ist, ist in Ordnung.)" Benötigen. Schaffst du das h.Ticks<1? Vielleicht finden Sie eine Nullable DateTimebilliger als die Verwendung DateTime.Min, aber ich habe hier nicht die vollständigen Auswirkungen überprüft. Mit der using-Klausel ==D.Minsollte das auch funktionieren.
VisualMelon

Über die Verwendung bezweifle ich, dass ich damit noch einen Lambda-Ausdruck abziehen kann. Ich bin mir ziemlich sicher, dass ich es nicht im Mid-Code hinzufügen kann . Explizite Lambda-Typen sind eine andere Sache, die ich noch nie gesehen habe, und ich habe sie mir vorgenommen - wenn es illegal ist , sagen Sie es, aber selbst die Mods haben noch nichts gesagt, vielleicht ist es in Ordnung ?. h>sIch werde das machen. h.Ticks<1und dieses auch.
Auhmaan

Ich bin zuversichtlich, dass wir dies zulassen, usingsund bei Lambdas kann ich nichts finden, was dies explizit auf Meta ausdrückt, aber diese Frage deutet nachdrücklich darauf hin, dass dies zulässig ist. Es besteht ein vernünftiger Konsens darüber, dass explizite Parametertypen erforderlich sein sollten (ich sollte hinzufügen, dass ich fest dafür bin). Im Übrigen sind Mods dazu da, die Dinge aus der Sicht von SE zivil zu halten und nicht die eigenen Regeln von PPCG durchzusetzen.
VisualMelon

Ich bin ein bisschen gegen die usings, vor allem, weil ich dann das Gefühl hätte, dass es einen vollständigen Code erfordern würde, und deshalb sage ich, ich bezweifle, dass ich eine Funktion als Lösung durchziehen könnte - vielleicht zwei Blöcke hinzufügen, einen für usings und einen anderen für die Lambda-Funktion? Über den Konsens denke ich, das Hinzufügen der fehlenden Func<...> f = ...;würde es lösen, obwohl der vollständige Name angegeben werden sollteSystem.Func<...> f = ...;
auhmaan

Vielleicht ist es besser, string swenn Sie nur eine gut benannte Funktion haben (nur mit C # 7 (6? Ich kann mich nicht erinnern) -Syntax), wenn Sie Lambdas und Usings nicht mischen möchten.
VisualMelon

2

CJam , 43 41 Bytes

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

Probieren Sie es online!

Erläuterung

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

Erster Codegolf des Jahres sollte für mich noch golffähig sein.

Bearbeiten: 5 Bytes mit einer Kurzform für gespeichert 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

Erklärungen

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                                 

Wenn Sie diesen Code ausprobieren möchten, können Sie das folgende Snippet verwenden

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, danke an 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]));}

Ausführliches Live

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
Nettes Golfen (für Java.) Benötigen Sie den Abstand zwischen String[] n,und String[] a?
programmer5000

@ programmer5000 nein, ich habe auch die stundenvariable entfernt und sie als minuten akkumuliert.
Khaled.K

1
Sie können ersetzen Integer.parseInt(n)mit new Short(n). Und basierend auf den Kommentaren der Herausforderung, LisaBobist auch eine gültige Ausgabe, so dass Sie das ändern können , printlnzu print.
Kevin Cruijssen

1

Batch, 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

Übernimmt die Eingabe für STDIN. Erste Zeile ist die Startzeit der Party, dann die Gästeliste. Verwendet @ Arnauld's Trick, um hh: mm in Minuten umzuwandeln.

Batchs bevorzugte Eingabe hierfür wäre eine Reihe von Befehlszeilenparametern (beginnend mit der Uhrzeit der Party, dann jeder Gast und jede Uhrzeit als separate Argumente). Dies würde nur 129 Bytes dauern:

@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, 170 bis 160 Byte

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}

Probieren Sie es online!


Besser spät als nie!
programmer5000

Ich bin heute in der Ruhe und habe etwas Zeit für ein bisschen Spaß
bisschen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.