La Battle Dev est un concours gratuit, ouvert à tous, où vous affronterez, seul ou en équipe, d'autres développeurs. Il y a plus d'une centaine d'entreprises qui parrainent cet événement. Pour une première participation, je m'en suis sorti 313ème sur 2 030. Je suis resté bloqué sur le problème n°4.

J'avais choisi la catégorie Python 3 et le second problème demandait à ce que l'on imprime un losange suivant le nombre donné en entrée, toujours impaire.

Exemple avec le nombre 5 :

..*..
.***.
*****
.***.
..*..

Ma première solution, crade mais fonctionnelle :

import sys

n = int(next(sys.stdin))

for i in range(1, n + 1, 2):
    print('{0:.^{1}}'.format('*' * i, n))

for i in range(n - 2, 0, -2):
    print('{0:.^{1}}'.format('*' * i, n))

Maintenant que j'ai du temps, j'aurai pu le faire comme ça :

number = int(input())
lines = [''] * number
fmt = '{0:.^{1}}'

for idx, length in enumerate(range(1, number + 1, 2)):
    lines[idx] = lines[-idx - 1] = fmt.format('*' * length, number)

print('\n'.join(lines))

Et ça donne :

% echo 29 | python3 a2.py
..............*..............
.............***.............
............*****............
...........*******...........
..........*********..........
.........***********.........
........*************........
.......***************.......
......*****************......
.....*******************.....
....*********************....
...***********************...
..*************************..
.***************************.
*****************************
.***************************.
..*************************..
...***********************...
....*********************....
.....*******************.....
......*****************......
.......***************.......
........*************........
.........***********.........
..........*********..........
...........*******...........
............*****............
.............***.............
..............*..............

Challenge

Comment auriez-vous fait ? Des astuces, modules ou une autre façon de résoudre ce problème ?