aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2021-02-02 07:47:13 +0100
committerFlavio Poletti <flavio@polettix.it>2021-02-02 07:47:13 +0100
commit30f393249dc949fbf5c792a39562769be66fe42c (patch)
tree14f72973b30a470eb5d880e32b84c56e3e55ded5
parentac60bddb13f96402c3026283fe223388ed54fc27 (diff)
downloadperlweeklychallenge-club-30f393249dc949fbf5c792a39562769be66fe42c.tar.gz
perlweeklychallenge-club-30f393249dc949fbf5c792a39562769be66fe42c.tar.bz2
perlweeklychallenge-club-30f393249dc949fbf5c792a39562769be66fe42c.zip
Add polettix's solution to PWC098
-rw-r--r--challenge-098/polettix/blog.txt1
-rw-r--r--challenge-098/polettix/blog1.txt1
-rw-r--r--challenge-098/polettix/perl/ch-1.pl26
-rw-r--r--challenge-098/polettix/perl/ch-2.pl24
4 files changed, 52 insertions, 0 deletions
diff --git a/challenge-098/polettix/blog.txt b/challenge-098/polettix/blog.txt
new file mode 100644
index 0000000000..85d56a733e
--- /dev/null
+++ b/challenge-098/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2021/02/03/pwc098-readn/
diff --git a/challenge-098/polettix/blog1.txt b/challenge-098/polettix/blog1.txt
new file mode 100644
index 0000000000..d25fb34087
--- /dev/null
+++ b/challenge-098/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2021/02/04/pwc098-search-insert-position/
diff --git a/challenge-098/polettix/perl/ch-1.pl b/challenge-098/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..e481a2e81b
--- /dev/null
+++ b/challenge-098/polettix/perl/ch-1.pl
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+use Fcntl qw< O_RDONLY SEEK_SET >;
+
+sub readN ($FILE, $number) {
+ state $at = {};
+ sysopen my $fh, $FILE, O_RDONLY or die "sysopen('$FILE'): $!\n";
+ sysseek $fh, $at->{$FILE} // 0, SEEK_SET;
+ my $retval = '';
+ my $n = sysread $fh, $retval, $number;
+ close $fh or die "close('$FILE'): $!\n";
+ die "sysread($FILE) \@$number: $!\n" if ! defined $n;
+ $at->{$FILE} += $n;
+ return $retval;
+}
+
+my $highlight = "\e[1;97;45m"; my $reset = "\e[0m";
+my $file = shift || __FILE__;
+my @numbers = @ARGV ? @ARGV : qw< 4 5 2 >;
+for my $n (@numbers) {
+ my $chunk = readN($file, $n);
+ say "got $n: $highlight$chunk$reset";
+}
diff --git a/challenge-098/polettix/perl/ch-2.pl b/challenge-098/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..7ed0201d3a
--- /dev/null
+++ b/challenge-098/polettix/perl/ch-2.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+
+sub search_insert_position ($aref, $new_item) {
+ my ($lo, $hi, $i) = (0, $aref->$#*, undef);
+ while ($lo <= $hi) {
+ $i = int(($lo + $hi) / 2);
+ my $item = $aref->[$i];
+ if ($new_item == $item) { return $i }
+ elsif ($new_item < $item) { $hi = $i }
+ else { $lo = $i }
+ last if ($hi - $lo) <= 1;
+ }
+ splice $aref->@*, $i, 0, $new_item;
+ return $i;
+}
+
+my $N = @ARGV ? shift @ARGV : 3;
+my @N = @ARGV ? @ARGV : qw< 1 2 3 4 >;
+my $i = search_insert_position(\@N, $N);
+say "$i -> (@N)";