diff --git a/2023/python/Day06.py b/2023/python/Day06.py
new file mode 100644
index 0000000000000000000000000000000000000000..c407ce1a96a601f93c356ec6733d0f9526733b7a
--- /dev/null
+++ b/2023/python/Day06.py
@@ -0,0 +1,57 @@
+import functools
+import itertools
+from typing import List, Tuple
+
+from ImportData import import_data
+
+day: int = 6
+
+sample_data: List[str] = '''
+Time:      7  15   30
+Distance:  9  40  200
+'''.split('\n')[1:-1]
+
+data_structure: type = List[Tuple[int, int]]
+
+
+def parse_data1(data: List[str]) -> data_structure:
+    times: List[int] = [int(time) for time in data[0].split(':')[1].strip().split()]
+    distances: List[int] = [int(distance) for distance in data[1].split(':')[1].strip().split()]
+    tuples = []
+    for index, _ in enumerate(times):
+        tuples.append((times[index], distances[index]))
+    return tuples
+
+
+def get_number_of_winning_options(race: Tuple[int, int]) -> int:
+    time: int = race[0]
+    record_distance: int = race[1]
+    number_of_wins: int = 0
+    for hold_time in range(1, time):
+        move_time = time - hold_time
+        speed = hold_time
+        distance = speed * move_time
+        if distance > record_distance:
+            number_of_wins += 1
+    return number_of_wins
+
+
+def part1(data: data_structure) -> int:
+    return functools.reduce(lambda x, y: x * y, [get_number_of_winning_options(race) for race in data])
+
+
+def parse_data2(data: List[str]) -> data_structure:
+    times: List[str] = [time for time in data[0].split(':')[1].strip().split()]
+    distances: List[str] = [distance for distance in data[1].split(':')[1].strip().split()]
+    return [((int(''.join(times))), (int(''.join(distances))))]
+
+
+def part2(data: data_structure) -> int:
+    return get_number_of_winning_options(data[0])
+
+
+if __name__ == '__main__':
+    production_ready = True
+    raw_data = import_data(day) if production_ready else sample_data
+    print(part1(parse_data1(raw_data)))
+    print(part2(parse_data2(raw_data)))