Alguien me preguntó ¿cómo puede pegar una cadena de 1000 veces en el bloc de notas de Windows. Mientras que esto se puede hacer fácilmente usando editores como Vi, estoy tratando de responder a su pregunta con el bloc de notas solamente. Así que el problema va como este, tenemos 2 opciones:
- Podemos pegar el contenido del portapapeles en 1 pulsación de tecla (C-v).
- Podemos duplicar el texto usando 4 pulsaciones de teclas (C-a C-c [abajo] C-v). Esto duplica el texto en el portapapeles.
¿Cómo podemos optimizar el número de pulsaciones necesarias?
Escribí un pequeño programa para calcular el número de pulsaciones necesarias que utiliza una heurística simple:
Si (valor en la pantalla de la pulsación de tecla k - 4) > (el valor de pantalla para las pulsaciones de teclas k - 1) + portapapeles de valor, a continuación, doble la pantalla de valor de uso C-a C-c down C-p
más seguir pegando con C-v
#include <stdio.h>
#define TIMES_TO_PRINTED 1000
int main() {
int clip[100], screen[100], keystroke;
int i;
for (i = 0; i < 100; i++) {
clip[i] = 0;
screen[i] = 0;
}
keystroke = 0;
screen[1] = 1;
clip[1] = 1;
while (screen[keystroke] < TIMES_TO_PRINTED && keystroke < 100) {
keystroke++;
if (keystroke > 4) {
if ((screen[keystroke - 4] * 2) >
(screen[keystroke - 1] + clip[keystroke])) {
screen[keystroke] = screen[keystroke - 4] * 2;
clip[keystroke + 1] = screen[keystroke - 4];
} else {
screen[keystroke] = screen[keystroke - 1] + clip[keystroke];
clip[keystroke + 1] = clip[keystroke];
}
} else {
screen[keystroke] = screen[keystroke - 1] + clip[keystroke];
clip[keystroke + 1] = clip[keystroke];
}
printf("%d - %d - %d\n", clip[keystroke], keystroke, screen[keystroke]);
}
printf("%d %d", screen[keystroke], keystroke);
return 0;
}
que las salidas:
Clipboard - keystroke - screen value
1 - 1 - 1
1 - 2 - 2
1 - 3 - 3
1 - 4 - 4
1 - 5 - 5
1 - 6 - 6
1 - 7 - 7
1 - 8 - 8
1 - 9 - 10
5 - 10 - 15
5 - 11 - 20
5 - 12 - 25
5 - 13 - 30
5 - 14 - 35
5 - 15 - 40
5 - 16 - 50
25 - 17 - 75
25 - 18 - 100
25 - 19 - 125
25 - 20 - 150
25 - 21 - 175
25 - 22 - 200
25 - 23 - 250
125 - 24 - 375
125 - 25 - 500
125 - 26 - 625
125 - 27 - 750
125 - 28 - 875
125 - 29 - 1000
Por lo tanto el uso de este heurístico podemos llegar a los 1000 utilizando el 29 de pulsaciones de teclas. No estoy seguro de si esta es la solución óptima, también es hay alguna otra manera de solucionarlo, en lugar de la enumeración de todas las posibilidades?