: olap { x1 w1 x2 w2 -- x w } x1 x2 max \ x x1 w1 + x2 w2 + min over - 0 max \ x w ; : isect ( x1 w1 x2 w2 y1 h1 y2 h2 -- x w y h ) olap 2>r \ R:y R:h olap 2r> \ x w y h ; : isecta ( x1 w1 x2 w2 y1 h1 y2 h2 -- w*h ) isect nip * nip ; : solve { ax ay aw ah bx by bw bh cx cy cw ch -- abc bc ac ab } bx bw cx cw by bh cy ch isect \ bc_x bc_w bc_y bc_h dup 3 pick * >r \ bc_x bc_w bc_y bc_h R:bc ay ah 2rot ax aw isecta r> \ abc bc ax aw cx cw ay ah cy ch isecta \ abc bc ac ax aw bx bw ay ah by bh isecta \ abc bc ac ab ; : print ." ab " . ." ac " . ." bc " . ." abc " 1 .r cr ; : go stdin slurp-fid bounds do i c@ bl = if i 1+ 2 s>number? * + ?dup or depth 12 = if solve print then then loop ; go bye