From c6a94bb22a6fa421be34db82d237a197dd9f2808 Mon Sep 17 00:00:00 2001 From: Paulo Custodio Date: Tue, 17 Sep 2024 16:12:02 +0100 Subject: Add Python solution to challenge 060 --- challenge-060/paulo-custodio/perl/ch-1.pl | 4 +-- challenge-060/paulo-custodio/perl/ch-2.pl | 2 +- challenge-060/paulo-custodio/python/ch-1.py | 43 +++++++++++++++++++++++++ challenge-060/paulo-custodio/python/ch-2.py | 50 +++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 challenge-060/paulo-custodio/python/ch-1.py create mode 100644 challenge-060/paulo-custodio/python/ch-2.py (limited to 'challenge-060') diff --git a/challenge-060/paulo-custodio/perl/ch-1.pl b/challenge-060/paulo-custodio/perl/ch-1.pl index 6aac747b1a..aa47f1375b 100644 --- a/challenge-060/paulo-custodio/perl/ch-1.pl +++ b/challenge-060/paulo-custodio/perl/ch-1.pl @@ -2,13 +2,13 @@ # Challenge 060 # -# TASK #1 › Excel Column +# TASK #1 > Excel Column # Reviewed by: Ryan Thompson # Write a script that accepts a number and returns the Excel Column Name it # represents and vice-versa. # # Excel columns start at A and increase lexicographically using the 26 letters -# of the English alphabet, A..Z. After Z, the columns pick up an extra “digit”, +# of the English alphabet, A..Z. After Z, the columns pick up an extra "digit", # going from AA, AB, etc., which could (in theory) continue to an arbitrary # number of digits. In practice, Excel sheets are limited to 16,384 columns. # diff --git a/challenge-060/paulo-custodio/perl/ch-2.pl b/challenge-060/paulo-custodio/perl/ch-2.pl index 6ec49647e7..ba89e73e05 100644 --- a/challenge-060/paulo-custodio/perl/ch-2.pl +++ b/challenge-060/paulo-custodio/perl/ch-2.pl @@ -2,7 +2,7 @@ # Challenge 060 # -# TASK #2 › Find Numbers +# TASK #2 > Find Numbers # Reviewed by: Ryan Thompson # Write a script that accepts list of positive numbers (@L) and two positive # numbers $X and $Y. diff --git a/challenge-060/paulo-custodio/python/ch-1.py b/challenge-060/paulo-custodio/python/ch-1.py new file mode 100644 index 0000000000..10efd3a1fc --- /dev/null +++ b/challenge-060/paulo-custodio/python/ch-1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +# Challenge 060 +# +# TASK #1 > Excel Column +# Reviewed by: Ryan Thompson +# Write a script that accepts a number and returns the Excel Column Name it +# represents and vice-versa. +# +# Excel columns start at A and increase lexicographically using the 26 letters +# of the English alphabet, A..Z. After Z, the columns pick up an extra "digit", +# going from AA, AB, etc., which could (in theory) continue to an arbitrary +# number of digits. In practice, Excel sheets are limited to 16,384 columns. +# +# Example +# Input Number: 28 +# Output: AB +# +# Input Column Name: AD +# Output: 30 + +import re +import sys + +def col2num(col): + num = 0 + for digit in col: + num = 26*num + ord(digit)-ord('A') + 1 + return num + +def num2col(num): + col = "" + while num > 0: + digit = (num-1) % 26 + num = int((num-1) / 26) + col = chr(ord('A')+digit) + col + return col + +arg = sys.argv[1] +if re.search(r'^\d+$', arg): + print(num2col(int(arg))) +else: + print(col2num(arg)) diff --git a/challenge-060/paulo-custodio/python/ch-2.py b/challenge-060/paulo-custodio/python/ch-2.py new file mode 100644 index 0000000000..5a159ce266 --- /dev/null +++ b/challenge-060/paulo-custodio/python/ch-2.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + +# Challenge 060 +# +# TASK #2 > Find Numbers +# Reviewed by: Ryan Thompson +# Write a script that accepts list of positive numbers (@L) and two positive +# numbers $X and $Y. +# +# The script should print all possible numbers made by concatenating the numbers +# from @L, whose length is exactly $X but value is less than $Y. +# +# Example +# Input: +# +# @L = (0, 1, 2, 5); +# $X = 2; +# $Y = 21; +# Output: +# +# 10, 11, 12, 15, 20 + +import sys + +def combine1(combin, prefix, n, digits): + if len(prefix) == n: + num = int(prefix) + if not num in combin: + combin.add(num) + else: + for digit in digits: + combine1(combin, prefix+digit, n, digits) + +def combine(digits): + combin = set() + for n in range(1, len(digits)+1): + combine1(combin, "", n, digits) + nums = sorted(list(combin)) + return nums + +def numbers(X, Y, L): + nums = combine(L) + nums = list(filter(lambda x:len(str(x))==X and x