diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ac80737cbad89f122d2fce5631a76e7b46159e80 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.c +changpu_v2 + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..c44172d5a029f9c4d694ba866e0d2734e8f1b573 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ + +CC ?= gcc -O3 + +build: + cython --embed changpu_v2.py + $(CC) changpu_v2.c -o changpu_v2 $$(python3-config --cflags --ldflags --embed) + +clean: + rm -f *.c changpu changpu_v2 + diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..cc2dbaa293f3f76818ffe078ce2c419d4730c984 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# changpu\_zhang + +å¼ è–蒲。æ¤ç¨‹åºé历所有情形寻找最优解,未作优化(懒)。 + +## performance + +``` +CASE Q: PYTHON=0.041s, C=0.040s +CASE 42: PYTHON=0.041s, C=0.023s +CASE 5Q2: PYTHON=0.038s, C=0.022s +CASE 5A53: PYTHON=0.040s, C=0.038s +CASE 5669: PYTHON=0.023s, C=0.023s +CASE 54Q3: PYTHON=0.039s, C=0.021s +CASE A877: PYTHON=0.038s, C=0.034s +CASE KJA5: PYTHON=0.024s, C=0.021s +CASE K325: PYTHON=0.039s, C=0.039s +CASE Q6348: PYTHON=0.028s, C=0.023s +CASE AK6522: PYTHON=0.023s, C=0.040s +CASE QJ35482: PYTHON=0.041s, C=0.038s +CASE 9583JQ3A: PYTHON=0.040s, C=0.022s +CASE K98KK8239: PYTHON=0.040s, C=0.040s +CASE 45232A62A4: PYTHON=0.055s, C=0.141s +CASE A9JK95A8K98: PYTHON=0.059s, C=0.159s +CASE 437998Q7Q637: PYTHON=0.099s, C=0.186s +CASE 4K223JQ82Q6J5: PYTHON=0.268s, C=0.184s +CASE J43J744392A563: PYTHON=1.063s, C=0.162s +CASE 64322666KJK36AJ: PYTHON=2.914s, C=0.171s +CASE 8AAQ4355A626276K: PYTHON=12.286s, C=0.178s +CASE JQ68K2745574A5KA9: PYTHON=......., C=0.224s +CASE 5978339223K9J73A7J: PYTHON=......., C=0.330s +CASE 24KJ7Q7886592264278: PYTHON=......., C=0.409s +CASE 3729J6JQ6JQ63QQ75KK2: PYTHON=......., C=0.855s +CASE K3K2495AJ652J749J32K8: PYTHON=......., C=1.368s +CASE Q3K6AK9JQKKJJ79A72A474: PYTHON=......., C=2.406s +CASE 39QJJ3AK787K99655JQ85A9: PYTHON=......., C=4.878s +CASE 432J5259A6K5588JAJJ9KQ7K: PYTHON=......., C=12.215s +CASE A936Q4J7QKKK3J7K7AK377Q54: PYTHON=......., C=13.480s +CASE Q328K7A284Q698649652A58936: PYTHON=......., C=22.705s +CASE 327965J2Q62Q2K4J3247JQK5A4K: PYTHON=......., C=14.555s +CASE 764933Q4577J9J9374KK7J9A4Q69: PYTHON=......., C=14.666s +CASE J48J2JAK84KJ4426K4JQ5655749QK: PYTHON=......., C=15.975s +CASE QQ8AK748K2K6824557K98Q35K554J8: PYTHON=......., C=15.039s +``` + + + diff --git a/benchmark.sh b/benchmark.sh new file mode 100644 index 0000000000000000000000000000000000000000..cded64c2100896a67da7b3bb4de5c509e9ab7beb --- /dev/null +++ b/benchmark.sh @@ -0,0 +1,61 @@ + + + + +function for_case () { + pytime=`( time python3 changpu_v2.py $1 ) 2>&1 | grep real | sed 's/^.*m//g'` + ctime=`( time ./changpu_v2 $1 ) 2>&1 | grep real | sed 's/^.*m//g'` + echo "CASE $1: PYTHON=$pytime, C=$ctime" +} + +function for_case_c () { + ctime=`( time ./changpu_v2 $1 ) 2>&1 | grep real | sed 's/^.*m//g'` + echo "CASE $1: PYTHON=......., C=$ctime" +} + + +for_case Q +for_case 42 +for_case 5Q2 +for_case 5A53 +for_case 5669 +for_case 54Q3 +for_case A877 +for_case KJA5 +for_case K325 +for_case Q6348 +for_case AK6522 +for_case QJ35482 +for_case 9583JQ3A +for_case K98KK8239 +for_case 45232A62A4 +for_case A9JK95A8K98 +for_case 437998Q7Q637 +for_case 4K223JQ82Q6J5 +for_case J43J744392A563 +for_case 64322666KJK36AJ +for_case 8AAQ4355A626276K +for_case_c JQ68K2745574A5KA9 +for_case_c 5978339223K9J73A7J +for_case_c 24KJ7Q7886592264278 +for_case_c 3729J6JQ6JQ63QQ75KK2 +for_case_c K3K2495AJ652J749J32K8 +for_case_c Q3K6AK9JQKKJJ79A72A474 +for_case_c 39QJJ3AK787K99655JQ85A9 +for_case_c 432J5259A6K5588JAJJ9KQ7K +for_case_c A936Q4J7QKKK3J7K7AK377Q54 +for_case_c Q328K7A284Q698649652A58936 +for_case_c 327965J2Q62Q2K4J3247JQK5A4K +for_case_c 764933Q4577J9J9374KK7J9A4Q69 +for_case_c J48J2JAK84KJ4426K4JQ5655749QK +for_case_c QQ8AK748K2K6824557K98Q35K554J8 + + + +# for len in (seq 20) +# for i in (seq $len) +# echo -n (random choice A 2 3 4 5 6 7 8 9 J Q K) +# end +# echo '' +# end + diff --git a/changpu.py b/changpu.py deleted file mode 100644 index c1980b2f4992f19c1a01f277cb76125dfc130937..0000000000000000000000000000000000000000 --- a/changpu.py +++ /dev/null @@ -1,75 +0,0 @@ -#cython: language_level=3 - -s = 'A8492QJ835433' -s = input("INPUT: ") - -import itertools - -def basic_char_to_int(ch): - ls = '0A23456789JQK' - return ls.find(ch) -def basic_int_to_char(i): - ls = '0A23456789JQK' - return ls[i] - -def comb_exclude_border(ar): - results = [] - for i in range(len(ar)): - if i != 0: - results += list(itertools.combinations(ar, i)) - return results -def sorted_list_dedup(ls): - if len(ls) == 0: - return ls - prev = "Impossible to match" - res = [] - for elem in ls: - if elem != prev: - prev = elem - res.append(elem) - return res -def set_try_sum_to_number(ls, target_int): - ls = ls.sort() - return "TODO" # TODO: speed up - -# we devide array to two half: halfA+halfB. -# Then find halfA == one of halfB.subset() -def combinations_pair_gen(ar): - combinations = comb_exclude_border(range(len(ar))) - results = [] - for combination in combinations: - halfA, halfB = [], [] - for i in range(len(ar)): - (halfA if i in combination else halfB).append(ar[i]) - results.append((halfA, halfB)) - return results - - -ar = [basic_char_to_int(ch) for ch in s] -possibilities = combinations_pair_gen(ar) -answers = [] -for possib in possibilities: - halfA, halfB = possib - if sum(halfA) > sum(halfB): - continue - elif sum(halfA) == sum(halfB): - answers.append((halfA, halfB)) - else: - # let's split halfB - for possib_halfB in comb_exclude_border(halfB): - if sum(halfA) == sum(possib_halfB): - answers.append((halfA, possib_halfB)) - -# now filter answers -quant = [len(answer[0]) + len(answer[1]) for answer in answers] -answers.sort(reverse=True, key=lambda answer: len(answer[0]) + len(answer[1])) -answers = sorted_list_dedup(answers) -answers = answers[:5] if len(answers) > 5 else answers - -# print answers -for answer in answers: - halfA_s = ''.join([basic_int_to_char(i) for i in answer[0]]) - halfB_s = ''.join([basic_int_to_char(i) for i in answer[1]]) - print(halfA_s, "===", halfB_s) - - diff --git a/changpu_v2.py b/changpu_v2.py index 9ab6d236f2e6dd529e113d6f4437c22b82f8ee30..fe156bf194a3a6f374880c9dc536a9a9db392271 100644 --- a/changpu_v2.py +++ b/changpu_v2.py @@ -1,5 +1,10 @@ -s = 'A8492QJ835433' -s = input("INPUT: ") +#cython: language_level=3 + +import sys +if len(sys.argv) == 2: + s = sys.argv[1] +else: + s = input("INPUT: ") import itertools @@ -40,7 +45,7 @@ combinations = comb_exclude_border(range(len(ar))) # 100 -> [[0,1,2,3], [6,7,8]] sum_buf = {} for comb in combinations: - sum_val = sum(comb) + sum_val = sum([ar[index] for index in comb]) if sum_val in sum_buf: sum_buf[sum_val].append(arr_to_bitarray(comb)) else: