three distinct points are plotted at random on a cartesian plane for which 1000 x y 1000 such that a triangle is formed consider the following two triangles a340 495 b153 910 c835 947 x175 41 y421 714 z574 645 it can be verified that triangle abc contains the origin whereas triangle xyz does not using triangles txt right click and save linktarget as a 27k text file containing the coordinates of one thousand random triangles find the number of triangles for which the interior contains the origin note the first two examples in the file represent the triangles in the example given above return the 2d vector product of two vectors vectorproduct1 2 5 0 10 vectorproduct3 1 6 10 24 check if the triangle given by the points ax1 y1 bx2 y2 cx3 y3 contains the origin containsorigin340 495 153 910 835 947 true containsorigin175 41 421 714 574 645 false find the number of triangles whose interior contains the origin solutiontesttriangles txt 1 return the 2 d vector product of two vectors vector_product 1 2 5 0 10 vector_product 3 1 6 10 24 check if the triangle given by the points a x1 y1 b x2 y2 c x3 y3 contains the origin contains_origin 340 495 153 910 835 947 true contains_origin 175 41 421 714 574 645 false find the number of triangles whose interior contains the origin solution test_triangles txt 1
from __future__ import annotations

from pathlib import Path


def vector_product(point1: tuple[int, int], point2: tuple[int, int]) -> int:
    
    return point1[0] * point2[1] - point1[1] * point2[0]


def contains_origin(x1: int, y1: int, x2: int, y2: int, x3: int, y3: int) -> bool:
    
    point_a: tuple[int, int] = (x1, y1)
    point_a_to_b: tuple[int, int] = (x2 - x1, y2 - y1)
    point_a_to_c: tuple[int, int] = (x3 - x1, y3 - y1)
    a: float = -vector_product(point_a, point_a_to_b) / vector_product(
        point_a_to_c, point_a_to_b
    )
    b: float = +vector_product(point_a, point_a_to_c) / vector_product(
        point_a_to_c, point_a_to_b
    )

    return a > 0 and b > 0 and a + b < 1


def solution(filename: str = "p102_triangles.txt") -> int:
    
    data: str = Path(__file__).parent.joinpath(filename).read_text(encoding="utf-8")

    triangles: list[list[int]] = []
    for line in data.strip().split("\n"):
        triangles.append([int(number) for number in line.split(",")])

    ret: int = 0
    triangle: list[int]

    for triangle in triangles:
        ret += contains_origin(*triangle)

    return ret


if __name__ == "__main__":
    print(f"{solution() = }")