diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-03-08 19:53:28 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-08 19:53:28 +0000 |
| commit | 2b82f76d147032401469dae1ec1da4a68be92da8 (patch) | |
| tree | 0d1c9c56b16a2b9a9755946a253d64feef34a104 /challenge-050 | |
| parent | 63cdc8936285520755df765cbe7c5ba9a1b155ed (diff) | |
| parent | 5dc6b4235c4ff49c245eeb429da1993fc53141d8 (diff) | |
| download | perlweeklychallenge-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.pl | 77 | ||||
| -rw-r--r-- | challenge-050/user-person/perl/ch-2.pl | 67 | ||||
| -rw-r--r-- | challenge-050/user-person/python/ch-1.py | 84 | ||||
| -rw-r--r-- | challenge-050/user-person/python/ch-2.py | 70 |
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.') |
