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...

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

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!

Imagen de ezamudio

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

Imagen de ezamudio

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.

Imagen de bimboso_d

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 )

 

Imagen de ezamudio

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.

Imagen de ezamudio

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).

Imagen de luxspes

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:

 

Imagen de ezamudio

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.

Imagen de luxspes

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

Imagen de claudiaivette

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.

Imagen de claudiaivette

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?

Imagen de rodrigo salado anaya

Mi solución groovy!! (1)

 

Imagen de rodrigo salado anaya

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?

Imagen de rodrigo salado anaya

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 : )