Lepiej późno niż wcale!


12

Twój program / funkcja itp. Zajmie 2 wejścia. Pierwszą będzie lista osób, które przyszły na moje przyjęcie i kiedy. Przykład:

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

Co to znaczy? Oznacza to, że Kevin najpierw przybył na moją imprezę (o 13:02, 24 godziny), potem Ruby 5 minut później, potem Sam 3 minuty później, a Lisa 6 minut później, a ostatni Bob 12 minut później.

Drugie wejście będzie, kiedy rozpocznie się moja impreza. Przykład:

13:15

(Czas 24-godzinny). Twój wynik musi być listą osób, które się spóźniły. (Każdy dokładnie na czas jest w porządku.) Przykładowe obliczenia (na przykład, nie wysyłaj ich)

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

Lisa i Bob przybyli później 13:15, dlatego ten program powinien wypisać „Lisa, Bob”.

Założenia wejściowe

  • Wejście 1 zawsze będzie nazwą (regex [A-Z][a-z]*), następnie spacją, następnie 24-godzinnym czasem w formie hours:minutesw pierwszym wierszu, a następnie nazwą, spacją i dodatnią liczbą całkowitą (liczba minut później) w następnych wierszach . Zawsze będzie co najmniej 1 linia.
  • Jeśli chcesz, możesz wprowadzić 1 z dowolnym innym znakiem zamiast podziału linii.
  • Wejście 2 będzie miało format hours:minutes.
  • Możesz wziąć swoje dane wejściowe jako jeden ciąg oddzielony dowolnym znakiem, jeśli chcesz. To jest opcjonalne.
  • Nie martw się o dzień crossovera. Moje imprezy nigdy nie później 23:59.

Reguły wyjściowe

  • Dane wyjściowe mogą być wartością zwracaną przez funkcję lub ciągiem echa do STDIN, pliku itp. Musisz zwrócić ciąg znaków lub tablicę / listę.
    • Jeśli zwrócisz ciąg, musi to być każda osoba, która się spóźniła (kolejność nie ma znaczenia), oddzielone dowolnym niealfanumerycznym separatorem.
    • Jeśli zwrócisz tablicę / listę, musi to być lista wszystkich spóźnionych.

2
Czy wymagany jest ścisły format wejściowy? Czy na przykład pierwszym wejściem może być lista list, z których każda jest „linią” zawierającą dwa elementy danych?
Jonathan Allan

„Wejście 1 zawsze będzie nazwą (regex [A-Z][a-z]*)” Czy to sugeruje, że nazwy mogą być puste?
HyperNeutrino

2
Zakładam, że miałeś na myśli „tak, ścisły format wejściowy jest konieczny”.
Jonathan Allan

2
Ścisły format wejściowy sprawia, że ​​to wyzwanie jest mniej interesujące
Luis Mendo

3
„Moje imprezy nigdy po 11:59”. masz na myśli 23:59?
tsh

Odpowiedzi:


3

MATL , 31 bajtów

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

Pierwsze wejście wykorzystuje spację zamiast podziału linii (dozwolone przez wyzwanie).

Wyjście używa podziału linii jako separatora.

Wypróbuj online!

Wyjaśnienie

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 bajtów

Zaoszczędził 1 bajt dzięki Neilowi

Pobiera listę gości li czas imprezy hw składni curry (l)(h). Oczekuje końca linii na liście. Zwraca rozdzieloną spacjami listę nazw, takich jak Lisa Bob.

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

Sformatowane i skomentowane

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

Próbny

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


