This algorithm is relatively simple. It attempts to push all blocks into a valid arrangement towards one end of the line, and notes their positions. Then it tries to find a valid arrangement pushed towards the opposite end, and compares with the previous positions. Where the range of cells covered by a single block pushed one way overlaps with the corresponding range pushed the other, it deduces that only solids can exist. Similarly, where the range of the gap between two blocks overlaps with itself when pushed to extremes, it deduces dots.

For example:

Length:   24
Rule:     1,1,5
Original: >---#---------#-----#####<
Broken:   >---#--         -      # <
      left>000122344444444444555556<
     right>000122222222222223455555<
      fast>---#--+++++++++-+++####+<

Odd numbers show the positions of blocks; even numbers show the gaps between them. Where an odd number overlaps with itself, there are solids; where even, dots.

This approach tends to be very fast, and gets most of the logically available information, but it does miss a few dots sometimes. For example:

Length:   29
Rule:     9,1,1,1
Original: >-----#########--------#-#-#--<
Broken:   >   --#########-------   #- - <
      left>00000111111111222222234456788<
     right>00000111111111222222222234567<
      fast>-----#########-------+++#-+-+<
    missed>                       -     <

Missed solids are rarer:

Length:   46
Rule:     5,6,3,1,1
Original: >---#####--######------------###-----------#-#-<
Broken:   >               #- -----      ##-      ---   #-<
      left>1111122222333333444444444444555678888888888890<
     right>0000000000011111222222222333333444455566667890<
      fast>+++++++++++++++#-+-----++++++##-++++++---++-#-<
    missed>         - ####  -     --   #                 <

Ĉi tiu paĝo disponeblas ĉi-lingve, laŭ la agordo de via krozilo.