Download code
From LiteratePrograms
Back to Eight_queens_puzzle_(Forth)
Download for Windows: single file, zip
Download for UNIX: single file, zip, tar.gz, tar.bz2
queens.4th
1 \ Copyright (c) 2009 the authors listed at the following URL, and/or 2 \ the authors of referenced articles or incorporated external code: 3 \ http://en.literateprograms.org/Eight_queens_puzzle_(Forth)?action=history&offset=20081217213248 4 \ 5 \ Permission is hereby granted, free of charge, to any person obtaining 6 \ a copy of this software and associated documentation files (the 7 \ "Software"), to deal in the Software without restriction, including 8 \ without limitation the rights to use, copy, modify, merge, publish, 9 \ distribute, sublicense, and/or sell copies of the Software, and to 10 \ permit persons to whom the Software is furnished to do so, subject to 11 \ the following conditions: 12 \ 13 \ The above copyright notice and this permission notice shall be 14 \ included in all copies or substantial portions of the Software. 15 \ 16 \ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 \ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 \ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 \ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 \ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 \ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 \ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 \ 24 \ Retrieved from: http://en.literateprograms.org/Eight_queens_puzzle_(Forth)?oldid=15632 25 26 \ board is left-diagonal, right-diagonal, and vertical attacks. 27 : board ( n -- l r v ) 28 >r -1 -1 1 r> lshift 1- ; 29 30 : safe-files ( l r v -- l r v files ) dup 2over and and ; 31 : first ( files -- first-file ) dup negate and ; 32 : rest ( files -- files' ) dup 1- and ; 33 34 : place-queen ( l r v file -- l r v l' r' v' ) 35 invert >r 36 2 pick r@ and 2* 1+ 37 2 pick r@ and 2/ 38 2 pick r> and ; 39 40 variable positions 41 variable solutions 42 43 : try ( l r v -- ) 44 dup 0= if 1 solutions +! 45 else 1 positions +! 46 safe-files begin ?dup while 47 dup >r first place-queen recurse r> 48 rest repeat 49 then 50 drop drop drop ; 51 52 : queens ( n -- ) 53 0 solutions ! 0 positions ! 54 dup board try . ." queens: " 55 solutions @ . ." solutions (tried " 56 positions @ . ." positions)." ; 57 58
