summary refs log blame commit diff stats
path: root/types.go
blob: 8a707bd1098049f2b8e276cc6c6b0f7c610c35bf (plain) (tree)
generated by cgit-pink 1.4.1-2-gfad0 (git 2.36.2.497.gbbea4dcf42) at 2024-07-05 09:02:08 +0000
break-if done? curr:square <- merge next-rank, next-file { curr-conflicts?:bool <- conflict? curr, queens break-if curr-conflicts? new-queens:&:list:square <- push curr, queens sub-result:num <- nqueens n, new-queens result <- add result, sub-result } next-file <- add next-file, 1 loop } ] # check if putting a queen on 'curr' conflicts with any of the existing # queens # assumes that 'curr' is on a non-conflicting rank, and checks for conflict # only in files and diagonals def conflict? curr:square, queens:&:list:square -> result:bool [ local-scope load-ingredients result <- conflicting-file? curr, queens return-if result result <- conflicting-diagonal? curr, queens ] def conflicting-file? curr:square, queens:&:list:square -> result:bool [ local-scope load-ingredients curr-file:num <- get curr, file:offset { break-unless queens q:square <- first queens qfile:num <- get q, file:offset file-match?:bool <- equal curr-file, qfile return-if file-match?, 1/conflict-found queens <- rest queens loop } return 0/no-conflict-found ] def conflicting-diagonal? curr:square, queens:&:list:square -> result:bool [ local-scope load-ingredients curr-rank:num <- get curr, rank:offset curr-file:num <- get curr, file:offset { break-unless queens q:square <- first queens qrank:num <- get q, rank:offset qfile:num <- get q, file:offset rank-delta:num <- subtract qrank, curr-rank file-delta:num <- subtract qfile, curr-file rank-delta <- abs rank-delta file-delta <- abs file-delta diagonal-match?:bool <- equal rank-delta, file-delta return-if diagonal-match?, 1/conflict-found queens <- rest queens loop } return 0/no-conflict-found ] def main [ nqueens 4 $dump-trace [app] ]