From 747c6a43c248bc8a56170bfca3442afaa0acf88a Mon Sep 17 00:00:00 2001 From: Fung Cheok Yin <61836418+E7-87-83@users.noreply.github.com> Date: Sun, 26 Apr 2020 18:34:18 +0800 Subject: Add files via upload --- ch-1.pl | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ch-2.pl | 49 +++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 ch-1.pl create mode 100644 ch-2.pl diff --git a/ch-1.pl b/ch-1.pl new file mode 100644 index 0000000000..3b06d8127f --- /dev/null +++ b/ch-1.pl @@ -0,0 +1,92 @@ +#!/usr/bin/perl +use strict; +use Data::Dumper; + +my @ro_tree1; + +sub array_transform_rowform { + + my ($h, $val, @kids) = @_; + if (! defined(@ro_tree1[$h])) { + @{$ro_tree1[$h]} = (); + } + push @{$ro_tree1[$h]}, $val; + + if ($kids[0]) { + my ($temp, @smallkids) = @{kids[0]}; + array_transform_rowform($h+1, shift @{$kids[0]}, @{$kids[0]}); + } + if ($kids[1]) { + my ($temp, @smallkids) = @{kids[1]}; + array_transform_rowform($h+1, shift @{$kids[1]}, @{$kids[1]}); + } + +} + +sub rowform_transform_array { + my @rowform = @_; + my $height = $#rowform; + my @data = (); + for (0..2**$height-1) { push @data, [ $rowform[$height][$_] ]; } + for my $i (reverse 1..$height-1) { + my @newdata = (); + for my $j (0..2**$i-1) { + $newdata[$j] = CombineTwo($data[$j*2], $data[$j*2+1]); + unshift @{$newdata[$j]}, $rowform[$i][$j]; + } + for my $j (0..2**$i-1) {$data[$j] = $newdata[$j];} + } + + return [$rowform[0][0], $data[0], $data[1]] ; +} + +sub CombineTwo { + my @temp = ($_[0], $_[1]); + return \@temp; +} + +sub swaprowformtree { + my @btree = @_; + my $N = $#btree; + for my $i (1..$N) { + for my $j (0..2**($i-1)-1) { + ($btree[$i][$j], $btree[$i][2**($i)-1-$j]) + = ($btree[$i][2**($i)-1-$j], $btree[$i][$j]); + } + } + + return @btree; +} + +# =================================================== + +my $tree1 = [2, [3, [5], [7]], [11, [13], [17]] ] ; +#SAMPLE INPUT (nested array form) + +array_transform_rowform(0, shift @{$tree1}, @{$tree1}); + +$Data::Dumper::Terse = 1; +$Data::Dumper::Indent = 0; + +print Dumper rowform_transform_array swaprowformtree @ro_tree1; + +# =================================================== + +# REFERENCES (format of binary tree): +# https://ry.ca/2020/04/path-sum/ +# https://raku-musings.com/diff-sum.html +# http://blogs.perl.org/users/laurent_r/2020/04/perl-weekly-challenge-56-diff-k-and-path-sum.html + + +sub display_rowform { # haven't used in program; use for checking + my @bb = @_; + print "("; + for my $i (0..$#bb) { + print "["; + print join "," , @{$bb[$i]}; + print "],\n" + } + + print ")"; +} + diff --git a/ch-2.pl b/ch-2.pl new file mode 100644 index 0000000000..2d628176b3 --- /dev/null +++ b/ch-2.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl +use strict; +use Scalar::Util qw/dualvar/; + +#Usage: $ ch-2.pl [list of words] +#e.g. ch-2.pl alphabet book carpet cadmium cadeau alpine +#output: alph , b , car , cadm , cade , alpi + +my @data = @ARGV; + + + +my $N = $#data + 1; + +my $i = 0; +my @dualv_sorted = sort {$a cmp $b} map { dualvar($i++, $_) } @data; + +my @dualv_processed = (); + +my $k = 1; + +for (0..$N-2) { + my $tempk = $k; + $k = 1; + my $first = substr($dualv_sorted[$_], 0, $k); + + while ($first eq substr( $dualv_sorted[$_+1], 0, $k)) { + $k++; + $first = substr( $dualv_sorted[$_], 0, $k); + } + + $first = substr($dualv_sorted[$_], 0, max($tempk, $k)); + $dualv_processed[$_] = dualvar( $dualv_sorted[$_]+0 , "$first"); +} + + + $dualv_processed[$N-1] + = dualvar($dualv_sorted[$N-1]+0, substr($dualv_sorted[$N-1], 0, $k)); + + +print join " , ", (sort {$a <=> $b} @dualv_processed); + + + + + +sub max { + return ($_[0] > $_[1] ? $_[0]: $_[1]); +} -- cgit