El Advent of Code es una página web donde cada día del mes de diciembre van descubriendo un problema para que la gente haga un algoritmo que lo resuelva.
El de este día mezcla HashMaps y recursividad
Dan una serie de direcciones y unos valores a escribir en ellas.
Los valores sufren una transformación y se almacenan, al final hay que hacer la suma de los valores almacenados en la memoria.
Se puede escribir varias veces en una posición de memoria y solo nos interesa el último valor escrito → No podemos ir sumando conforme leemos.
Para que no usemos la fuerza bruta y hagamos un array con todas las posiciones de memoria nos dicen que éstas son de 36 bits.
Es imposible que hagamos un array de 68.719.476.736 posiciones (68 gigas).
Tenemos pocos valores en un espacio de direccionamiento muy amplio.
El caso ideal para usar un hashmap.
Haremos un put(posición, valor) y al final sumaremos los valores recorriendo todo el hashmap.
Múltiples escrituras
Las direcciones de memoria no están definidas del todo.
Si nos dan una direccion como 01010xc01010x000xx11 que tiene 4 x significa que tendremos que escribir en 2^4 = 16 posiciones de memoria diferentes, con todas las combinaciones de 1s y 0s para cada x.
En alguna dirección tenemos que cambiar hasta 10 x, eso son 2^10 = 1024 escrituras.
Lo he hecho en Java pq es un lenguaje con el que me encuentro cómodo.
Se podía haber hecho en cualquier otro lenguaje (C, Python, Perl, Basic, Pascal, Javascript...), pero me he quedado con éste.
Aún no hay cambiado nada
Muy importante: Trabajar con el tipo long y no integer para que no se desborde el resultado.
He medido cuantos milisegundos le cuesta hacer los cálculos y le ha costado 31 milisegundos, por lo que he decidido no optimizarlo.
¿Quieres contactar conmigo?
@xblasco.com (blueSky)
@xblasco (twitter)