I just completed "Extended Polymerization" - Day 14 - Advent of Code 2021 adventofcode.com/2021/day/14 #AdventOfCode

Este tiene un parecido a Lanter Fish en su crecimiento rápido en la 2º parte que obliga a un replanteamiento..

*SPOILERS *SPOILERS*

#AdventOfCode #AdventOfCode2021
El parser: secuencia de parsers "polymerP" y "newlineP >> rulesP" que capturan tanto la plantilla como las reglas. Creamos todos los subparser necesarios. Leed la función desde el final hacia arriba y veréis la "estructura"
la parte 1 "del tirón". Leemos las reglas y preparamos un diccionario.. BB -> C. En cada paso de polimerización convertimos el pólimero en pares(zip) y aplicamos la conversión a cada par según el dict. El resultado crece rápidamente por lo que abreviamos la salida si len > 60
Despues contamos cada letra guardando las cifras en un dict "stats". Convertimos "stats" a lista de tuplas (k, v) y ordenamos usando como criterio el segundo valor de cada tupla mediante itemgetter (traido de operator)
Finalmente calculamos la clave mas común menos las mas rara..
Probamos el fichero de test..
Y seguidamente el puzzle..
Ha sido fácil (lo bueno vienen después!)
En la segunda parte nos piden básicamente el mismo cálculo pero en el paso 40. rápidamente vemos que no va a ser tan facil ya que el poliméro crece desmesuradamente..
Tras lo cual vemos que un acercamiento tipo "Lanter fish" nos permitirá atacar el problema. Si tenemos una regla BH -> C en realidad podemos escribirla como BH -> BC, CH
como las reglas no se solapan contando la poblacion de cada "par" generado ¿podríamos llevar la cuenta?
El problema es que si nos atenemos a la cardinalidad de las letras BH -> C no es BH = BC + CB sino mas bien BH = BC + CB - C ya que la letra se intercala dos veces (una por cada par generado). por tanto debemos llevar la cuenta de los excesos generados al aplicar cada regla..
Empezamos construyendo el dict de reglas: Ahora una reglas como BH -> C se codifica como ruleset["BH"] = [("BC", 1), ("CH", 1), ("C", 1)] es decir una lista de cambios que indica añadir 1 instancia de cada par y una instancia de una letra de exceso.
Los pares van a ir al diccionario de pares y los excesos iran a un diccionario de excesos (¡que original!) para cada elemento generado se contabiliza un 0 en su dict respectivo "para hacer hueco". Finalmente devolvemos los 3 dict en una tupla.
Estraemos los pares inciales de la plantilla y sus letras de exceso es decir: NNCB se convierte en NN, NC, CB y esta conversion genera N, C caracteres de exceso. Estos valores se colocan en los diccionarios de pares y excesos como estado incial antes de iterar la "polimerización"
En cada paso se iteran sobre los pares existentes en el dict "pairs" se obtiene su lista de cambios de ruleset[pair] se ajusta estos cambios en funcion de cuantos pares hay 1 , 2 ó 53000.. se elimina ese "par" del dict pares (restando uno).
La lista de cambios indica cuantos instancias hay que añadir de los nuevos pares resultantes (recuerda BH -> BC, CH) y se contabilizan los elementos en exceso resultantes (en este caso C)
Finalmente tras iterar las 40 veces, contamos el numero de letras destructurando cada par del dict "pares" y sumando las letras cada uno con la suya y restando los excesos que estan consignados en el dict elements.
Finalmente el dict stats es convertido en una lista de tuplas y reordenadas estas por su segundo valor de forma descendente usando sorted y itemgetter (de operator).
El ultimo valor se resta del primero dándonos la solución buscada.
Probamos on el fichero de test. la salida es verbosa pero permite comprobar todos los cálculos previos. Un TDD puro seria algo engorroso y yo (aunque no lo parezca) no tengo muchas ganas de teclear..
Atacamos el puzzle sin mas dilación...
Bueno pues algo engorroso (quizás por la forma de abordarlo a lo bruto) pero no excesivamente complicado.

