Le saqué algo en claro al partido de España...

#AdventOfCode 5 Supply Stacks en SQL puro (PostgreSQL)

Si te gusta el SQL lo vas a flipar (creo) , sígueme en este triste historia (por lo de "La Roja") +
Empezamos como siempre, y toca cargar el fichero de test que ya tiene tela... Image
Empezamos enumerando las lineas del fichero (ya en la tabla de input), quedandonos con la parte de las pilas y calculando la longitud maxima de entre todas las líneas (por si caso no eran iguales) ImageImage
Los contenidos de las pilas están en vertical, malo, malo para las tablas de un SGBD. Hagamos una explosión para poder reagrupar mas adelante. Cada símbolo es la letrita dentro de cada par de corchetes Image
Hay que renumerarlso de entre cada linea y cada stack (para no perder la posición relativa) Image
Finalmente usamos rank para saber la posicion relativa a partir de cada posicion absulta y cada linea.
Y la tabla de stacks consiste en recolectar los resultados de estas CTEs. ImageImage
Ahora quiero ver los comandos como simples comandos pop -> push entre pilas, pero debo extraer el número de items a mover y la pilas.

Primero extraemos la parte de los comandos de la tabla de input y depuues repetimos pasos y además partimos las descripciones en un array. Image
Las palabras 2,4,6 del array son la cantidad de ítems y origen y destino (pilas). En base a eso explosiono los comandos en un montón de "single commands" (de 1 solo ítem de una pila a otra). Image
Para aplicar un comando debo saber en un momento dado las cimas de cada pila y para eso me costruyo una vista, calculando las cimas de la pila origen y destino para cada comando potencial.

Es una vista, es "lazy" no calculo nada que no se vaya a pedir en realidad.. Image
Cuando haya acabado de aplicar cualquier comando hipotético quiero saber el elemento en la cima de cada pila ¿Como? Pues con otra vista! Image
Como ejecuto un comando, pues con un UPDATE para lo cual me voy a hacer una función para encapsular este proceso. ¿Ya era hora no? Bueno, es por ejercitar un poco de todo... Image
Ahora como ejecuto las funciones, pues para cada comando genero una sentencia que llama a la función...
¡¡Pero esa consulta sólo devuelte un string que parece SQL!! diréis con razón, y es verdad en SQL pero no hace nada , solo sale por pantalla... Image
Ahora haremos magia, un poco de magia de PSQL con el metacomando \gexec, no seais vagos y RTFM. Si me hubieran dado a mi un mnnual tan cojonudo cuando yo estudiaba!! Image
Aqui os lo enseño todo junto, la consulta genera SQL que sale por pantalla y queda en el buffer de salida de PSQL.

\gexec copia el buffer de salida en el buffer de entrada y ejecuta uno auno esos comandos.

Como la función devuelve texto vereis una explicacion de cada movimiento Image
Creedme que se tarda mas en imprimir todo lo que hace que en hacerlo... En mi caso salío poco en el test pero el fichos completo fué un chorreo de 1 minuto y caso instantaneo cambiando el tipo de la función de TEXT a VOID. Image
Y todo el pésimo futbol de "la roja" quedó transformado en una estrellita.

Y aquí paro ya porque estoy derrengaoooo si miro Hoy la segunda parte me voy a acordar de la madre del creador de #AdventOfCode Image
No me gustó como hice este ejercicio así que lo he refactorizado un poco.

Construiremos secuencias de 2 y 3 letras distintas. A partir de ahí haremos las de 4 letras y luego las de 7 letras y por último las de 14 letras.

Empezamos...
Paso de limpieza y enumeración de letras. Image
Secuencias de 2 letras consecutivas distintas, hcaemos auto reunion de la tabla de 1 letra y nos quedamos con índices consecutivos con letras distintas. Finalmente concatenamos las letras en un array. Image
Secuencias de 3 letras consecutivas distintas. Básicamente como la de 2 letras pero con 3 letras y tambiín generamos un array. Image
2 secuencias consecutivas de 2 letras hacen una de 4. Así que buscamos dos índices a 2 letras de distancia en las tablas de 2 y que los arrays no esteén solapados (elementos en común). Image
Con una de 4 y una de 3 consecutivas hacemos una de 7. La dinámica es la misma pero con tablas tipo "4letras" y "3letras" con fragmentos consecutivos y arrays sin solapamiento. Image
Con 2 de 7 hacemos una de 14. Básicamente repetir el procedimiento con 2 tablas tipo "7letras". Image
El fichero de entrada tarda un pelín mas pero es inapreciable para estos tamaños de ejercicio y hay que contar que el motor de #PostgreSQL hace sus optimizaciones...

