Inverted Forward Repeating Alphabet Triangle in JavaScript

Beginner
⏱️ 8 min read
📚 Updated: Aug 2026
🎯 3 Code Examples
🚀 Live Preview
Nested Loops

What You’ll Learn

Row width shrinks from five to one, but the letter moves forward each row: AAAAA, BBBB, CCC, DD, E. Compare with Program 11 (same shape, letters step down) and worked JavaScript examples, live preview, edge cases, and complexity.

Shape Rule

Wide first, letters forward

Row 1 prints AAAAA, then BBBB, down to a single E.

Outer Loop

Letter advance

for (let i = "A".charCodeAt(0); i <= "E".charCodeAt(0); i++) picks the letter for each row.

Inner Loop

Width 5…1

for (let j = "E".charCodeAt(0); j >= i; j--) shrinks as i rises - print String.fromCharCode(i), not the inner counter.

line vs console.log

Same line / next line

Letters use line += ch; end each row with console.log(line).

Live Preview

1–26 rows

Pick a row count and draw the inverted forward triangle in the browser.

O(n²)

Complexity

Total letters = n(n+1)/2; extra memory stays O(1).

Introduction

An inverted forward repeating alphabet triangle starts wide and shrinks by one repeated letter on each new line, while letters advance from A toward the top of the range. With the right angle on the left, the console shows an upside-down staircase of identical letters per row.

In JavaScript you usually solve it with two nested for loops: the outer loop picks the row letter (counting up), the inner loop prints that same letter fewer times each row, then console.log(line) moves to the next line.

Why it matters?

It shows that letter direction and width direction are independent knobs. Flip only the outer loop (A→E vs E→A) and you move between Program 12 and Program 11 without rewriting the shape idea.

Key Highlights

Widest First

Top row repeats A exactly n times.

Letters Advance

Rows go A, B, C, … while widths go n…1.

Print Outer Letter

line += String.fromCharCode(i) in the inner loop; console.log(line) after.

Mirror of Program 11

Same widths - opposite letter direction.

In short: for each letter i from A up to top, print i repeatedly (top - i + 1) times, then call console.log(line).

📝 Problem & Approach

Given a positive integer rows (or a fixed top letter like 'E'), print a left-aligned inverted triangle where letters advance from A and widths shrink from rows down to 1.

JavaScript
// First 5 rows (conceptual shape)
// AAAAA
// BBBB
// CCC
// DD
// E

Inputs & Outputs

ItemTypeDescription
rowsintNumber of triangle lines (typically 1–26). Top letter = String.fromCharCode("A".charCodeAt(0) + rows - 1).
Printed outputtextLeft-aligned rows; row r (0-based) prints letter String.fromCharCode("A".charCodeAt(0) + r) exactly rows - r times.

Minimal workflow

Pseudocode
for row from 0 to rows - 1:
    ch = String.fromCharCode("A".charCodeAt(0) + row)
    repeat = rows - row
    for k from 1 to repeat:
        append ch (no newline)
    console.log the row

Approach comparison

ApproachIdeaBest for
Nested char loopsOuter A…top + inner top…i widthLearning and interviews
ch.repeat(repeat)Build a whole row in one callShorter production-style demos

⚡ Quick Reference

GoalPattern
Walk letters forwardfor (let i = "A".charCodeAt(0); i <= "E".charCodeAt(0); i++)
Shrink repeat countfor (let j = "E".charCodeAt(0); j >= i; j--)
Print row letterline += String.fromCharCode(i) — not the inner counter
End the rowconsole.log(line)
One-line row shortcutconsole.log(ch.repeat(repeat))
Letters step downSee Program 11 (EEEEE, DDDD, …)

📋 line vs console.log vs *

Same triangle - different ways to emit characters.

line += ch
same line

Prints a letter without moving to the next line

console.log(line)
new line

Ends the current row after all repeats are printed

ch * n
whole row

Builds n copies of ch at once - skip the inner loop

Learning tip
print String.fromCharCode(i)

Master printing the outer letter before the string shortcut

Context

When This Pattern Shows Up

