A **Seven Segment Display** is an electronic display device, used to display decimal or hexadecimal numerals. It involves seven led segments that are lit in specific combinations to represent a specific numeral. An example of each combination is shown below:

![seven segment display](https://upload.wikimedia.org/wikipedia/commons/9/97/7-segments_Indicator.gif)

For this Kata, you must accept an integer in the range `0 - 999999` and print it as a string (in decimal format), with each digit being represented as its own seven segment display (6x seven segment displays in total). Each of the individual led segments per display should be represented by three hashes `###`. Vertical bars `|` (ASCII 124) represent the edges of each display, with a single whitespace on either side between the edge and the area of the led segments. An example of the expected output is shown below:
```
segment_display(123456) = 
|       |  ###  |  ###  |       |  ###  |  ###  | 
|     # |     # |     # | #   # | #     | #     |
|     # |     # |     # | #   # | #     | #     |
|     # |     # |     # | #   # | #     | #     |
|       |  ###  |  ###  |  ###  |  ###  |  ###  |
|     # | #     |     # |     # |     # | #   # |
|     # | #     |     # |     # |     # | #   # |
|     # | #     |     # |     # |     # | #   # |
|       |  ###  |  ###  |       |  ###  |  ###  |
```
For clarity, the entire set of required combinations is provided below:

```
|  ###  |       |  ###  |  ###  |       |  ###  |  ###  |  ###  |  ###  |  ###  |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
|       |       |  ###  |  ###  |  ###  |  ###  |  ###  |       |  ###  |  ###  |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
|  ###  |       |  ###  |  ###  |       |  ###  |  ###  |       |  ###  |  ###  |
```
If the number is smaller than 6 digits, the result should be justified to the right, with the unused segments being blank (as they are not turned on). Refer to the sample test for an example.

**Note:** There should not be any trailing whitespace for any line.

Please rate and enjoy!

Difficulty: introductory

Starter code:

def segment_display(num):
	

Solutions:
BASE = [r.split('|') for r in '''\
  ###  |       |  ###  |  ###  |       |  ###  |  ###  |  ###  |  ###  |  ###  |       
 #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |       
 #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |       
 #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |       
       |       |  ###  |  ###  |  ###  |  ###  |  ###  |       |  ###  |  ###  |       
 #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |       
 #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |       
 #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |       
  ###  |       |  ###  |  ###  |       |  ###  |  ###  |       |  ###  |  ###  |       '''.split('\n') ]


def segment_display(n):
    digs = [int(d,16) for d in f'{n:A>6}']
    return '\n'.join( f'|{ "|".join( BASE[x][d] for d in digs) }|'
                      for x in range(len(BASE)))


from itertools import chain

lines = """
|  ###  |       |  ###  |  ###  |       |  ###  |  ###  |  ###  |  ###  |  ###  |       
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |       
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |       
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |       
|       |       |  ###  |  ###  |  ###  |  ###  |  ###  |       |  ###  |  ###  |       
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |       
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |       
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |       
|  ###  |       |  ###  |  ###  |       |  ###  |  ###  |       |  ###  |  ###  |       
""".lstrip().splitlines()

def digit_rotated(n):
    return ["".join(line[i] for line in lines) for i in range(n * 8, (n+1) * 8)]

def segment_display(n):
    digits = [int(c) for c in str(n)]
    if len(digits) < 6:
        digits = [-1] * (6-len(digits)) + digits
    xs = (line for line in chain(*map(digit_rotated, digits), ["|||||||||"]))
    return "\n".join(map("".join, zip(*xs)))

data = """
  ###  |       |  ###  |  ###  |       |  ###  |  ###  |  ###  |  ###  |  ###  
 #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # 
 #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # 
 #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # 
       |       |  ###  |  ###  |  ###  |  ###  |  ###  |       |  ###  |  ###  
 #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # 
 #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # 
 #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # 
  ###  |       |  ###  |  ###  |       |  ###  |  ###  |       |  ###  |  ###  
"""
# Remove blank lines, and extract the string for each line of each digit
data = [line for line in data.split('\n') if line]
segments = [tuple(line.split('|')) for line in data]
h, w = len(segments), len(segments[0][0])

def segment_display(num):
    result = [[] for _ in range(h)]
    n = str(num)
    # Apply left padding
    for _ in range(6 - len(n)):
        for i in range(h):
            result[i].append(' ' * w)
    # Add each digit in turn
    for c in n:
        n = int(c)
        for i in range(h):
            result[i].append(segments[i][n])
    return "\n".join( ['|{}|'.format('|'.join(row)) for row in result])


displays = {
    '0': '012456',
    '1': '25',
    '2': '02346',
    '3': '02356',
    '4': '1235',
    '5': '01356',
    '6': '013456',
    '7': '025',
    '8': '0123456',
    '9': '012356',
    ' ' : ''
}
shape = ' 000 |1   2|1   2|1   2| 333 |4   5|4   5|4   5| 666 '.split('|')

def segment_display(n):
    s = str(n).rjust(6,' ')
    return '\n'.join('|' + ('|'.join(' '+ (''.join(' #'[c in displays[d]] for c in shape[j]) + ' ') for d in s)) + '|' for j in range(9))

def segment_display(num):
    segs = ''' 
 ### |     | ### | ### |     | ### | ### | ### | ### | ### 
#   #|    #|    #|    #|#   #|#    |#    |    #|#   #|#   #
#   #|    #|    #|    #|#   #|#    |#    |    #|#   #|#   #
#   #|    #|    #|    #|#   #|#    |#    |    #|#   #|#   #
     |     | ### | ### | ### | ### | ### |     | ### | ### 
#   #|    #|#    |    #|    #|    #|#   #|    #|#   #|    #
#   #|    #|#    |    #|    #|    #|#   #|    #|#   #|    #
#   #|    #|#    |    #|    #|    #|#   #|    #|#   #|    #
 ### |     | ### | ### |     | ### | ### |     | ### | ### '''
    numbers = {str(i): [] for i in range(10)}
    for s in segs.split('\n')[1:]:
        for i, t in enumerate(s.split('|')):
            numbers[str(i)].append(t)
    numbers[' '] = ['     '] * 9
    return '\n'.join(['| ' + ' | '.join([numbers[ch][y] for ch in f'{num:>6}']) + ' |' for y in range(9)])

s = '''|  ###  |       |  ###  |  ###  |       |  ###  |  ###  |  ###  |  ###  |  ###  |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
|       |       |  ###  |  ###  |  ###  |  ###  |  ###  |       |  ###  |  ###  |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
|  ###  |       |  ###  |  ###  |       |  ###  |  ###  |       |  ###  |  ###  |
'''.splitlines()
segment_display=lambda n:'\n'.join(''.join(i)+'|'for i in [(['|       ']*(6-len(str(n))))+[k[int(l)]for l in str(n)]for k in[[i[j:j+8]for j in range(0,len(i),8)]for i in s]])

def segment_display(num):  
    fline, fl, fr, frl, empty = ['  ###  '],[' #     '],['     # '],[' #   # '],['       ']
    codes = [
            empty*9,
            fline + frl*3 + empty + frl*3 + fline, 
            (empty + fr*3) * 2 + empty,
            fline + fr*3 + fline + fl*3 + fline,
            (fline + fr*3) * 2 + fline,
            empty + frl*3 + fline + fr*3 + empty,
            fline + fl*3 + fline + fr*3 + fline,
            fline + fl*3 + fline + frl*3 + fline,
            fline + (fr*3 + empty) * 3 + empty,
            (fline + frl*3) * 2 + fline,
            fline + frl*3 + fline + fr*3 + fline
        ]

    result = ""
    for line in range(9): # Hight is 9 lines
        result += "|" + "|".join([codes[0 if letter==' ' else int(letter)+1][line] for letter in str(num).rjust(6)]) + "|\n"  
    return result[:-1]

all_num = \
'''|  ###  |       |  ###  |  ###  |       |  ###  |  ###  |  ###  |  ###  |  ###  |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
| #   # |     # |     # |     # | #   # | #     | #     |     # | #   # | #   # |
|       |       |  ###  |  ###  |  ###  |  ###  |  ###  |       |  ###  |  ###  |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
| #   # |     # | #     |     # |     # |     # | #   # |     # | #   # |     # |
|  ###  |       |  ###  |  ###  |       |  ###  |  ###  |       |  ###  |  ###  |'''
def segment_display(num):
    all_num_list = all_num.split('\n')
    fish_list = []
    for val in (all_num_list):
        fish_hold_list = []
        fish_hold = '' + '|       |'*(6-len(str(num)))
        for num2 in str(num):
            num3 = int(num2)
            beg_col = (num3 * 8)
            end_col = beg_col + 9
            fish_hold += val[beg_col:end_col]
            fish_hold_list.append([fish_hold])
        fish_list.append(fish_hold)
    retval_list = []
    for val in (fish_list):
        retval_list.append(val.replace('||','|'))
    return '\n'.join(retval_list)


def segment_display(num):
    temp=str(num).rjust(6, "_")
    numbers=[[' ### ', '     ', ' ### ', ' ### ', '     ', ' ### ', ' ### ', ' ### ', ' ### ', ' ### '], ['#   #', '    #', '    #', '    #', '#   #', '#    ', '#    ', '    #', '#   #', '#   #'], ['#   #', '    #', '    #', '    #', '#   #', '#    ', '#    ', '    #', '#   #', '#   #'], ['#   #', '    #', '    #', '    #', '#   #', '#    ', '#    ', '    #', '#   #', '#   #'], ['     ', '     ', ' ### ', ' ### ', ' ### ', ' ### ', ' ### ', '     ', ' ### ', ' ### '], ['#   #', '    #', '#    ', '    #', '    #', '    #', '#   #', '    #', '#   #', '    #'], ['#   #', '    #', '#    ', '    #', '    #', '    #', '#   #', '    #', '#   #', '    #'], ['#   #', '    #', '#    ', '    #', '    #', '    #', '#   #', '    #', '#   #', '    #'], [' ### ', '     ', ' ### ', ' ### ', '     ', ' ### ', ' ### ', '     ', ' ### ', ' ### ']]
    res=[]
    for i in range(len(numbers)):
        string=[]
        for j, num in enumerate(temp):
            string.append(" "*5) if num=="_" else string.append(numbers[i][int(num)])
        res.append("| "+" | ".join(string)+" |")
    return "\n".join(res)