En utilisant la solution de marcog, j'ai trouvé un modèle qui commence à n=16 . Pour illustrer cela, voici les frappes n=24jusqu'à n=29, j'ai remplacé ^ A par S (sélection), ^ C par C (copie) et ^ V par P (coller) pour plus de lisibilité:
24: A,A,A,A,S,C,P,P,P,S,C,P,P,P,S,C,P,P,P,S,C,P,P,P
4 * 4 * 4 * 4 * 4 = 1024
25: A,A,A,A,S,C,P,P,P,S,C,P,P,S,C,P,P,S,C,P,P,S,C,P,P
4 * 4 * 3 * 3 * 3 * 3 = 1296
26: A,A,A,A,S,C,P,P,P,S,C,P,P,P,S,C,P,P,S,C,P,P,S,C,P,P
4 * 4 * 4 * 3 * 3 * 3 = 1728
27: A,A,A,A,S,C,P,P,P,S,C,P,P,P,S,C,P,P,P,S,C,P,P,S,C,P,P
4 * 4 * 4 * 4 * 3 * 3 = 2304
28: A,A,A,A,S,C,P,P,P,S,C,P,P,P,S,C,P,P,P,S,C,P,P,P,S,C,P,P
4 * 4 * 4 * 4 * 4 * 3 = 3072
29: A,A,A,A,S,C,P,P,P,S,C,P,P,P,S,C,P,P,P,S,C,P,P,P,S,C,P,P,P
4 * 4 * 4 * 4 * 4 * 4 = 4096
Après un premier 4 As, le modèle idéal est de sélectionner, copier, coller, coller, coller et répéter. Cela multipliera le nombre de As par 4 toutes les 5 frappes. Si ce modèle de 5 touches ne peut pas consommer les touches restantes à lui seul, un certain nombre de 4 modèles de touches (SCPP) consomme les dernières frappes, remplaçant SCPPP (ou supprimant l'une des pâtes) si nécessaire. Les 4 modèles de touches multiplient le total par 3 toutes les 4 frappes.
En utilisant ce modèle, voici du code Python qui obtient les mêmes résultats que la solution de marcog, mais est O (1) edit : C'est en fait O (log n) en raison de l'exponentiation, merci à IVlad pour l'avoir signalé.
def max_chars(n):
if n <= 15:
return (0, 1, 2, 3, 4, 5, 6, 9, 12, 16, 20, 27, 36, 48, 64, 81)[n]
e3 = (4 - n) % 5
e4 = n // 5 - e3
return 4 * (4 ** e4) * (3 ** e3)
Calcul de e3:
Il y a toujours entre 0 et 4 motifs SCPP à la fin de la liste des touches, car n % 5 == 4il y en a 4, n % 5 == 1il y en a 3, n % 5 == 2il y en a 2, n % 5 == 3il y en a 1 et n % 5 == 4il y en a 0. Cela peut être simplifié à (4 - n) % 5.
Calcul de e4:
Le nombre total de motifs augmente de 1 chaque fois n % 5 == 0, car il s'avère que ce nombre augmente à exactement n / 5. En utilisant la division du sol, nous pouvons obtenir le nombre total de motifs, le nombre total pour e4est le nombre total de motifs moins e3. Pour ceux qui ne connaissent pas Python, //est la notation à l'épreuve du temps pour la division par étage.
^Afaut généralement "sélectionner tout",^C"copier",^V"coller". Cela vous donne-t-il une idée?