JavaScript Reverse Alphabet Pyramid Pattern (Centered)

Beginner
7 min read
Updated: Sep 2026
3 programs
Live preview

What Is This Pattern?

A reverse centered alphabet pyramid prints Program 28’s layered rows down to the A-center line, then mirrors them back up to the top letter — without printing the center twice.

Remember
Rule: printRow(i) = left k..0 + right 1..k with (j > i ? j : i)
      Phase 1: i = k..0   Phase 2: i = 1..k

E E E E E E E E E
E D D D D D D D E
E D C C C C C D E
E D C B B B C D E
E D C B A B C D E   ← center once
E D C B B B C D E
E D C C C C C D E
E D D D D D D D E
E E E E E E E E E     ← top = 'E' (9×9)

Program 28 is exactly the upper half. The lower phase starts at i = 1 (B) so the A-center row is not duplicated.

How to Solve It

Two ways to emit the same diamond — duplicate the row body in both phases, or factor helpers.

MethodIdeaBest for
Two phases inlineUpper k..0, lower 1..k, same row bodyLearning, interviews, exams
cell + printRowOne place owns the floor rule and both halvesCleaner demos once the rule clicks

Pseudocode

Pseudocode
k = top - 'A'
define printRow(i):
    for j from k down to 0: append (j > i ? alpha[j] : alpha[i])
    for j from 1 to k:      append (j > i ? alpha[j] : alpha[i])
    print newline

for i from k down to 0: printRow(i)   // upper
for i from 1 to k:      printRow(i)   // lower

Cheat sheet

GoalPattern
Top indexconst k = top.charCodeAt(0) - 65; (4 for E)
Floor rulej > i ? alpha[j] : alpha[i]
Upper phasefor (let i = k; i >= 0; i--) printRow(...);
Lower phasefor (let i = 1; i <= k; i++) printRow(...);
Skip center twiceLower starts at 1, not 0
SizeRows = width = 2k + 1
Upper half onlyProgram 28

Printing Letters vs Starting a New Line

APIEffectUse for
line += …Stays on the same rowEach letter (and its trailing space)
console.log(line)Ends the current rowAfter both half-loops of a row

Append cells without a newline, then end the row once.

Live Preview

Change the top letter and the reverse-centered diamond updates instantly — rows = width = 2k + 1.

One letter from A to F. Tap a chip or type a letter — the preview redraws as you go.

Live result Top E · 9 rows · width 9
E E E E E E E E E
E D D D D D D D E
E D C C C C C D E
E D C B B B C D E
E D C B A B C D E
E D C B B B C D E
E D C C C C C D E
E D D D D D D D E
E E E E E E E E E

Worked Walkthrough — Top = E (k = 4)

Trace each floor and the resulting 9-letter line across both phases.

PhaseiFloorPrinted row
Upper4EE E E E E E E E E
Upper3DE D D D D D D D E
Upper2CE D C C C C C D E
Upper1BE D C B B B C D E
Upper0AE D C B A B C D E
Lower1BE D C B B B C D E
Lower2CE D C C C C C D E
Lower3DE D D D D D D D E
Lower4EE E E E E E E E E

Width is always 2×4 + 1 = 9. Total rows are 2×5 − 1 = 9. The A-center row appears only once (upper phase).

JavaScript Programs

Three complete programs: fixed A–E, top-letter prompt, and a helper-function rewrite. Use View Output for sample results, or Try It Yourself to edit and run in the playground.

Example 1 — Fixed A–E

Same row logic as Program 28, printed in two phases to complete the reverse centered pyramid.

JavaScript
const k = 4; // index for 'E'
const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Upper half (E down to A)
for (let i = k; i >= 0; i--) {
  let line = "";
  for (let j = k; j >= 0; j--) {
    line += (j > i ? alpha[j] : alpha[i]) + " ";
  }
  for (let j = 1; j <= k; j++) {
    line += (j > i ? alpha[j] : alpha[i]) + " ";
  }
  console.log(line.trimEnd());
}

// Lower half (B up to E) — skip repeating the A row
for (let i = 1; i <= k; i++) {
  let line = "";
  for (let j = k; j >= 0; j--) {
    line += (j > i ? alpha[j] : alpha[i]) + " ";
  }
  for (let j = 1; j <= k; j++) {
    line += (j > i ? alpha[j] : alpha[i]) + " ";
  }
  console.log(line.trimEnd());
}
Try It Yourself

How It Works

1. Fix the top index. k = 4 means the highest letter is E.

2. Upper phase. Floor i runs from k down to 0 — same as Program 28 through the A-center row.

3. Lower phase. Floor i runs from 1 to k so the center line is not printed twice.

4. Same row body. Both phases use left k..0 and right 1..k with j > i ? alpha[j] : alpha[i].

Example 2 — Top Letter Input

Works for A..top with the same two-phase pyramid. Prefer validating a single A–Z character.

