Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

52 votos

¿Cuántos pasos se necesitan para convertir una "a" en al menos 100,000 "a"s usando solo las tres funciones de "seleccionar todo", "copiar" y "pegar"?

Supongamos que al principio hay un documento en blanco y se escribe una letra "a" en él. En los siguientes pasos, solo se pueden utilizar las tres funciones de "seleccionar todo", "copiar" y "pegar".

Encuentra el número mínimo de pasos para alcanzar al menos 100,000 a's (cada una de las tres operaciones de "seleccionar todo", "copiar" y "pegar" se cuenta como un paso). Si el número de destino no está especificado, y quiero obtener la cantidad exacta de "a"s, ¿existe una fórmula general?

Esta es una pregunta fascinante. Mi amigo y yo la discutimos durante mucho tiempo ese día, pero no logramos resolverla.

Lo que comencé a pensar fue: Si los pasos de "seleccionar todo", "copiar" y "pegar" se cuentan aproximadamente como un paso. Cada paso hace que el número ×2, por lo que es una progresión geométrica con una razón común de 2.

Sea an100000(nN), donde a1=1.

De acuerdo con la fórmula general de progresión geométrica: an=a1×qn1

Podemos obtener: n=17

Entonces, si las tres operaciones de "seleccionar todo", "copiar" y "pegar" se cuentan cada una como un paso, hay un total de 17×3=51 pasos

Pero esto ignora un problema: ¿podemos pegar todo el tiempo?

Entonces, esto parece ser un problema de optimización interesante, y necesitamos encontrar una estrategia para minimizar el número de pasos de una "a" a cien mil "a"s.

  1. Seleccionar todo + copiar + pegar: Estas tres operaciones duplican el número de "a"s. Si actualmente hay n "a"s, entonces habrá 2n "a"s después de la operación.

  2. Pegar: Esta operación agregará el número de "a"s igual al contenido del portapapeles. Si hay k "a"s en el portapapeles, entonces habrá (n+k) "a"s después de la operación.

Definimos una función f(n) que representa el número mínimo de pasos requeridos para alcanzar n "a"s. Inicialmente, tenemos una "a", así que f(1)=0.

Si elegimos la operación de duplicar, f(2n)=f(n)+3.

Si elegimos la operación de pegar, entonces f(n+k)=f(n)+1, donde k es el número de "a"s en el portapapeles.

Entonces comencé a confundirme porque me di cuenta de que parecía que cada paso enfrentaba una optimización, y parecía ser complicado. Empecé a usar la comparación de funciones para obtener n=14 como el valor mínimo, pero me di cuenta de que solo se optimizaba una vez.

40voto

ajotatxe Puntos 26274

S=seleccionar
C=copiar
P=pegar

SS, SP, CS, PC o CC no tienen sentido, por supuesto. Así que después de una S debe haber una C, después de una C debe haber una P, y después de una P debe haber otra P o una S.

SCkP es SC y k pega, por ejemplo SCPPPP=SC4P.

SCkP es k+2 pasos y multiplica el número de caracteres por k+1.

Entonces, después de a1 SC1P, a2 SC2P, etc, el número de caracteres es k=1(k+1)ak y el número de pasos es k=1(k+2)ak

Tenga en cuenta que solo un número finito de ak son positivos.

A grandes rasgos, SCkP multiplica el número de caracteres por k+2k+1 en cada paso. El máximo de k+2k+1 para k entero es en k=3, pero k=2 está muy cerca de él. (Para k real no es e, por si acaso estás adivinando). Por lo tanto, es mejor elegir SC2P o SC3P siempre que sea posible.

Con un poco de prueba y error, he encontrado que 3346=110592>105 lo que arroja 34+65=42 pasos.

Por otro lado, para obtener exactamente 100,000 caracteres, dado que 105=24255, el número de pasos es 31+52+65=43

No sé si es posible lograr 41 o menos pasos, pero no creo que sea así.

EDIT
Para mostrar un ejemplo a @badjohn, si quieres obtener exactamente 100,001 caracteres, deberías factorizar 100001=119091, por lo que la mejor manera de obtenerlo es 1SC10P y 1SC9090P, es decir, 12+9092=9104 pasos.

Para 99,999 es 99999=3241271. Dado que 32 es relativamente pequeño, intentamos

  • 2SP2C+1SP40C+1SP270C=8+42+272=302 pasos.
  • 1SP8C+1SP40C+1SP270C=10+42+272=304 pasos.

