A diagonal mirror number diamond is Program 57’s inverse-V pyramid plus a mirrored bottom half — digit i only on the left and right diagonals, spaces everywhere else.
Remember
Rule: top i = 1..rows, bottom i = rows−1..1
same left/right diagonal print as Program 57
1
2 2
3 3
4 4
5 5
4 4
3 3
2 2
1 ← rows = 5 (9 lines)
In Python reuse the same diagonal row logic twice: climb 1..rows, then descend rows-1..1, then a bare print() after each row.
Approach
How to Solve It
Reuse Program 57’s diagonal row logic twice: climb 1..rows, then descend rows-1..1 so the peak line appears once.
Method
Idea
Best for
Two outer loops
Top 1..rows, bottom rows-1..1
Learning, interviews, exams
Rows input
Same logic with a user-chosen half-height
Practice / demos
Pseudocode
Pseudocode
function print_row(i, rows):
for j from rows down to 1:
if i == j: print i else print space
for k from 2 to rows:
if i == k: print i else print space
print newline
for i from 1 to rows:
print_row(i, rows)
for i from rows - 1 down to 1:
print_row(i, rows)
Cheat sheet
Goal
Pattern
Top half
for i in range(1, rows + 1):
Bottom half
for i in range(rows - 1, 0, -1):
Left diagonal
for j in range(rows, 0, -1): print(j if i == j else " ", end="")
Right diagonal
for k in range(2, rows + 1): print(k if i == k else " ", end="")
Total lines
2 * rows - 1
Printing Numbers vs Starting a New Line
API
Effect
Use for
print(..., end="")
Stays on the same line
Each diagonal digit or filler space
print()
Ends the current line
After both left and right loops
Columns use end=""; a bare print() ends the row once.
Try it
Live Preview
Change the half-height and the hollow diamond updates instantly — capped at 9 for readable single-digit demos.
Whole numbers from 1 to 9. Tap a chip or type a value — the preview redraws as you go.
Live resultrows = 5 · 9 lines
1
2 2
3 3
4 4
5 5
4 4
3 3
2 2
1
Trace
Worked Walkthrough — rows = 5
See how the two outer loops share one row body and why the bottom starts at rows - 1.
Half
i values
Lines produced
Top
1..5
1 → 2 2 → … → 5
Bottom
4..1
4 → 3 3 → … → 1
Total lines = 2×5−1 = 9. Starting the bottom at 5 would print the peak twice.
Code
Python Programs
Three complete programs: fixed rows = 5, user-input half-height, and a compact rows = 3 demo. Use View Output for sample results.
Example 1 — Fixed rows = 5
Hard-coded half-height — top pyramid, then mirrored bottom with the same diagonal logic.
Python
rows = 5
for i in range(1, rows + 1):
for j in range(rows, 0, -1):
print(j if i == j else " ", end="")
for k in range(2, rows + 1):
print(k if i == k else " ", end="")
print()
for i in range(rows - 1, 0, -1):
for j in range(rows, 0, -1):
print(j if i == j else " ", end="")
for k in range(2, rows + 1):
print(k if i == k else " ", end="")
print()
Output
1
2 2
3 3
4 4
5 5
4 4
3 3
2 2
1
How It Works
1. Top half. Same as Program 57: left j = rows..1, right k = 2..rows.
2. Bottom half. Replay the same row body for i = rows - 1 down to 1.
3. One peak. Skipping i = rows on the way down keeps the middle line unique.
Example 2 — User Input (rows)
Read the half-height and draw the same hollow diagonal diamond.
Python
try:
rows = int(input("Enter the number of rows: "))
except ValueError:
print("Please enter a positive whole number.")
raise SystemExit
if rows < 1:
print("Please enter a positive whole number.")
raise SystemExit
for i in range(1, rows + 1):
for j in range(rows, 0, -1):
print(j if i == j else " ", end="")
for k in range(2, rows + 1):
print(k if i == k else " ", end="")
print()
for i in range(rows - 1, 0, -1):
for j in range(rows, 0, -1):
print(j if i == j else " ", end="")
for k in range(2, rows + 1):
print(k if i == k else " ", end="")
print()
Output (when user enters 4)
Enter the number of rows: 4
1
2 2
3 3
4 4
3 3
2 2
1
2. Same core. Top and bottom loops match Example 1 — only rows comes from the user.
3. Single-digit tip. Cap demos at rows ≤ 9 so every digit stays one character wide.
Example 3 — Compact rows = 3
Five-line diamond — easy to confirm the bottom starts at 2, not 3.
Python
rows = 3
for i in range(1, rows + 1):
for j in range(rows, 0, -1):
print(j if i == j else " ", end="")
for k in range(2, rows + 1):
print(k if i == k else " ", end="")
print()
for i in range(rows - 1, 0, -1):
for j in range(rows, 0, -1):
print(j if i == j else " ", end="")
for k in range(2, rows + 1):
print(k if i == k else " ", end="")
print()
Output
1
2 2
3 3
2 2
1
How It Works
1. Five lines. Top prints 1, 2 2, 3 3; bottom reprints 2 2 and 1.
2. Trace on paper. Confirm the peak 3 3 appears once — bottom starts at rows - 1.
Edge Cases & Pitfalls
Check these before calling the solution done.
i = rows..1
Double peak
If the bottom loop starts at rows, the widest line prints twice. Always start at rows - 1.
k = 1
Triple digit on a row
If the right loop starts at 1, the center column can print a third digit. Keep k = 2.
bare print()
Broken rows
If bare print() sits inside an inner loop, each character lands on its own line. Call it only after both diagonal loops finish.
rows = 1
Single line
Output is just 1 — the bottom loop (rows-1..1) does not run.
rows > 9
Multi-digit width
Digits 10+ break neat column alignment. Cap demos at 9 or use a fixed field width.
Bad input
int(input()) throws
Wrap with try/except ValueError so non-numeric input does not crash the script.
Analysis
Time and Space Complexity
Program
Time
Extra space
Fixed / compact (Examples 1, 3)
O(n²)
O(1)
User input (Example 2)
O(n²)
O(1)
You print 2n−1 lines, each scanning about 2n−1 positions → O(n²) time. Only a few loop variables are needed.
Remember
Key Takeaways
Pyramid + mirror: top 1..rows, bottom rows-1..1, same diagonal row body.
Skip the peak twice: bottom starts at rows - 1.
print vs print(): digits and spaces use end=""; bare print() advances after both loops.
Next step: Program 59 prints consecutive numbers around a hollow square border.
One line: Program 57 once upward, then again from rows-1 down to 1.
Frequently Asked Questions
Each row prints the same digit on the left diagonal and the right diagonal; spaces fill the remaining positions.
The top half already printed the peak row — starting at rows-1 avoids duplicating the middle line.
An inverse-V pyramid from 1 to rows, then mirrored back down to 1 — 2*rows-1 lines total.
Program 57 prints only the top pyramid half. Program 58 adds a second outer loop from rows-1 down to 1 for the bottom half.
Each column prints either the row digit or a space — those conditions pick exactly the two diagonal positions.
Change rows or read it from user input with int(input()) inside try/except — see Example 2.
O(n²) for n rows because you print 2n-1 lines, each scanning about 2n positions.
Yes. Replace print(j, end="") / print(k, end="") with print("*", end="") in both diagonal print branches.
Use try/except ValueError around int(input()) so bad input does not crash the script.
Only one line prints — the bottom loop (rows-1..1) does not run.
🤔
Did you know?
Print the Program 57 pyramid for the top half, then mirror with for i in range(rows - 1, 0, -1). Total lines = 2×rows-1 — each row scans about 2×rows-1 positions.