nearest.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #!/usr/bin/env python3
  2. import csv
  3. import colorsys
  4. import random
  5. from argparse import ArgumentParser
  6. parser = ArgumentParser()
  7. parser.add_argument("color", nargs="?", default=None, help="Target color, randomized if not provided")
  8. parser.add_argument("-n", "--number", default=1, type=int, help="Number of Pokemon to find")
  9. parser.add_argument("-c", "--closeness", default=2, type=int, help="Closeness coefficient")
  10. parser.add_argument("--database", default="database.csv", help="Database file")
  11. parser.add_argument("-v", "--verbose", action="store_true", help="Print raw scores")
  12. args = parser.parse_args()
  13. if args.number <= 0:
  14. raise ValueError("Must request a number greater than 0")
  15. if args.color is not None:
  16. if len(args.color) != 6:
  17. raise ValueError("Color must be a 6 digit hex")
  18. color = (int(args.color[0:2], base=16), int(args.color[2:4], base=16), int(args.color[4:6], base=16))
  19. else:
  20. color = tuple(int(c * 255) for c in colorsys.hsv_to_rgb(random.random(), 0.9, 0.9))
  21. print(f"Generated random color: #{''.join(hex(c)[2:] for c in color)} / {color}")
  22. results = []
  23. with open(args.database) as infile:
  24. for name, x, *y in csv.reader(infile, delimiter=",", quotechar="'"):
  25. score = float(x) - args.closeness * sum(float(y_c) * c for y_c, c in zip(y, color))
  26. results.append((score, name))
  27. if args.number > 1:
  28. for i, (score, name) in enumerate(sorted(results)[:args.number]):
  29. print(f"{i+1}:\t{name}")
  30. if args.verbose:
  31. print(f"\t\t\t{score=}")
  32. else:
  33. best_score, best_name = min(results)
  34. print(f"Best match: {best_name}")
  35. if args.verbose:
  36. print(f"{score=}")