Aller au contenu

E05 - Gravity⚓︎

Le problème

Gravity

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))