From c5a6037568368e9b79111f30ee13398ecb113245 Mon Sep 17 00:00:00 2001 From: "Jaldhar H. Vyas" Date: Sun, 16 Aug 2020 01:07:54 -0400 Subject: Challenge 59 by Jaldhar H. Vyas --- challenge-059/jaldhar-h-vyas/blog.txt | 1 + challenge-059/jaldhar-h-vyas/perl/ch-1.pl | 147 ++++++++++++++++++++++++++++++ challenge-059/jaldhar-h-vyas/perl/ch-2.pl | 60 ++++++++++++ challenge-059/jaldhar-h-vyas/raku/ch-1.p6 | 115 +++++++++++++++++++++++ challenge-059/jaldhar-h-vyas/raku/ch-2.p6 | 19 ++++ 5 files changed, 342 insertions(+) create mode 100644 challenge-059/jaldhar-h-vyas/blog.txt create mode 100755 challenge-059/jaldhar-h-vyas/perl/ch-1.pl create mode 100755 challenge-059/jaldhar-h-vyas/perl/ch-2.pl create mode 100755 challenge-059/jaldhar-h-vyas/raku/ch-1.p6 create mode 100755 challenge-059/jaldhar-h-vyas/raku/ch-2.p6 (limited to 'challenge-059') diff --git a/challenge-059/jaldhar-h-vyas/blog.txt b/challenge-059/jaldhar-h-vyas/blog.txt new file mode 100644 index 0000000000..082f88ede5 --- /dev/null +++ b/challenge-059/jaldhar-h-vyas/blog.txt @@ -0,0 +1 @@ +https://www.braincells.com/perl/2020/08/perl_weekly_challenge_week_59.html diff --git a/challenge-059/jaldhar-h-vyas/perl/ch-1.pl b/challenge-059/jaldhar-h-vyas/perl/ch-1.pl new file mode 100755 index 0000000000..9783414253 --- /dev/null +++ b/challenge-059/jaldhar-h-vyas/perl/ch-1.pl @@ -0,0 +1,147 @@ +#!/usr/bin/perl +use 5.020; + + +package LinkedList { + use Moo; + use namespace::autoclean; + + package LinkedList::Node { + use Moo; + use namespace::autoclean; + + has _value => ( + is => 'rw', + ); + + has _next => ( + is => 'rw', + isa => sub { return ref eq 'LinkedList::Node'; }, + ); + + sub BUILDARGS { + my ($orig, $class, @args) = @_; + + return { _value => $args[0], _next => undef }; + } + } + + has _head => ( + is => 'ro', + isa => sub { return ref eq 'LinkedList::Node'; }, + ); + + sub BUILDARGS { + my ($orig, $class, @args) = @_; + + return { _head => undef }; + } + + sub add { + my ($self, $newval) = @_; + + my $v = $self->{_head}; + + if ($v) { + while ($v->{_next}) { + $v = $v->{_next}; + } + $v->{_next} = LinkedList::Node->new(value => $newval); + } else { + $self->{_head} = LinkedList::Node->new(value => $newval); + } + + $self->{_count}++; + } + + sub print { + my ($self) = @_; + + my $v = $self->{_head}; + + while ($v) { + print $v->{_value} // q{}, q{ }; + $v = $v->{_next}; + } + + print "\n"; + } + + sub attach { + my ($self, $node) = @_; + + my $v = $self->{_head}; + + if ($v) { + while ($v->{_next}) { + $v = $v->{_next}; + } + $v->{_next} = $node; + } else { + $self->{_head} = $node; + } + } + + sub merge { + my ($self, $list) = @_; + + my $v = $self->{_head}; + + if ($v) { + while ($v->{_next}) { + $v = $v->{_next}; + } + $v->{_next} = $list->{_head}; + } else { + $self->{_head} = $list->{_head}; + } + } + + sub partition { + my ($self, $k) = @_; + + my $higher = LinkedList->new(); + my $lower = LinkedList->new(); + my $same = LinkedList->new(); + + my $v = $self->{_head}; + + while ($v) { + my $node = $v; + $v = $v->{_next}; + $node->{_next} = undef; + + if ($node->{_value} < $k) { + $lower->attach($node); + } elsif ($node->{_value} > $k) { + $higher->attach($node); + } else { + $same->attach($node); + } + } + + if ($self->{_head}) { + $self->{_head} = undef; + } + + $self->merge($lower); + $self->merge($same); + $self->merge($higher); + } + +} + +package main; +use 5.020; +use warnings; + +my $linked_list = LinkedList->new(); +$linked_list->add(1); +$linked_list->add(4); +$linked_list->add(3); +$linked_list->add(2); +$linked_list->add(5); +$linked_list->add(2); + +$linked_list->partition(3); +$linked_list->print(); \ No newline at end of file diff --git a/challenge-059/jaldhar-h-vyas/perl/ch-2.pl b/challenge-059/jaldhar-h-vyas/perl/ch-2.pl new file mode 100755 index 0000000000..1a4f777a2f --- /dev/null +++ b/challenge-059/jaldhar-h-vyas/perl/ch-2.pl @@ -0,0 +1,60 @@ +#!/usr/bin/perl +use 5.020; +use warnings; +use English qw/ -no_match_vars /; + +sub usage { + print<<"-USAGE-"; +Usage: + $PROGRAM_NAME [ ...] +-USAGE- + + exit(0); +} + +sub combinations { + my @list = @{$_[0]}; + my $length = $_[1]; + + if ($length <= 1) { + return map [$_], @list; + } + + my @combos; + + for (my $i = 0; $i + $length <= scalar @list; $i++) { + my $val = $list[$i]; + my @rest = @list[$i + 1 .. $#list]; + for my $c (combinations(\@rest, $length - 1)) { + push @combos, [$val, @{$c}] ; + } + } + + return @combos; +} + +sub f { + my ($a, $b) = @_; + my $c = 0 + sprintf("%b", $a); + my $d = 0 + sprintf("%b", $b); + + if (length $c > length $d) { + $d = sprintf("%0*d", length $c, $d); + } elsif (length $d > length $c) { + $c = sprintf("%0*d", length $d, $c); + } + return ($c ^ $d) =~ tr/1/1/; +} + +if (scalar @ARGV < 1) { + usage(); +} + +my $total = 0; + +for my $a (combinations(\@ARGV, 2)) { + $total += f($a->[0], $a->[1]); +} + +say $total; + \ No newline at end of file diff --git a/challenge-059/jaldhar-h-vyas/raku/ch-1.p6 b/challenge-059/jaldhar-h-vyas/raku/ch-1.p6 new file mode 100755 index 0000000000..eac2c3b517 --- /dev/null +++ b/challenge-059/jaldhar-h-vyas/raku/ch-1.p6 @@ -0,0 +1,115 @@ +#!/usr/bin/perl6 + +class LinkedList { + + class Node { + has $.value is rw; + has Node $.next is rw; + + submethod BUILD( :$value) { + $!value = $value; + $!next = Nil; + } + } + + has Node $.head is rw; + + + submethod BUILD() { + self.head = Nil; + } + + method add($newval) { + my $v = $.head; + + if $v { + while $v.next { + $v = $v.next; + } + $v.next = Node.new(value => $newval); + } else { + $.head = Node.new(value => $newval); + } + } + + method print() { + my $v = $.head; + + while $v { + print $v.value // q{}, q{ }; + $v = $v.next; + } + + print "\n"; + } + + method attach(Node $node) { + my $v = $.head; + + if $v { + while $v.next { + $v = $v.next; + } + $v.next = $node; + } else { + $.head = $node; + } + } + + method merge(LinkedList $n) { + my $v = $.head; + + if $v { + while $v.next { + $v = $v.next; + } + $v.next = $n.head; + } else { + $.head = $n.head; + } + } + + method partition(Int $k) { + my $higher = LinkedList.new(); + my $lower = LinkedList.new(); + my $same = LinkedList.new(); + + my $v = $.head; + + while $v { + my $node = $v; + $v = $v.next; + $node.next = Nil; + + if ($node.value < $k) { + $lower.attach($node); + } elsif ($node.value > $k) { + $higher.attach($node); + } else { + $same.attach($node); + } + } + + if ($.head) { + $.head = Nil; + } + + self.merge($lower); + self.merge($same); + self.merge($$higher); + } +} + +sub MAIN() { + my $linked_list = LinkedList.new(); + $linked_list.add(1); + $linked_list.add(4); + $linked_list.add(3); + $linked_list.add(2); + $linked_list.add(5); + $linked_list.add(2); + + $linked_list.partition(3); + + $linked_list.print(); +} \ No newline at end of file diff --git a/challenge-059/jaldhar-h-vyas/raku/ch-2.p6 b/challenge-059/jaldhar-h-vyas/raku/ch-2.p6 new file mode 100755 index 0000000000..f827466949 --- /dev/null +++ b/challenge-059/jaldhar-h-vyas/raku/ch-2.p6 @@ -0,0 +1,19 @@ +#!/usr/bin/perl6 + +sub f($a, $b) { + my $c = ($a+0).base(2); + my $d = ($b+0).base(2); + + if ($c.chars > $d.chars) { + $d = sprintf("%0*d", $c.chars, $d); + } elsif ($d.chars > $c.chars) { + $c = sprintf("%0*d", $d.chars, $c); + } + + return ($c +^ $d ~~ m:g/ 1 /).elems; +} + +sub MAIN(*@ARGS where { @*ARGS.elems > 0; }) { + + say [+] @*ARGS.combinations(2).map({ f(@_[0], @_[1]); }); + } \ No newline at end of file -- cgit