Geç olsun güç olmasın!


12

Programınız / fonksiyonunuz vb. 2 giriş alacaktır. Birincisi, partime kimin ne zaman geldiğinin bir listesi olacak. Misal:

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

Bu ne anlama geliyor? Bu, Kevin'in önce partime (13:02, 24 saat sonra), ardından 5 dakika sonra Ruby'ye, daha sonra Sam 3 dakika sonra, Lisa'ya 6 dakika sonra ve son Bob 12 dakika sonra geldiği anlamına gelir.

İkinci girdi partim başladığında olacak. Misal:

13:15

(24 saat). Çıktınız geç kalmış olanların listesi olmalıdır . (Tam zamanında olan herkes iyidir.) Örnek hesaplamalar (örneğin, bunların çıktısını almayın)

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

Lisa ve Bob geldi 13:15, bu nedenle bu program "Lisa, Bob" yazdırmak gerekir.

Girdi varsayımları

  • Giriş 1 her zaman bir ad (normal ifade [A-Z][a-z]*), sonra bir boşluk, ardından hours:minutesilk satırdaki formda 24 saatlik bir süre , ardından bir sonraki satırda bir ad, bir boşluk ve bir pozitif tam sayı (dakika sayısı sonra) olacaktır. . Her zaman en az 1 satır olacaktır.
  • İsterseniz, satır 1 yerine başka bir karakterle giriş 1'i alabilirsiniz.
  • Giriş 2 biçiminde olacaktır hours:minutes.
  • İsterseniz, girişlerinizi herhangi bir karakterle ayrılmış bir dize olarak alabilirsiniz. Bu isteğe bağlıdır.
  • Gün geçidi için endişelenme. Partilerim asla peşinden gitmez 23:59.

Çıktı kuralları

  • Çıktı bir işlev döndürme değeri veya STDIN'e, bir dosyaya vb. Yansıtılan bir dize olabilir. Bir dize veya dizi / liste döndürmeniz gerekir.
    • Bir dizeyi döndürürseniz, alfasayısal olmayan sınırlayıcılarla ayrılmış, geç kalan (sıralamanın önemi olmayan) her kişi olmalıdır.
    • Bir dizi / liste döndürürseniz, geç kalan herkesin bir listesi olmalıdır.

2
Katı giriş formatı gerekli mi? Örneğin, ilk girdi, her biri iki veri öğesini içeren bir "satır" olan bir liste listesi olabilir mi?
Jonathan Allan

"Giriş 1 her zaman bir ad olacaktır (regex [A-Z][a-z]*)" Bu, adların boş olabileceğini gösteriyor mu?
HyperNeutrino

2
"Evet, katı giriş formatı gerekli" demek istediğinizi varsayalım.
Jonathan Allan

2
Sıkı giriş biçimi bu sorun daha az ilginç kılan
Luis Mendo

3
"Partilerim asla 11:59'dan sonra gitmezler." demek istiyorsun 23:59?
tsh

Yanıtlar:


3

MATL , 31 bayt

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

İlk girdi satır sonu yerine boşluk kullanır (sınama tarafından izin verilir).

Çıktı, ayırıcı olarak satır sonu kullanır.

Çevrimiçi deneyin!

açıklama

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 bayt

Neil sayesinde 1 bayt kaydedildi

Konukların listesini lve hsözdiziminde parti zamanını alır (l)(h). Listede bir satır sonu olması beklenir. Gibi boşluklarla ayrılmış bir ad listesi döndürür Lisa Bob.

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

Biçimlendirilmiş ve yorumlanmış

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

gösteri

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


