Create TOC

2013년 8월 30일

Python/LCD Display

원문

한 친구가 방금 새 컴퓨터를 샀다. 그 친구가 지금까지 샀던 가장 강력한 컴퓨터는 공학용 전자 계산기였다. 그런데 그 친구는 새 컴퓨터의 모니터보다 공학용 계산기에 있는 LCD 디스플레이가 더 좋다며 크게 실망하고 말았다. 그 친구를 만족시킬 수 있도록 숫자를 LCD 디스플레이 방식으로 출력하는 프로그램을 만들어보자.

입력

입력 파일은 여러 줄로 구성되며 표시될 각각의 숫자마다 한 줄씩 입력된다. 각 줄에는 s와 n이라는 두개의 정수가 들어있으며 n은 출력될 숫자( 0<= n <= 99,999,999 ), s는 숫자를 표시하는 크기( 1<= s < 10 )를 의미한다. 0 이 두 개 입력된 줄이 있으면 입력이 종료되며 그 줄은 처리되지 않는다.

출력

입력 파일에서 지정한 숫자를 수평 방향은 '-' 기호를, 수직 방향은 '|'를 이용해서 LCD 디스플레이 형태로 출력한다. 각 숫자는 정확하게 s+2개의 열, 2s+3개의 행으로 구성된다. 마지막 숫자를 포함한 모든 숫자를 이루는 공백을 스페이스로 채워야 한다. 두 개의 숫자 사이에는 정확하게 한 열의 공백이 있어야 한다.

풀이

#!/usr/bin/python
# -*- coding: utf-8 -*-

q = {
    '1': {
        0: lambda c: [c, 0, 0],
        1: lambda c: [0, (c - 1), 1],
        2: lambda c: [c, 0, 0],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [c, 0, 0],
    },
    '2': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [0, (c - 1), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [1, (c - 1), 0],
        4: lambda c: [1, (c - 2), 1],
    },
    '3': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [0, (c - 1), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '4': {
        0: lambda c: [c, 0, 0],
        1: lambda c: [1, (c - 2), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [c, 0, 0],
    },
    '5': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 1), 0],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '6': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 1), 0],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [1, (c - 2), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '7': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [0, (c - 1), 1],
        2: lambda c: [c, 0, 0],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [c, 0, 0],
    },
    '8': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 2), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [1, (c - 2), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '9': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 2), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '0': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 2), 1],
        2: lambda c: [c, 0, 0],
        3: lambda c: [1, (c - 2), 1],
        4: lambda c: [1, (c - 2), 1],
    },
}

def print_x(s, nums):
    if s <= 0:
        return
    c = s + 2
    r = s * 2 + 3

    print ''.join([' ' * q[n][0](c)[0] + '-' * q[n][0](c)[1] + ' ' * q[n][0](c)[2] + ' ' for n in nums])
    print '\n'.join([''.join(['|' * q[n][1](c)[0] + ' ' * q[n][1](c)[1] + '|' * q[n][1](c)[2] + ' ' for n in nums]) for i in xrange(0, r / 2 - 1)])
    print ''.join([' ' * q[n][2](c)[0] + '-' * q[n][2](c)[1] + ' ' * q[n][2](c)[2] + ' ' for n in nums])
    print '\n'.join([''.join(['|' * q[n][3](c)[0] + ' ' * q[n][3](c)[1] + '|' * q[n][3](c)[2] + ' ' for n in nums]) for i in xrange(0, r / 2 - 1)])
    print ''.join([' ' * q[n][4](c)[0] + '-' * q[n][4](c)[1] + ' ' * q[n][4](c)[2] + ' ' for n in nums])

print_x(2, '1234567890')
print ''
print_x(4, '1234567890')

실행 결과는 아래와 같다.

      --   --        --   --   --   --   --   --
   |    |    | |  | |    |       | |  | |  | |  |
   |    |    | |  | |    |       | |  | |  | |  |
      --   --   --   --   --        --   --
   | |       |    |    | |  |    | |  |    | |  |
   | |       |    |    | |  |    | |  |    | |  |
      --   --        --   --        --   --   --

        ----   ----          ----   ----   ----   ----   ----   ----
     |      |      | |    | |      |           | |    | |    | |    |
     |      |      | |    | |      |           | |    | |    | |    |
     |      |      | |    | |      |           | |    | |    | |    |
     |      |      | |    | |      |           | |    | |    | |    |
        ----   ----   ----   ----   ----          ----   ----
     | |           |      |      | |    |      | |    |      | |    |
     | |           |      |      | |    |      | |    |      | |    |
     | |           |      |      | |    |      | |    |      | |    |
     | |           |      |      | |    |      | |    |      | |    |
        ----   ----          ----   ----          ----   ----   ----