```Here is my solution. Run with no argument, it generates a random
initial position. Run with an argument in the range 1..960, it
provides the initial position for the specified game. It uses
Scharnagl's method which is quite easy to implement in Ruby.

Here is what it produces when given 519 as its argument:

Initial position 519
rnbqkbnr
pppppppp
........
........
........
........
PPPPPPPP
RNBQKBNR

Regards, Morton

<code>
#! /usr/bin/env ruby -w
#
# Ruby Quiz 106 -- Chess960 Starting Positions
# Implementation uses Scharnagl's tables. See
#     http://en.wikipedia.org/wiki/Chess960_starting_position

class Chess960
BISHOP_TABLE = [
"BB------", #0
"B--B----", #1
"B----B--", #2
"B------B", #3
"-BB-----", #4
"--BB----", #5
"--B--B--", #6
"--B----B", #7
"-B--B---", #8
"---BB---", #9
"----BB--", #10
"----B--B", #11
"-B----B-", #12
"---B--B-", #13
"-----BB-", #14
"------BB"  #15
]

N5N_TABLE = [
"NN---", #0
"N-N--", #1
"N--N-", #2
"N---N", #3
"-NN--", #4
"-N-N-", #5
"-N--N", #6
"--NN-", #7
"--N-N", #8
"---NN"  #9
]

def initialize(number)
q, @bishop_index = (number - 1).divmod 16
@knight_index, @queen_index = q.divmod 6
@white_pieces = BISHOP_TABLE[@bishop_index].split('')
@white_pieces[nth_dash(@queen_index)] = 'Q'
knights = N5N_TABLE[@knight_index]
m = knights.index('N')
n = knights.index('N', m + 1)
m, n = nth_dash(m), nth_dash(n)
@white_pieces[m] = 'N'
@white_pieces[n] = 'N'
@white_pieces[@white_pieces.index('-')] = 'R'
@white_pieces[@white_pieces.index('-')] = 'K'
@white_pieces[@white_pieces.index('-')] = 'R'
end

def nth_dash(n)
dashes = []
@white_pieces.each_with_index { |ch, i| dashes << i if ch ==
'-' }
dashes[n]
end

def inspect
@white_pieces.join
end

def to_s
white_pieces = @white_pieces.join + "\n"
white_pawns = 'P' * 8 + "\n"
black_pieces = white_pieces.downcase
black_pawns = 'p' * 8 + "\n"
empty = ('.' * 8 + "\n") * 4
black_pieces + black_pawns + empty + white_pawns + white_pieces
end
end

if __FILE__ == \$0
begin
if ARGV.empty? then n = 1 + rand(960)
else
n = ARGV.first.to_i
raise StandardError unless (1..960).include?(n)
end
puts "Initial position #{n}"
print Chess960.new(n).to_s
rescue StandardError
puts "Usage:  #{\$PROGRAM_NAME} [<integer>]"
puts "where <integer> is in 1..960"
puts "Omitting <integer> produces a random initial position"
end
end
</code>

```