diff --git a/.github/workflows/autocheckcombos.yml b/.github/workflows/autocheckcombos.yml index 2c2d8dc..3279986 100644 --- a/.github/workflows/autocheckcombos.yml +++ b/.github/workflows/autocheckcombos.yml @@ -23,10 +23,10 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.9' @@ -35,10 +35,10 @@ jobs: run: | sudo apt-get install -y expect - - name: Run find-num.py + - name: Run findnum.py id: find_num run: | - unbuffer python find-num.py --range 255 | tee result.txt + unbuffer python findnum.py --range 255 | tee result.txt - name: Update originalMappings.csv id: update_mappings @@ -81,7 +81,7 @@ jobs: body: | ## 🚀 Automatic Shorter Candidates - This PR updates `data/originalMappings.csv` with new shorter candidates discovered by `find-num.py`. + This PR updates `data/originalMappings.csv` with new shorter candidates discovered by `findnum.py`. Enjoy 🎉 base: main @@ -95,7 +95,7 @@ jobs: - name: Upload Existing Combinations Log if: steps.update_mappings.outputs.new_candidates == 'false' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: results-log path: result.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e99e36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc \ No newline at end of file diff --git a/data/originalMappings.csv b/data/originalMappings.csv index 081104e..12f5d22 100644 --- a/data/originalMappings.csv +++ b/data/originalMappings.csv @@ -253,4 +253,122 @@ 252,chr(len(vars(set))+len(vars(set))+len(str(credits))) 253,chr(sum(range(len(str(bin))))) 254,chr((not())+sum(range(len(str(bin))))) -255,chr((not())+(not())+sum(range(len(str(bin))))) \ No newline at end of file +255,chr((not())+(not())+sum(range(len(str(bin))))) +276,chr(sum(range(len(str(hash))))) +300,chr(sum(range(len(str(ascii))))) +325,chr(sum(range(len(ascii(str(hash)))))) +351,chr(sum(range(len(ascii(str(ascii)))))) +378,chr(sum(range(len(str(set()))+len(str(bin))))) +406,chr(sum(range(len(str(set()))+len(str(hash))))) +435,chr(sum(range(len(str(set()))+len(str(ascii))))) +465,chr(sum(range(len(str(set))+len(str(reversed))))) +496,chr(sum(range(ord(min(str(bin)))))) +528,chr(sum(range((not())+ord(min(str(bin)))))) +561,chr(sum(range(ord(min(repr(repr(str()))))))) +595,chr(sum(range(len(vars(dict))))) +630,chr(sum(range(len(ascii(type(bin)))))) +666,chr(sum(range(len(vars(list))))) +703,chr(sum(range((not())+len(vars(list))))) +741,chr(sum(range(ord(max(repr(str())))))) +780,chr(sum(range(ord(min(str(set())))))) +820,chr(sum(range(ord(max(str(())))))) +861,chr(sum(range(ord(max(str(())))+(not())))) +903,chr(sum(range(ord(max(str(())))+(not())+(not())))) +946,chr(sum(range(ord(max(str(tuple(repr(str())))))))) +990,chr(sum(range(len(vars(tuple))+len(str(bin))))) +1035,chr(sum(range(ord(min(str(float())))))) +1081,chr(sum(range(len(vars(set))))) +1128,chr(sum(range(ord(str(int()))))) +1176,chr(sum(range(ord(str(+(not())))))) +1225,chr(sum(range(ord(str((not())+(not())))))) +1275,chr(sum(range(ord(str(len(hex(int()))))))) +1326,chr(sum(range(ord(str(len(str(not()))))))) +1378,chr(sum(range(ord(str(len(str(set()))))))) +1431,chr(sum(range(ord(str(len(str(complex(not())))))))) +1485,chr(sum(range(ord(max(str(ord(max(str(not()))))))))) +1540,chr(sum(range(ord(max(str(ord(str(int())))))))) +1596,chr(sum(range(ord(max(str(ord(str(+(not()))))))))) +1653,chr(sum(range(len(str(bin))+len(vars(dict))))) +1711,chr(sum(range(len(str(hash))+len(vars(dict))))) +1770,chr(sum(range(ord(next(iter(str(bin))))))) +1830,chr(sum(range(len(str(set))+ord(str(int()))))) +1891,chr(sum(range(ord(next(reversed(str(object()))))))) +1953,chr(sum(range(len(str(bytes))+ord(str(int()))))) +2016,chr(sum(range(len(str(bin))+ord(max(str(())))))) +2080,chr(sum(range(len(str(hash))+ord(max(str(())))))) +2145,chr(sum(range(len(str(ascii))+ord(max(str(())))))) +2211,chr(sum(range(ord(next(iter(str(copyright))))))) +2278,chr(sum(range(len(str(frozenset))+ord(str(+(not())))))) +2346,chr(sum(range(len(vars(tuple))+len(vars(set))))) +2415,chr(sum(range(ord(min(str(()in())))))) +2485,chr(sum(range((not())+ord(min(str(()in())))))) +2556,chr(sum(range(len(str(hash))+ord(str(int()))))) +2628,chr(sum(range(len(str(ascii))+ord(str(int()))))) +2701,chr(sum(range(len(str(ascii))+ord(str(+(not())))))) +2775,chr(sum(range(len(vars(dict))+ord(min(str(set())))))) +2850,chr(sum(range(len(vars(dict))+ord(max(str(())))))) +2926,chr(sum(range(len(vars(list))+ord(min(str(set())))))) +3003,chr(sum(range(sum(range(len(str(set))))))) +3081,chr(sum(range(sum(range(len(str(set))))+(not())))) +3160,chr(sum(range(ord(min(str(bin)))+ord(str(int()))))) +3240,chr(sum(range(ord(min(str(bin)))+ord(str(+(not())))))) +3321,chr(sum(range(len(vars(dict))+len(vars(set))))) +3403,chr(sum(range(len(vars(dict))+ord(str(int()))))) +3486,chr(sum(range(ord(min(str(not())))))) +3570,chr(sum(range(ord(min(str(not())))+(not())))) +3655,chr(sum(range(len(vars(list))+ord(str(+(not())))))) +3741,chr(sum(range(ord(min(str(set())))+len(vars(set))))) +3828,chr(sum(range(ord(max(str(())))+len(vars(set))))) +3916,chr(sum(range(ord(max(str(())))+ord(str(int()))))) +4005,chr(sum(range(ord(max(str(())))+ord(str(+(not())))))) +4095,chr(sum(range(sum(range(len(str(dict))))))) +4186,chr(sum(range(ord(max(repr(repr(repr(str())))))))) +4278,chr(sum(range(len(str(bin))+ord(min(str(()in())))))) +4371,chr(sum(range(len(str(hash))+ord(min(str(()in())))))) +4465,chr(sum(range(len(vars(set))+ord(str(int()))))) +4560,chr(sum(range(ord(min(min(vars())))+(not())))) +4656,chr(sum(range(max(range(ord(max(bin(int())))))))) +4753,chr(sum(range(ord(max(bin(int())))))) +4851,chr(sum(range(ord(max(bin(int())))+(not())))) +4950,chr(sum(range((not())+ord(max(bin(int())))+(not())))) +5050,chr(sum(range(ord(next(reversed(str(not()))))))) +5151,chr(sum(range(ord(next(iter(str(frozenset()))))))) +5253,chr(sum(range(len(str(set()))+ord(max(bin(int())))))) +5356,chr(sum(range(len(str(set))+sum(range(len(str(dict))))))) +5460,chr(sum(range(sum(range(len(repr(str(set)))))))) +5565,chr(sum(range(ord(max(str(complex())))))) +5671,chr(sum(range(ord(max(str(complex())))+(not())))) +5778,chr(sum(range(len(str(hash))+ord(min(str(not())))))) +5886,chr(sum(range(len(str(ascii))+ord(min(str(not())))))) +5995,chr(sum(range(max(range(ord(max(oct(int())))))))) +6105,chr(sum(range(ord(max(oct(int())))))) +6216,chr(sum(range(ord(max(oct(int())))+(not())))) +6328,chr(sum(range(ord(max(oct(int())))+(not())+(not())))) +6441,chr(sum(range(ord(max(str(range(int()))))))) +6555,chr(sum(range(ord(max(str(range)))))) +6670,chr(sum(range(ord(max(str(set)))))) +6786,chr(sum(range(ord(max(str(bin)))))) +6903,chr(sum(range(ord(max(str(vars)))))) +7021,chr(sum(range(ord(max(str(pow)))))) +7140,chr(sum(range(ord(max(str(hex)))))) +7260,chr(sum(range(ord(max(str(type)))))) +7381,chr(sum(range(ord(max(str(zip)))))) +7503,chr(sum(range(ord(min(str(dict())))))) +7626,chr(sum(range(ord(min(str(dict())))+(not())))) +7750,chr(sum(range(ord(max(str(dict())))))) +7875,chr(sum(range(ord(max(str(dict())))+(not())))) +8001,chr(sum(range(len(str(set()))+ord(max(str(zip)))))) +8128,chr(sum(range(len(str(set))+ord(max(str(range)))))) +8256,chr(sum(range(len(str(set))+ord(max(str(set)))))) +8385,chr(sum(range(len(str(set))+ord(max(str(bin)))))) +8515,chr(sum(range(len(str(set))+ord(max(str(vars)))))) +8646,chr(sum(range(len(str(set))+ord(max(str(pow)))))) +8778,chr(sum(range(len(str(set))+ord(max(str(hex)))))) +8911,chr(sum(range(len(str(set))+ord(max(str(type)))))) +9045,chr(sum(range(len(str(set))+ord(max(str(zip)))))) +9180,chr(sum(range(len(str(dict))+ord(max(str(zip)))))) +9316,chr(sum(range(len(str(bytes))+ord(max(str(zip)))))) +9453,chr(sum(range(len(str(bin))+ord(max(str(range)))))) +9591,chr(sum(range(len(str(bin))+ord(max(str(set)))))) +9730,chr(sum(range(len(str(bin))+ord(max(str(bin)))))) +9870,chr(sum(range(len(str(bin))+ord(max(str(vars)))))) \ No newline at end of file diff --git a/find-num.py b/findnum.py similarity index 90% rename from find-num.py rename to findnum.py index 1425598..cea5beb 100644 --- a/find-num.py +++ b/findnum.py @@ -23,8 +23,8 @@ def find_shortest_combination(target, codes, max_length=4): # Extract ASCII values from codes for code in codes: try: - code = process_code(code) - ascii_value = eval(code) + processed_code = process_code(code) + ascii_value = eval(processed_code) ascii_values[code] = ascii_value except Exception: continue @@ -33,25 +33,31 @@ def find_shortest_combination(target, codes, max_length=4): shortest_length = float('inf') # Helper function to update shortest result - def update_shortest(expression): + def update_shortest(expression, original_code): nonlocal shortest_result, shortest_length - current_length = len(f"chr({expression})") + current_length = len(original_code) if current_length < shortest_length: - shortest_result = f"chr({expression})" + shortest_result = original_code shortest_length = current_length + # Check individual codes first + for code, value in ascii_values.items(): + if value == target: + update_shortest(code, code) + return shortest_result, shortest_length + # Check combinations of codes - for length in range(1, max_length + 1): + for length in range(2, max_length + 1): for combo in combinations(ascii_values.items(), length): if sum(val for _, val in combo) == target: expression = "+".join(code for code, _ in combo) - update_shortest(expression) - if length == 1: # If we found a single code match, we can stop - return shortest_result, shortest_length + combined_code = f"chr({expression})" + update_shortest(expression, combined_code) return shortest_result, shortest_length + def process_file(filename): """Process the CSV file and return a list of codes.""" codes = []