# -*- coding: utf-8 -*- """ Created on Fri Sep 6 14:56:44 2019 @author: tinet1 """ # ----------------------------------------------------------------------------- # CREPIER # ----------------------------------------------------------------------------- def crepier(crepes, psycho = False): """ :param crepes: crepes - listes de longueurs (et sens de la face brûlée si nécessaire) :param psycho: si True, les crêpes ont une face brûlée :return: pile de crêpe triée, nombre d'actions réalisées """ # Position à laquelle on cherche à placer la plus grande crêpe position = 0 # Compteur d'actions compteur = 0 while position < len(crepes): # On recherche la bonne crêpe maxloc = grande_crepe(crepes, position, psycho) # La crêpe est bien positionnée, on passe à l'étape suivante if maxloc == position: # Test de la face brûlée if not psycho or (psycho and crepes[maxloc][1] == True): position += 1 continue # On procède au retournement de la pile à partir de la bonne crêpe (si elle n'est pas déjà en haut) if maxloc != len(crepes)-1: crepes, compteur = spatule(crepes, maxloc, compteur, psycho) # Gestion de la face brûlée (il faut que la face brûlée soit en haut) if psycho and crepes[-1][1]: crepes[-1][1] = False compteur += 1 # On positionne la bonne crêpe crepes, compteur = spatule(crepes, position, compteur, psycho) position += 1 return crepes, compteur def spatule(crepes, position, compteur, psycho = False): """ :param crepes: crepes - listes de longueurs (et sens de la face brûlée si nécessaire) :param position: position de la spatule :param compteur: compteur d'actions :param psycho: si True, les crêpes ont une face brûlée :return: pile de crêpe après retournement, compteur d'actions mis à jour """ pile = crepes[position:] pile.reverse() # Changement du sens de la face brûlée if psycho: pile = [[t, not s] for t, s in pile] return crepes[:position] + pile, compteur + 1 def grande_crepe(crepes, position, psycho = False): """ :param crepes: crepes - listes de longueurs (et sens de la face brûlée si nécessaire) :param position: position à partir de laquelle on cherche un maximum :param psycho: si True, les crêpes ont une face brûlée :return: indice de la plus grande crêpe à partir de la position donnée """ if psycho: longueurs = [crepe[0] for crepe in crepes] return longueurs.index(max(longueurs[position:])) return crepes.index(max(crepes[position:])) # ----------------------------------------------------------------------------- # Programme principal if __name__ == "__main__": # Test crêpier normal crepes = [6,5,8,3,4,7,0,1,2,9] crepes, score = crepier(crepes) print(crepes) print("Le score est de ",score," coups de spatules.") # Test crêpier psychirigide crepes = [[6,True],[5,False],[8,True],[3,True],[4,True],[7,False],[0,False],[1,False],[2,False],[9,True]] crepes, score = crepier(crepes, True) print(crepes) print("Le score est de ",score," coups de spatules.")