EDIT2

La fórmula de los pasos mínimos para obtener exactamente n caracteres es la siguiente:

Factoriza n de esta manera: n=2α24α4p primo imparpαp, donde a2 debe ser 0 o 1 y ak0 para k3.

Entonces, el número mínimo de pasos es p=4 o p es primoαp(p+1)


Algunas notas:

1. Encontrar el máximo de k+2k+1 con cálculo involucra una ecuación no elemental que resolví con software. Afortunadamente, no es esencial, es solo una pista.

2. Los puntos esenciales de mi razonamiento es que el número mínimo de pasos S(n) para obtener exactamente n caracteres, depende únicamente de cierta factorización de n, que implica 4, números primos impares y 2 solo si es necesario.

El número de pasos para alguna factorización (no necesariamente con factores primos) nnαn es n(n+1)αn

Para obtener la mejor factorización podemos comenzar desde la factorización prima y luego ver si 'combinando' algunos factores, podemos obtener una mejor.

Combinando un factor pα con un factor qα, (p,q2, por supuesto) ,obtenemos el factor (pq)α. El número de pasos para esos factores va desde α(p+q+2) hasta α(pq+1) así que la pregunta es si p+q+2 es mayor o menor que pq+1. Combinar obtiene un menor número de pasos si p+q+2>pq+1.

Así que asumamos por ejemplo que p+q+2>pq+1. Las siguientes desigualdades son equivalentes a esta: p+q+1>pq p(q1)Dadoque$q1>0$,p<\frac{q+1}{q-1}=1+\frac2{q-1}$$ Esto es verdad solo para p=q=2, así que 'combinar' obtiene mejores resultados solo al hacer un 4 a partir de dos 2's.

Es decir, SC3P es mejor que 2SCP. Pero repetir P en lugar de hacer un nuevo SC es peor en cualquier otra situación. O igual para SCPPSCP y SC5P. (Es decir, para multiplicar el número de caracteres por 6 debes realizar 7 pasos, sin importar qué).

3. El problema es mucho, mucho más difícil si deseas obtener al menos n caracteres, porque implica la factorización de cada número n.

33voto

Andrea Marino Puntos 71

Profundizando en la respuesta de @ajotatxe, podemos mostrar en realidad cuál es el número mínimo de pasos necesarios.

Como él mencionó, los únicos movimientos sensatos son Mk:=SCkP, es decir "seleccionar todo, copiar y luego pegar k veces" donde k1.

Cada vez que aplicamos Mp, multiplicamos el número por (p+1) y usamos (p+2) pasos. Llamemos C(Mp)=p+2 el costo del movimiento y U(Mp)=p+1 la utilidad del movimiento. Para una secuencia de movimientos ˉM=(Mp1,,Mpk), las funciones de costo y utilidad son respectivamente C(ˉM)=kj=1(pj+2),   U(ˉM)=kj=1(pj+1) Digamos que una secuencia de movimientos ˉM es peor que otra secuencia ˉN, denotada como ˉMˉN, si C(ˉM)C(ˉN) y U(ˉM)U(ˉN). En la práctica, casi siempre compararemos secuencias con el mismo costo. Una secuencia de movimientos ˉM se llama óptima si es máxima con respecto a . Por otro lado, notemos que es solo un preorden, es decir que podemos tener secuencias diferentes con igual utilidad y costo.

Afirmo que los únicos movimientos sensatos son M1,M2,M3,M4. Mostraré este hecho con el siguiente Lema. Si una secuencia de movimientos ˉM contiene Mk con k5, entonces existe ˉMˉN con ˉN no conteniendo Mk para k5.

Prueba. Dado que la composición de movimientos es multiplicativa en la utilidad y aditiva en el costo, es suficiente mostrar que Mk para k5 es peor que una secuencia de movimientos hechos únicamente de M1,M2,M3,M4. Para k=5 tenemos M5(M2,M1), mientras que para k6 afirmo que Mk(Mk5,M3). De hecho, k+14k16 siempre que k17/35.67.

La segunda observación es que M3 tiene la mejor utilidad-por-costo; esto se puede ver al comparar el factor k+2k+1 para k=1,2,3,4: α1=321.26,   α2=431.316,   α3=541.319,   α4=651.308 Como resultado, tenemos lo siguiente:

