aboutsummaryrefslogtreecommitdiff
path: root/challenge-059
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-059')
-rw-r--r--challenge-059/javier-luque/blog.txt1
-rw-r--r--challenge-059/javier-luque/perl/ch-1.pl141
-rw-r--r--challenge-059/javier-luque/perl/ch-2.pl32
-rw-r--r--challenge-059/javier-luque/raku/ch-1.p6104
-rw-r--r--challenge-059/javier-luque/raku/ch-2.p626
5 files changed, 304 insertions, 0 deletions
diff --git a/challenge-059/javier-luque/blog.txt b/challenge-059/javier-luque/blog.txt
new file mode 100644
index 0000000000..4daabaedc2
--- /dev/null
+++ b/challenge-059/javier-luque/blog.txt
@@ -0,0 +1 @@
+https://perlchallenges.wordpress.com/2020/05/04/perl-weekly-challenge-059/
diff --git a/challenge-059/javier-luque/perl/ch-1.pl b/challenge-059/javier-luque/perl/ch-1.pl
new file mode 100644
index 0000000000..0672fdac2a
--- /dev/null
+++ b/challenge-059/javier-luque/perl/ch-1.pl
@@ -0,0 +1,141 @@
+#!/usr/bin/perl
+# Test: ./ch-1.pl
+package LinkedList::Node; # Linked list
+use Mouse;
+
+has 'value' => (
+ is => 'rw',
+ isa => 'Maybe[Int]',
+ default => sub {
+ return undef;
+ }
+);
+
+has 'next' => (
+ is => 'rw',
+ isa => 'Maybe[LinkedList::Node]',
+ default => sub {
+ return undef
+ }
+);
+
+__PACKAGE__->meta->make_immutable();
+
+package LinkedList;
+
+use Mouse;
+use feature qw /say/;
+use LinkedList::Node;
+
+has 'first' => (
+ is => 'rw',
+ isa => 'Maybe[LinkedList::Node]',
+ default => sub {
+ return undef
+ }
+);
+
+# Create the list
+sub create_list {
+ my ($self, @values) = @_;
+ my $prev_node;
+
+ # Populate the list
+ for my $value (@values) {
+ my $node = LinkedList::Node->new(value => $value);
+
+ # Populate first and next nodes
+ ($prev_node) ?
+ $prev_node->next($node) :
+ $self->first($node);
+
+ # Next
+ $prev_node = $node;
+ }
+}
+
+sub partition_list {
+ my ($self, $k) = @_;
+
+ # Temp variables to store node locations
+ my $k_node_current;
+ my $k_node_first;
+ my $before_node_current;
+ my $before_node_first;
+ my $after_node_current;
+ my $after_node_first;
+
+ # Loop through the nodes
+ my $node = $self->first;
+ while ($node) {
+ if ($node->value == $k) {
+ if ($k_node_current) {
+ $k_node_current->next($node);
+ $k_node_current = $node;
+ } else {
+ $k_node_first = $node;
+ $k_node_current = $node;
+ }
+ }
+
+ # Process the nodex lower than k
+ if ($node->value < $k) {
+ if ($before_node_current) {
+ $before_node_current->next($node);
+ $before_node_current = $node;
+ } else {
+ $before_node_first = $node;
+ $before_node_current = $node;
+ }
+ }
+
+ # Process the nodex higher than k
+ if ($node->value > $k) {
+ if ($after_node_current) {
+ $after_node_current->next($node);
+ $after_node_current = $node;
+ } else {
+ $after_node_first = $node;
+ $after_node_current = $node;
+ }
+ }
+
+ $node = $node->next;
+ }
+
+ # link the chains
+ $self->first($before_node_first);
+ $before_node_current->next($k_node_first);
+ $k_node_current->next($after_node_first);
+ $after_node_current->next(undef);
+}
+
+sub display_list {
+ my $self = shift;
+
+ my $node = $self->first;
+ my @keys;
+
+ while ($node) {
+ push @keys, $node->value;
+ $node = $node->next;
+ }
+
+ return join ' → ', @keys;
+}
+
+__PACKAGE__->meta->make_immutable();
+
+package main;
+
+use strict;
+use warnings;
+use LinkedList;
+
+my $ll = LinkedList->new();
+$ll->create_list(1,4,3,2,5,2);
+say 'Before: ' . $ll->display_list;
+$ll->partition_list(3);
+say 'After: ' . $ll->display_list;
+
+
diff --git a/challenge-059/javier-luque/perl/ch-2.pl b/challenge-059/javier-luque/perl/ch-2.pl
new file mode 100644
index 0000000000..c7ea428308
--- /dev/null
+++ b/challenge-059/javier-luque/perl/ch-2.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/perl
+# Test: ./ch-2.pl 2 3 4
+
+use strict;
+use warnings;
+use feature qw /say/;
+use Algorithm::Combinatorics qw /combinations/;
+
+my $answer = 0;
+
+my $combinations = combinations(\@ARGV, 2);
+while (my $v = $combinations->next) {
+ $answer += f(@$v);
+}
+
+say $answer;
+
+sub f {
+ return calculate_true_bits(int(shift) ^ int(shift));
+}
+
+# Calculate the number of true bits
+sub calculate_true_bits {
+ my $number = shift;
+ my $count = 0;
+
+ do {
+ $count++ if ($number & 1);
+ } while ($number = $number >> 1);
+
+ return $count;
+}
diff --git a/challenge-059/javier-luque/raku/ch-1.p6 b/challenge-059/javier-luque/raku/ch-1.p6
new file mode 100644
index 0000000000..ca4849b3a3
--- /dev/null
+++ b/challenge-059/javier-luque/raku/ch-1.p6
@@ -0,0 +1,104 @@
+# Test: perl6 ch-1.p6
+class LinkedList::Node {
+ has Int $.value is rw;
+ has LinkedList::Node $.next is rw;
+}
+
+class LinkedList {
+ has LinkedList::Node $.first is rw;
+
+ # Create the list
+ method create-list(*@values) {
+ my $prev_node;
+
+ # Populate the list
+ for @values -> $value {
+ my $node = LinkedList::Node.new(value => $value);
+
+ # Populate first and next nodes
+ if ($prev_node) {
+ $prev_node.next = $node
+ } else {
+ self.first = $node;
+ }
+
+ # Next node
+ $prev_node = $node;
+ }
+ }
+
+ method partition_list(Int $k) {
+ # Temp variables to store node locations
+ my $k_node_current;
+ my $k_node_first;
+ my $before_node_current;
+ my $before_node_first;
+ my $after_node_current;
+ my $after_node_first;
+
+ # Loop through the nodes
+ my $node = self.first;
+ while ($node) {
+ if ($node.value == $k) {
+ if ($k_node_current) {
+ $k_node_current.next = $node;
+ $k_node_current = $node;
+ } else {
+ $k_node_first = $node;
+ $k_node_current = $node;
+ }
+ }
+
+ # Process the nodex lower than k
+ if ($node.value < $k) {
+ if ($before_node_current) {
+ $before_node_current.next = $node;
+ $before_node_current = $node;
+ } else {
+ $before_node_first = $node;
+ $before_node_current = $node;
+ }
+ }
+
+ # Process the nodex higher than k
+ if ($node.value > $k) {
+ if ($after_node_current) {
+ $after_node_current.next = $node;
+ $after_node_current = $node;
+ } else {
+ $after_node_first = $node;
+ $after_node_current = $node;
+ }
+ }
+
+ $node = $node.next;
+ }
+
+ # link the chains
+ self.first = $before_node_first;
+ $before_node_current.next = $k_node_first;
+ $k_node_current.next = $after_node_first;
+ $after_node_current.next = Nil;
+ }
+
+ method display-list {
+ my $node = self.first;
+ my @keys;
+
+ while ($node) {
+ @keys.push($node.value);
+ $node = $node.next;
+ }
+
+ return @keys.join(" → ");
+ }
+}
+
+
+sub MAIN() {
+ my $ll = LinkedList.new();
+ $ll.create-list(1,4,3,2,5,2);
+ say 'Before: ' ~ $ll.display-list;
+ $ll.partition_list(3);
+ say 'After: ' ~ $ll.display-list;
+}
diff --git a/challenge-059/javier-luque/raku/ch-2.p6 b/challenge-059/javier-luque/raku/ch-2.p6
new file mode 100644
index 0000000000..707105dd9a
--- /dev/null
+++ b/challenge-059/javier-luque/raku/ch-2.p6
@@ -0,0 +1,26 @@
+# Test: perl6 ch-2.p6 2 3 4
+sub MAIN(*@ARGV) {
+ my @combos = @ARGV.combinations: 2;
+ my $answer = 0;
+
+ for @combos -> $combo {
+ $answer += f($combo[0], $combo[1]);
+ }
+
+ say $answer;
+}
+
+sub f(Int $a, Int $b) {
+ return calculate-true-bits($a +^ $b);
+}
+
+# Calculate the number of true bits
+sub calculate-true-bits(Int $n is copy) {
+ my $count = 0;
+
+ repeat {
+ $count++ if ($n +& 1);
+ } while ($n = $n +> 1);
+
+ return $count;
+}