Katkat

Track Workers, Sessions, Promotions, and Bonus Pay

OtherSoftware Engineer · Online Assessment

Last updated

Implement worker sessions, current metadata, promotions, ordered filtering, and time-clipped compensation with historical rates and non-stacking double-pay intervals.

Implement worker_payroll(operations: string[][]) -> string[][], returning one string-array result for each operation. This operation encoding and the timing policies below are explicit practice choices because the reported assessment provides features rather than an exact API.

Constraints & Assumptions

  • At most 2000 operations and 200 workers. Names and levels are nonempty ASCII letters/digits/underscores. Worker names are unique and immutable.
  • Times are integer minutes from 0 through 1000000. Rates are integer cents per minute from 0 through 1000000. Use wide integers for compensation.
  • All inputs satisfy the preconditions below. No invalid-operation handling is required. Each worker alternates ENTER and LEAVE; all recorded sessions have positive duration and never overlap for that worker.
  • ADD, UPDATE, and PROMOTE occur while that worker is outside. A session keeps the rate in effect when it began. Updates do not change historical session pay.
  • All TOTAL queries occur when every worker is outside. All sessions relevant to the query have already been recorded. BONUS periods are global and may be added before a query; overlapping bonus periods form a union and never multiply pay more than twice.
  • Intervals are half-open [start,end). A TOTAL query clips every recorded session to the requested interval.

Operations and Results

  • ["ADD",name,level,rate]: add a worker; return ["OK"].
  • ["GET",name]: return [name,currentLevel,currentRate].
  • ["UPDATE",name,level,rate] and ["PROMOTE",name,newLevel,newRate]: replace the current level and rate; return ["OK"]. PROMOTE is a separately named business action with the same immediate update timing in this practice contract.
  • ["ENTER",name,time], ["LEAVE",name,time]: open or close a session; return ["OK"].
  • ["FILTER",field,value,sortField]: select current workers whose name, level, or rate equals value. Sort ascending by name, level, or numeric rate as specified by sortField, breaking ties by name. Return the selected names, possibly an empty array.
  • ["BONUS",start,end]: record a positive-length double-pay interval; return ["OK"].
  • ["TOTAL",start,end]: return [totalCents] for all workers combined, with no decimal point or leading zeroes except 0.

All integer arguments and results use ordinary base-10 strings. FILTER uses exact case-sensitive equality. The source does not require an asymptotically optimal data structure; explain the complexity of the representation you choose.

Example

operations = [["ADD","Ada","L1","10"],["ENTER","Ada","0"],
 ["LEAVE","Ada","10"],["BONUS","3","5"],["TOTAL","0","10"],
 ["PROMOTE","Ada","L2","20"],["GET","Ada"]]
result = [["OK"],["OK"],["OK"],["OK"],["120"],["OK"],["Ada","L2","20"]]

Hints

Hint 1

Preserve historical rates: A worker's current salary is insufficient to price an old session after a promotion. Store the rate with the completed session and count each minute of overlapping bonus intervals only once.