aboutsummaryrefslogtreecommitdiff
path: root/challenge-101/paulo-custodio/python/ch-1.py
diff options
context:
space:
mode:
author冯昶 <seaker@qq.com>2021-03-15 18:13:51 +0800
committer冯昶 <seaker@qq.com>2021-03-15 18:13:51 +0800
commit8b6be37fe4dac8b4c6489a95e55514b76b298d15 (patch)
treeae36c8ec2c71f606c0e36adaa19dba366a68a0b4 /challenge-101/paulo-custodio/python/ch-1.py
parent865acfd056fb6f409ec6b1a81d60b931cbcb69fe (diff)
parentc9aec2da6bcb04b488183f09ca94bee488557aff (diff)
downloadperlweeklychallenge-club-8b6be37fe4dac8b4c6489a95e55514b76b298d15.tar.gz
perlweeklychallenge-club-8b6be37fe4dac8b4c6489a95e55514b76b298d15.tar.bz2
perlweeklychallenge-club-8b6be37fe4dac8b4c6489a95e55514b76b298d15.zip
Merge branch 'master' of github.com:seaker/perlweeklychallenge-club
Diffstat (limited to 'challenge-101/paulo-custodio/python/ch-1.py')
-rw-r--r--challenge-101/paulo-custodio/python/ch-1.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/challenge-101/paulo-custodio/python/ch-1.py b/challenge-101/paulo-custodio/python/ch-1.py
new file mode 100644
index 0000000000..57d08d0847
--- /dev/null
+++ b/challenge-101/paulo-custodio/python/ch-1.py
@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+
+# Challenge 101
+#
+# TASK #1 > Pack a Spiral
+# Submitted by: Stuart Little
+#
+# You are given an array @A of items (integers say, but they can be anything).
+#
+# Your task is to pack that array into an MxN matrix spirally counterclockwise,
+# as tightly as possible.
+#
+# 'Tightly' means the absolute value |M-N| of the difference has to be as small
+# as possible.
+
+import sys
+import math
+
+def spiral(numbers):
+
+ # find max width of elements, convert to int
+ def max_width(numbers):
+ num_width = 1
+ for i in range(0, len(numbers)):
+ if len(numbers[i]) < num_width:
+ num_width = len(numbers[i])
+ numbers[i] = int(numbers[i])
+ return num_width
+
+ # find out m,n
+ def smallest_rect(n):
+ l, h = 1, n
+ for i in range(1, int(math.sqrt(n)+1)):
+ if ((n % i) == 0):
+ l, h = i, int(n / i)
+ return l, h
+
+ # build empty rectangle
+ rect = []
+ def build_rect(numbers):
+ m, n = smallest_rect(len(numbers))
+ for r in range (0, m+1):
+ rect.append(["" for c in range(0, n+1)])
+ return m, n
+
+ # build spiral rectangle
+ num_width = max_width(numbers)
+ m, n = build_rect(numbers)
+
+ r, c = m, 1
+ i = 0
+ while (i < len(numbers)):
+ # go East
+ while (c <= n):
+ if (rect[r][c] != ""):
+ break
+ rect[r][c] = ("{:"+str(num_width+1)+"d}").format(numbers[i])
+ i += 1
+ c += 1
+ c -= 1
+ r -= 1
+ # go North
+ while (r >= 1):
+ if (rect[r][c] != ""):
+ break
+ rect[r][c] = ("{:"+str(num_width+1)+"d}").format(numbers[i])
+ i += 1
+ r -= 1
+ r += 1
+ c -= 1
+ # go West
+ while (c >= 1):
+ if (rect[r][c] != ""):
+ break
+ rect[r][c] = ("{:"+str(num_width+1)+"d}").format(numbers[i])
+ i += 1
+ c -= 1
+ c += 1
+ r += 1
+ # go South
+ while (r <= m):
+ if (rect[r][c] != ""):
+ break
+ rect[r][c] = ("{:"+str(num_width+1)+"d}").format(numbers[i])
+ i += 1
+ r += 1
+ r -= 1
+ c += 1
+
+ for r in range (1, m+1):
+ output = ""
+ for c in range (1, n+1):
+ output += rect[r][c]
+ print(output)
+
+# main
+numbers = sys.argv[1:]
+spiral(numbers)