diff options
| author | Flavio Poletti <flavio@polettix.it> | 2021-02-02 07:47:13 +0100 |
|---|---|---|
| committer | Flavio Poletti <flavio@polettix.it> | 2021-02-02 07:47:13 +0100 |
| commit | 30f393249dc949fbf5c792a39562769be66fe42c (patch) | |
| tree | 14f72973b30a470eb5d880e32b84c56e3e55ded5 | |
| parent | ac60bddb13f96402c3026283fe223388ed54fc27 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-098/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-098/polettix/perl/ch-1.pl | 26 | ||||
| -rw-r--r-- | challenge-098/polettix/perl/ch-2.pl | 24 |
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)"; |
