The shape is a box of numbers, hollow except for the diagonals. For example, a box of side-length 5 would look like
| 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 4 | 5 | |
| 1 | 3 | 5 | ||
| 1 | 2 | 4 | 5 | |
| 1 | 2 | 3 | 4 | 5 |
and one of side length 6 like
| 1 | 2 | 3 | 4 | 5 | 6 |
| 1 | 2 | 5 | 6 | ||
| 1 | 3 | 4 | 6 | ||
| 1 | 3 | 4 | 6 | ||
| 1 | 2 | 5 | 6 | ||
| 1 | 2 | 3 | 4 | 5 | 6 |
The thinking behind my solution is to separate printing the outside of the box from the inside. A function named interior? — ending with a question mark in the spirit of a Ruby convention for boolean functions — calculates this. The local input went out-of-scope, so I used a global $input instead.
To allow multi-digit numbers, I convert missing numbers into a string to find out how many characters would have been taken up.
I have a feeling there's a neat way to draw all this with just one if but it hasn't come to me yet. As you may be able to tell, I have enjoyed Ruby's parentheses-optional attitude. Also, the implicit return, like the one I use in my function.
Here's the code:
#!/usr/bin/ruby2.1
print "Input: "
$input = gets.chomp.to_i
def interior? index
0 < index and index < $input-1
end
$input.times do |row|
$input.times do |col|
if interior? row and interior? col
if col == row or ($input-1)-col == row
print col + 1
else
print " " * (col+1).to_s.length
end
else
print col + 1
end
print " "
end
puts
end