#! /usr/bin/python3

print("""
  Générateur des suites de Kaprekar -- Jean-Christophe Beumier -- GPL3

  Pour un nombre de trois chiffres, la différence entre le nombre
  constitué de ses trois chiffres en ordre descendant et le nombre
  constitué de ses chiffres ascendant finit (itération) par donner 495

  Exemple: 381 -> 831 -138 = 693 -> 963 -369 = 594 -> 954 -459
   = 495 -> 954 -459 =495 (ce dernier nombre cycle sur lui-même)

  Des cas triviaux donnent 0 : 100 -> 100 -1 = 99 -> 99 -99 =0

  À quatre chiffres, le nombre final est 6174 (ou 0)
  Pour plus de chiffres, des cyclages sur plusieurs nombres apparaissent
""")

q =int(input("nombre de chiffres (de 2 à 5 est recommandé): "))

texte =[] ; mx =0
for i in range(10 **(q -1), 10 **q) : # détermination de la plage des nombres
  n =i ; suite =[]
  while -1 :
    ch =str(n)
    n1 =int("".join(sorted(ch)))                # mises en ordre
    n2 =int("".join(sorted(ch, reverse=True)))  # des chiffres
    n =n2 -n1 ; nn =str(n)
    # si un nombre est déjà présent dans la suite
    if nn in suite :
      fin =suite.index(nn) ; lon =len(suite)
      suite[fin] =f">{suite[fin]}"              # marquage du début de cycle
      ligne =f"{i} ({lon}) {' '.join(suite)}<"
      mx =max(lon, mx)
      break

    suite +=[nn]

  print(ligne)
  texte +=[ligne]

print("itération maximale:", mx)
open(f"kaprekar{q}ch.txt", "w").write("\n".join(texte))

