Buenas, el ejercicio está bien resuelto. En lo referente al bucle y poner el valor i=-1, no es quizás lo más fácil de interpretar, pero funciona. Lo importante es que comprendas por qué funciona. Comento algo sobre esto:
i=-1
while (i<palabra.length-1){i++
alert("Letra " +[i+1]+": "+palabra.charAt(i))}
}
Este código inicial i con el valor -1. Entra al bucle si el valor de i es menor que la longitud de la palabra menos 1. Si no introduzco nada y pulso el botón ¿entra al bucle? No, porque la longitud de la palabra que he introducido es cero y al restarle uno me sale menos uno. Como menos uno no es menor que menos uno, no entra al bucle y no me muestra nada.
Si introduzco una letra sola, por ejemplo la e y pulso el botón se muestra "Letra 1: e", porque la longitud de la palabra introducido menos uno es cero, y cero es mayor que menos 1. Por eso entra al bucle.
¿Qué ocurre cuando se entra al bucle? Nada más entrar al bucle el valor de i se incrementa en una unidad con la instrucción i++ a la que por cierto veo preferible ponerle el punto y coma, es decir, escribir i++;
Tras esto se muestra por pantalla el mensaje indicando que la letra i+1 es la que se encuentra en palabra.charAt(i)
La función charAt comienzo contando la primera letra como índice cero, y las siguientes son índice 1,2,3 ... hasta palabra.length-1. Es importante saber interpretar el por qué de palabra.length-1 Esto es porque palabra.length nos devuelve el número de caracteres de 1 a n, mientras que charAt cuenta de 0 a n-1. Por ejemplo para gas los índices que usa charAt son 0, 1 y 2 mientras que length nos devuelve 3.
Entonces si no introducimos nada no se entra al bucle. Si introducimos e nada más entrar i pasa a valer 0, se muestra por pantalla y se vuelve a evaluar si i es menor que palabra.length-1. Como i vale ahora 0 y palabra.length-1 también es cero, en ese caso sólo hay una pasada por el bucle.
Si introducimos una palabra de varias letras habrá tantas pasadas como letras.
Y el resumen de todo esto es que el programa funciona. Para mí no es muy intuitivo el uso que haces de los contadores, yo por ejemplo lo veo más claro con este código:
https://aprenderaprogramar.com/foros/index.php?topic=4041.0Pero si entiendes lo que haces, está bien tanto hacerlo de una manera como de otra. Y para resolver los ejercicios lo adecuado es siempre plantearlo primero como tú creas mejor y sobre todo entendiéndolo. Luego, si consultando otras respuestas consideras que puedes mejorar tu código entendiendo lo que haces, también está bien mejorarlo, pero siempre entendiendo el por qué de las cosas.
Salu2