aboutsummaryrefslogtreecommitdiff
path: root/challenge-179/sgreen/python
diff options
context:
space:
mode:
authorSimon Green <mail@simon.green>2022-08-28 18:46:24 +1000
committerSimon Green <mail@simon.green>2022-08-28 18:46:24 +1000
commitebd856ad7f9be363073598af45a200d448cef9c8 (patch)
tree86c383877d6324fc6ac9f8b72002842d3addaad0 /challenge-179/sgreen/python
parentd41a919cdc74a72e0fab7031b12130325692dcc8 (diff)
downloadperlweeklychallenge-club-ebd856ad7f9be363073598af45a200d448cef9c8.tar.gz
perlweeklychallenge-club-ebd856ad7f9be363073598af45a200d448cef9c8.tar.bz2
perlweeklychallenge-club-ebd856ad7f9be363073598af45a200d448cef9c8.zip
sgreen solutions to challenge 179
Diffstat (limited to 'challenge-179/sgreen/python')
-rwxr-xr-xchallenge-179/sgreen/python/ch-1.py77
-rwxr-xr-xchallenge-179/sgreen/python/ch-2.py20
2 files changed, 97 insertions, 0 deletions
diff --git a/challenge-179/sgreen/python/ch-1.py b/challenge-179/sgreen/python/ch-1.py
new file mode 100755
index 0000000000..9ff2f822a7
--- /dev/null
+++ b/challenge-179/sgreen/python/ch-1.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python3
+
+import sys
+
+
+def main(s):
+ n = int(s)
+ if n >= 10 ** 12:
+ raise ValueError('Number too large')
+
+ numbers = [None, 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten',
+ 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
+ tens = [None, None, 'twenty', 'thirty', 'fourty',
+ 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
+ ordinal = [None, 'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth', 'tenth',
+ 'eleventh', 'twelfth', 'thirteenth', 'fourteenth', 'fifteenth', 'sixteenth', 'seventeenth', 'eighteenth', 'nineteenth']
+ thousands = [None, 'thousand', 'million', 'billion']
+
+ # Split the string into blocks of three
+ blocks = []
+ while len(s) > 3:
+ # Take off the last three numbers
+ blocks.append(int(s[-3:]))
+ s = s[:-3]
+ blocks.append(int(s))
+
+ words = []
+ for count, value in enumerate(blocks):
+ w = ''
+
+ # Maybe this block has no numbers
+ if value == 0:
+ continue
+
+ # Deal with the hundreds first
+ if value >= 100:
+ w = numbers[int(value/100)] + ' hundred'
+
+ if value % 100 == 0:
+ # Deal with numbers evenly divisable by 100
+ if count > 0:
+ w += ' ' + thousands[count]
+ words.insert(0, w)
+ continue
+
+ w += ' and '
+ value = value % 100
+
+ # Then the tens
+ if value >= 20:
+ w += tens[int(value/10)] + ' '
+ value = value % 10
+ if value == 0 and count == 0:
+ # We need to add the ordinal word here
+ w = w[:-2] + 'ieth'
+
+ # And then the number
+ if value != 0:
+ t = ordinal if count == 0 else numbers
+ w += t[value]
+
+ # And maybe the thousandth word
+ if count > 0:
+ w += ' ' + thousands[count]
+
+ words.insert(0, str(w))
+
+ # Edge case, if the number is evenly divisible by 100, add 'th' to the last value
+ if int(n) % 100 == 0:
+ words[-1] += 'th'
+
+ # Print the ordinal number
+ print(*words, sep=' ')
+
+
+if __name__ == '__main__':
+ main(sys.argv[1])
diff --git a/challenge-179/sgreen/python/ch-2.py b/challenge-179/sgreen/python/ch-2.py
new file mode 100755
index 0000000000..7647b00b1e
--- /dev/null
+++ b/challenge-179/sgreen/python/ch-2.py
@@ -0,0 +1,20 @@
+#!/usr/bin/python3
+
+import sys
+
+
+def main(strings):
+ numbers = [float(x) for x in strings]
+ bar = '▁▂▃▄▅▆▇█'
+ barcount = len(bar)
+
+ mn, mx = min(numbers), max(numbers)
+ extent = mx - mn
+ sparkline = ''.join(bar[min([barcount - 1,
+ int((n - mn) / extent * barcount)])]
+ for n in numbers)
+ print(sparkline)
+
+
+if __name__ == '__main__':
+ main(sys.argv[1:])