Lebih baik terlambat daripada tidak sama sekali!


12

Program / fungsi Anda, dll. Akan mengambil 2 input. Yang pertama adalah daftar siapa yang datang ke pestaku dan kapan. Contoh:

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

Apa artinya? Itu berarti bahwa Kevin pertama-tama datang ke pestaku (pukul 13:02, waktu 24 jam), kemudian Ruby 5 menit kemudian, kemudian Sam 3 menit kemudian, kemudian Lisa 6 menit kemudian, dan terakhir Bob 12 menit kemudian.

Input kedua adalah ketika pesta saya dimulai. Contoh:

13:15

(Waktu 24 jam). Keluaran Anda haruslah daftar orang-orang yang terlambat. (Siapa pun yang tepat waktu baik-baik saja.) Contoh perhitungan (hanya misalnya, jangan tampilkan ini)

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

Lisa dan Bob tiba setelah 13:15itu, oleh karena itu program ini harus mencetak "Lisa, Bob".

Masukan asumsi

  • Input 1 akan selalu berupa nama (regex [A-Z][a-z]*), lalu spasi, lalu waktu 24 jam dalam formulir hours:minutesdi baris pertama, lalu nama, spasi, dan bilangan bulat positif (jumlah menit kemudian) pada baris berikutnya . Akan selalu ada setidaknya 1 baris.
  • Jika ingin, Anda dapat mengambil input 1 dengan karakter lain alih-alih sebagai pemisah baris.
  • Input 2 akan dalam format hours:minutes.
  • Anda dapat mengambil input Anda sebagai satu string yang dipisahkan oleh karakter apa pun jika Anda mau. Ini opsional.
  • Jangan khawatir tentang crossover hari. Pesta saya tidak pernah berakhir 23:59.

Aturan keluaran

  • Output dapat berupa nilai pengembalian fungsi atau string yang digemakan ke STDIN, file, dll. Anda harus mengembalikan string atau array / daftar.
    • Jika Anda mengembalikan string, itu harus setiap orang yang terlambat (urutan tidak masalah), dipisahkan oleh pembatas non-alfanumerik.
    • Jika Anda mengembalikan array / daftar, itu harus daftar semua orang yang terlambat.

2
Apakah format input yang ketat diperlukan? Bisakah, misalnya, input pertama menjadi daftar daftar, masing-masing menjadi "baris" yang berisi dua item data?
Jonathan Allan

"Input 1 akan selalu menjadi nama (regex [A-Z][a-z]*)" Apakah ini menunjukkan bahwa nama dapat kosong?
HyperNeutrino

2
Saya berasumsi Anda berarti "ya format input yang ketat diperlukan".
Jonathan Allan

2
Format input yang ketat membuat tantangan ini kurang menarik
Luis Mendo

3
"Pesta saya tidak pernah setelah 11:59." maksudmu 23:59?
tsh

Jawaban:


3

MATL , 31 byte

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

Input pertama menggunakan spasi alih-alih jeda baris (diizinkan oleh tantangan).

Output menggunakan jeda baris sebagai pemisah.

Cobalah online!

Penjelasan

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 byte

Disimpan 1 byte berkat Neil

Membawa daftar tamu ldan waktu pesta hdalam sintaks currying (l)(h). Mengharapkan linebreak tambahan pada daftar. Mengembalikan daftar nama yang dipisahkan oleh spasi seperti Lisa Bob.

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

Diformat dan dikomentari

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


