diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2025-06-15 21:22:09 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-15 21:22:09 +0100 |
| commit | 89e1918aa2c20e267feaafced4e7a2e68a8723b7 (patch) | |
| tree | 998b560b3ab40e0791ad4bb8e75b5b8603d47868 /challenge-325/ysth/python | |
| parent | debca5b8e7261ce86883bdce2ba0ccddd07247e2 (diff) | |
| parent | b5d49aa06286a39fe7011326e7c0db5822d5f33c (diff) | |
| download | perlweeklychallenge-club-89e1918aa2c20e267feaafced4e7a2e68a8723b7.tar.gz perlweeklychallenge-club-89e1918aa2c20e267feaafced4e7a2e68a8723b7.tar.bz2 perlweeklychallenge-club-89e1918aa2c20e267feaafced4e7a2e68a8723b7.zip | |
Merge pull request #12185 from ysth/challenge-325-ysth
challenge 325 python and perl solutons by ysth
Diffstat (limited to 'challenge-325/ysth/python')
| -rw-r--r-- | challenge-325/ysth/python/ch-1.py | 58 | ||||
| -rw-r--r-- | challenge-325/ysth/python/ch-2.py | 18 |
2 files changed, 76 insertions, 0 deletions
diff --git a/challenge-325/ysth/python/ch-1.py b/challenge-325/ysth/python/ch-1.py new file mode 100644 index 0000000000..97aa83a7a3 --- /dev/null +++ b/challenge-325/ysth/python/ch-1.py @@ -0,0 +1,58 @@ +import sys + +#https://stackoverflow.com/questions/65271060/is-there-a-built-in-way-to-use-inline-c-code-in-python + +# cffi? https://stackoverflow.com/questions/65271060/is-there-a-built-in-way-to-use-inline-c-code-in-python +# python benchmarks + +# ch-2: perl using List::BinarySearch and Judy1 + +def make_regex_search(r): + def regex_search(binary_list): + match = r.search(''.join(['1' if value==1 else '0' for value in binary_list])) + result = 0 if not match else len(match.group(1)) + return result + return regex_search + +import re +naive_regex = make_regex_search(re.compile('(1+)(?!.*?\\1)')) + +better_regex = make_regex_search(re.compile('(?<!1)(1++)(?!.*?\\1)')) + +# re does not support branch reset or SKIP, re and regex do not support MARK +import pcre2 +one_pass_regex = make_regex_search(pcre2.compile('(?|(1++).*?(*MARK:go)\\1(*SKIP:go)(*FAIL)|(1++))')) + +def loop(binary_list): + current_sequence = 0; + longest_sequence = 0; + for value in binary_list: + if value: + current_sequence += 1 + else: + if longest_sequence < current_sequence: + longest_sequence = current_sequence + current_sequence = 0 + if longest_sequence < current_sequence: + longest_sequence = current_sequence + return longest_sequence + +def loop_sentinel(binary_list): + current_sequence = 0; + longest_sequence = 0; + for value in (*binary_list, 0): + if value: + current_sequence += 1 + else: + if longest_sequence < current_sequence: + longest_sequence = current_sequence + current_sequence = 0 + return longest_sequence + +#binary_list = [1 if value=='1' else 0 for value in sys.argv[1:]] +from digits import digits as binary_list +print(loop(binary_list)) +print(loop_sentinel(binary_list)) +print(naive_regex(binary_list)) +print(better_regex(binary_list)) +print(one_pass_regex(binary_list)) diff --git a/challenge-325/ysth/python/ch-2.py b/challenge-325/ysth/python/ch-2.py new file mode 100644 index 0000000000..f151496925 --- /dev/null +++ b/challenge-325/ysth/python/ch-2.py @@ -0,0 +1,18 @@ +import sys +import bisect + +prices = [int(value) for value in sys.argv[1:]] + + +sale_prices = [] +seen_prices = [] +for price in reversed(prices): + seen_price_index = bisect.bisect_right(seen_prices, price) + discount = seen_prices[seen_price_index-1] if seen_price_index > 0 else 0 + if seen_price_index == 0 or seen_prices[seen_price_index-1] != price: + seen_prices[seen_price_index:] = [price] + sale_prices.insert(0, price - discount) + + +print("prices: ", prices) +print("sale prices ", sale_prices) |