Sprytne rozwiązanie! +1. Mój jest daleko ....... :(
Arjun,

Nie (.*) (.*)\ndziała?
Neil,

@ Neil Domyślnie chciwy, pierwszy pasowałby (.*)do całej linii.
Arnauld

W takim razie co pasowałoby do tego miejsca?
Neil,

@Neil Oh, przepraszam, masz rację.
Arnauld

6

PHP, 118 98 95 91 bajtów

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

pobiera dane wejściowe z argumentów wiersza poleceń (jeśli chcesz, możesz to interpretować jako linie oddzielone spacjami); drukuje nazwy bez ogranicznika. Uruchom go -rlub przetestuj online .

edycja 1: zapisane 20 bajtów z drukowaniem bezpośrednim
edycja 2: zapisane 3 bajty poprzez usunięcie separatora
edycja 3: zapisane 4 bajty przez wykorzystanie tego, że zwykłe liczby całkowite nie są prawidłowymi datamistrtotime

awaria

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 bajtów

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

Wypróbuj online


5

JavaScript ES6, 185 bajtów

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

Wypróbuj 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'))


O ile mogę stwierdzić na podstawie specyfikacji, formularz wejściowy może być bardziej rygorystyczny.
Jonathan Allan

Myślę, że teraz jest poprawne.
powelles

Tak - zapytałem również o ścisłość danych wejściowych.
Jonathan Allan

... właściwie masz czas w swoich danych wejściowych, a nie przesunięcia, które powinny byćf('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@JonathanAllan Thanks. Mam to teraz.
powelles

4

PowerShell , 215 196 180 bajtów

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

Wypróbuj online!

Mniej więcej 1/3 tego jest parsowaniem danych wejściowych, więc nie jestem pewien, jak dalece mogę grać w golfa.

Pobiera dane wejściowe $ajako rozdzielony przecinkami ciąg nazw i czasów / minut oraz $bjako hh:mmciąg znaków. Po pierwsze, mamy -split $ana ,przechowywać pierwszy wynik w $xi pozostała w $a, z wyraźną ponownej obsady $ajako array(tak, że pętla później działa prawidłowo). My, zainicjować naszą hashtable $z, zestaw $ii $jbyć $x -splitna spacji i ustawić $z[$i]się być dateod $j(przechowywany w $ydo wykorzystania później).

Następnie przeglądamy pozostałe $a. Z każdą iteracją robimy podobnie - -splitciąg znaków w białych znakach ustawia odpowiedni $zindeks tak, aby był o wiele więcej poza miejscem, w którym się obecnie znajdujemy. Używa skróconej nazwy sztuczki, aby zapisać niektóre bajty, używając |% *es $jzamiast .AddMinutes($j).

Wreszcie, .GetEnumerator()(ponownie stosując podstęp) naszego hashtable i Where-Objectwybierz te wpisy z valueto -greater than $b(tj, są one późno do partii). Następnie wybieramy tylko .Nameich. Dane wyjściowe mają postać niejawnej tablicy, między którą domyślnie Write-Outputwstawiane są znaki nowej linii.

Uratowałem sporo dzięki briantist za przypomnienie mi, że [tablica] to coś. I wiele innych za skróconą wskazówkę dotyczącą nazwy nieruchomości.


Przyznaję, że zrobiłem minimalne czytanie i testowanie tego, ale czy nie mógłbyś tego zrobić$x,[array]$a=$a-split',' ?
briantist

1
@briantist Tak, dziękuję. Próbowałem znaleźć sposób na użycie operatora przecinka w wielu zadaniach, ale to po prostu nie działało. Zupełnie zapomniałem, że [array]to ważna obsada. Ha ha. Chyba za dużo golfa.
AdmBorkBork

Jestem na telefonie komórkowym, więc trudno byłoby przetestować, ale myślę, że GetEnumeratori jestem AddMinutesdobrym kandydatem do %składni metody
briantist

@briantist Yep. Zapisuje kolejne 16. Dzięki!
AdmBorkBork

4

Python 2 , 140,148, 144 bajtów

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,

Wypróbuj online!

Format wejściowy:

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

Nie obsługuje poprawnie przepełnienia minut: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'nic nie drukuje, nawet jeśli Lisa i Bob są jeszcze spóźnieni.
L3viathan

1
o tak. Była usterka! Naprawione. Dzięki Ci!
Keerthana Prabhakaran

3

Bash, 135 124 115 bajtów

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

Wypróbuj online!


3

CJam, 66 54 58 54 51 49 46 bajtów

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

Dane wejściowe 1 są podawane przez STDIN, dane wejściowe 2 są podawane jako ciąg znaków na stosie. Dane wyjściowe to tablica na stosie. Separator dla wejścia 1 to spacja, np Kevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12.

Ślad stosu:

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

Wyjaśnienie:

  • Procedura Kkonwertuje czas hh:mmi liczbę reprezentującą liczbę minut od północy.
  • Czytamy pierwszą osobę i zamieniamy jej czas na K (ich czas). Następnie dodajemy to na początku wejścia.
  • Następnie wykonujemy niektóre operacje na łańcuchach, aby uzyskać listę nazwisk i listę czasów, na przykład [782 5 3 6 12].
  • Gromadząc tę ​​listę, otrzymujemy [782 787 790 796 808], co daje czasy, które wszyscy przyszli.
  • Najkrótszym sposobem ustalenia, kto się spóźnia, jest wstawienie godziny rozpoczęcia do tablicy, a następnie ponowne posortowanie, aby umieścić ją tam, gdzie powinna być. Następnie znajdujemy indeks, aby dowiedzieć się, gdzie się on znajduje, a następnie wycinamy listę nazw z tego indeksu.

2

JavaScript, 285 283 bajty

Pobiera listę gości ii czas imprezy pw składni curry (i)(p). Zwraca listę nazw oddzielonych przecinkami, takich jak 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()}

Wiem, że jest dość długa i na ostatnim miejscu z dość dużym marginesem, ale to właśnie mogłem wymyślić.

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 bajtów


Grał w golfa

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

Nie golfił

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

Nieczytelny czytelny

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

Pełny kod

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

Wydawnictwa

  • v1.1 - - 2 bytes- Dzięki VisualMelon
  • v1.0 - 269 bytes- Wstępne rozwiązanie.

Notatki

  • Format wyjściowy: Wyświetla nazwy oddzielone spacjami

Możesz zaoszczędzić kilka bajtów, dodając using D=System.DateTime;dyrektywę (nie zapomnij zastąpić vars!). Powinieneś naprawdę podać typy parametrów lambda, aby ten kod był całkowicie jednoznaczny (tj (string l,string f).). Myślę również, że jest niewielki błąd, którego potrzebujesz ( h>szamiast 1 h>=sbajtu oszczędzania!) Zgodnie z „(Każdy dokładnie na czas jest w porządku.)”. Można to zrobić h.Ticks<1? Możesz znaleźć nullable DateTimetańsze niż używanie DateTime.Min, ale nie sprawdziłem tutaj pełnych implikacji. Z klauzulą ​​use ==D.Minpowinien również działać.
VisualMelon

Jeśli chodzi o używanie , wątpię, czy nadal potrafiłbym za jego pomocą uzyskać wyrażenie lambda. Jestem prawie pewien, że nie mogę tego dodać w połowie kodu . Jawne typy lambda to kolejna rzecz, której nie widziałem, że ludzie to robią, i poszedłem z tym - jeśli jest to nielegalne , powiedz tak, ale nawet modowie nic nie powiedzieli, może jest w porządku ?. h>sZrobię to. h.Ticks<1i ten też.
auhmaan

Jestem pewien, że zezwalamy usingsi tak z lambdami, nie mogę znaleźć niczego, co mówi to wprost na mecie, ale to pytanie zdecydowanie sugeruje, że jest dozwolone. Istnieje rozsądna zgoda co do tego, że powinny być wymagane jawne typy parametrów (należy dodać, że jestem zdecydowanie za). Nawiasem mówiąc, mody są po to, aby zachować cywilność z perspektywy SE, a nie egzekwować własne zasady PPCG.
VisualMelon

Jestem trochę przeciwny usings, głównie dlatego, że czułbym wtedy, że wymagałoby to pełnego kodu, stąd mówię, że wątpię, czy mógłbym pobrać funkcję jako rozwiązanie - może dodając dwa bloki, jeden dla usings, a drugi dla funkcja lambda? Jeśli chodzi o konsensus, myślę, że dodanie brakujących Func<...> f = ...;rozwiązałoby go, chociaż należy podać pełną nazwęSystem.Func<...> f = ...;
auhmaan

Lepiej jest mieć dobrze nazwaną funkcję (dodaje tylko string sze składnią C # 7 (6? Nie pamiętam)), jeśli wolisz nie mieszać lambd i usings.
VisualMelon

2

CJam , 43 41 bajtów

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

Wypróbuj online!

Wyjaśnienie

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 bajtów

Pierwszy codegolf tego roku powinien być dla mnie golfem.

Edycja: Zapisano 5 bajtów, używając skrótu dla 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

Objaśnienia

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                                 

jeśli chcesz wypróbować ten kod, możesz użyć następującego fragmentu kodu

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 bajtów

  • -9 bajtów, dzięki @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]));}

Szczegółowe na żywo

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
Niezła gra w golfa (dla Javy). Potrzebujesz przestrzeni między String[] n,i String[] a?
programista

@ programmer5000 nie, usunąłem również zmienną godzin i zgromadziłem je w minutach.
Khaled.K

1
Można wymienić Integer.parseInt(n)z new Short(n). Oraz na podstawie uwag wyzwanie, LisaBobto również ważne wyjście, więc można zmienić printlnna print.
Kevin Cruijssen

1

Partia, 163 bajty

@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

Pobiera dane wejściowe na STDIN. Pierwsza linia to godzina rozpoczęcia imprezy, a następnie lista gości. Wykorzystuje sztuczkę @ Arnauld do konwersji hh: mm na minuty.

Preferowane dane wejściowe Batcha to seria parametrów wiersza poleceń (zaczynając od czasu imprezy, a następnie każdego gościa i czasu jako osobnych argumentów). Zajmie to tylko 129 bajtów:

@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 bajtów

{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 160 bajtów

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}

Wypróbuj online!


Lepiej późno niż wcale!
programista

Dzisiaj odpoczywam, dlatego mam trochę czasu na zabawę
Andrei Odegov
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.