Akıllı çözüm! +1. Benimki çok uzak ....... :(
Arjun

Çalışmıyor mu (.*) (.*)\n?
Neil

@Neil Varsayılan olarak açgözlü olmaktan ilki (.*), tüm çizgiyle eşleşir.
Arnauld

O zaman uzay neyle uyuşur?
Neil

@Neil Oh, üzgünüm, haklısın.
Arnauld

6

PHP, 118 98 95 91 bayt

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

komut satırı bağımsız değişkenlerinden girdi alır (isterseniz satırlarla ayrılmış satırlar olarak yorumlayabilirsiniz); adları sınırlayıcı olmadan yazdırır. Çevrimiçi olarak çalıştırın -rveya test edin .

düzenleme 1: doğrudan baskı ile 20 bayt kaydetti
düzenleme 2: sınırlayıcı kaldırarak 3 bayt kaydetti
düzenleme 3: düz tamsayılar için geçerli tarihler istismar ederek 4 bayt kaydettistrtotime

Yıkmak

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 bayt

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

Çevrimiçi deneyin


5

JavaScript ES6, 185 bayt

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

Çevrimiçi deneyin!

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


Spesifikasyondan söyleyebildiğim kadarıyla giriş formu daha katı olabilir.
Jonathan Allan

Sanırım şimdi doğru.
powelles

Evet - Ben de girdi kesinliği hakkında sorular sordum.
Jonathan Allan

... aslında girdilerinizde zamanlar var, olması gereken ofsetler değilf('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@JonathanAllan Teşekkürler. Şimdi anladım.
powelles

4

PowerShell , 215 196 , 180 bayt

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

Çevrimiçi deneyin!

Kabaca 1/3 giriş ayrıştırma, bu yüzden daha ne kadar golf emin değilim.

Girişi Alır $aisimleri ve süreleri / dakikalık bir virgülle ayrılmış dize olarak ve $byanı hh:mmdize olarak. İlk olarak, -split $aüzerine ,, içine ilk sonucunu saklamak $xve içine kalan $abir açık yeniden bulutları yüzünden $abir şekilde array(böylece döngü sonra düzgün çalıştığını). Bizim hashtable'a başlatmak $z, set $ive $jolmaya $x -splitboşluk üzerinde ve set $z[$i]olmak datearasında $j(içine saklanan $ysonra kullanılmak üzere).

Sonra geri kalanını dolaşıyoruz $a. Her yineleme, benzer yapıyoruz - -splitboşluktaki dize, uygun $zdizini şu anda bulunduğumuz yerden çok daha fazla dakika olarak ayarlayın. Bu , yerine yerine bazı baytları kaydetmek için kısaltılmış bir özellik adı hilesi kullanır .|% *es $j.AddMinutes($j)

Son olarak, .GetEnumerator()bizim Hashtable (yine işe kullanarak) ve Where-Objectbir olanlarda girdileri seçmek valueolduğunu -greater than $b(yani onlar partiye geç kaldık). Daha sonra sadece .Namebunların seçimini yaparız . Çıktı, varsayılanın Write-Outputarasına satırsonu ekleyen örtülü bir dizidir .

Briantist sayesinde bana [dizi] 'nin bir şey olduğunu hatırlattığı için bir demet kaydedildi. Ve kısaltılmış mülk adı ipucu için bir sürü daha.


Bunu çok az okudum ve test ettiğimi itiraf ediyorum, ama yapamaz$x,[array]$a=$a-split',' mısın?
briantist

1
@briantist Evet, teşekkür ederim. Birden fazla atamada virgül operatörünü kullanmanın bir yolunu bulmaya çalıştım ve işe yaramıyordu. Bunun [array]geçerli bir oyuncu olduğunu tamamen unutmuştum . Haha. Çok fazla golf sanırım.
AdmBorkBork

Dışarı testine zor olacağını bu yüzden mobil yaşıyorum ama sanırım GetEnumeratorve AddMinutesiyi adaylardır %yöntem sözdizimi
briantist

@briantist Yep. Başka bir 16 kazanır. Teşekkürler!
AdmBorkBork

4

Python 2 , 140.148, 144 bayt

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,

Çevrimiçi deneyin!

Giriş Formatı:

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

Dakika taşmasını doğru işlemez: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'Lisa ve Bob hala geç kalsalar bile hiçbir şey yazdırmaz.
L3viathan

1
Ah evet. Bir aksaklık vardı! Onu düzeltti. Teşekkürler!
Keerthana Prabhakaran

3

Bash, 135 124 115 bayt

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

Çevrimiçi deneyin!


3

CJam, 66 54 58 54 51 49 46 bayt

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

Giriş 1, STDIN üzerinden verilir, giriş 2, yığın üzerinde bir dize olarak verilir. Çıktı, yığındaki bir dizidir. Giriş 1 için ayırıcı bir boşluktur, ör Kevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12.

Yığın izleme:

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

Açıklama:

  • Prosedür Kbir saat hh:mmile gece yarısından bu yana kaç dakika olduğunu gösteren bir sayı arasında dönüşüm sağlar .
  • İlk kişiyi okur ve zamanlarını K (zamanlarıyla) ile değiştiririz. Daha sonra bunu girişin önüne ekleriz.
  • Daha sonra, bir ad listesi ve bir zaman listesi almak için bazı dize işlemlerini önceden yaparız [782 5 3 6 12].
  • Bu listeyi [782 787 790 796 808]toplayarak, herkesin geldiği zamanları veririz .
  • Kimin geç olduğunu bulmanın en kısa yolu, başlangıç ​​zamanını diziye eklemek ve ardından olması gereken yere yerleştirmek için yeniden sıralamaktır. Daha sonra, nereye yerleştirileceğini bulmak için dizini buluruz ve daha sonra bu dizinden adların listesini çıkarırız.

2

JavaScript, 285 283 bayt

Konukların listesini ive psözdiziminde parti zamanını alır (i)(p). Gibi virgülle ayrılmış bir ad listesi döndürür 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()}

Oldukça uzun ve şu anda son olarak adil bir marjla biliyorum, ama bu benim ortaya çıkabileceğim şeydi.

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 bayt


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

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

Okunmamış okunabilir

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

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

Salıverme

  • v1.1 - - 2 bytes- Teşekkürler VisualMelon'a
  • v1.0 - 269 bytes- İlk çözüm.

notlar

  • Çıktı biçimi: Adları boşluklarla ayrılmış olarak verir

Bir using D=System.DateTime;yönerge ekleyerek birkaç bayt kaydedebilirsiniz ( vars'yi değiştirmeyi unutmayın !). Bu kodu tamamen açık hale getirmek için lambda parametreleri için gerçekten türler sağlamalısınız (yani (string l,string f)). Ben de hafif bir hata olduğunu düşünüyorum, h>syerine h>=s(1byte tasarruf!) Yerine "(Tam zamanında herkes gayet iyi.)" Yapabilir misin h.Ticks<1? Kullanılamayacak kadar DateTimeucuz bir nullable bulabilirsiniz DateTime.Min, ancak burada tüm sonuçları kontrol etmedim. Kullanma yan tümcesi ile de ==D.Minçalışmalıdır.
VisualMelon

Kullanımı hakkında ben hala onunla bir lambda ifade çekebilir şüpheliyim. Orta kod içine ekleyemeyeceğime eminim . Açık lambda türleri , insanların bunu yaptığını görmediğim başka bir şeydir ve bununla gittim - eğer yasadışı ise , öyle söyleyin, ama modlar bile bir şey söylemedi, belki sorun değil mi? h>sBunu ben yaparım. h.Ticks<1ve bu da.
auhmaan

İzin verdiğimizden eminim usingsve lambdas ile bunu açıkça metada söyleyen hiçbir şey bulamıyorum, ancak bu soru kesinlikle izin verildiğini gösteriyor. Orada makul bir uzlaşmaya açık parametre türleri (I lehine sıkıca olduğumu ben eklemek gerekir) gereklidir gerektiğini. Bununla birlikte, Mods, PPCG'nin kendi kurallarını zorlamak değil, şeyleri SE'nin bakış açısından sivil tutmak için var.
VisualMelon

Ben usingsçoğunlukla karşı, ben daha sonra tam bir kod gerektireceğini hissediyorum çünkü bu yüzden bana bir çözüm olarak bir işlevi çıkarmak şüpheli olduğunu söyleyerek çünkü - belki bir usings ve diğeri için iki blok ekleyerek lambda işlevi? Fikir birliği hakkında, Func<...> f = ...;tam adının belirtilmesi System.Func<...> f = ...;
gerekse

string sLambdasları ve kullanımları karıştırmak istemiyorsanız, sadece iyi adlandırılmış bir işleve sahip olmanız daha iyi olabilir (sadece C # 7 (6? Hatırlamıyorum) sözdizimi ekler ).
VisualMelon

2

CJam , 43 41 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

Benim için yılın ilk kod golfü yine de golf edilebilir olmalı.

Düzenleme: için bir kısayol kullanarak kaydedilmiş 5 bayt 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

açıklamalar

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                                 

bu kodu denemek istiyorsanız, aşağıdaki snippet'i kullanabilirsiniz

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 bayt

  • -9 bayt, @KevinCruijssen sayesinde
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]));}

Detaylı Canlı

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
Güzel golf (Java için.) Eğer arasındaki boşluğu gerekiyor mu String[] n,ve String[] a?
programmer5000

@ programmer5000 no, saat değişkenini de kaldırdım ve dakika olarak biriktirdim.
Khaled.K

1
Sen yerini alabilir Integer.parseInt(n)ile new Short(n). Ve zorluk açıklamalara dayanarak LisaBobdeğiştirmek, böylece de geçerli bir çıkıştır printlniçin print.
Kevin Cruijssen

1

Toplu işlem, 163 bayt

@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

STDIN üzerine girdi alır. İlk satır, partinin başlangıç ​​zamanı, ardından davetliler listesidir. S: mm'yi dakikaya dönüştürmek için @ Arnauld'un numarasını kullanır.

Batch'ın bunun için tercih ettiği girdi, bir dizi komut satırı parametresi olarak olacaktır (partinin saatinden başlayarak her misafir ve saat ayrı bağımsız değişkenler olarak başlar). Bu yalnızca 129 bayt sürer:

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

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

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}

Çevrimiçi deneyin!


Geç olsun güç olmasın!
programmer5000

Bugün dinleniyorum, bu nedenle biraz eğlenmek için biraz zamanım var
Andrei Odegov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.