let CountTriangles lines { let pointsAtLine = Vector lines; let numLines = Size pointsAtLine; let linesAtPoint = HashDict()->WithDefault []; Each (Range numLines) ?l { Each pointsAtLine@l ?p {linesAtPoint@p = l \ linesAtPoint@p} }; var count = 0; Each (Range numLines) ?l1 { Each pointsAtLine@l1 ?p1 => Each linesAtPoint@p1 ?l2 => if (l2 ~= l1) => Each pointsAtLine@l2 ?p2 => if (p2 > p1) => Each linesAtPoint@p2 ?l3 => if (l3 ~= l2) => Each pointsAtLine@l3 ?p3 => if (p3 > p2) => if (l1 %IsIn linesAtPoint@p3) {count = count + 1} }; count }; // Each sublist gives points on one line. CountTriangles [ [0 5 8 10] [0 3 7 9] [0 2 4 6] [0 1] [1 2 3 5] [1 4 7 8] [1 6 9 10] ]->WriteLine;