chess960_initial_positions.sf 980 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/usr/bin/ruby
  2. # Generate the initial positions in Fischer Random Chess (also known as chess960).
  3. # See also:
  4. # https://en.wikipedia.org/wiki/Chess960
  5. var pieces = %w(♛ ♚ ♜ ♜ ♝ ♝ ♞ ♞)
  6. func is_valid_960 (backrank) {
  7. var king = backrank.index('♚')
  8. var (rook1, rook2) = backrank.indices_of('♜')...
  9. king.is_between(rook1, rook2) || return false
  10. var (bishop1, bishop2) = backrank.indices_of('♝')...
  11. bishop1+bishop2 -> is_odd
  12. }
  13. func random_960_position {
  14. loop {
  15. var a = pieces.random_permutation
  16. return a if is_valid_960(a)
  17. }
  18. }
  19. say "Here's a random 960 position: #{random_960_position().join(' ')}"
  20. var chess960 = gather {
  21. var arr = pieces.clone
  22. loop {
  23. take(arr.clone) if is_valid_960(arr)
  24. arr.next_permutation || break
  25. }
  26. }
  27. say "There are #{chess960.len} initial positions."
  28. __END__
  29. Here's a random 960 position: ♞ ♜ ♝ ♛ ♞ ♚ ♜ ♝
  30. There are 960 initial positions.