aboutsummaryrefslogtreecommitdiff
path: root/challenge-050
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-03-08 19:53:28 +0000
committerGitHub <noreply@github.com>2020-03-08 19:53:28 +0000
commit2b82f76d147032401469dae1ec1da4a68be92da8 (patch)
tree0d1c9c56b16a2b9a9755946a253d64feef34a104 /challenge-050
parent63cdc8936285520755df765cbe7c5ba9a1b155ed (diff)
parent5dc6b4235c4ff49c245eeb429da1993fc53141d8 (diff)
downloadperlweeklychallenge-club-2b82f76d147032401469dae1ec1da4a68be92da8.tar.gz
perlweeklychallenge-club-2b82f76d147032401469dae1ec1da4a68be92da8.tar.bz2
perlweeklychallenge-club-2b82f76d147032401469dae1ec1da4a68be92da8.zip
Merge pull request #1368 from user-person/master
User person's solutions for challenge 50.
Diffstat (limited to 'challenge-050')
-rw-r--r--challenge-050/user-person/perl/ch-1.pl77
-rw-r--r--challenge-050/user-person/perl/ch-2.pl67
-rw-r--r--challenge-050/user-person/python/ch-1.py84
-rw-r--r--challenge-050/user-person/python/ch-2.py70
4 files changed, 298 insertions, 0 deletions
diff --git a/challenge-050/user-person/perl/ch-1.pl b/challenge-050/user-person/perl/ch-1.pl
new file mode 100644
index 0000000000..335abc3172
--- /dev/null
+++ b/challenge-050/user-person/perl/ch-1.pl
@@ -0,0 +1,77 @@
+#!/usr/bin/env perl
+
+###########################################################################
+# script name: ch-1.pl #
+# #
+# https://github.com/user-person #
+# #
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-050/ #
+# #
+# Merge Intervals #
+# Write a script to merge the given intervals where ever possible. #
+# #
+# [2,7], [3,9], [10,12], [15,19], [18,22] #
+# #
+# The script should merge [2, 7] and [3, 9] together to return [2, 9]. #
+# #
+# Similarly it should also merge [15, 19] and [18, 22] together to #
+# return [15, 22]. #
+# #
+# The final result should be something like below: #
+# #
+# [2, 9], [10, 12], [15, 22] #
+# #
+###########################################################################
+
+use strict;
+use warnings;
+use List::MoreUtils qw( minmax );
+
+my $input = "[2,7], [3,9], [10,12], [15,19], [18,22]";
+
+$input = "@ARGV" if @ARGV;
+
+$input =~ s{[][, ]+}{ }g;
+$input =~ s{\A\s+|\s+\Z}{};
+
+my @sets = split m{ }, $input;
+
+sub printSets {
+ for (my $i=0; $i < $#_; $i += 2) {
+ print "[$_[$i], $_[$i+1]]";
+ print ", " if $i+1 < $#_;
+ }
+ print "\n";
+}
+
+sub mergeUnits {
+ my @indicies = @_;
+ my ($min, $max) = minmax ( $sets[$indicies[0]], $sets[$indicies[1]], $sets[$indicies[2]], $sets[$indicies[3]] );
+ push @sets, $min;
+ push @sets, $max;
+
+ foreach ( sort { $b <=> $a } @indicies ) {
+ splice @sets, $_, 1;
+ }
+}
+
+print "UNMERGED:\n";
+printSets @sets;
+
+OUTER:
+for (my $j=0; $j < $#sets; $j += 2) {
+ for ( my $k=$j+2; $k < $#sets; $k += 2) {
+
+ if ( $sets[$k] >= $sets[$j] and $sets[$k] <= $sets[$j+1]
+ or $sets[$k+1] >= $sets[$j] and $sets[$k+1] <= $sets[$j+1] ) {
+
+ mergeUnits $j, $j+1, $k, $k+1;
+ $j = -2; # This resets OUTER loop to 0 after its double increment
+ next OUTER;
+ }
+ }
+}
+
+@sets = sort { $a <=> $b } @sets;
+print "\nMERGED:\n";
+printSets @sets;
diff --git a/challenge-050/user-person/perl/ch-2.pl b/challenge-050/user-person/perl/ch-2.pl
new file mode 100644
index 0000000000..7abfedc00e
--- /dev/null
+++ b/challenge-050/user-person/perl/ch-2.pl
@@ -0,0 +1,67 @@
+#!/usr/bin/env perl
+
+###########################################################################
+# script name: ch-2.pl #
+# #
+# https://github.com/user-person #
+# #
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-050/ #
+# #
+# Noble Integer #
+# You are given a list, @L, of three or more random integers between 1 #
+# and 50. A Noble Integer is an integer N in @L, such that there are #
+# exactly N integers greater than N in @L. Output any Noble Integer #
+# found in @L, or an empty list if none were found. #
+# #
+# An interesting question is whether or not there can be multiple Noble #
+# Integers in a list. #
+# #
+# For example, #
+# #
+# Suppose we have list of 4 integers [2, 6, 1, 3]. #
+# #
+# Here we have 2 in the above list, known as Noble Integer, since there #
+# are exactly 2 integers in the list i.e.3 and 6, which are greater than #
+# 2. #
+# #
+# Therefore the script would print 2. #
+# #
+###########################################################################
+
+use strict;
+use warnings;
+
+sub nobleInt {
+ my @ints = sort { $a <=> $b } @_;
+ my %seen = ();
+ for (my $i = 0; $i <= $#ints; ++$i) {
+ my $count = 0;
+ MOV:
+ for (my $j = 0; $j <= $#ints; ++$j) {
+ next MOV if $i == $j;
+ ++$count if $ints[$i] < $ints[$j];
+ }
+ $seen{ $ints[$i] }++ if $count == $ints[$i];
+ }
+ return keys %seen;
+}
+
+my $input = "[2, 6, 1, 3]";
+
+if (@ARGV) {
+ $input = "@ARGV"
+} else {
+ print "default input: $input\n";
+}
+
+$input =~ s{[][, ]+}{ }g;
+$input =~ s{\A\s+|\s+\Z}{};
+my @L = split m{ }, $input;
+
+my @nobleInteger = nobleInt @L;
+
+if ( @nobleInteger ){
+ print "Noble integer: $nobleInteger[0]\n";
+} else {
+ print "No noble integer.\n";
+}
diff --git a/challenge-050/user-person/python/ch-1.py b/challenge-050/user-person/python/ch-1.py
new file mode 100644
index 0000000000..3a2721f302
--- /dev/null
+++ b/challenge-050/user-person/python/ch-1.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+
+###########################################################################
+# script name: ch-1.py #
+# #
+# https://github.com/user-person #
+# #
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-050/ #
+# #
+# Merge Intervals #
+# Write a script to merge the given intervals where ever possible. #
+# #
+# [2,7], [3,9], [10,12], [15,19], [18,22] #
+# #
+# The script should merge [2, 7] and [3, 9] together to return [2, 9]. #
+# #
+# Similarly it should also merge [15, 19] and [18, 22] together to #
+# return [15, 22]. #
+# #
+# The final result should be something like below: #
+# #
+# [2, 9], [10, 12], [15, 22] #
+# #
+###########################################################################
+
+import re
+import sys
+
+input = "[2,7], [3,9], [10,12], [15,19], [18,22]"
+
+if len(sys.argv) > 1:
+ input = ' '.join(sys.argv[1:])
+
+input = re.sub(r'[][, ]+',' ',input)
+input = re.sub(r'\A\s+|\s+\Z','',input)
+sets = re.split(r' ',input)
+
+def printSets(sList):
+ lastInd = len(sList)-1
+ for k in range(0, lastInd, 2):
+ print('[' + str(sList[k]) + ', ' + str(sList[k+1]) + ']',end='')
+ if lastInd > k+2:
+ print(', ',end='')
+ print()
+
+def mergeUnits(inds):
+
+ indsVal = [sets[pos] for pos in inds]
+ indsVal.sort(key=int)
+ sets.append(indsVal[0])
+ sets.append(indsVal[3])
+
+ inds.sort(key=int,reverse=True)
+ for ind2pop in inds:
+ sets.pop(ind2pop)
+
+print('UNMERGED:')
+printSets(sets)
+
+loop = True
+while loop:
+
+ loop = False
+ for i in range(0, len(sets)-1, 2):
+
+ for j in range(0, len(sets)-1, 2):
+
+ if i == j:
+ continue
+
+ elif int(sets[j]) >= int(sets[i]) and int(sets[j]) <= int(sets[i+1]) or int(sets[j+1]) >= int(sets[i]) and int(sets[j+1]) <= int(sets[i+1]):
+ # Elegant? no, but it seems to work.
+
+ mergeUnits([i, i+1, j, j+1])
+ loop = True
+ break
+ else:
+ continue
+
+ break
+
+print('\nMERGED:')
+sets.sort(key=int)
+printSets(sets)
diff --git a/challenge-050/user-person/python/ch-2.py b/challenge-050/user-person/python/ch-2.py
new file mode 100644
index 0000000000..4ccab6057d
--- /dev/null
+++ b/challenge-050/user-person/python/ch-2.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+
+###########################################################################
+# script name: ch-2.py #
+# #
+# https://github.com/user-person #
+# #
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-050/ #
+# #
+# Noble Integer #
+# You are given a list, @L, of three or more random integers between 1 #
+# and 50. A Noble Integer is an integer N in @L, such that there are #
+# exactly N integers greater than N in @L. Output any Noble Integer #
+# found in @L, or an empty list if none were found. #
+# #
+# An interesting question is whether or not there can be multiple Noble #
+# Integers in a list. #
+# #
+# For example, #
+# #
+# Suppose we have list of 4 integers [2, 6, 1, 3]. #
+# #
+# Here we have 2 in the above list, known as Noble Integer, since there #
+# are exactly 2 integers in the list i.e.3 and 6, which are greater than #
+# 2. #
+# #
+# Therefore the script would print 2. #
+# #
+###########################################################################
+
+import re
+import sys
+
+def nobleInt(ints):
+ seen = dict()
+ ints.sort(key=int)
+
+ for i in ints:
+ count = 0
+
+ for j in ints:
+
+ if int(i) < int(j):
+ count += 1
+
+ if int(count) == int(i):
+ if i in seen:
+ seen[i] += 1
+ else:
+ seen.update({i:1})
+ return seen.keys()
+
+input = "[2, 6, 1, 3]"
+
+if len(sys.argv) > 1:
+ input = ' '.join(sys.argv[1:])
+else:
+ print('default input:',input)
+
+input = re.sub(r'[][, ]+', ' ', input)
+input = re.sub(r'\A\s+|\s+\Z', '', input)
+L = re.split(r' ', input)
+
+nobleInteger = nobleInt(L)
+
+if nobleInteger:
+ for kys in nobleInteger:
+ print('noble integer:',kys)
+else:
+ print('No noble integer.')