JavaScript
const raw = (prompt("Enter top letter (like E):") || "").trim().toUpperCase();
const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

if (!/^[A-Z]$/.test(raw)) {
  console.log("Please enter a single letter A-Z.");
} else {
  const k = raw.charCodeAt(0) - 65;

  for (let i = k; i >= 0; i--) {
    let line = "";
    for (let j = k; j >= 0; j--) {
      line += (j > i ? alpha[j] : alpha[i]) + " ";
    }
    for (let j = 1; j <= k; j++) {
      line += (j > i ? alpha[j] : alpha[i]) + " ";
    }
    console.log(line.trimEnd());
  }

  for (let i = 1; i <= k; i++) {
    let line = "";
    for (let j = k; j >= 0; j--) {
      line += (j > i ? alpha[j] : alpha[i]) + " ";
    }
    for (let j = 1; j <= k; j++) {
      line += (j > i ? alpha[j] : alpha[i]) + " ";
    }
    console.log(line.trimEnd());
  }
}
Try It Yourself

How It Works

1. Prompt and scale. k = top.charCodeAt(0) - 65 sets both phases and both halves.

2. Same diamond core. For top = C you get 5 rows of width 5 (2k + 1).

3. Same nested-loop core. Only the source of k changes — the print logic matches Example 1.

Example 3 — Helper Functions

Often clearer: one function owns the floor rule; another prints a full row so both phases stay thin.

JavaScript
function cell(alpha, j, i) {
  return (j > i ? alpha[j] : alpha[i]) + " ";
}

function printRow(alpha, k, i) {
  let line = "";
  for (let j = k; j >= 0; j--) {
    line += cell(alpha, j, i);
  }
  for (let j = 1; j <= k; j++) {
    line += cell(alpha, j, i);
  }
  console.log(line.trimEnd());
}

const k = 4;
const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

for (let i = k; i >= 0; i--) {
  printRow(alpha, k, i);
}

for (let i = 1; i <= k; i++) {
  printRow(alpha, k, i);
}
Try It Yourself

How It Works

1. cell owns the rule. j > i lives in one place.

2. printRow owns both halves. Left k..0 and right 1..k, then console.log.

3. Thin phases. The two outer loops only decide which floors to visit.

Edge Cases & Pitfalls

Check these before calling the solution done.

i = 0

Duplicate center row

If the lower phase starts at 0, the A-center line prints twice. Keep for (i = 1; i <= k; i++).

Right j = 0

Duplicate center A in a row

The right half of each row must start at 1, same as Program 28.

log inside

Column of letters

If console.log is inside either half-loop, each cell lands on its own line. Append with +=; log only after both halves.

top = A

Single A

When k = 0, upper prints A and lower never runs. A good sanity check.

Upper only

Program 28 by mistake

Forgetting the lower phase leaves the open square. Add for (i = 1; i <= k; i++) with the same row printer.

Bad input

Validate one letter

Trim, uppercase, and require length 1 in A–Z — reject empty or multi-character prompts.

Time and Space Complexity

ProgramTimeExtra space
Two phases inline (Examples 1–2)O(n²)O(n) for the current row string
Helper functions (Example 3)O(n²)O(n) for the current row string

For n = k + 1 letters, there are 2n - 1 rows of width 2n - 1 — still quadratic in n. Roughly twice Program 28’s cell count, minus one shared center row.

Key Takeaways

  • Rule: same printRow as Program 28 — upper k..0, lower 1..k.
  • No double center: lower phase starts at B (i = 1).
  • Break the row: call console.log only after both half-loops.
  • Complexity: O(n²) time; O(n) space for the current row string.

One line: print Program 28’s rows from k down to 0, then again from 1 up to k.

Frequently Asked Questions

The first loop decreases i from E down to A, printing each layered row toward the center. The second increases i from B back to E with the same row rule so the pyramid widens again without repeating the A-centered row.
Because the A-centered row already appears in the upper half. Starting from B prevents duplicating the center line.
If n is the number of letters from A to the top letter, total rows are 2n−1 (9 rows for A..E).
It prints the border letter when the column index j is above the current row floor i; otherwise it prints the floor letter. The same rule applies on both left and right halves of every row.
The left scan goes E down to A; the right scan goes B up to E so the middle A appears once and the row mirrors.
line += builds each letter and its trailing space on the same row. console.log inside either half-loop would log one cell per line. Log once after both halves finish.
O(n²) because there are O(n) rows and each row prints O(n) cells.
Program 28 is exactly the upper half of this pyramid. Program 29 reuses that row logic, then mirrors upward from B to E for the closed diamond.

Did you know?

Reuse Program 28’s row logic twice: first with i from E down to A, then with i from B up to E so the center row is not duplicated. Each row stays full width (2n-1 cells); total rows are also 2n-1 for n letters.

Next: Decreasing & Increasing Rows

Move from a layered diamond to fixed-width rows with a decreasing prefix and increasing suffix.

Program 30 tutorial →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

12 people found this page helpful