123456789101112131415161718192021222324252627282930313233343536373839404142 |
- #!/usr/bin/ruby
- # Generate the initial positions in Fischer Random Chess (also known as chess960).
- # See also:
- # https://en.wikipedia.org/wiki/Chess960
- var pieces = %w(♛ ♚ ♜ ♜ ♝ ♝ ♞ ♞)
- func is_valid_960 (backrank) {
- var king = backrank.index('♚')
- var (rook1, rook2) = backrank.indices_of('♜')...
- king.is_between(rook1, rook2) || return false
- var (bishop1, bishop2) = backrank.indices_of('♝')...
- bishop1+bishop2 -> is_odd
- }
- func random_960_position {
- loop {
- var a = pieces.random_permutation
- return a if is_valid_960(a)
- }
- }
- say "Here's a random 960 position: #{random_960_position().join(' ')}"
- var chess960 = gather {
- var arr = pieces.clone
- loop {
- take(arr.clone) if is_valid_960(arr)
- arr.next_permutation || break
- }
- }
- say "There are #{chess960.len} initial positions."
- __END__
- Here's a random 960 position: ♞ ♜ ♝ ♛ ♞ ♚ ♜ ♝
- There are 960 initial positions.
|