Lema. Una secuencia óptima contiene M1 y M4 a lo sumo una vez y M2 a lo sumo cuatro veces. Además, M2 y M4 no pueden aparecer juntos. En particular, todos menos 5 movimientos en una secuencia óptima son movimientos de M3.

Prueba. Supongamos por contradicción que M2 aparece cinco veces en una secuencia óptima. Notemos que C(M2,M2,M2,M2,M2)=20=C(M3,M3,M3,M3) La utilidad de M2 cinco veces es U(M2)5=α202, mientras que la utilidad de M3 repetido 4 veces es α203, concluyendo el argumento.

Para demostrar que M4 y M1 pueden aparecer a lo sumo una vez, notemos que (M4,M4)(M2,M2,M2) y (M1,M1)M4. La última afirmación sigue de (M2,M4)(M3,M3).

Por último, notemos que (M1,M2,M2)(M4,M3) permite solamente un M2 cuando M1 aparece. Como resultado, los únicos movimientos óptimos no de M3 posibles son los siguientes 7 movimientos: M1,   M1M2,   M2,   M2M2,   M2M2M2,   M2M2M2M2,   M4 Es posible mostrar, con la ayuda de un programa simple, que estas son en realidad secuencias óptimas de movimientos.

Estamos listos para mostrar el teorema final:

Teorema. El número mínimo de pasos S(n) para copiar y pegar un texto n veces con movimientos de seleccionar todo, copiar y pegar está dado por S(n)=min donde (c_i, u_i) varía en el conjunto I = \{ (0,1), (3,2), (7,6), (4,3), (8,9), (12,27), (16,81), (6,5) \}

Prueba. La prueba es una consecuencia directa del argumento anterior. El conjunto I es el conjunto de coordenadas de costo-utilidad para las 7 secuencias de movimientos anteriores, más un octavo elemento que representa el movimiento vacío (correspondiente a solo usar M_3). Si usamos una secuencia inicial con costo-utilidad (c,u) y luego aplicamos k veces M_3, obtenemos un costo-utilidad total de (c+5k, u \cdot 4^k). Imponiendo u \cdot 4^k \ge n obtenemos k \ge \log_4(n/u), por lo que la solución entera más pequeña es k_* = \lceil \log_4(n/u) \rceil. Sustituyendo en el costo obtenemos la fórmula reclamada.

Como aplicación, para n= 100,000 obtenemos el mejor valor con el movimiento inicial M_2 M_2 M_2, y el número asociado de pasos es... 42, la Respuesta a la Pregunta Última sobre la Vida, el Universo y Todo!! Mis felicitaciones a @ajotatxe por haber adivinado la respuesta con prueba y error.

Para el OP: a posteriori, no es sorprendente que tu y tu amigo hayan tenido dificultades para encontrar la respuesta correcta. ¡Gracias por el problema muy interesante!

16voto

Jimmy Yang Puntos 101

Las otras respuestas son buenas pero pensé en comentar sobre cómo verificar computacionalmente la respuesta: Se puede utilizar búsqueda en anchura (breadth-first search) en un grafo donde cada nodo representa un estado del documento. Las operaciones SELECT, COPY y PASTE nos permiten movernos de un nodo a otro en este grafo. El programa en C++ a continuación implementa este algoritmo.

#include <iostream>
#include <queue>

enum Mode
{
    SELECT,
    COPY,
    PASTE
};

struct Node
{
    int noOfAs;
    int steps;
    int noOfAsCopied;
    Mode mode;
};

int main()
{
    std::queue<Node> q;

    q.push({1, 0, 0, SELECT});

    while (!q.empty())
    {
        Node n = q.front();
        q.pop();

        if (n.noOfAs >= 100000)
        {
            std::cout << n.steps << std::endl;
            break;
        }

        switch (n.mode)
        {
        case SELECT:
            q.push({n.noOfAs, n.steps + 1, n.noOfAsCopied, COPY});
            break;
        case COPY:
            q.push({n.noOfAs, n.steps + 1, n.noOfAs, PASTE});
            break;
        case PASTE:
            q.push({n.noOfAs, n.steps, n.noOfAsCopied, SELECT});
            q.push({n.noOfAs + n.noOfAsCopied, n.steps + 1, n.noOfAsCopied, PASTE});
            break;
        }
    }

    return 0;
}

Al ejecutar este programa se mostrará la salida 42, que es el número mínimo de operaciones para que el documento se llene con al menos 100000 a's.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X