text: SET NOCOUNT ON;
  
  -- Doors can be open or closed.
  DECLARE @open CHAR(1) = 'O';
  DECLARE @closed CHAR(1) = 'C';
  
  -- There are 100 doors in a row that are all initially closed.
  DECLARE @doorsCount INT = 100;
  DECLARE @doors TABLE (doorKey INT PRIMARY KEY, doorState CHAR(1));
  WITH sample100 AS (
      SELECT TOP(100) object_id
      FROM sys.objects
  )
  INSERT @doors
    SELECT ROW_NUMBER() OVER (ORDER BY A.object_id) AS doorKey,
      @closed AS doorState
    FROM sample100 AS A
        CROSS JOIN sample100 AS B
        CROSS JOIN sample100 AS C
        CROSS JOIN sample100 AS D
    ORDER BY 1
    OFFSET 0 ROWS
    FETCH NEXT @doorsCount ROWS ONLY;
  
  -- You make 100 passes by the doors, visiting every door and toggle the door (if
  -- the door is closed, open it; if it is open, close it), according to the rules
  -- of the task.
  DECLARE @pass INT = 1;
  WHILE @pass <= @doorsCount BEGIN
    UPDATE @doors
    SET doorState = CASE doorState WHEN @open THEN @closed ELSE @open END
    WHERE doorKey >= @pass
      AND doorKey % @pass = 0;
  
    SET @pass = @pass + 1;
  END;
  
  -- Answer the question: what state are the doors in after the last pass?
  -- The answer as the query result is:
  SELECT doorKey, doorState FROM @doors;
  -- The answer as the console output is:
  DECLARE @log VARCHAR(max);
  DECLARE @doorKey INT = (SELECT MIN(doorKey) FROM @doors);
  WHILE @doorKey <= @doorsCount BEGIN
    SET @log = (
        SELECT TOP(1) CONCAT('Doors ', doorKey, ' are ',
          CASE doorState WHEN @open THEN ' open' ELSE 'closed' END, '.')
        FROM @doors
        WHERE doorKey = @doorKey
      );
    RAISERROR (@log, 0, 1) WITH NOWAIT;
  
    SET @doorKey = (SELECT MIN(doorKey) FROM @doors WHERE doorKey > @doorKey);
  END;
  
  -- Which are open, which are closed?
  -- The answer as the query result is:
  SELECT doorKey, doorState FROM @doors WHERE doorState = @open;
  SELECT doorKey, doorState FROM @doors WHERE doorState = @closed;
  -- The answer as the console output is:
  SET @log = (
    SELECT CONCAT('These are open doors: ',
      STRING_AGG(CAST(doorKey AS VARCHAR(max)), ', '), '.')
    FROM @doors
    WHERE doorState = @open
  );
  RAISERROR (@log, 0, 1) WITH NOWAIT;
  SET @log = (
    SELECT CONCAT('These are closed doors: ',
      STRING_AGG(CAST(doorKey AS VARCHAR(max)), ', '), '.')
    FROM @doors
    WHERE doorState = @closed
  );
  RAISERROR (@log, 0, 1) WITH NOWAIT;
  
  -- Assert:
  DECLARE @expected TABLE (doorKey INT PRIMARY KEY);
  SET @doorKey = 1;
  WHILE @doorKey * @doorKey <= @doorsCount BEGIN
    INSERT @expected VALUES (@doorKey * @doorKey);
    SET @doorKey = @doorKey + 1;
  END;
  IF NOT EXISTS (
      SELECT doorKey FROM @doors WHERE doorState = @open
      EXCEPT
      SELECT doorKey FROM @expected
    )
    AND NOT EXISTS (
      SELECT doorKey FROM @expected
      EXCEPT
      SELECT doorKey FROM @doors WHERE doorState = @open
    )
    PRINT 'The task is solved.';
  ELSE
    THROW 50000, 'These aren''t the doors you''re looking for.', 1;