From b5d49aa06286a39fe7011326e7c0db5822d5f33c Mon Sep 17 00:00:00 2001 From: Yitzchak Scott-Thoennes Date: Wed, 11 Jun 2025 20:42:24 -0400 Subject: challenge 325 python and perl solutons by ysth --- challenge-325/ysth/blog.txt | 1 + challenge-325/ysth/blog1.txt | 1 + challenge-325/ysth/perl/ch-1.pl | 136 ++++++++++++++++++++++++++++++++++++++ challenge-325/ysth/perl/ch-2.pl | 20 ++++++ challenge-325/ysth/python/ch-1.py | 58 ++++++++++++++++ challenge-325/ysth/python/ch-2.py | 18 +++++ 6 files changed, 234 insertions(+) create mode 100644 challenge-325/ysth/blog.txt create mode 100644 challenge-325/ysth/blog1.txt create mode 100644 challenge-325/ysth/perl/ch-1.pl create mode 100644 challenge-325/ysth/perl/ch-2.pl create mode 100644 challenge-325/ysth/python/ch-1.py create mode 100644 challenge-325/ysth/python/ch-2.py diff --git a/challenge-325/ysth/blog.txt b/challenge-325/ysth/blog.txt new file mode 100644 index 0000000000..68b53a61f1 --- /dev/null +++ b/challenge-325/ysth/blog.txt @@ -0,0 +1 @@ +https://blog.ysth.info/idiomatic-perl-solutions-to-the-weekly-challenge-325-task-1/ diff --git a/challenge-325/ysth/blog1.txt b/challenge-325/ysth/blog1.txt new file mode 100644 index 0000000000..423c4f4020 --- /dev/null +++ b/challenge-325/ysth/blog1.txt @@ -0,0 +1 @@ +https://blog.ysth.info/python-solution-to-the-weekly-challenge-325-task-2/ diff --git a/challenge-325/ysth/perl/ch-1.pl b/challenge-325/ysth/perl/ch-1.pl new file mode 100644 index 0000000000..32d9cfc265 --- /dev/null +++ b/challenge-325/ysth/perl/ch-1.pl @@ -0,0 +1,136 @@ +use 5.036; + +use Benchmark 'cmpthese'; +use File::Slurp 'read_file', 'write_file'; +use List::Util 'max'; +use Inline 'C'; + +my $binary_array; +if (@ARGV) { + $binary_array = [ map $_ eq 1 ? 1 : 0, @ARGV ]; +} +else { + # read or make some data + my $FILENAME = 'digits.txt'; + my $digits; + if (-r $FILENAME) { + chomp($digits = read_file($FILENAME)); + } + else { + # a million random 0s and 1s. + $digits = join "", map int 2*rand, 1..1e6; + # ignore failure + eval { write_file($FILENAME, $digits) }; + } + $binary_array = [ split //, $digits ]; +} + +my %code = ( + naive_regex => sub { naive_regex($binary_array) }, + better_regex => sub { better_regex($binary_array) }, + loop_sentinel => sub { loop_sentinel($binary_array) }, + loop => sub { loop($binary_array) }, + mapping => sub { mapping($binary_array) }, + one_pass_regex => sub { one_pass_regex($binary_array) }, + inlinec_loop => sub { inlinec_loop($binary_array) }, +); + +# test first +my $expected = naive_regex($binary_array); +say $expected; +while (my ($name, $sub) = each %code) { + $sub->($binary_array) == $expected + or delete $code{$name}, say "$name incorrect\n"; +} + +cmpthese(-2, \%code); + +sub naive_regex ($binary_array) { + join('', @$binary_array) =~ /(1+)(?!.*?\1)/ + ? length $1 + : 0 +} + +sub better_regex ($binary_array) { + join('', @$binary_array) =~ /(? $price, 0..$#seen_prices; + $seen_price_index //= @seen_prices; + my $discount = $seen_price_index > 0 ? $seen_prices[$seen_price_index - 1] : 0; + if ($seen_price_index == 0 || $seen_prices[$seen_price_index-1] != $price) { + splice @seen_prices, $seen_price_index, @seen_prices-$seen_price_index, $price; + } + unshift @sale_prices, $price - $discount; +} + +say 'prices: ', join ', ', @prices; +say 'sale prices: ', join ', ', @sale_prices; 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('(? 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) -- cgit