E05 - Gravity⚓︎
Le problème
Indices⚓︎
Il sera judicieux de fabriquer une fonction qui prend une liste ou une chaine de caractères et qui renvoie une liste ou une chaine avec les .
en tête. Un peu comme :
🐍 Script Python
>>> gravite('a.zer..ty')
'...azerty'
Solution⚓︎
🐍 Script Python
"""
author: Franck CHAMBON
problem: https://prologin.org/train/2013/semifinal/gravity
"""
def gravite(chaine):
"""Renvoie la chaine avec les '.' au début.
>>> gravite('a.zer..ty')
'...azerty'
"""
# on construit une liste sans les '.'
chute = []
for x in chaine:
if x != '.':
chute.append(x)
# variante fonctionnelle des 4 lignes précédentes
chute = [x for x in chaine if x != '.']
# n : la quantité de '.' manquants
n = len(chaine) - len(chute)
# on ajoute au début les '.' manquants
chute = ['.' for _ in range(n)] + chute
# join : pour obtenir une chaine collée
return "".join(chute)
# 1. Test des fonctions
import doctest
doctest.testmod()
# 2. Lecture de l'entrée
nb_lignes, nb_colonnes = map(int, input().split())
grille = [list(input()) for _ in range(nb_lignes)]
# 3. Résolution
grille_sortie = [['.' for _ in range(nb_colonnes)] for _ in range(nb_lignes)]
for j in range(nb_colonnes):
colonne_j = [grille[i][j] for i in range(nb_lignes)]
# la colonne_j va subir la gravité
colonne_j = gravite(colonne_j)
for i in range(nb_lignes):
grille_sortie[i][j] = colonne_j[i]
# 4. Écriture de la sortie
for ligne in grille_sortie:
print("".join(ligne))