content: -- Finds all possible solutions and the unique patterns.
  
  property Grid_Size : 8
  
  property Patterns : {}
  property Solutions : {}
  property Test_Count : 0
  
  property Rotated : {}
  
  on run
      local diff
      local endTime
      local msg
      local rows
      local startTime
  
      set Patterns to {}
      set Solutions to {}
      set Rotated to {}
  
      set Test_Count to 0
  
      set rows to Make_Empty_List(Grid_Size)
  
      set startTime to current date
      Solve(1, rows)
      set endTime to current date
      set diff to endTime - startTime
  
      set msg to ("Found " & (count Solutions) & " solutions with " & (count Patterns) & " patterns in " & diff & " seconds.") as text
      display alert msg
  
      return Solutions
  end run
  
  on Solve(row as integer, rows as list)
      if row is greater than (count rows) then
          Append_Solution(rows)
          return
      end if
  
      repeat with column from 1 to Grid_Size
          set Test_Count to Test_Count + 1
          if Place_Queen(column, row, rows) then
              Solve(row + 1, rows)
          end if
      end repeat
  end Solve
  
  on abs(n)
      if n < 0 then
          -n
      else
          n
      end if
  end abs
  
  on Place_Queen(column as integer, row as integer, rows as list)
      local colDiff
      local previousRow
      local rowDiff
      local testColumn
  
      repeat with previousRow from 1 to (row - 1)
          set testColumn to item previousRow of rows
  
          if testColumn is equal to column then
              return false
          end if
  
          set colDiff to abs(testColumn - column) as integer
          set rowDiff to row - previousRow
          if colDiff is equal to rowDiff then
              return false
          end if
      end repeat
  
      set item row of rows to column
      return true
  end Place_Queen
  
  on Append_Solution(rows as list)
      local column
      local rowsCopy
      local testReflection
      local testReflectionText
      local testRotation
      local testRotationText
      local testRotations
  
      copy rows to rowsCopy
      set end of Solutions to rowsCopy
      local rowsCopy
  
      copy rows to testRotation
      set testRotations to {}
      repeat 3 times
          set testRotation to Rotate(testRotation)
          set testRotationText to testRotation as text
          if Rotated contains testRotationText then
              return
          end if
          set end of testRotations to testRotationText
  
          set testReflection to Reflect(testRotation)
          set testReflectionText to testReflection as text
          if Rotated contains testReflectionText then
              return
          end if
          set end of testRotations to testReflectionText
      end repeat
  
      repeat with testRotationText in testRotations
          set end of Rotated to (contents of testRotationText)
      end repeat
      set end of Rotated to (rowsCopy as text)
      set end of Rotated to (Reflect(rowsCopy) as text)
  
      set end of Patterns to rowsCopy
  end Append_Solution
  
  on Make_Empty_List(depth as integer)
      local i
      local emptyList
  
      set emptyList to {}
      repeat with i from 1 to depth
          set end of emptyList to missing value
      end repeat
      return emptyList
  end Make_Empty_List
  
  on Rotate(rows as list)
      local column
      local newColumn
      local newRow
      local newRows
      local row
      local rowCount
  
      set rowCount to (count rows)
      set newRows to Make_Empty_List(rowCount)
      repeat with row from 1 to rowCount
          set column to (contents of item row of rows)
          set newRow to column
          set newColumn to rowCount - row + 1
          set item newRow of newRows to newColumn
      end repeat
  
      return newRows
  end Rotate
  
  on Reflect(rows as list)
      local column
      local newRows
  
      set newRows to {}
      repeat with column in rows
          set end of newRows to (count rows) - column + 1
      end repeat
  
      return newRows
  end Reflect
  