Reach for this triangle when practicing inverted widths with forward letters.

  1. After Program 11

    Keep shrinking widths; flip only the letter direction to A→E.

  2. Independent knobs

    Letter direction and width direction can flip separately.

  3. Index-based formula

    Practice ch = String.fromCharCode("A".charCodeAt(0) + row) and repeat = rows - row.

  4. Gateway to Program 13

    Next: sequential letters that keep advancing across rows.

  5. Not a UI layout tool

    This is a console teaching pattern - not how you build modern app screens.

Key benefit: one small program that proves letter direction is independent of inverted width - a core alphabet-pattern skill.

🔮 Live Preview

Choose a row count between 1 and 26 and draw the inverted forward repeating alphabet triangle in the browser.

Try 5 (AAAAA…E), 4 (AAAA…D), or 7. Max 26 keeps letters in A–Z.

Live result
Press "Draw pattern".

Examples Gallery

Three complete JavaScript programs - fixed A-to-E range, prompt input, and a ch.repeat(repeat) shortcut. Click View Output to reveal sample console results, or Try it Yourself to run in the browser editor.

📚 Getting Started

Print five shrinking rows with letters advancing from A.

Example 1 — Fixed 'A' up to 'E'

Hard-coded range - ideal for first demos and screenshots.

JavaScript
const base = "A".charCodeAt(0);
const top = "E".charCodeAt(0);

for (let i = base; i <= top; i++) {
  const ch = String.fromCharCode(i);
  let line = "";
  for (let j = top; j >= i; j--) {
    line += ch;
  }
  console.log(line);
}
Try it Yourself

How It Works

When i is "A".charCodeAt(0), the inner loop runs from E down to A (5 times) and builds AAAAA. When i is "B".charCodeAt(0), it builds BBBB, and so on until a single E. Appending ch from the outer letter (not the inner counter) keeps each row uniform.

📈 Practical Variant

Let the user choose the height at runtime.

Example 2 — User Input Version

Use row index: ch = String.fromCharCode(base + row) and repeat = rows - row. Validate parseInt(prompt()) with Number.isFinite in real apps.

JavaScript
const rowsInput = prompt("Enter the number of rows:");
let rows = parseInt(rowsInput, 10);
rows = Math.max(1, Math.min(rows, 26));
const base = "A".charCodeAt(0);

for (let row = 0; row < rows; row++) {
  const ch = String.fromCharCode(base + row);
  const repeat = rows - row;
  let line = "";
  for (let k = 0; k < repeat; k++) {
    line += ch;
  }
  console.log(line);
}
Try it Yourself

How It Works

For rows = 4, row 0 builds A four times, row 1 builds B three times, and so on. Clamp rows to 1-26 so letters stay within A-Z.

⚡ Shortcut Style

Same shape without an explicit inner append loop.

Example 3 — ch.repeat(repeat)

Build each repeated-letter row in one call, then log it.

JavaScript
const rows = 5;
const base = "A".charCodeAt(0);

for (let row = 0; row < rows; row++) {
  const ch = String.fromCharCode(base + row);
  const repeat = rows - row;
  console.log(ch.repeat(repeat));
}
Try it Yourself

How It Works

ch.repeat(repeat) creates a string of length repeat filled with that letter. Great once you understand the nested-loop idea; keep the two-loop version for exams that ask you to show both bounds.

🧠 How the Algorithm Prints Rows

1

Set up

Use prompt() when reading input. Fix the top letter or compute it from rows.

Setup
2

Outer loop (letter)

for (let i = "A".charCodeAt(0); i <= "E".charCodeAt(0); i++) selects the character printed on the row.

A → E
3

Inner loop (width)

for (let j = "E".charCodeAt(0); j >= i; j--) runs 5, 4, 3… times; print String.fromCharCode(i) with line += String.fromCharCode(i).

5..1
4

New line

console.log(line) ends the row so the next outer iteration starts fresh.

Break
=

Triangle complete

Total letters: n+(n-1)+…+1 = n(n+1)/2O(n²) time, O(1) extra memory.

🔎 Worked Walkthrough — 'A' up to 'E'

Trace each outer-loop value of i and count how many times the inner loop runs.