Solusi pintar! +1. Milik saya jauh ....... :(
Arjun

Tidak (.*) (.*)\nbekerja
Neil

@Neil Menjadi serakah secara default, yang pertama (.*)akan cocok dengan seluruh baris.
Arnauld

Lalu apa yang cocok dengan ruang angkasa?
Neil

@Neil Oh, maaf, kamu benar.
Arnauld

6

PHP, 118 98 95 91 byte

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

mengambil input dari argumen baris perintah (Anda dapat menafsirkannya sebagai garis yang dipisahkan oleh spasi jika Anda mau); mencetak nama tanpa pembatas. Jalankan dengan -ratau coba online .

edit 1: disimpan 20 byte dengan pencetakan langsung
edit 2: disimpan 3 byte dengan menghapus pembatas
edit 3: disimpan 4 byte dengan mengeksploitasi bahwa integer polos bukan tanggal yang valid untukstrtotime

kerusakan

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 byte

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

Cobalah online


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

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


Sejauh yang saya tahu dari spesifikasi formulir input mungkin lebih ketat.
Jonathan Allan

Saya pikir itu benar sekarang.
powelles

Yap - Saya juga bertanya tentang keketatan input.
Jonathan Allan

... sebenarnya Anda memiliki waktu dalam masukan Anda, bukan yang seharusnyaf('Kevin 13:02\nRuby 5\nSam 3...
Jonathan Allan

1
@Jonathan Allan Terima kasih. Mengerti sekarang
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

Cobalah online!

Kira-kira 1/3 dari ini adalah input parsing, jadi saya tidak yakin seberapa jauh saya bisa golf itu.

Mengambil input $asebagai string nama dan waktu / menit yang dibatasi koma, dan $bsebagai hh:mmstring. Pertama, kita -split $aaktif ,, simpan hasil pertama ke dalam $xdan sisanya ke dalam $a, dengan gips ulang eksplisit $asebagai array(sehingga loop kemudian bekerja dengan baik). Kita inisialisasi hashtable kita $z, atur $idan $jberada $x -splitdi whitespace, dan atur $z[$i]menjadi dateof the $j(disimpan $yuntuk digunakan nanti).

Kemudian kami mengulangi sisanya $a. Setiap iterasi, kami melakukan hal yang sama - -splitstring di whitespace, mengatur $zindeks yang sesuai menjadi lebih banyak menit di luar tempat kami berada saat ini. Ini menggunakan trik nama properti singkat untuk menyimpan beberapa byte, menggunakan |% *es $jbukan .AddMinutes($j).

Akhirnya, kami .GetEnumerator()(lagi menggunakan trik) dari hashtable kami, dan Where-Objectpilih entri-entri dengan valueyang -greater than $b(yaitu, mereka terlambat ke pesta). Kami kemudian memilih hanya .Namedaripadanya. Output adalah sebagai array implisit, yang default Write-Outputmenyisipkan baris baru di antara.

Menyelamatkan banyak terima kasih kepada briantis untuk mengingatkan saya bahwa [array] adalah suatu hal. Dan banyak lagi untuk tip nama properti singkat.


Saya akui saya membaca dan mengetes ini dengan minimal, tetapi, tidak bisakah Anda melakukannya$x,[array]$a=$a-split',' ?
briantist

1
@ Briantist Ya, terima kasih. Saya terus berusaha menemukan cara untuk menggunakan koma-operator dalam penugasan berganda, dan ternyata tidak berhasil. Saya benar-benar lupa bahwa itu [array]adalah pemeran yang valid. Ha ha. Terlalu banyak bermain golf, kurasa.
AdmBorkBork

Saya menggunakan ponsel jadi sulit untuk menguji tetapi saya pikir GetEnumeratordan AddMinutesmerupakan kandidat yang baik untuk %sintaksis metode
briantist

@bantri Yap. Menghemat 16 lainnya. Terima kasih!
AdmBorkBork

4

Python 2 , 140.148, 144 byte

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,

Cobalah online!

Masukkan format:

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

Tidak benar menangani menit overflow: 'Kevin 13:47;Ruby 5;Sam 3;Lisa 6;Bob 12;14:00'tidak mencetak apa-apa, meskipun Lisa dan Bob masih terlambat.
L3viathan

1
Oh ya. Ada kesalahan! Memperbaikinya. Terimakasih!
Keerthana Prabhakaran

3

Bash, 135 124 115 byte

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

Cobalah online!


3

CJam, 66 54 58 54 51 49 46 byte

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

Input 1 diberikan melalui STDIN, input 2 diberikan sebagai string pada stack. Output adalah array di stack. Pemisah untuk input 1 adalah spasi, mis Kevin 13:02 Ruby 5 Sam 3 Lisa 6 Bob 12.

Jejak tumpukan:

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

Penjelasan:

  • Prosedur Kmengubah antara waktu hh:mmdan angka yang mewakili berapa menit sejak tengah malam.
  • Kami membaca orang pertama dan mengganti waktu mereka dengan K (waktu mereka). Kami kemudian menambahkan ini ke depan input.
  • Kami kemudian membentuk beberapa operasi string untuk mendapatkan daftar nama dan daftar waktu, seperti [782 5 3 6 12].
  • Dengan mengakumulasikan daftar ini, kita dapat [782 787 790 796 808], yang memberi waktu ketika semua orang datang.
  • Cara terpendek untuk menemukan siapa yang terlambat adalah memasukkan waktu mulai ke dalam array dan kemudian mengurutkannya kembali untuk meletakkannya di tempat yang seharusnya. Kami kemudian menemukan indeks untuk mencari tahu di mana tempatnya, dan kemudian mengiris daftar nama dari indeks itu.

2

JavaScript, 285 283 byte

Membawa daftar tamu idan waktu pesta pdalam sintaks currying (i)(p). Mengembalikan daftar nama yang dipisahkan koma seperti 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()}

Saya tahu ini cukup panjang dan saat ini berada di tempat terakhir dengan margin yang adil, tapi itulah yang bisa saya kemukakan.

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 byte


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

Tidak disatukan

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

Tidak terbaca dibaca

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

Kode lengkap

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

Rilis

  • v1.1 - - 2 bytes- Terima kasih untuk VisualMelon
  • v1.0 - 269 bytes- Solusi awal.

Catatan

  • Format keluaran: Keluaran nama yang dipisahkan oleh spasi

Anda dapat menyimpan beberapa byte dengan menambahkan using D=System.DateTime;arahan (jangan lupa untuk mengganti vars!). Anda harus benar-benar memberikan tipe untuk parameter lambda untuk membuat kode ini sama sekali tidak ambigu (yaitu (string l,string f)). Saya juga berpikir ada sedikit bug, Anda perlu h>sdaripada h>=s(tabungan 1byte!) Sesuai "(Siapa pun yang tepat waktu baik-baik saja.)". Bisakah kamu melakukannya h.Ticks<1? Anda mungkin menemukan nullable DateTimelebih murah daripada menggunakan DateTime.Min, tetapi saya belum memeriksa implikasi lengkapnya di sini. Dengan menggunakan klausa, ==D.Minharus bekerja juga.
VisualMelon

Tentang penggunaannya, saya ragu saya masih bisa menampilkan ekspresi lambda. Saya cukup yakin saya tidak bisa menambahkannya di mid-code . Tipe lambda yang eksplisit adalah hal lain yang belum pernah saya lihat orang melakukannya, dan saya setuju - jika itu ilegal , katakan saja, tetapi bahkan para mod tidak mengatakan apa-apa, mungkin tidak apa-apa ?. h>sSaya akan melakukannya. h.Ticks<1dan yang ini juga.
auhmaan

Saya yakin kami mengizinkan usingsdan dengan lambdas, saya tidak dapat menemukan apa pun yang mengatakan ini secara eksplisit pada meta, tetapi pertanyaan ini sangat menyarankan itu diizinkan. Ada konsensus yang masuk akal bahwa jenis parameter eksplisit harus diminta (saya harus menambahkan bahwa saya mendukung). Omong-omong, Mod ada untuk menjaga hal-hal sipil dari perspektif SE, bukan untuk menegakkan aturan PPCG sendiri.
VisualMelon

Saya agak menentang usings, sebagian besar karena saya kemudian akan merasa bahwa itu akan memerlukan kode lengkap, maka saya mengatakan bahwa saya ragu saya dapat melakukan fungsi sebagai solusi - mungkin menambahkan dua blok, satu untuk usings dan satu lagi untuk fungsi lambda? Tentang konsensus, saya pikir menambahkan yang hilang Func<...> f = ...;akan menyelesaikannya, meskipun harus ditentukan nama lengkapnyaSystem.Func<...> f = ...;
auhmaan

Anda mungkin lebih baik hanya memiliki fungsi yang bernama baik (hanya menambahkan string sdengan C # 7 (6? Saya tidak ingat) sintaks) jika Anda lebih suka tidak mencampur lambdas dan usings.
VisualMelon

2

CJam , 43 41 byte

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

Cobalah online!

Penjelasan

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

Codegolf pertama tahun ini bagi saya, masih harus golf.

Sunting: Disimpan 5 Bytes dengan menggunakan singkatan untuk 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

Penjelasan

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                                 

jika Anda ingin mencoba kode ini, Anda dapat menggunakan potongan berikut

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 byte

  • -9 byte, terima kasih kepada @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]));}

Detil 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
Golf yang bagus (untuk Jawa.) Apakah Anda memerlukan ruang di antara String[] n,dan String[] a?
programmer5000

@ programmer5000 tidak, saya juga menghapus variabel jam & menumpuknya dalam hitungan menit.
Khaled.K

1
Anda bisa menggantinya Integer.parseInt(n)dengan new Short(n). Dan berdasarkan komentar dari tantangan, LisaBobjuga merupakan output yang valid, sehingga Anda dapat mengubah printlnke print.
Kevin Cruijssen

1

Batch, 163 byte

@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

Mengambil input pada STDIN. Baris pertama adalah waktu mulai pesta, lalu daftar tamu. Menggunakan trik @ Arnauld untuk mengubah jam: mm menjadi menit.

Input Batch yang lebih disukai untuk ini adalah sebagai serangkaian parameter baris perintah (dimulai dengan waktu pesta, lalu setiap tamu dan waktu sebagai argumen terpisah). Ini hanya akan membutuhkan 129 byte:

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

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

Cobalah online!


Lebih baik terlambat daripada tidak sama sekali!
programmer5000

Karena itu saya istirahat hari ini bersenang
Andrei Odegov
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.