Неоптимальний код і AceLewis-калькулятор

Надрукувати

Розбираємо задачу з 8545 з e-olimp під назвою «Таблиця множення».

https://www.e-olymp.com/uk/problems/8545

Проста задача, в принципі. Знову таки, з дивно високим коефіцієнтом складності, 21%.  Треба побудувати квадратну матрицю, як на обкладинках зошитів з математики. Вхідні дані - розмірність матриці, від 1 до 9 включно. Результат відповідним чином відформатувати:

n = 5

 1  2  3  4  5

 2  4  6  8 10

 3  6  9 12 15

 4  8 12 16 20

 5 10 15 20 25

 

n = 7

 1  2  3  4  5  6  7

 2  4  6  8 10 12 14

 3  6  9 12 15 18 21

 4  8 12 16 20 24 28

 5 10 15 20 25 30 35

 6 12 18 24 30 36 42

 7 14 21 28 35 42 49

 

Запропонував Саша цю задачу. З приміткою «неробіт». Проходить 70% тестів. E-olimp, на відміну від codeforces, тести не відкриває, шукаємо помилку аналітично.

Показав Саша код:

 

a = int(input())

if a == 1:

    print( '1')

elif a == 2:

    print(' 1  2\n 2  4')

elif a == 3:

    print(' 1  2  3 \n 2  4  6 \n 3  6  9')

elif a == 4:

    print(' 1  2  3  4 \n 2  4  6  8 \n 3  6  9 12 \n 4  8 12 16')

elif a == 5:

    print(' 1  2  3  4  5 \n 2  4  6  8 10 \n 3  6  9 12 15 \n 4  8 12 16 20 \n 5 10 15 20 25')

elif a == 6:

    print(' 1  2  3  4  5  6 \n 2  4  6  8 10 12 \n 3  6  9 12 15 18 \n 4  8 12 16 20 24 \n 5 10 15 20 25 30 \n 6 12 18 24 30 36')

elif a == 7:

    print(' 1  2  3  4  5  6  7 \n 2  4  6  8 10 12 14 \n 3  6  9 12 15 18 21 \n 4  8 12 16 20 24 28 \n 5 10 15 20 25 30 35 \n 6 12 18 24 30 36 42 \n 7 14 21 28 35 42 49')

elif a == 8:

    print(' 1  2  3  4  5  6  7  8 \n 2  4  6  8 10 12 14 16 \n 3  6  9 12 15 18 21 24 \n 4  8 12 16 20 24 28 32 \n 5 10 15 20 25 30 35 40 \n 6 12 18 24 30 36 42 48 \n 7 14 21 28 35 42 49 56 \n 8 16 24 32 40 48 56 64')

else:

    print(' 1  2  3  4  5  6  7  8  9 \n 2  4  6  8 10 12 14 16 18 \n 3  6  9 12 15 18 21 24 27 \n 4  8 12 16 20 24 28 32 36 \n 5 10 15 20 25 30 35 40 45 \n 6 12 18 24 30 36 42 48 54 \n 7 14 21 28 35 42 49 56 63 \n 8 16 24 32 40 48 56 64 72 \n 9 18 27 36 45 54 63 72 81 ')

 

 

Звичайно, Саша дізнався про себе багато цікавого після оприлюднення такого щастя :)

 

Колегі-програмісти нагадали, що так робити не під час олімпіади – гріх.  Навіть запропонували з таким підходом приєднатися до написання прекрасного AceLewis-калькулятора. До речі, хто не в курсі, що це таке, дуже раджу ознайомитися, скоріше за все ви, як це побачите, то не забудете ніколи.

 

Чудовий в своєму різноманітті інструментарію Python дозволяє чудово форматувати текст при виводі. Нам треба вирівняти текст вправо в межах двох символів? Не проблема. Як просто і елегантно, правда?

 

n = int(input())

for x in range(1, n+1):

    for y in range(1, n+1):

        print(str(x*y).rjust(2), end = ' ')

    print()