Skip to content

Commit

Permalink
Solutions to the challenge 059.
Browse files Browse the repository at this point in the history
  • Loading branch information
wanderdoc committed May 4, 2020
1 parent bd1cc9e commit 6bd84ac
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 0 deletions.
78 changes: 78 additions & 0 deletions challenge-059/wanderdoc/perl/ch-1.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!perl
use strict;
use warnings FATAL => qw(all);



=prompt
You are given a linked list and a value k. Write a script to partition the linked list such that all nodes less than k come before nodes greater than or equal to k. Make sure you preserve the original relative order of the nodes in each of the two partitions.
For example:
Linked List: 1 → 4 → 3 → 2 → 5 → 2
k = 3
Expected Output: 1 → 2 → 2 → 4 → 3 → 5.
=cut


my $K = shift || 3;
my @input = map {(1 .. 10)[rand 10] } 1 .. 10; # (1, 4, 3, 2, 5, 2);
print join(' -> ', @input), $/;


# LL-Implementation.
# https://www.slideshare.net/lembark/perly-linked-lists

my $list = [[]];

my $node = $list->[0];
for my $val ( @input )
{
@$node = ([], $val);
$node = $node->[0];
}

my $part_uK = [[]];
my $node_uK = $part_uK->[0];

my $part_oK = [[]];
my $node_oK = $part_oK->[0];


$node = $list->[0]; # Back to begin.

while ($node)
{
if ( $node->[1] and $node->[1] < $K )
{
@$node_uK = ([], $node->[1]);
$node_uK = $node_uK->[0];

}
elsif ( $node->[1] and $node->[1] >= $K )
{
@$node_oK = ([], $node->[1]);
$node_oK = $node_oK->[0];
}
$node = $node->[0];
}

@$node_uK = @{@$part_oK[0]}; # Now all the partitioned LL is in $part_uK.
# $node_uK was already at the end of the list.

# Free memory.
undef $list;
undef $part_oK;



# Output.
my $n_all = $part_uK->[0];
while ( $n_all )
{
print $n_all->[1] if $n_all->[1];

$n_all = $n_all->[0];
print ' -> ' if ($n_all and $n_all->[1]);

}
print $/;
53 changes: 53 additions & 0 deletions challenge-059/wanderdoc/perl/ch-2.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!perl
use strict;
use warnings FATAL => qw(all);

=prompt
For this task, you will most likely need a function f(a,b) which returns the count of different bits of binary representation of a and b.
For example, f(1,3) = 1, since:
Binary representation of 1 = 01
Binary representation of 3 = 11
There is only 1 different bit. Therefore the subroutine should return 1. Note that if one number is longer than the other in binary, the most significant bits of the smaller number are padded (i.e., they are assumed to be zeroes).
Script Output
You script should accept n positive numbers. Your script should sum the result of f(a,b) for every pair of numbers given:
For example, given 2, 3, 4, the output would be 6, since f(2,3) + f(2,4) + f(3,4) = 1 + 2 + 3 = 6
=cut

use List::Util qw(max);

sub pairwise_difbits
{
my ($n1, $n2) = @_;
my $max = max(map length(sprintf("%b", $_)), ($n1, $n2));
($n1, $n2) = map sprintf("%0${max}b", $_) , ($n1, $n2);

my $count = 0;
for my $i ( 0 .. $max - 1 )
{
$count++ if substr($n1, $i, 1) != substr($n2, $i, 1);
}
return $count;
}

sub sumdif
{
my @numbers = @_;
my $sum;


for my $i ( 0 .. $#numbers - 1 )
{
for my $j ( $i .. $#numbers )
{
next if $i == $j;
$sum += pairwise_difbits(@numbers[$i, $j]);
}
}

return $sum;
}

print sumdif ( 1, 2, 3, 4, 5 ), $/;

0 comments on commit 6bd84ac

Please sign in to comment.