iInner j rangePrinted rowRepeats
'A''E'..'A'AAAAA5
'B''E'..'B'BBBB4
'C''E'..'C'CCC3
'D''E'..'D'DD2
'E''E'..'E'E1

Total letter prints: 5 + 4 + 3 + 2 + 1 = 15 = 5×6/2.

Use Cases

Where this tiny pattern (and its loop structure) shows up beyond the homework prompt.

1. Letter vs Width Knobs

Clearest demo that forward letters can pair with shrinking widths.

Example: swap only the outer loop direction to get Program 11.

2. Pair with Program 11

Teach letter direction as a one-line change.

Example: side-by-side EEEEE/DDDD vs AAAAA/BBBB.

3. Index Formulas

Practice String.fromCharCode("A".charCodeAt(0) + row) and rows - row without char countdown tricks.

Example: row 2 → letter C, repeat = n-2.

4. Case & Fill Variants

Swap to lowercase or mix digits once the loops work.

Example: start from 'a' + row.

5. Complexity Intuition

Descending triangular totals still make O(n²) concrete.

Example: 5+4+…+1 = 15 for n = 5.

6. Input Validation Labs

Pair the pattern with Number.isFinite and 1–26 clamps.

Example: reject rows <= 0 or rows > 26.

Pro Tip: say “letters go up, width goes down” before coding - that story prevents mixing Program 11’s countdown letter with this page.

Advantages

Why this pattern earns a spot right after the inverted countdown triangle.

  1. 1. Instant Visual Feedback

    Wrong letter direction shows up immediately as EEEEE instead of AAAAA.

  2. 2. Minimal Concepts

    Only loops, chars, and console output - no arrays required.

  3. 3. Easy to Mirror

    Flip to Program 11 by counting letters downward instead.

  4. 4. O(1) Extra Memory

    Streaming output needs no storage beyond loop counters.

Pro Tip: learn the nested-loop version first; treat ch.repeat(repeat) as a polish shortcut afterward.

Usage Tips

Small habits that keep alphabet-pattern code clean.

  1. 1. Name the Roles

    Use ch = String.fromCharCode("A".charCodeAt(0) + row) and repeat = rows - row - clearer than overloaded char bounds alone.

  2. 2. Validate prompt() input

    Avoid crashes when the user types letters instead of a number.

  3. 3. Keep console.log(line) Outside

    Only call console.log(line) after the inner loop finishes the row.

  4. 4. Clamp to 26

    For A–Z demos, reject or clamp rows > 26.

  5. 5. Dry-Run One Small n

    Trace rows = 3 (AAA, BB, C) on paper before coding larger demos.

Pro Tip: if you get EEEEE, DDDD, CCC instead of AAAAA, BBBB, CCC, you reused Program 11’s countdown outer loop.

Common Pitfalls

Mistakes that commonly break inverted forward repeating alphabet patterns.

  1. 1. Printing j Instead of i

    Rows become countdown sequences instead of repeated letters.

    → Always line += String.fromCharCode(i) (or ch) for this shape.

  2. 2. Using Program 11’s Outer Loop

    Counting i from top down to A prints EEEEE first instead of AAAAA.

    → Keep i (or row) advancing from A upward.

  3. 3. console.log(line) Inside the Inner Loop

    Each letter lands on its own line - you get a column, not a triangle.

    → Use line += ch for letters; console.log(line) only after the inner loop.

  4. 4. Blind parseInt(prompt())

    Non-numeric input yields NaN with bare parseInt(prompt()).

    → Validate parseInt(prompt()) with Number.isFinite and validate range.

  5. 5. rows > 26 Without a Policy

    String.fromCharCode("A".charCodeAt(0) + rows - 1) can leave the A–Z range.

    → Clamp to 26 or define wrap/error behavior explicitly.

Edge Cases

Check these inputs before calling the solution done.

rows = 1

Single letter

Output is just A on one line.

rows = 0

Empty pattern

Treat as invalid; re-prompt instead of silent empty output.

Negative

rows < 0

Invalid height - validate before looping.

rows > 26

Past Z

Clamp or error - char math leaves A–Z.

Bad input

Non-numeric input

Non-numeric input becomes 0 - check Number.isFinite first.

Case

