1717/* Pretty prints a solution to the n-queens puzzle */
1818function pretty_print ( result , board_size ) {
1919 function member_eq ( v , xs ) {
20- return is_null ( xs ) ? null : equal ( v , head ( xs ) ) ? xs : member_eq ( v , tail ( xs ) ) ;
20+ return is_null ( xs )
21+ ? null
22+ : equal ( v , head ( xs ) )
23+ ? xs
24+ : member_eq ( v , tail ( xs ) ) ;
2125 }
2226 const possible_positions = enum_list ( 1 , board_size ) ;
2327
24- let col_index_str = ' ' ;
25- for_each ( i => { col_index_str = col_index_str + stringify ( i ) + ' ' ; } , possible_positions ) ;
28+ let col_index_str = " " ;
29+ for_each ( i => {
30+ col_index_str = col_index_str + stringify ( i ) + " " ;
31+ } , possible_positions ) ;
2632 display ( col_index_str ) ;
2733
2834 for_each ( row => {
29- let row_str = stringify ( row ) + ' ' ;
35+ let row_str = stringify ( row ) + " " ;
3036 for_each ( col => {
3137 const position = pair ( row , col ) ;
3238 const contains_position = member_eq ( position , result ) !== null ;
3339 if ( contains_position ) {
34- row_str = row_str + 'Q ' ;
40+ row_str = row_str + "Q " ;
3541 } else {
36- row_str = row_str + '. ' ;
42+ row_str = row_str + ". " ;
3743 }
38- } ,
39- possible_positions ) ;
44+ } , possible_positions ) ;
4045
4146 display ( row_str ) ;
42- } ,
43- possible_positions ) ;
47+ } , possible_positions ) ;
4448}
4549
46-
4750const N = 8 ; // the number of queens and the size of the board
4851const empty_positions = null ;
4952
@@ -60,19 +63,23 @@ function queens_slow(board_size, num_queens) {
6063 require ( num_queens <= board_size ) ;
6164 const possible_positions = enum_list ( 1 , board_size ) ;
6265
63- const result = accumulate ( ( _ , so_far ) => {
64- const row = an_element_of ( possible_positions ) ;
65- require ( is_row_safe ( row , so_far ) ) ;
66+ const result = accumulate (
67+ ( _ , so_far ) => {
68+ const row = an_element_of ( possible_positions ) ;
69+ require ( is_row_safe ( row , so_far ) ) ;
6670
67- const col = an_element_of ( possible_positions ) ;
68- require ( is_col_safe ( col , so_far ) ) ;
71+ const col = an_element_of ( possible_positions ) ;
72+ require ( is_col_safe ( col , so_far ) ) ;
6973
70- const new_position = pair ( row , col ) ;
71- require ( is_diagonal_safe ( new_position , so_far ) ) ;
74+ const new_position = pair ( row , col ) ;
75+ require ( is_diagonal_safe ( new_position , so_far ) ) ;
7276
73- const new_positions = pair ( new_position , so_far ) ;
74- return new_positions ;
75- } , empty_positions , enum_list ( 1 , num_queens ) ) ;
77+ const new_positions = pair ( new_position , so_far ) ;
78+ return new_positions ;
79+ } ,
80+ empty_positions ,
81+ enum_list ( 1 , num_queens )
82+ ) ;
7683
7784 return result ;
7885}
@@ -90,15 +97,20 @@ function is_col_safe(new_col, queen_positions) {
9097function is_diagonal_safe ( new_position , queen_positions ) {
9198 const new_sum = head ( new_position ) + tail ( new_position ) ;
9299 const new_sub = head ( new_position ) - tail ( new_position ) ;
93- const sums = map ( position => head ( position ) + tail ( position ) , queen_positions ) ;
94-
95- return member ( new_sum , sums ) === null &&
96- member ( new_sub , map (
97- position => head ( position ) - tail ( position ) , queen_positions
98- ) ) === null ;
100+ const sums = map (
101+ position => head ( position ) + tail ( position ) ,
102+ queen_positions
103+ ) ;
104+
105+ return (
106+ member ( new_sum , sums ) === null &&
107+ member (
108+ new_sub ,
109+ map ( position => head ( position ) - tail ( position ) , queen_positions )
110+ ) === null
111+ ) ;
99112}
100113
101-
102114/******************************************************************************/
103115/* Fast version which uses non-determinism only for the rows, */
104116/* with the columns being hardcoded. */
@@ -109,41 +121,43 @@ function is_diagonal_safe(new_position, queen_positions) {
109121// generate more solutions by entering 'try again' in the REPL
110122
111123function queens_fast ( board_size , num_queens ) {
112- require ( num_queens <= board_size ) ;
113- const possible_positions = enum_list ( 1 , board_size ) ;
114-
115- function queen_cols ( k ) {
116- if ( k === 0 ) {
117- return empty_positions ;
118- } else {
119- const so_far = queen_cols ( k - 1 ) ;
120-
121- const new_row = an_element_of ( possible_positions ) ;
122- const new_position = pair ( new_row , k ) ;
123- require ( is_safe ( new_position , so_far ) ) ;
124-
125- const new_positions = pair ( new_position , so_far ) ;
126- return new_positions ;
127- }
128- }
129- return queen_cols ( num_queens ) ;
124+ require ( num_queens <= board_size ) ;
125+ const possible_positions = enum_list ( 1 , board_size ) ;
126+
127+ function queen_cols ( k ) {
128+ if ( k === 0 ) {
129+ return empty_positions ;
130+ } else {
131+ const so_far = queen_cols ( k - 1 ) ;
132+
133+ const new_row = an_element_of ( possible_positions ) ;
134+ const new_position = pair ( new_row , k ) ;
135+ require ( is_safe ( new_position , so_far ) ) ;
136+
137+ const new_positions = pair ( new_position , so_far ) ;
138+ return new_positions ;
139+ }
140+ }
141+ return queen_cols ( num_queens ) ;
130142}
131143
132144function is_safe ( new_position , positions ) {
133- const new_row = head ( new_position ) ;
134- const new_col = tail ( new_position ) ;
145+ const new_row = head ( new_position ) ;
146+ const new_col = tail ( new_position ) ;
135147
136- return accumulate ( ( position , so_far ) => {
148+ return accumulate (
149+ ( position , so_far ) => {
137150 const row = head ( position ) ;
138151 const col = tail ( position ) ;
139152
140- return so_far &&
141- new_row - new_col !==
142- row - col &&
143- new_row + new_col !==
144- row + col &&
145- new_row !== row ;
153+ return (
154+ so_far &&
155+ new_row - new_col !== row - col &&
156+ new_row + new_col !== row + col &&
157+ new_row !== row
158+ ) ;
146159 } ,
147160 true ,
148- positions ) ;
161+ positions
162+ ) ;
149163}
0 commit comments