# PASOS NECESARIOS PARA COLOCAR CADA ELEMENTO DE A EN SU SITIO EN B total = pasosA + pasosB (esta suma es solo una idea, se ha de sumar de una forma peculiar)
def necesariosA(a, b): # array pasosA calcula los pasos necesarios para colocar cada elemento de A como el primero de su pila
for v in a:
if a.index(v) < len(a)/2:
pasosA.append(a.index(v))
else:
pasosA.append(-(len(a) - a.index(v)))
def necesariosB(a,b):
for i in range(len(a)):
maxinfB = min(b) # maximo de los inferiores en B al valor iésimo de A, se inicializa en -infinito(-2147483648) o si da problemas se inicializa en el min(b)
for j in range(len(b)):
if b[j] < a[i] and b[j] > maxinfB:
maxinfB = b[j]
# el maxinfB se ha de situar el primero de la pila B
if b.index(maxinfB) < len(b)/2:
pasosB.append(b.index(maxinfB))
else:
pasosB.append(-(len(b)- b.index(maxinfB)))
def totaliza(a,b): # totalizar pasos
global total
for i in range(len(pasosA)):
if pasosA[i] * pasosB[i] < 0: # si son de distinto signo, uno positivo y otro negativo
total.append(abs(pasosA[i]) + abs(pasosB[i])) # no hay sinergia
else: # si son de igual signo o alguno cero
total.append(max(abs(pasosA[i]), abs(pasosB[i]))) # si son de igual signo hay sinergia
def calculaIndexPasosMinimos():
global pasosA
global pasosB
global total
pasosA = [] # [0,1,2, ...,41,-41,... , -2,-1] vector donde cada index está asociado con el valor del mismo index en A
pasosB = [] # [-3,2,-5, ..., -5,0] estos dos arrays se han de recalcular cada vez que realmente se mueva algún elemento de A a B
total = []
necesariosA(a, b); print("pasosA: ", pasosA)
necesariosB(a, b); print("pasosB: ", pasosB)
totaliza(a,b); print("total: ", total)
return total.index(min(total)) # retorna el índice del elemento de la pila A que menos pasos totales necesita
a = [3, 23, 24, 10, 15, 32, 30, 29, 6, 26, 25, 20, 27, 12, 17, 19, 21, 18, 28, 31, 9, 2]
b = [13,11,8,7,5,4,1,22,16,14]
if __name__ == "__main__":
index_minimosPasos = calculaIndexPasosMinimos()
pasosA: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1] pasosB: [-4, -3, -3, 2, -1, -3, -3, -3, 4, -3, -3, -2, -3, 1, -2, -2, -2, -2, -3, -3, 2, -4] total: [4, 4, 5, 3, 5, 8, 9, 10, 8, 12, 13, 11, 10, 10, 8, 7, 6, 5, 4, 3, 4, 4]