aboutsummaryrefslogtreecommitdiff
path: root/challenge-253/jeanluc2020/python
diff options
context:
space:
mode:
authorThomas Köhler <jean-luc@picard.franken.de>2024-01-22 21:45:09 +0100
committerThomas Köhler <jean-luc@picard.franken.de>2024-01-22 21:45:09 +0100
commit898efbfec41a9cba96da449d2a550ec17370de2d (patch)
treecfecbe0f8f0bdbd05b23041cd34789c6c263f9e9 /challenge-253/jeanluc2020/python
parent8db85cd488ebedbbda40cca5403676ce0ed8e072 (diff)
downloadperlweeklychallenge-club-898efbfec41a9cba96da449d2a550ec17370de2d.tar.gz
perlweeklychallenge-club-898efbfec41a9cba96da449d2a550ec17370de2d.tar.bz2
perlweeklychallenge-club-898efbfec41a9cba96da449d2a550ec17370de2d.zip
Add solution 253.
Signed-off-by: Thomas Köhler <jean-luc@picard.franken.de>
Diffstat (limited to 'challenge-253/jeanluc2020/python')
-rwxr-xr-xchallenge-253/jeanluc2020/python/ch-1.py49
-rwxr-xr-xchallenge-253/jeanluc2020/python/ch-2.py91
2 files changed, 140 insertions, 0 deletions
diff --git a/challenge-253/jeanluc2020/python/ch-1.py b/challenge-253/jeanluc2020/python/ch-1.py
new file mode 100755
index 0000000000..466d4712c2
--- /dev/null
+++ b/challenge-253/jeanluc2020/python/ch-1.py
@@ -0,0 +1,49 @@
+#!/usr/bin/python3
+# https://theweeklychallenge.org/blog/perl-weekly-challenge-253/#TASK1
+#
+# Task 1: Split Strings
+# =====================
+#
+# You are given an array of strings and a character separator.
+#
+# Write a script to return all words separated by the given character excluding
+# empty string.
+#
+# Example 1
+#
+# Input: @words = ("one.two.three","four.five","six")
+# $separator = "."
+# Output: "one","two","three","four","five","six"
+#
+# Example 2
+#
+# Input: @words = ("$perl$$", "$$raku$")
+# $separator = "$"
+# Output: "perl","raku"
+#
+############################################################
+##
+## discussion
+##
+############################################################
+#
+# This is a classic one-liner problem: join the words into a single string,
+# then split this string into an array of strings at the separator, then
+# only keep the non-empty strings by grepping for strings that contain one
+# character.
+#
+
+import re
+
+def split_strings(separator: str, words: list) -> None:
+ print("Input: (\"", "\", \"".join(words), "\"), '", separator, "'", sep="")
+ output = []
+ for value in separator.join(words).split(separator):
+ if len(value) > 0:
+ output.append(value)
+ print("Output: (\"", "\", \"".join(output), "\")", sep="")
+
+
+split_strings(".", ["one.two.three","four.five","six"])
+split_strings('$', ['$perl$$', '$$raku$'])
+
diff --git a/challenge-253/jeanluc2020/python/ch-2.py b/challenge-253/jeanluc2020/python/ch-2.py
new file mode 100755
index 0000000000..895f12e674
--- /dev/null
+++ b/challenge-253/jeanluc2020/python/ch-2.py
@@ -0,0 +1,91 @@
+#!/usr/bin/python3
+# https://theweeklychallenge.org/blog/perl-weekly-challenge-253/#TASK2
+#
+# Task 2: Weakest Row
+# ===================
+#
+# You are given an m x n binary matrix i.e. only 0 and 1 where 1 always appear before 0.
+#
+# A row i is weaker than a row j if one of the following is true:
+#
+## a) The number of 1s in row i is less than the number of 1s in row j.
+## b) Both rows have the same number of 1 and i < j.
+#
+# Write a script to return the order of rows from weakest to strongest.
+#
+## Example 1
+##
+## Input: $matrix = [
+## [1, 1, 0, 0, 0],
+## [1, 1, 1, 1, 0],
+## [1, 0, 0, 0, 0],
+## [1, 1, 0, 0, 0],
+## [1, 1, 1, 1, 1]
+## ]
+## Output: (2, 0, 3, 1, 4)
+##
+## The number of 1s in each row is:
+## - Row 0: 2
+## - Row 1: 4
+## - Row 2: 1
+## - Row 3: 2
+## - Row 4: 5
+#
+## Example 2
+##
+## Input: $matrix = [
+## [1, 0, 0, 0],
+## [1, 1, 1, 1],
+## [1, 0, 0, 0],
+## [1, 0, 0, 0]
+## ]
+## Output: (0, 2, 3, 1)
+##
+## The number of 1s in each row is:
+## - Row 0: 1
+## - Row 1: 4
+## - Row 2: 1
+## - Row 3: 1
+#
+############################################################
+##
+## discussion
+##
+############################################################
+#
+# First, we create a second array which contains the number of 1's
+# in each row and the row's index, then we sort that array by the
+# number of ones and the index - which means we only sort by the
+# number of ones since python's sort is stable, keeping the order
+# of elements intact if the values are the same, and the index is
+# therefore already sorted after sorting by number of ones.
+#
+
+from operator import itemgetter
+
+def number_of_ones( array: list) -> int:
+ output = 0
+ for value in array:
+ if value > 0:
+ output += 1
+ return output
+
+def weakest_row(matrix: list) -> None:
+ print("Input: [")
+ for array in matrix:
+ print(" [", ", ".join([str(x) for x in array]), "],")
+ print(" ]")
+ sort_by_me = []
+ i = 0
+ for array in matrix:
+ num = number_of_ones(array)
+ pos = i
+ i += 1
+ sort_by_me.append([num, pos])
+ sorted_array = sorted(sort_by_me, key=itemgetter(0))
+ print("Output: (", ", ".join([str(x[1]) for x in sorted_array]), ")", sep=None)
+
+
+weakest_row([ [1, 1, 0, 0, 0], [1, 1, 1, 1, 0], [1, 0, 0, 0, 0], [1, 1, 0, 0, 0], [1, 1, 1, 1, 1] ])
+weakest_row([ [1, 0, 0, 0], [1, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 0] ])
+