Fundamentals/Patterns/Event Simulation11 problems· Simulation

Step through events/time/state transitions in order, updating world state per step

When to useGame-of-life-style ticks, robot movement on a grid, parsing scripted commands, processing timeline of timestamped events

iterative
The FIFO Model
queue_fifo_model
Real-World Queue Examples
real_world_queue_examples
Josephus Problem
josephus_problem
Simulation Coding Problems: Introduction and Strategies
simulation_intro
Turnstile | Hackerank SHL
amazon_oa_turnstile
Robot Bounded in Circle
amazon_oa_robot_in_circle
Call Center
oop_call_center
Parking Spots
oop_parking_spots
Public Library
oop_public_library
Vending Machine
oop_vending_machine
Authentication Tokens
twitter_oa_auth_token
INITIALIZE
world state (position, direction, scores, queues)
const queue = []; let head = 0; const results = [];
const queue = Array.from({ length: n }, (_, i) => i);
const dx = [0, 1, 0, -1]; const dy = [1, 0, -1, 0]; let dir = 0; let x = 0; let y = 0;
const indexed = arrTime.map((t, i) => [t, i]).sort(...);
const enterQueue = [], exitQueue = [];
let time = 0, i = 0, lastUsed = -1;
const result = new Array(n);
let x = 0, y = 0, dir = 0;
const dx = [0, 1, 0, -1];
const dy = [1, 0, -1, 0];
const employees = [], queue = [], phoneToEmployee = new Map(), output = [];
const slots = new Array(n).fill(null);
const output = [];
const inventory = new Map(); const borrowed = []; const output = [];
const products = new Map(); let balance = 0; const output = [];
const tokens = new Map();
const durations = new Map();
const output = [];
TRAVERSE
for each event/tick/step
for (const op of operations) {
while (queue.length > 1) {
for (const ch of commands) {
while (i < n || enterQueue.length > 0 || exitQueue.length > 0) {
for (const ch of instructions) {
for (const op of instructions) {
for (const op of instructions) {
for (const op of instructions) {
for (const op of instructions) {
for (const op of instructions) {
[STEP]
apply event's effect to world state
if (op[0] === 'enqueue') {
queue.push(op[1]);
} else if (op[0] === 'dequeue') {
if (head >= queue.length) results.push(null);
else { results.push(queue[head]); head++; }
}
const [arrivalTime, name] = arrivals[i];
for (let i = 0; i < k - 1; i++) { queue.push(queue.shift()); }
queue.shift();
x += dx[dir]; y += dy[dir]; // or dir = (dir±1+4) % 4
// pick exit vs enter by priority rule; dequeue winner; record result[idx] = time; lastUsed = ...; time++;
if (ch === 'G') { x += dx[dir]; y += dy[dir]; }
else if (ch === 'L') { dir = (dir + 3) % 4; }
else if (ch === 'R') { dir = (dir + 1) % 4; }
if (op[0] === 'hire') { /* push employee */ }
else if (op[0] === 'dispatch') { /* connect or enqueue */ }
else if (op[0] === 'end') { /* free employee, drain queue */ }
if (op[0] === 'park') { /* scan from start, place at first null */ }
else if (op[0] === 'remove') { slots[spot] = null; }
else if (op[0] === 'print') { output.push(...); }
else if (op[0] === 'print_free_spots') { output.push(...); }
// update inventory / borrowed / output per op type
// update products / balance; push to output on purchase/checkout
if (op[0] === 'generate') { ... }
else if (op[0] === 'renew') { ... }
else if (op[0] === 'count_unexpired') { ... }
track
record max/snapshot/state if needed
// no snapshot needed — position/dir accumulates
output.push(...) on connect/end
// print/print_free_spots append to output inside [STEP]
// output.push(...) on print_borrowed
// output.push('true'/'false') or output.push(String(balance))
output.push(count);
RETURN
return final state or aggregated result
return results;
return completed;
return queue[0];
return [x, y];
return result;
return (x === 0 && y === 0) || dir !== 0;
return output;
return output;
return output;
return output;
return output;