diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-02-07 23:04:58 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-07 23:04:58 +0000 |
| commit | 4ffd91cb418c60d9a0c2df22e43383eb86b4efb2 (patch) | |
| tree | 4fd72bcd2f25e5b546530597ee17e15758f748b5 | |
| parent | aec4184737ce89cd2feb49e762a61a70b0f7a435 (diff) | |
| parent | 6d84c7cffd90982a572b0d7f843fd62f3670ac24 (diff) | |
| download | perlweeklychallenge-club-4ffd91cb418c60d9a0c2df22e43383eb86b4efb2.tar.gz perlweeklychallenge-club-4ffd91cb418c60d9a0c2df22e43383eb86b4efb2.tar.bz2 perlweeklychallenge-club-4ffd91cb418c60d9a0c2df22e43383eb86b4efb2.zip | |
Merge pull request #3476 from PerlBoy1967/branch-for-challenge-098
Task 1 & 2
| -rwxr-xr-x | challenge-098/perlboy1967/perl/ch-1.pl | 43 | ||||
| -rwxr-xr-x | challenge-098/perlboy1967/perl/ch-2.pl | 37 | ||||
| -rw-r--r-- | challenge-098/perlboy1967/perl/input1.txt | 2 | ||||
| -rw-r--r-- | challenge-098/perlboy1967/perl/input2.txt | 1 | ||||
| -rw-r--r-- | challenge-098/perlboy1967/perl/readN.pm | 59 |
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; |
