# -*- coding:utf-8 -*- __projet__ = "1 - Introduction" __nom_fichier__ = "crepier_cfv" __author__ = "Christine Fay-Varnier" __date__ = "novembre 2019" """ solution pour ranger le crêpier en triant dans la même liste sans tenir compte de la face brûlée """ # def spatule(crepes, position): # """ # VERSION avec modification de la liste initiale # @param crepes: liste des crêpes ex : [7, 6, 3, 1, 2, 4, 5] # @param position: position à partir duquel on veut inverser la liste # @return: la liste est modifiée est pour position = 2 [7, 6, 5, 4, 2, 1, 3] # """ # # besoin de traiter le cas particulier lorsqu'on trie toute la liste # if position==0: # crepes.reverse() # # crepes[position], crepes[-1] = crepes[-1], crepes[position] # else: # crepes[position:] = crepes[:position - 1:-1] def spatule(crepes, position): """ VERSION avec création d'une nouvelle liste @param crepes: liste des crêpes ex : [7, 6, 3, 1, 2, 4, 5] @param position: position à partir duquel on veut inverser la liste @return: la liste est modifiée est pour position = 2 [7, 6, 5, 4, 2, 1, 3] """ # on récupère le haut de la pile au-dessus de la crêpe la plus grande non encore rangée pile = crepes[position:] # on retourne pour avoir la crêpe la plus grande au-dessus avec la règle de la spatule pile.reverse() return crepes[:position] + pile def trier_crepier(crepes): """ @param crepes: liste des crêpes dans un ordre quelconque. pour une crêpe on dispose de sa taille @return: liste des crêpes triées dans l'ordre décroissant sachant qu'on ne peut retourner qu'une crêpe et celle qui sont dessus en même temps """ for position in range(len(crepes) - 1): # à cette étape, les crêpes entre l'indice 0 et position sont bien placées # on place la crêpe la plus grande du tas non encore triée, la dernière sera automatiquement bien placée valmax = max(crepes[position:]) rgmax = crepes.index(valmax) if rgmax != position: # la crêpe est mal placée, elle n'est pas à la position où elle devrait être if rgmax != len(crepes) - 1: # la crêpe la plus grande n'est pas en haut de la pile # on inverse le haut de la pile crepes = spatule(crepes, rgmax) # la crêpe la plus grande est maintenant en haut de la pile # on inverse toutes les crêpes non classées en-dessous crepes = spatule(crepes, position) # on inverse la pile à partir du rang position return crepes if __name__ == '__main__': lescrepes = [6, 5, 8, 3, 4, 7, 0, 9, 2, 1] print(lescrepes) lescrepes_classees = trier_crepier(lescrepes) print(lescrepes_classees)