Si hay explosiones combinatorias en el #AdventOfCode de este año aún no las hemos visto.

• • •

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

Keep Current with The Code Maverick (3/3 💉)

The Code Maverick (3/3 💉) 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

Dec 7
I just completed "Tuning Trouble" - Day 6 - Advent of Code 2022 adventofcode.com/2022/day/6 #AdventOfCode

Seguimos a lomos del SQL, a veces bien a veces hay que tirar de constorsionismos imposibles (o mi nivel no me dá para ello) Image
Empezamos como siempre... Image
Limpiamos el pescado, enumeramos y nos preparamos,,, Image
Read 9 tweets
Dec 6
La primera parte de Camp Cleanup es obscenamente fácil ¿Se vecina uno de esos giros famosos del #AdventOfCode ?

De momento os cuento como lo hice en SQL

#AdventOfCode22
Quien no sepa que esto que lea mis otros hilos porque ya va siendo lo mismo todo el rato
Tan facil que no lo voy a despiezar pues creo que se entiende de un vistazo y además esta comenetado. Convierte en rangos y comprueba inclusiones entre ellos.

Ridiculamente fácil
Read 8 tweets
Dec 5
Bueno, de vuelta al #AdventOfCode 3 Rucksack Reorganization

Empezamos leyendo los datos con ayuda de una tabla y restricciones adecuadas..
He creado una vista con la solución y así la reuso para pasar el test y luego el fichero de entrada del desafío.
Seguidamente os explico, aquí la muestro plegada junto con el código completo.
Empiezo mapeando las prioridades ['a'..'z'] -> [1..26] y ['A'..'Z'] -> [27..52] con dos consultas sencillas y el operador UNION ALL
Read 23 tweets
Dec 4
Este año en la encuesta de evaluación docente me van a crujir los alumnos y seguramente las prácticas de la asignatura son lo más parecido a lo que demandan cuando recién aterrizados en el curro te quejas de lo que no visteis en la universidad
Les hemos hecho currar a base de bien primero un diseño con su modelo entidad relación y su diccionario de datos justificando cada dato cada dominio cada tipo y créeme que les hemos hechi pelear cada punto y cada coma lo mismo para el modelo relacional...
después nos hemos dado un conjunto de datos con muchos defectos han tenido que cargarlos en tablas y examinarlos y razonar sobre qué transformaciones o incluso qué modificaciones a su modelo original deberían hacer ( Y efectuarlas!)
Read 16 tweets
Dec 3
Bueno pues aquí voy con el día 2 del #adventofcode y seguimos en #SQL. Ahora aprovecharé las "constraints" para asegurarme que leo bien las cosas..
Necesito además calcular los resultados de cada mano según me indican
Calculo todas las manos y las añado a la tabla de scores.
Read 15 tweets
Dec 3
Bueno, pues estaba dejando pasar unos días para evitar spoilers y meditando si hacer en #Python o en #SQL el #AdventOfCode de este año
Así q estoy tonteando con el SQL e hice la 1ª parte del 1er día.. Como tampoco soy un fiera en SQL me lo he currado con CTEs paso a paso (YMMV) Image
Empecé con un pequeño script que prepara una tabla para leer la entrada. Esta vez parsear la entrada es fácil asi q no me voy a pegar un tiro en el pié al elegir SQL, no sé qué pasará después..
La tabla es temporal y se borrarrá sola al hacer el COMMIT al final del script + Image
Metemos los valores de test en un ficherito
y vemos que es va a ser bastante fácil leer esto.. Image
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

Don't want to be a Premium member but still want to support us?

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!

:(