diff --git a/archive/p/perl/baklava.pl b/archive/p/perl/baklava.pl index 26060dc07..7cd629554 100644 --- a/archive/p/perl/baklava.pl +++ b/archive/p/perl/baklava.pl @@ -1,13 +1,11 @@ #!/usr/bin/env perl -use strict; -use warnings; +use v5.42; my $size = 10; -for my $i (1..$size){ - print " "x($size + 1 - $i), "*"x($i*2 - 1), "\n"; -} +for my $i ( -$size .. $size ) { + my $spaces = abs($i); + my $stars = 2 * ( $size - $spaces ) + 1; -for my $j (0..$size){ - print " "x($j), "*"x($size*2 - $j*2 + 1), "\n"; -} \ No newline at end of file + say ' ' x $spaces, '*' x $stars; +} diff --git a/archive/p/perl/binary-search.pl b/archive/p/perl/binary-search.pl index 3001bca02..3d309c245 100644 --- a/archive/p/perl/binary-search.pl +++ b/archive/p/perl/binary-search.pl @@ -1,82 +1,49 @@ #!/usr/bin/env perl -use strict; -use warnings; +use v5.42; -sub handle_error { - print "Usage: please provide a list of sorted integers (\"1, 4, 5, 11, 12\") and the integer to find (\"11\")\n"; - exit(0); -} +use feature qw/keyword_any/; +no warnings 'experimental::keyword_any'; -sub check { - my ($s) = @_; - - # Trim leading and trailing spaces - $s =~ s/^\s+//; - $s =~ s/\s+$//; - - # Check if there are spaces in the middle - if ($s =~ /\s/) { - handle_error(); - } - - # Check if it's a valid integer - if ($s !~ /^-?\d+$/) { - handle_error(); - } - - return int($s); +sub usage { + say 'Usage: please provide a list of sorted integers ("1, 4, 5, 11, 12") and the integer to find ("11")'; + exit; } -sub convert { - my ($s) = @_; - - if (length($s) == 0) { - handle_error(); - } - - my @v; - my @parts = split(',', $s); - - foreach my $part (@parts) { - push @v, check($part); - } - - return @v; -} +sub parse_list ($s) { + return undef unless defined $s; -# Main program -if (@ARGV < 2) { - handle_error(); -} + my @vals = split /\s*,\s*/, $s; -my @v = convert($ARGV[0]); -my $num = check($ARGV[1]); + return undef unless @vals; + return undef if any { $_ !~ /\A\d+\z/ } @vals; -# Check if array is sorted -for (my $i = 0; $i < @v - 1; $i++) { - if ($v[$i] > $v[$i + 1]) { - handle_error(); - } + @vals = map 0 + $_, @vals; + + return undef if any { $vals[$_] > $vals[ $_ + 1 ] } 0 .. $#vals - 1; + return \@vals; } -# Binary search -my $start = 0; -my $end = scalar(@v); -my $ans = "false"; +sub binary_search ( $a, $x ) { + my ( $lo, $hi ) = ( 0, $#$a ); -while ($start < $end) { - my $mid = int(($start + $end) / 2); - - if ($num < $v[$mid]) { - $end = $mid; - } - elsif ($v[$mid] < $num) { - $start = $mid + 1; - } - elsif ($v[$mid] == $num) { - $ans = "true"; - last; + while ( $lo <= $hi ) { + my $mid = ( $lo + $hi ) >> 1; + + return "true" if $a->[$mid] == $x; + $hi = $mid - 1 if $a->[$mid] > $x; + $lo = $mid + 1 if $a->[$mid] < $x; } + + return "false"; } -print "$ans\n"; \ No newline at end of file +my ( $list_s, $num_s ) = @ARGV; + +defined $num_s or usage(); + +my $list = parse_list($list_s) or usage(); + +usage() unless $num_s =~ /\A\d+\z/; +my $num = 0 + $num_s; + +say binary_search( $list, $num ); diff --git a/archive/p/perl/bubble-sort.pl b/archive/p/perl/bubble-sort.pl index 9b5478a30..47f4c22f9 100644 --- a/archive/p/perl/bubble-sort.pl +++ b/archive/p/perl/bubble-sort.pl @@ -1,32 +1,45 @@ -#!/usr/bin/perl -$num_args = $#ARGV + 1; -if ($num_args == 0) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; -} else { - $input_string = $ARGV[0]; - my @arr = split(',',$input_string); - $n = $#arr + 1; - if ($n <= 1) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; - } else { - for ($i = 0;$i < $n;$i++) { - $arr[$i] = int($arr[$i]) - } - for ($i = 0;$i < $n;$i = $i + 1) { - for ($j = 0;$j < $n - $i - 1;$j = $j + 1) { - if ($arr[$j] > $arr[$j + 1]) { - $temp = $arr[$j]; - $arr[$j] = $arr[$j + 1]; - $arr[$j + 1] = $temp; - } - } - } - for ($i = 0;$i < $n;$i = $i + 1) { - if ($i == 0) { - print "$arr[$i]"; - } else { - print ", $arr[$i]"; - } +#!/usr/bin/env perl +use v5.42; + +use feature qw/keyword_any/; +no warnings 'experimental::keyword_any'; + +sub usage { + say 'Usage: please provide a list of at least two integers to sort in the format "1, 2, 3, 4, 5"'; + exit; +} + +sub parse_list ($s) { + return undef unless defined $s; + + my @vals = split /\s*,\s*/, $s; + + return undef if @vals < 2; + return undef if any { $_ !~ /\A-?\d+\z/ } @vals; + + return [ map 0 + $_, @vals ]; +} + +sub bubble_sort ($a) { + my $n = @$a; + + for my $end ( reverse 1 .. $n - 1 ) { + my $swapped = false; + + for my $i ( 0 .. $end - 1 ) { + next if $a->[$i] <= $a->[ $i + 1 ]; + ( $a->[$i], $a->[ $i + 1 ] ) = ( $a->[ $i + 1 ], $a->[$i] ); + $swapped = true; } + + last unless $swapped; } + + return $a; } + +my ($input) = @ARGV; +my $a = parse_list($input) or usage(); + +bubble_sort($a); +say join ', ', @$a; diff --git a/archive/p/perl/capitalize.pl b/archive/p/perl/capitalize.pl index 2a1162e9e..7b34404f4 100644 --- a/archive/p/perl/capitalize.pl +++ b/archive/p/perl/capitalize.pl @@ -1,13 +1,12 @@ #!/usr/bin/env perl -use strict; -use warnings; +use v5.42; -# accept input as argument -my ($string) = @ARGV; - -if (!defined $string || length $string == 0) { - print "Usage: please provide a string\n"; - exit; +sub usage { + say "Usage: please provide a string"; + exit; } -print ucfirst $string, "\n"; +my ($string) = @ARGV; +usage() unless defined $string && length $string; + +say ucfirst $string; diff --git a/archive/p/perl/even-odd.pl b/archive/p/perl/even-odd.pl index 057d383af..9499d730d 100644 --- a/archive/p/perl/even-odd.pl +++ b/archive/p/perl/even-odd.pl @@ -1,17 +1,13 @@ #!/usr/bin/env perl -use strict; -use warnings; +use v5.42; + +sub usage { + say "Usage: please input a number"; + exit; +} -# accept input as argument my ($number) = @ARGV; -if (!defined $number || $number !~ /^\-?\d+$/) { - print "Usage: please input a number\n"; - exit; -} +usage() unless defined $number && $number =~ /\A-?\d+\z/; -if ($number % 2 == 0) { - print "Even\n"; -} else { - print "Odd\n"; -} +say $number % 2 == 0 ? "Even" : "Odd"; diff --git a/archive/p/perl/factorial.pl b/archive/p/perl/factorial.pl index c6e024bbf..80a863f10 100755 --- a/archive/p/perl/factorial.pl +++ b/archive/p/perl/factorial.pl @@ -1,32 +1,15 @@ #!/usr/bin/env perl -use strict; -use warnings; +use v5.42; -# no input -usage() unless @ARGV == 1; - -# accept input as argument -my ($number) = @ARGV; - -# if not provided, read from standard input -if (!defined $number) { - $number = ; - chomp $number; +sub usage { + say "Usage: please input a non-negative integer"; + exit; } -if (!defined $number || $number !~ /^\d+$/ || $number < 0) { - usage(); -} +my ($number) = @ARGV; +usage() unless defined $number && $number =~ /\A\d+\z/; my $factorial = 1; +$factorial *= $_ for 2 .. $number; -for (my $i = 1; $i <= $number; $i++) { - $factorial = $factorial * $i; -} - -print "$factorial\n"; - -sub usage { - print "Usage: please input a non-negative integer\n"; - exit; -} \ No newline at end of file +say $factorial; diff --git a/archive/p/perl/fibonacci.pl b/archive/p/perl/fibonacci.pl index 5407c1e46..ac16bef4f 100644 --- a/archive/p/perl/fibonacci.pl +++ b/archive/p/perl/fibonacci.pl @@ -1,20 +1,17 @@ -#!/usr/bin/perl -$num_args = $#ARGV + 1; -if ($num_args == 0) { - print "Usage: please input the count of fibonacci numbers to output\n"; -} elsif ($num_args == 1) { - if ($ARGV[0] =~ /[0-9]+/) { - $n = $ARGV[0]; - $result = 0,$first = 0,$second = 1; - for ($i = 1;$i <= $n;$i = $i + 1) { - $result = $first + $second; - $first = $second; - $second = $result; - print "$i: $first\n"; - } - } else { - print "Usage: please input the count of fibonacci numbers to output\n"; - } -} else { - print "Usage: please input the count of fibonacci numbers to output\n"; +#!/usr/bin/env perl +use v5.42; + +sub usage { + say "Usage: please input the count of fibonacci numbers to output"; + exit; +} + +my ($n) = @ARGV; +usage() unless defined $n && $n =~ /\A\d+\z/; + +my ( $a, $b ) = ( 0, 1 ); + +for my $i ( 1 .. $n ) { + ( $a, $b ) = ( $b, $a + $b ); + say "$i: $a"; } diff --git a/archive/p/perl/file-input-output.pl b/archive/p/perl/file-input-output.pl index bf25d0a0e..db815ba61 100644 --- a/archive/p/perl/file-input-output.pl +++ b/archive/p/perl/file-input-output.pl @@ -1,27 +1,21 @@ #!/usr/bin/env perl +use v5.42; +use IO::File; -sub Main { - Write("Some arbitrary data."); - Read(); - exit(0); -} +my $file = "output.txt"; +my $content = <<'EOF'; +Perl is cool! +There's more than one way to do it. +EOF -sub Write { - open(my $writing, ">output.txt") || die "File could not be written.\nError: $!"; +# Write to file - print $writing "@_"."\n"; +my $w = IO::File->new(">$file") or die "Cannot open $file for writing: $!"; +$w->print($content) or die "Write failed: $!"; +$w->close or die "Cannot close after write: $!"; - close($writing) || die "The file could not be closed on write.\nError: $!"; -} +# Read from file -sub Read { - open(my $reading, "; - } - - close($reading) || die "The file could not be closed on reading.\nError: $!"; -} - -Main(); +my $r = IO::File->new("<$file") or die "Cannot open $file for reading: $!"; +print while <$r>; +$r->close or die "Cannot close after read: $!"; diff --git a/archive/p/perl/fizz-buzz.pl b/archive/p/perl/fizz-buzz.pl index 05198a8b9..891e0b7a7 100644 --- a/archive/p/perl/fizz-buzz.pl +++ b/archive/p/perl/fizz-buzz.pl @@ -1,15 +1,13 @@ -#!/usr/bin/perl -# -# FizzBuzz in Perl - -use strict; -use warnings; -use diagnostics; -use 5.10.0; - -for my $n (1..100) { - !($n % 15) ? say "FizzBuzz" : - !($n % 3) ? say "Fizz" : - !($n % 5) ? say "Buzz" : - say "$n"; +#!/usr/bin/env perl +use v5.42; + +sub fizzbuzz ($n) { + my $s = ''; + + $s .= "Fizz" if $n % 3 == 0; + $s .= "Buzz" if $n % 5 == 0; + + return $s || $n; } + +say fizzbuzz($_) for 1 .. 100; diff --git a/archive/p/perl/insertion-sort.pl b/archive/p/perl/insertion-sort.pl index ab2481f61..cf65f764c 100644 --- a/archive/p/perl/insertion-sort.pl +++ b/archive/p/perl/insertion-sort.pl @@ -1,32 +1,39 @@ -#!/usr/bin/perl -$num_args = $#ARGV + 1; -if ($num_args == 0) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; -} else { - $input_string = $ARGV[0]; - my @arr = split(',',$input_string); - $n = $#arr + 1; - if ($n <= 1) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; - } else { - for ($i = 0;$i < $n;$i++) { - $arr[$i] = int($arr[$i]) - } - for ($i = 1;$i < $n;$i = $i + 1) { - $p = $arr[$i]; - $j = $i - 1; - while($j >= 0 && $arr[$j] > $p) { - $arr[$j + 1] = $arr[$j]; - $j = $j - 1; - } - $arr[$j + 1] = $p; - } - for ($i = 0;$i < $n;$i = $i + 1) { - if ($i == 0) { - print "$arr[$i]"; - } else { - print ", $arr[$i]"; - } - } +#!/usr/bin/env perl +use v5.42; + +use feature qw/keyword_any/; +no warnings 'experimental::keyword_any'; + +sub usage { + say 'Usage: please provide a list of at least two integers to sort in the format "1, 2, 3, 4, 5"'; + exit; +} + +sub parse_list ($s) { + return undef unless defined $s; + + my @vals = split /\s*,\s*/, $s; + + return undef if @vals < 2; + return undef if any { $_ !~ /\A-?\d+\z/ } @vals; + + return [ map 0 + $_, @vals ]; +} + +sub insertion_sort ($a) { + for my $i ( 1 .. $#$a ) { + my $key = $a->[$i]; + my $j = $i - 1; + + $a->[ $j + 1 ] = $a->[$j], $j-- while $j >= 0 && $a->[$j] > $key; + $a->[ $j + 1 ] = $key; } + + return $a; } + +my ($input) = @ARGV; +my $a = parse_list($input) or usage(); + +insertion_sort($a); +say join ', ', @$a; diff --git a/archive/p/perl/linear-search.pl b/archive/p/perl/linear-search.pl index 06f4dc4f0..688b8202e 100644 --- a/archive/p/perl/linear-search.pl +++ b/archive/p/perl/linear-search.pl @@ -1,22 +1,35 @@ -#!/usr/bin/perl -my $arguments_used = scalar @ARGV; -if($arguments_used < 2) -{ - die "Usage: please provide a list of integers (\"1, 4, 5, 11, 12\") and the integer to find (\"11\")\n"; +#!/usr/bin/env perl +use v5.42; + +use feature qw/keyword_any/; +no warnings 'experimental::keyword_any'; + +sub usage { + say 'Usage: please provide a list of integers ("1, 4, 5, 11, 12") and the integer to find ("11")'; + exit; } -my @input_array = @ARGV; -my $input_string = pop @ARGV; -my @trimmed_string = split(',', @input_array[0]); -my $found_it = 0; -if(scalar@trimmed_string < 1) -{ - die "Usage: please provide a list of integers (\"1, 4, 5, 11, 12\") and the integer to find (\"11\")\n"; + +sub parse_list ($s) { + return undef unless defined $s; + + my @vals = split /\s*,\s*/, $s; + + return undef unless @vals; + return undef if any { $_ !~ /\A\d+\z/ } @vals; + + @vals = map 0 + $_, @vals; + + return \@vals; } -for(my $i = 0; $i < scalar(@trimmed_string); $i++) -{ - if($trimmed_string[$i] == $input_string) - { - $found_it = 1; - } -} -print $found_it ? "true" : "false"; \ No newline at end of file + +my ( $list_s, $num_s ) = @ARGV; + +defined $num_s or usage(); + +my $list = parse_list($list_s) or usage(); + +usage() unless $num_s =~ /\A\d+\z/; +my $num = 0 + $num_s; + +my $found = any { $_ == $num } @$list; +say $found ? "true" : "false"; diff --git a/archive/p/perl/longest-word.pl b/archive/p/perl/longest-word.pl index 8f8bd44c3..febc5094a 100644 --- a/archive/p/perl/longest-word.pl +++ b/archive/p/perl/longest-word.pl @@ -1,16 +1,11 @@ -#!/usr/bin/perl -my $args = join(" ", @ARGV); -if($args eq "" || $args eq " ") -{ - die "Usage: please provide a string\n" -} -my $total = 0; -my @storage = split(" ", $args); -foreach my $loop (@storage) -{ - if(length($loop) >= $total) - { - $total = length($loop); - } -} -print $total; +#!/usr/bin/env perl +use v5.42; +use List::Util qw/max/; + +sub usage { say "Usage: please provide a string"; exit } + +my $input = "@ARGV"; +$input =~ s/^\s+|\s+$//g; + +usage unless length $input; +say max map length, split /\s+/, $input; \ No newline at end of file diff --git a/archive/p/perl/merge-sort.pl b/archive/p/perl/merge-sort.pl index 28e10d270..13640769d 100644 --- a/archive/p/perl/merge-sort.pl +++ b/archive/p/perl/merge-sort.pl @@ -1,49 +1,58 @@ -#!/usr/bin/perl -#Merge Sort using recursion -$num_args = $#ARGV + 1; -# If no input was provided -if ($num_args == 0) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; -} -# If invalid input was provided -else { - $input_string = $ARGV[0]; - my @arr = split(',',$input_string); - $n = $#arr + 1; - if ($n <= 1) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; - } -#Input is fine - else { -# Convert input sting to Integers - for ($i = 0;$i < $n;$i++) { - $arr[$i] = int($arr[$i]) - } #end for - -@merge_sorted_list = merge_sort (@arr); - -# Print sorted numbers - for ($i = 0;$i < $n;$i = $i + 1) { - if ($i == 0) { - print "$merge_sorted_list[$i]"; - } else { - print ", $merge_sorted_list[$i]"; - } - } - } +#!/usr/bin/env perl +use v5.42; + +use feature qw/keyword_any/; +no warnings 'experimental::keyword_any'; + +sub usage { + say 'Usage: please provide a list of at least two integers to sort in the format "1, 2, 3, 4, 5"'; + exit; +} + +sub parse_list ($s) { + return undef unless defined $s; + + my @vals = split /\s*,\s*/, $s; + + return undef if @vals < 2; + return undef if any { $_ !~ /\A-?\d+\z/ } @vals; + + return [ map 0 + $_, @vals ]; +} + +# Note: Perl's `sort` is implemented via merge sort as of v5.42, so one could use that instead. + +sub merge_sort ($a) { + return $a if @$a <= 1; + + my $mid = @$a >> 1; + + my $left = [ @{$a}[ 0 .. $mid - 1 ] ]; + my $right = [ @{$a}[ $mid .. $#$a ] ]; + + merge_sort($left); + merge_sort($right); + + @$a = _merge( $left, $right ); + return $a; } -sub merge_sort { - my @temp_array = @_; - return @temp_array if @temp_array < 2; - my $m = int @temp_array / 2; - my @a = merge_sort(@temp_array[0 .. $m - 1]); - my @b = merge_sort(@temp_array[$m .. $#temp_array]); - for (@temp_array) { - $_ = !@a ? shift @b - : !@b ? shift @a - : $a[0] <= $b[0] ? shift @a - : shift @b; +sub _merge ( $left, $right ) { + my @out; + + while ( @$left && @$right ) { + push @out, $left->[0] <= $right->[0] + ? shift @$left + : shift @$right; } - @temp_array; + + push @out, @$left, @$right; + + return @out; } + +my ($input) = @ARGV; +my $a = parse_list($input) or usage(); + +merge_sort($a); +say join ', ', @$a; diff --git a/archive/p/perl/palindromic-number.pl b/archive/p/perl/palindromic-number.pl index 087706c6c..4c923b94f 100644 --- a/archive/p/perl/palindromic-number.pl +++ b/archive/p/perl/palindromic-number.pl @@ -1,51 +1,11 @@ - -# accept an integer, reverse it, compare it with original -# print true, if original and reversed number are same -# print false, if original and reversed number are same #!/usr/bin/env perl -use strict; -use warnings; - -# no input -usage() unless @ARGV == 1; - -# accept input as argument -my ($number) = @ARGV; - -# if not provided, read from standard input -if (!defined $number) { - $number = ; - chomp $number; -} - -if (!defined $number || $number !~ /^\d+$/ || $number < 0) { - usage(); -} - -my $temp = $number; -my $noofdigits = 0; -my $reversed_number = 0; -while ($temp > 0){ - $reversed_number = ($reversed_number * 10) + ($temp % 10); - $temp = int($temp / 10); - $noofdigits += 1; -} - -if ($number < 0){ - print("Usage: please input a non-negative integer") -} - -else{ - if ($reversed_number == $number){ - print("true"); - } - else{ - print("false"); - } - -} +use v5.42; sub usage { - print "Usage: please input a non-negative integer"; - exit; + say "Usage: please input a non-negative integer"; + exit; } + +my ($n) = @ARGV; +usage() unless defined $n && $n =~ /\A\d+\z/; +say $n eq reverse($n) ? "true" : "false"; diff --git a/archive/p/perl/prime-number.pl b/archive/p/perl/prime-number.pl index 6ba83e13d..2650eedf0 100644 --- a/archive/p/perl/prime-number.pl +++ b/archive/p/perl/prime-number.pl @@ -1,65 +1,22 @@ -# Requirement https://sample-programs.therenegadecoder.com/projects/prime-number/ -# Issue #1834 -# Accept a number on command line and print if it is Prime or Composite -# Prime Numbers will have only 1 Divisor, itself.. Use that to determine Composite. -# Note: 0 and 1 are Composite numbers, 2 is a Prime Number -use warnings; +#!/usr/bin/env perl +use v5.42; -my ($prime) = @ARGV; - -$num_args = $#ARGV + 1; - -# Empty input -if ( $num_args < 1 ) { - print("Usage: please input a non-negative integer"); - exit(0); +sub usage { + say "Usage: please input a non-negative integer"; + exit; } -# Only Integer -if ( $prime =~ /^-?\d+$/ ) { - - # Negative Number - if ( $prime < 0 ) { - print("Usage: please input a non-negative integer"); - exit(0); - } - - if ( $prime == 2 ) { - print("Prime"); - exit(0); - } +my ($n) = @ARGV; +usage() unless defined $n && $n =~ /\A\d+\z/; - # If 1 or the Number is Even - elsif ( ( $prime == 1 ) || ( $prime == 0 ) || ( $prime % 2 == 0 ) ) { - print("Composite"); - exit(0); - } +$n += 0; - else { - # Check how many divisors for the given number - $i = 0; - $num_of_divisors = 0; - - # Number is guaranteed to be Even - for ( $i = $prime ; $i > 1 ; $i = $i - 2 ) { - if ( $prime % $i == 0 ) { - $num_of_divisors += 1; - } - } - - # If more than 2 divisors - if ( $num_of_divisors > 2 ) { - print("Composite"); - } - else { - print("Prime"); - } - } +say "Composite" and exit if $n < 2; +say "Prime" and exit if $n == 2; +say "Composite" and exit if $n % 2 == 0; +for ( my $i = 3 ; $i * $i <= $n ; $i += 2 ) { + say "Composite" and exit if $n % $i == 0; } -# If not Integer -else { - print "Usage: please input a non-negative integer"; - exit(0); -} +say "Prime"; diff --git a/archive/p/perl/quick-sort.pl b/archive/p/perl/quick-sort.pl index 4a1cd5344..4b064ef5d 100644 --- a/archive/p/perl/quick-sort.pl +++ b/archive/p/perl/quick-sort.pl @@ -1,58 +1,39 @@ -#!/usr/bin/perl -#Quick Sort using recursion on last element as pivot key -$num_args = $#ARGV + 1; -# If no input was provided -if ($num_args == 0) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; -} -# If invalid input was provided -else { - $input_string = $ARGV[0]; - my @arr = split(',',$input_string); - $n = $#arr + 1; - if ($n <= 1) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; - } -#Input is fine - else { -# Convert input sting to Integers - for ($i = 0;$i < $n;$i++) { - $arr[$i] = int($arr[$i]) - } #end for - -@quicksortedlist = quicksort(@arr); -# Print sorted numbers - for ($i = 0;$i < $n;$i = $i + 1) { - if ($i == 0) { - print "$quicksortedlist[$i]"; - } else { - print ", $quicksortedlist[$i]"; - } - } - } +#!/usr/bin/env perl +use v5.42; + +use feature qw/keyword_any/; +no warnings 'experimental::keyword_any'; + +sub usage { + say 'Usage: please provide a list of at least two integers to sort in the format "1, 2, 3, 4, 5"'; + exit; } +sub parse_list ($s) { + return undef unless defined $s; + + my @vals = split /\s*,\s*/, $s; -sub quicksort -{ - my @list = @_; - if($#list < 1) - { - return @list; - } - my $pivot_key = pop(@list); - my @elements_smaller_than_pivot_key; - my @elements_greather_than_pivot_key; - foreach my $element (@list) - { - if ($element < $pivot_key) - { - push(@elements_smaller_than_pivot_key, $element); - } - else - { - push(@elements_greather_than_pivot_key, $element); - } - } - return quicksort(@elements_smaller_than_pivot_key), $pivot_key, quicksort(@elements_greather_than_pivot_key); + return undef if @vals < 2; + return undef if any { $_ !~ /\A-?\d+\z/ } @vals; + + return [ map 0 + $_, @vals ]; } + +sub quick_sort ($a) { + return $a if @$a <= 1; + + my $pivot = $a->[ @$a >> 1 ]; + + my @left = grep { $_ < $pivot } @$a; + my @mid = grep { $_ == $pivot } @$a; + my @right = grep { $_ > $pivot } @$a; + + return [ @{ quick_sort( \@left ) }, @mid, @{ quick_sort( \@right ) } ]; +} + +my ($input) = @ARGV; +my $a = parse_list($input) or usage(); + +$a = quick_sort($a); +say join ', ', @$a; diff --git a/archive/p/perl/reverse-string.pl b/archive/p/perl/reverse-string.pl index 98f93c0b9..efbfa0977 100644 --- a/archive/p/perl/reverse-string.pl +++ b/archive/p/perl/reverse-string.pl @@ -1,6 +1,5 @@ +#!/usr/bin/env perl +use v5.42; my ($str) = @ARGV; - -if (defined $str) { - print scalar reverse $str; -} +say scalar reverse $str if defined $str; diff --git a/archive/p/perl/rot13.pl b/archive/p/perl/rot13.pl index aa9e31807..01cf5885b 100644 --- a/archive/p/perl/rot13.pl +++ b/archive/p/perl/rot13.pl @@ -1,9 +1,13 @@ -my ($str) = @ARGV; - +#!/usr/bin/env perl +use v5.42; -if (not defined $str or not length $str) { - die "Usage: please provide a string to encrypt\n"; +sub usage { + say "Usage: please provide a string to encrypt"; + exit; } -$str =~ tr/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm/; -print $str . "\n"; +my ($str) = @ARGV; +usage() unless defined $str && length $str; + +$str =~ tr/A-Za-z/N-ZA-Mn-za-m/; +say $str; diff --git a/archive/p/perl/selection-sort.pl b/archive/p/perl/selection-sort.pl index 6c9cdeef6..8d3d6c53e 100644 --- a/archive/p/perl/selection-sort.pl +++ b/archive/p/perl/selection-sort.pl @@ -1,42 +1,43 @@ -#!/usr/bin/perl -#Selection Sort -$num_args = $#ARGV + 1; -# If no input was provided -if ($num_args == 0) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; -} -# If invalid input was provided -else { - $input_string = $ARGV[0]; - my @arr = split(',',$input_string); - $n = $#arr + 1; - if ($n <= 1) { - print "Usage: please provide a list of at least two integers to sort in the format \"1, 2, 3, 4, 5\""; - } -#Input is fine - else { -# Convert input sting to Integers - for ($i = 0;$i < $n;$i++) { - $arr[$i] = int($arr[$i]) - } #end for - -@selection_sorted_list = selection_sort (@arr); - -# Print sorted numbers - for ($i = 0;$i < $n;$i = $i + 1) { - if ($i == 0) { - print "$selection_sorted_list[$i]"; - } else { - print ", $selection_sorted_list[$i]"; - } +#!/usr/bin/env perl +use v5.42; + +use feature qw/keyword_any/; +no warnings 'experimental::keyword_any'; + +sub usage { + say 'Usage: please provide a list of at least two integers to sort in the format "1, 2, 3, 4, 5"'; + exit; +} + +sub parse_list ($s) { + return undef unless defined $s; + + my @vals = split /\s*,\s*/, $s; + + return undef if @vals < 2; + return undef if any { $_ !~ /\A-?\d+\z/ } @vals; + + return [ map 0 + $_, @vals ]; +} + +sub selection_sort ($a) { + my $n = @$a; + + for my $i ( 0 .. $n - 2 ) { + my $min = $i; + + for my $j ( $i + 1 .. $n - 1 ) { + $min = $j if $a->[$j] < $a->[$min]; } + + ( $a->[$i], $a->[$min] ) = ( $a->[$min], $a->[$i] ) if $i != $min; } + + return $a; } -sub selection_sort - {my @a = @_; - foreach my $i (0 .. $#a - 1) - {my $min = $i + 1; - $a[$_] < $a[$min] and $min = $_ foreach $min .. $#a; - $a[$i] > $a[$min] and @a[$i, $min] = @a[$min, $i];} - return @a;} +my ($input) = @ARGV; +my $a = parse_list($input) or usage(); + +selection_sort($a); +say join ', ', @$a;