aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-098/perlboy1967/perl/ch-1.pl43
-rwxr-xr-xchallenge-098/perlboy1967/perl/ch-2.pl37
-rw-r--r--challenge-098/perlboy1967/perl/input1.txt2
-rw-r--r--challenge-098/perlboy1967/perl/input2.txt1
-rw-r--r--challenge-098/perlboy1967/perl/readN.pm59
5 files changed, 142 insertions, 0 deletions
diff --git a/challenge-098/perlboy1967/perl/ch-1.pl b/challenge-098/perlboy1967/perl/ch-1.pl
new file mode 100755
index 0000000000..a05ee06420
--- /dev/null
+++ b/challenge-098/perlboy1967/perl/ch-1.pl
@@ -0,0 +1,43 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 098
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-098/
+#
+# Task 1 - Read N-characters
+#
+# Author: Niels 'PerlBoy' van Dijke
+
+BEGIN {
+ use File::Basename qw(dirname);
+ chdir(dirname($0));
+}
+
+use v5.16;
+use strict;
+use warnings;
+
+use lib '.';
+
+use readN qw(readN);
+
+# Unbuffered STDOUT
+$|++;
+
+
+@ARGV = qw(1 input1.txt input2.txt)
+ unless scalar(@ARGV);
+
+my $len = shift @ARGV // 4;
+my %files = map {$_ => 1} @ARGV;
+
+do {
+ foreach my $file (sort keys %files) {
+ my $s = readN($file, $len);
+ if (defined $s) {
+ printf "$file |%s|\n", $s;
+ } else {
+ delete $files{$file};
+ }
+ }
+} while (scalar(keys %files) > 0);
+
diff --git a/challenge-098/perlboy1967/perl/ch-2.pl b/challenge-098/perlboy1967/perl/ch-2.pl
new file mode 100755
index 0000000000..55e6f3f44d
--- /dev/null
+++ b/challenge-098/perlboy1967/perl/ch-2.pl
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 098
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-098/
+#
+# Task 2 - Search Insert Position
+#
+# Author: Niels 'PerlBoy' van Dijke
+
+use v5.16;
+use strict;
+use warnings;
+
+use List::MoreUtils qw(firstidx);
+
+# Unbuffered STDOUT
+$|++;
+
+while (<DATA>) {
+ chomp;
+
+ my ($N, @N) = split(/,/);
+ @N = sort(@N);
+
+ my $idx = firstidx { $_ >= $N } @N;
+ $idx = scalar(@N)
+ if ($idx < 0);
+
+ printf "Input: \@N = (%s) and \$N = %d\n", join(',', @N), $N;
+ printf "Output: %d\n\n", $idx;
+}
+
+__DATA__
+3,1,3,2,4
+6,1,7,5,3
+10,14,12,16,18
+19,15,13,11,17
diff --git a/challenge-098/perlboy1967/perl/input1.txt b/challenge-098/perlboy1967/perl/input1.txt
new file mode 100644
index 0000000000..6bb8b1fa8b
--- /dev/null
+++ b/challenge-098/perlboy1967/perl/input1.txt
@@ -0,0 +1,2 @@
+12345
+abcde
diff --git a/challenge-098/perlboy1967/perl/input2.txt b/challenge-098/perlboy1967/perl/input2.txt
new file mode 100644
index 0000000000..48082f72f0
--- /dev/null
+++ b/challenge-098/perlboy1967/perl/input2.txt
@@ -0,0 +1 @@
+12
diff --git a/challenge-098/perlboy1967/perl/readN.pm b/challenge-098/perlboy1967/perl/readN.pm
new file mode 100644
index 0000000000..03c12de77d
--- /dev/null
+++ b/challenge-098/perlboy1967/perl/readN.pm
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 098
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-098/
+#
+# Task 1 - Read N-characters
+#
+# Author: Niels 'PerlBoy' van Dijke
+
+package readN;
+
+use v5.16;
+use strict;
+use warnings;
+
+use Fcntl qw(:DEFAULT);
+use Time::HiRes qw(usleep);
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(readN);
+
+my %FH;
+my %EOF;
+
+sub readN ($$) {
+ my ($fileName, $length) = @_;
+
+ # Close the file when eof is reached
+ if (exists $EOF{$fileName}) {
+ delete $FH{$fileName};
+ delete $EOF{$fileName};
+ return;
+ }
+
+ if (!exists ($FH{$fileName})) {
+ sysopen($FH{$fileName}, $fileName, O_RDONLY) //
+ die "Can't open '$fileName' ($!)";
+ binmode($FH{$fileName});
+ }
+
+ my $return;
+ my $retry = 10;
+ do {
+ my $buf;
+ my $nread = sysread($FH{$fileName}, $buf, $length);
+ if (!defined $nread) {
+ $retry--; usleep 1_000;
+ } elsif ($nread == 0) {
+ $EOF{$fileName}++;
+ } elsif ($nread <= $length) {
+ $return .= $buf;
+ }
+ } while (!exists $EOF{$fileName} and length($return // '') != $length and $retry);
+
+ return $return;
+}
+
+1;