Ordenar por número de llamadas

Published by bangyen in

Crea una función que recibe una lista de funciones y las ordena en orden ascendente según cuántas llamadas necesitan para devolver algo que no sea una función.

Ejemplos

f1 = lambda: "hello"
# f1() ➞ "hello"

f2 = lambda: lambda: "edabit"
# f2()() ➞ "edabit"

f3 = lambda: lambda: lambda: "user"
# f3()()() ➞ "user"

func_sort([f2, f3, f1]) ➞ [f1, f2, f3]
# [f2, f3, f1] ➞ [2, 3, 1] ➞ [1, 2, 3] ➞ [f1, f2, f3]

func_sort([f1, f2, f3]) ➞ [f1, f2, f3]
# [f1, f2, f3] ➞ [1, 2, 3] ➞ [1, 2, 3] ➞ [f1, f2, f3]

func_sort([f2, "func"]) ➞ ["func", f2]
# [f2, "func"] ➞ [2, 0] ➞ [0, 2] ➞ ["func", f2]

Notas

  • Trata los elementos que no sean funciones como si necesitaran cero llamadas.
  • Cada función se llamará sin parámetros.
  • Será necesario llamar a cada función al menos una vez.
  • Entre los posibles valores devueltos se incluyen ints, floats y lists, entre otros.