diff options
| author | 冯昶 <seaker@qq.com> | 2021-03-15 18:13:51 +0800 |
|---|---|---|
| committer | 冯昶 <seaker@qq.com> | 2021-03-15 18:13:51 +0800 |
| commit | 8b6be37fe4dac8b4c6489a95e55514b76b298d15 (patch) | |
| tree | ae36c8ec2c71f606c0e36adaa19dba366a68a0b4 /challenge-101/paulo-custodio/python/ch-1.py | |
| parent | 865acfd056fb6f409ec6b1a81d60b931cbcb69fe (diff) | |
| parent | c9aec2da6bcb04b488183f09ca94bee488557aff (diff) | |
| download | perlweeklychallenge-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.py | 98 |
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) |