Diviértanse!!

#AdventOfCode2021 #AdventOfCode

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with The Code Maverick

The Code Maverick Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @maverick_code

15 Dec
I just completed "Transparent Origami" - Day 13 - Advent of Code 2021 adventofcode.com/2021/day/13 #AdventOfCode
El parser como siempre: construimos partes como número, coordenada etc.. Aquí la novedad es instructionP que parsea un "fold" y devuelve un lambda que realiza el doblado propiamente dicho "lambda a: fold(a, x, y)" donde x y son el eje e y la fila ó columna respectivamente.
para construir la hoja desde las coordenadas suminstradas tenemos la función data_to_sheet bastante directa (reseñar que hay que averiguar primero la dimensión de las lista de listas)
Read 12 tweets
14 Dec
I just completed "Passage Pathing" - Day 12 - Advent of Code 2021 adventofcode.com/2021/day/12 #AdventOfCode

Bueno al final un generador me ha salvado de hacer una burrada aunque la versión no ha quedado demasiado fea...

*SPOILERS* * SPOILERS*

#AdventOfCode #adventofCode2021
Bueno empecemos por el parser...
Preparamos un diccionario con las conexiones entre nodos (si a -> b entonces b -> a tambien) y luego llamamos a la función traverse que devuelve un generador de rutas que usamos para contabilizar la respuesta y mostrar las rutas al asuario.
Read 12 tweets
10 Dec
I just completed "Syntax Scoring" - Day 10 - Advent of Code 2021 adventofcode.com/2021/day/10 #AdventOfCode

Luego os lo cuento...

*SPOILERS* *SPOILERS*

#AdventOfCode2021 #adventofcode
El parser!! No me canso de quitarme problemas leyendo la entrada con un poco de cuidado (incluso he tratado de correr el fichero de un puzle con el código de otro y esto ayuda a que nada que no tenga que pasar "pase"...
Leemos todos los "chunks" y de aquellos corruptos calculos su "score" an base al caracter que no cuadraba en el lexing.. Usamos un dict para las puntuaciones +
Read 15 tweets
10 Dec
I just completed "Smoke Basin" - Day 9 - Advent of Code 2021 adventofcode.com/2021/day/9 #AdventOfCode
problemas de lectura comprensiva? yo, a veces, lo que me ha llevado a darme de bruces con el puzle (habiendo pasado el test) hasta que quité las diagonales que nadie me habia pedido 🤨

Veamos...

*SPOILERS* *SPOILERS*

#AdventOfCode2021 #adventofcode
El parser. aprovechamos para probar estrategias de sanitización como por ejemplo leer la primera linea y adaptar el parser al vuelo para que las demas sean exactamente de la misma longitud +
Read 15 tweets
8 Dec
I just completed "Seven Segment Search" - Day 8 - Advent of Code 2021 adventofcode.com/2021/day/8 #AdventOfCode
Otro trabajo "guarro" y que conste que quise hacerlo de una forma elegante pero acabé haciéndolo en plan "el juego de la imitación" buscando el "Heil JS!" y esperando pacientemente a que la "bomba" cuadrase todo..

Veamos..

*SPOILERS* *SPOILERS*

#AdventOfCode #AdventOfCode2021
el parser como siempre para leer todo sin errores que ya bastante lío nos van a formar los amigos de Advent of Code..
Read 16 tweets
7 Dec
I just completed "The Treachery of Whales" - Day 7 - Advent of Code 2021 adventofcode.com/2021/day/7 #AdventOfCode
Ha sido muy guarro y no me ha gustado (he usado la fuerza bruta) asi que bueno ya daré con la solución mas elegante que seguramente será una función conveza o algo similar 😓

Veamos como quedó..

*SPOILERS* *SPOILERS*

#AdventOfCode #AdventOfCode2021
El parser...
Read 18 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(