From d09c76fb33ba0032d7c49b11821b76ac42ebbce5 Mon Sep 17 00:00:00 2001 From: Xevion Date: Sun, 11 Aug 2019 02:50:39 -0500 Subject: [PATCH] initialization --- config.json | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.py | 46 +++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 config.json create mode 100644 main.py diff --git a/config.json b/config.json new file mode 100644 index 0000000..937498f --- /dev/null +++ b/config.json @@ -0,0 +1,125 @@ +{ + "elements": { + "1": 0, + "2": 0, + "3": 3, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 1, + "9": 0, + "10": 0, + "11": 0, + "12": 0, + "13": 0, + "14": 2, + "15": 0, + "16": 0, + "17": 0, + "18": 0, + "19": 0, + "20": 0, + "21": 0, + "22": 0, + "23": 0, + "24": 0, + "25": 0, + "26": 0, + "27": 0, + "28": 0, + "29": 0, + "30": 0, + "31": 0, + "32": 0, + "33": 0, + "34": 0, + "35": 0, + "36": 0, + "37": 0, + "38": 0, + "39": 0, + "40": 0, + "41": 0, + "42": 0, + "43": 0, + "44": 0, + "45": 0, + "46": 0, + "47": 0, + "48": 0, + "49": 0, + "50": 0, + "51": 0, + "52": 0, + "53": 0, + "54": 0, + "55": 0, + "56": 0, + "57": 0, + "58": 0, + "59": 0, + "60": 0, + "61": 0, + "62": 0, + "63": 0, + "64": 0, + "65": 0, + "66": 0, + "67": 0, + "68": 0, + "69": 0, + "70": 0, + "71": 0, + "72": 0, + "73": 0, + "74": 0, + "75": 0, + "76": 0, + "77": 0, + "78": 0, + "79": 0, + "80": 0, + "81": 0, + "82": 0, + "83": 0, + "84": 0, + "85": 0, + "86": 0, + "87": 0, + "88": 0, + "89": 0, + "90": 0, + "91": 0, + "92": 0, + "93": 0, + "94": 0, + "95": 0, + "96": 0, + "97": 0, + "98": 0, + "99": 0, + "100": 0, + "101": 0, + "102": 0, + "103": 0, + "104": 0, + "105": 0, + "106": 0, + "107": 0, + "108": 0, + "109": 0, + "110": 0, + "111": 0, + "112": 0, + "113": 0, + "114": 0, + "115": 0, + "116": 0, + "117": 0, + "118": 0 + }, + "minimumScore": 1, + "reverseSorting": false, + "fullPrint" : true +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..082a058 --- /dev/null +++ b/main.py @@ -0,0 +1,46 @@ +import os, sys, json, re, mendeleev as mdv + +path = os.path.join(sys.path[0], 'config.json') +config = json.load(open(path, 'r')) + +def score(item): + return config['elements'][str(item[0])] + config['elements'][str(item[1])], item + +def arrange(item): + return (max(item), min(item)) + +def formatting(e1, e2): + e1, e2 = mdv.element(e1), mdv.element(e2) + return '\t[{} {}] + [{} {}]'.format(e1.symbol if not config['fullPrint'] else e1.name, + e1.atomic_number, + e2.symbol if not config['fullPrint'] else e2.name, + e2.atomic_number) + +def getElement(element): + if re.match(r'\d+', element): + return mdv.element(int(element)) + elif re.match(r'\w{1,2}', element): + try: + return mdv.element(element.strip().title()) + except: + raise ValueError('Unknown Element \'{}\''.format(element)) + else: + raise ValueError('Unknown Element Format \'{}\''.format(element)) + +def bestSelection(select): + select = select.atomic_number + posi = [(x, select - x) for x in range(1, select)] + posi = list(map(arrange, posi)) + posi = list(set(posi)) + posi = list(filter(lambda item : score(item)[0] >= config['minimumScore'], posi)) + posi.sort(key=lambda item : score(item), reverse=not config['reverseSorting']) + + string1 = '[Best Elements for Element {}, {}]'.format(select, mdv.element(select).name) + string2 = '\n'.join([formatting(element1, element2) for element1, element2 in posi]) + return string1, string2 or '\t{No elements matched the configuration specified}' + +selection = input("Choose elements, delimited by whitespace and/or punctuation...\n") +selection = [getElement(e) for e in selection.split()] +print('\n\n'.join( + sorted(['{}\n{}'.format(*bestSelection(E)) for E in selection], key=lambda string : len(string.split('\n'))) +)) \ No newline at end of file