Lowercase variant

Same loops work with 'a' + row.

🎯 Practice Problems

Try these variations to lock in the pattern.

1. Flip to Program 11

  • Keep shrink; letters step E→A
  • Continue with Program 11

2. Growing forward (Program 9)

  • Widths grow 1…n with A, BB, CCC
  • See Program 9

3. Safe input loop

  • Use Number.isFinite until 1 <= rows <= 26
  • Then draw the triangle

4. Lowercase version

  • Use 'a' + row as the row letter
  • Shows the loop structure is reusable

Notes

  • Triangular count. Total letters for n rows is still n(n+1)/2 - hence O(n²) time.
  • Print the outer letter; the inner loop only decides how many times (shrinking).
  • Validate 1 <= rows <= 26 for interactive A–Z programs.
  • This page is left-aligned. Centered pyramids need leading spaces - covered later in the series.

Quick Takeaway: outer loop advances the letter (A→top), inner loop shrinks the width, then break the line - that is the whole pattern.

⏱️ Time and Space Complexity

ProgramTimeExtra space
Nested loops (Examples 1-2)O(rows²)O(1)
ch.repeat(repeat) (Example 3)O(rows²)O(rows) per row string (temporary)
Wrap Up

🎉 Conclusion

The inverted forward repeating alphabet triangle is a small nested-loop exercise with lasting payoff: forward letters vs shrinking width, and O(n²) intuition. Master the classic two-loop version, then optionally shorten rows with ch.repeat(repeat).

Practice the three examples above, then compare with Program 11 or continue to Program 13’s sequential letters.

Print the outer letter with line += ch, end rows with console.log(line), and use repeat = rows - row (not Program 11’s countdown letter) for this shape.

💡 Best Practices

✅ Do

  • Explain outer = forward letter, inner = shrinking width before coding
  • Use line += String.fromCharCode(i) for letters and console.log(line) after each row
  • Validate 1 <= rows <= 26 for interactive programs
  • Check Number.isFinite after prompt()
  • State O(n²) time when asked about complexity

❌ Don’t

  • Print the inner-loop variable for this repeating shape
  • Reuse Program 11’s countdown outer letter here
  • Call console.log(line) inside the inner letter loop
  • Ignore bad prompt input in user-facing demos
  • Allow rows > 26 without a clear policy

Key Takeaways

Knowledge Unlocked

Five things to remember about this alphabet pattern

Print the inverted forward repeating triangle the beginner-friendly way.

5
Core concepts
02

Outer loop

Advances A→top

Code
A 03

Inner loop

Shrinks with line += String.fromCharCode(i)

Code
04

console.log(line)

Ends each row

I/O
O 05

Complexity

O(n²) time

Analysis

❓ Frequently Asked Questions

Program 11 prints EEEEE, DDDD, ... (letters step down). Program 12 prints AAAAA, BBBB, ... (letters step up) with the same inverted widths 5..1.
When i is "A".charCodeAt(0), the inner loop runs from E down to A (5 times) and appends A each time. Next i becomes "B".charCodeAt(0), the inner loop runs 4 times and appends B.
The inner loop only controls how many times to append. Using the outer letter keeps the entire row the same letter; using the inner counter would step letters across the row.
Because the inner loop runs from the fixed top code down to the current i. As i increases, the loop has fewer iterations. Equivalently, repeat = rows - row.
line += ch builds the full row string. console.log() inside the inner loop would log one letter per line. Log once after the inner loop finishes.
O(n^2) where n is the number of rows. Total logged characters equal n+(n-1)+...+1 = n(n+1)/2.
Yes. console.log(ch.repeat(repeat)) logs a full repeated-letter row in one call. Nested loops are better for learning; ch.repeat is a handy shortcut later.
Use parseInt with Number.isFinite after prompt(), then clamp rows between 1 and 26 so letters stay within A-Z.

Did you Know? 🔊

This is the forward-letter twin of Program 11: same inverted widths (5…1), but letters advance A→E instead of stepping down. Append the outer loop letter inside the inner loop so each row stays uniform.

Continue to Alphabet Pattern 13

Next up: sequential letters that keep advancing across the whole triangle.

Program 13 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