Ejercicio (como) para volverse loco
Resolviendo una pregunta en otro lado llegue después de un par de iteraciones a una solución bastante extraña para resolver el siguiente problema:
"Crear un método que reemplace todas las letras
encontradas en
con una
y que la
aparezca incrementada en cada ocurrencia de
"
Ejemplos:
Restricciones: Únicamente se pueden utilizar los siguiente métodos de la clase String:
y claro el resto del lenguaje ( for, while, operador + variables etc. ). Ninguna otra clase, ningún otro método.
Mi solución solo dos sentencias:
Pff... para volverse loco.
Ahi se los dejo de tarea.
Update Le había puesto que regresaba XXX en unos y xxx en otros. Es siempre con la misma "x" ( cualquiera de las dos )
Mi error, corregido. Gracias wishmaster77 por notarlo.
EDIT: (ezamudio) Si piensan resolver el ejercicio, no vean todavía los comentarios, porque ya hay algunas soluciones ahí; primero resuélvanlo y luego ponen su solución en los comentarios, para compararla con las que ya están...
- Inicie sesión o regístrese para enviar comentarios
En un solo for
De hecho así lo pensé. En C puedes tener varias inicializaciones en la parte de inicialización. La alternativa es ( como ya pudiste ver ) sacrificar el indice y calcularlo siempre. Pero me hacía sentir sucio. jajaa
Por si alguién necesita traducción de la caricatura ahi va ( aunque no habrá explicación, exlicar XKCD le quita el chiste )
- nano? Los verdaderos programadores usan emacs
- Oye!, Los VERDADEROS programadores usan VIM
- Bueno, los VERDADEROS programadores usan ed
- NO los VERDADERES PROGRAMADORES usan cat
- Los verdaderos programadores usan una aguja imantada y una mano muy firme.
- Discúlpenme pero los VERDADEROS programadores usan Mariposas:
Abren sus manos y dejan que sus delicadas manos aleteen una vez..
... Las turbulencia de las ondas cambia el flujo de las corrientes de la atmosfera superior
... Que a su vez causan momentarias bolsas de aire a alta presión...
... Que actúan como lentes de desvían los rayos cósmicos entrantes, enfocándolos sobre el plato del disco duro y cambiando el bit necesario....
- Vaya!.. Pero bueno, por su puesto hay un comando en emacs para hacer eso... - Ahh si el viejo truco de C-x-M-x M-mariposa...
- Diablos emacs!
alt-text
cuando pongas un xkcd debes conservar el alt-text, siempre es parte del humor. Este dice algo de que los programadores de verdad configuran las variables necesarias al inicio del universo para que todo evolucione a que el disco tenga los datos que necesitan.
Lo había olvidado. Cuando
Lo había olvidado. Cuando hay alguno que no entiendo, el alt-text ( ahora que veo es el title ) me da la clave ( a veces ).
Otro
1 sola linea (sentencia) iterativa
XD
rafaelCacho
Eso no es una sola sentencia, son 3: El for, el if, y la asignación a la variable
. Ponerlo todo en la misma línea y omitir llaves no lo hace una sola sentencia.
Segunda ronda
He me parece bien, pero con las mismas restricciones?
2da ronda.
El problema con la segunda ronda está en que es muy difícil comparar si se corre en máquinas diferentes.
La única forma es comparando contra otras implementaciones corriendo en la misma máquina.
Lo que debe de funcionar más eficientemente debe de ser usando un StringBuilder, por que no se crean objetos innecesarios intermedios.
Quizá una forma más eficiente que esa sería manejar a nivel de bits, quién sabe.
Ahí les dejo mi solución y la forma en que la comparé ( contra mi solución original );
Salida nueva version y version anterior ( promedio en millisegundos )
bits?
Por el lado de performance, tal vez convenga manejar bytes directamente. Por el lado de memoria, puedes usar StringBuilder, o puedes crear un arreglo de caracteres exactamente del tamaño que vas a necesitar para la cadena resultante. Para ello necesitas darle dos pasadas a la cadena, primero contando las L's que hay para que calcules cuántas X's vas a meter en el resultado; y en la segunda pasada vas copiando de la cadena los fragmentos que no son L al nuevo arreglo de caracteres, a la vez de ir poniendo X's donde estaban las L's.
warmup
Para benchmarks, recuerden hacer warmup primero (correr la función que van a probar, una vez, para que se compile en el JIT, y luego ya la corren tomando tiempo).
Primer intento en C# usando Aggregate (left fold)
Aqui va un intento rapido en C#, a partir de esto voy a ir bajando el numero de lineas de codigo:
C#
El for de una línea debe jalar en C# también. A fin de cuentas nada más es inicializar una variable, concatenarla, y reasignar a la variable de la cadena dos subcadenas con la secuencia de X's.
C#: for
Si, definitivamente el for de una línea debe jalar en C# también. Pero como estado leyendo de Haskell, Scala, F# y las capacidades para programacion funcional en C#... pues no se me antoja usar un for ;-)
Solucion
Aqui mi solucion, disculpen pero apenas lei el post :p
Con una linea :p
Saludos.
Editado--------
Creo que se parece a la solucion de rafaelCacho :p
Mi solución
Yo lo resolví en 3, o cuenta como 2??
Saludos
@claudiaivette Yeap, cuanta
@claudiaivette
Yeap, cuanta como 3
Ahora que si quitas la "i" que no estás usando y metes la declaración de x en la inicialización del for y el cuerpo del for dentro del incremento tendrás 1.
Si, tienes toda la razón...
Si, tienes toda la razón... ya me di cuenta revisando las soluciones de los demás... :D
Pero esta super. Yo mismo lo
Pero esta super. Yo mismo lo puse en dos sentencias antes de darme cuena de que se podía en 1 ( y eso que le estuve dando y dando vueltas )
Mi solución
Hola, bueno leyendo el reto un poco tarde pero ya encontré una solución, espero les agrade.
Espero sus comentarios.
Yeap!.. si te das cuenta un
Yeap!.. si te das cuenta un while es:
incializacion
while( condicion )
cuerpo / incremento
Puedes lograr lo mismo con un for por que tiene esas mismas tres partes, así que reescribiendolo podría quedar en un solo for.
O algo así. Está interesante no?
Mi solución groovy!! (1)
Mi solución groovy!! (2)
@Rod me gusta más la
@Rod me gusta más la segunda. Pregunta: ¿Sientes que haber estado programando en C# te ha hecho mejor programador Groovy?
Linq (C#)
Creo que he mejorado como programador porque estuve mucho tiempo con muy buenos programadores; y aun sigo :P, pero también creo que usar Linq (C#) como locos TODO el tiempo... si cambio la manera en que veo Groovy : )