Guide

Handling Input in Node.js for Competitive Programming.

Transitioning from Python or C++ to JavaScript can be a hurdle. This interactive dashboard demystifies asynchronous data streams and provides optimized templates for global platforms.

High Performance

Bypass the event loop for ultra-fast reading using synchronous file buffers.

🧩

Versatile Patterns

Ready-to-use logic for Matrices, Graphs, and multi-line test cases.

🛠️

Memory Efficient

Learn to handle 100MB+ input files without crashing the V8 engine heap.

Core Architecture & Vocabulary

Node.js was built for high-performance servers, meaning it treats input as an asynchronous stream. Understanding these keywords is fundamental to mastering its behavior.

Event Listener

.on("line", ...)

Registers a "trap". Every time a line is pushed down the stream, the callback triggers. Ideal for line-by-line processing.

The Signal

"close" / "end"

Fired when the input source runs out of data (EOF). This is your trigger to finally execute your algorithms.

Modern UI

.question()

A one-time listener that automatically disconnects after capturing a single string. Great for interactive command lines.

The Engine

Event Loop

The manager that decides when to run your logic. Synchronous reads bypass this for maximum speed.

LeetCode vs. Codeforces

Not all platforms require the same boilerplate. Identify your target first.

Function-Based Environments

  • Platforms like LeetCode and modern technical interview tools.
  • You do NOT read input manually.
  • The platform parses the raw input and calls your function with ready-to-use variables.
class Solution {
    solve(nums, target) {
        // Platform handles the parsing!
        // Just return the result.
    }
}

The 5 Implementation Methods

From high-speed synchronous reads for contests to user-friendly asynchronous interfaces for interviews.

Method A

The Codeforces Champion

Uses fs.readFileSync(0) to read the entire input block synchronously into memory. It is the fastest possible way and avoids "Time Limit Exceeded" errors.

  • ✔ Fastest execution speed
  • ✔ Bypasses event-loop delay
  • ✖ Consumes more memory (heap space)
const fs = require("fs");
const input = fs.readFileSync(0, "utf-8")
                .trim()
                .split(/\s+/);
// [n, k, ...arr] now holds numbers
const [n, k] = input.slice(0, 2).map(Number);

Performance vs. Memory Footprint

Comparison based on processing 50,000 integers in Node.js v18. Higher score is better.

Method B

Modern Promise Interface

Introduced in Node.js 16+, readline/promises allows you to use async/await. It reads line-by-line in a sequential way that is highly readable during interviews.

  • ✔ Beautiful, clean syntax
  • ✔ Ideal for live coding screens
  • ✖ Slower overhead than fs
const rl = require("readline/promises")
           .createInterface(process.stdin);

async function main() {
  const line1 = await rl.question("");
  const arrLine = await rl.question("");
  rl.close();
}

Common Input Blueprints

Interactive templates for the most common data structures in competitive programming.

Handling T Test Cases

const input = fs.readFileSync(0, "utf-8").trim().split("\n");
const t = Number(input[0]);
let lineIdx = 1;

for (let i = 0; i < t; i++) {
  const [n, k] = input[lineIdx++].split(" ").map(Number);
  const arr = input[lineIdx++].split(" ").map(Number);
  // Process Case i
}

Optimization Lab: Pitfalls & Fixes

The small details that cause your program to crash during high-load tests.

❌ Pitfall: console.log in Loops

Printing to the terminal is a synchronous blocking task. Logging 100,000 times will cause TLE.

for(let i of arr) console.log(i);

❌ Pitfall: split() on Massive Lines

Splitting a 50MB line creates millions of tiny string objects, often crashing the V8 heap (MLE).

✅ Fix: Buffer Output

Accumulate all output in an array and join them into a single string for a single console.log call.

let res = [];
res.push(val);
console.log(res.join("\n"));

✅ Fix: Low-Level Parsers

Iterate through the Buffer manually using character codes to parse integers without allocating new strings.