Ver Fonte

Implement nearest finder

Kirk Trombley há 3 anos atrás
pai
commit
c76edb0339
1 ficheiros alterados com 40 adições e 0 exclusões
  1. 40 0
      nearest.py

+ 40 - 0
nearest.py

@@ -0,0 +1,40 @@
+import csv
+import colorsys
+import random
+from argparse import ArgumentParser
+
+parser = ArgumentParser()
+parser.add_argument("color", nargs="?", default=None)
+parser.add_argument("-n", "--number", default=1, type=int)
+parser.add_argument("--database", nargs=1, default="database.csv")
+parser.add_argument("-v", "--verbose", action="store_true")
+args = parser.parse_args()
+
+if args.number <= 0:
+    raise ValueError("Must request a number greater than 0")
+
+if args.color is not None:
+    if len(args.color) != 6:
+        raise ValueError("Color must be a 6 digit hex")
+    color = (int(args.color[0:2], base=16), int(args.color[2:4], base=16), int(args.color[4:6], base=16))
+else:
+    # TODO random color
+    color = tuple(int(c * 255) for c in colorsys.hsv_to_rgb(random.random(), 0.5, 0.9))
+    print(f"Generated random color: {color}")
+
+results = []
+with open(args.database) as infile:
+    for name, x, *y in csv.reader(infile, delimiter=",", quotechar="'"):
+        score = float(x) - sum(float(y_c) * c for y_c, c in zip(y, color))
+        results.append((score, name))
+
+if args.number > 1:
+    for i, (score, name) in enumerate(sorted(results)[:args.number]):
+        print(f"{i+1}:\t{name}")
+        if args.verbose:
+            print(f"\t\t\t{score=}")
+else:
+    best_score, best_name = min(results)
+    print(f"Best match: {best_name}")
+    if args.verbose:
+        print(f"{score=}")