def ordenado_circular_decreciente(arr): # da True si todos los elementos de la pila están ordenados de forma decreciente circular
maximo, minimo = max(arr), min(arr)
flags = [False]*(len(arr)-1)
for i in range(len(arr)-1):
if arr[i]==minimo and arr[i+1]==maximo:
flags[i]= True
elif arr[i] > arr[i+1]:
flags[i] = True
return all(flags)
def ordenado_circular_creciente(arr): # da True si todos los elementos de la pila están ordenados de forma creciente circular
maximo, minimo = max(arr), min(arr)
flags = [False]*(len(arr)-1)
for i in range(len(arr)-1):
if arr[i]==maximo and arr[i+1]==minimo:
flags[i]= True
elif arr[i] < arr[i+1]:
flags[i] = True
return all(flags) and arr[0] > arr[-1]
#a = [6,7,8,9,1,2,3,5] # True
a = [21, 22, 24, 26, 28, 29, 33, 3, 7, 13, 18, 19]
ordenado_circular_creciente(a)
True
Esta función proporciona el tramo más largo de números crecientes.
En caso de empate se muestra el último tramo.
Si se quiere el primer tramo cambiar en dos sitios el <= por un <.
def crecientes(arr):
l = [] # lista creciente actual de trabajo
result = [] # lista creciente más larga, al final es el resultado que se retorna
previo = None
for actual in arr:
if previo is None or actual > previo: # al seguir ascendiendo
l.append(actual) # agregar a la lista actual
else: # si ya no asciende
if len(l) >= len(result): # si la lista actual l es más larga que la que hasta ese momento existía en result
result = l[:] # la lista antigua result desaparece y es sustituida por la la lista actual l
l = [actual]
previo = actual
if l and len(l)>=len(result): # ver el última tramo, si hay algo allí. El = hace que en caso de empate se tome el tramo más a la derecha
result = l[:]
return result
a = [46,31,30,32,37,23,38,27,8,25,48,15,44,20,45,9,14,16,39,41,43,47,2,5,10,1,17,4,11,40,12,21,22,24,26,28,29,33,3,7,13,18,19,6,34,35,42,36]
print(crecientes(a))
[12, 21, 22, 24, 26, 28, 29, 33]
Esta función proporciona el tramo más largo de números crecientes circulares.
def ordenado_circular_creciente(arr): # da True si todos los elementos de la pila están ordenados de forma creciente circular
maximo, minimo = max(arr), min(arr)
flags = [False]*(len(arr)-1)
for i in range(len(arr)-1):
if arr[i]==maximo and arr[i+1]==minimo:
flags[i]= True
elif arr[i] < arr[i+1]:
flags[i] = True
return all(flags) and arr[0] > arr[-1]
def tramo_creciente_circular(arr):
n = len(arr)
optimo = [] # tramo más amplio
for i in range(n-1):
for j in range(i+1,n):
if ordenado_circular_creciente(arr[i:j]) and len(arr[i:j]) > len(optimo):
optimo = arr[i:j]
return optimo
a = [46,31,30,32,37,23,38,27,8,25,48,15,44,20,45,9,14,16,39,41,43,47,2,5,10,1,17,4,11,40,12,21,22,24,26,28,29,33,3,7,13,18,19,6,34,35,42,36]
print(tramo_creciente_circular(a))
[21, 22, 24, 26, 28, 29, 33, 3, 7, 13, 18, 19]