diff options
| -rw-r--r-- | ch-1.pl | 92 | ||||
| -rw-r--r-- | ch-2.pl | 49 |
2 files changed, 141 insertions, 0 deletions
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]);
+}
|
