Advent of Code 2020

¿Dónde me apunto?

https://adventofcode.com/

Normas

  • Cada día se desbloquea un problema nuevo
  • Programas en el lenguaje que te da la gana
  • Utilizas las técnicas que te da la gana
  • Le dedicas el tiempo que te da la gana
  • Cada problema tiene una caja de texto para meter la solución (suelen ser números o alguna cadena de texto pequeña)

Leaderboard privado para el pique sano

NSFW

Las respuestas se postean en Spoiler + code

Cecos94

Todavia no he sido capaz de resolver la parte dos de ayer, entiendo que solo un indice corresponde a cada campo pero algo me esta bailando por ahi porque no consigo hacerle funcionar. Ultimamente se me estan complicando las segundas partes

1 respuesta
ciza

#811

pista

El problema de hoy es bastante parecido al de los asientos del avión pero añadiendo dimensiones basicamente.

QuitCat

Hechos los dos de hoy. Mañana vuelvo al curro, a ver si saco tiempo para seguir al día hasta donde la dificultad me lo permita :joy:

spoiler
BeheritSp

En la parte 1 me ha costado entender el ejemplo porque estaba asumiendo que el (0,0) siempre estaba en el medio.

spoiler
Main Part 1 y 2
Funciones
1 respuesta
sergioRG

Dia 17, Codigo para ambas partes, lo más optimizado que se me ocurre

spoiler
1 respuesta
QuitCat

Explicación de mi solución:

spoiler
1 1 respuesta
JonaN

#814 Te has puesto tibio a crear funciones xdd. No sería más sencillo, sabiendo que en cada turno como mucho vas a necesitar 2 columnas y 2 filas extra, crear una matriz vacía desde el principio con los R,C iniciales +2*turnos? Salvo que esté malinterpretando lo que has hecho, que sólo lo he mirado de pasada.

Día 17
1 respuesta
S

#817 Tu solucion es la mas sencilla,y es correcta, solo que hace muchos mas calculos de los necesarios, es posible que haya algun input que no se extienda mas de la zona inicial, o que se muevan solo en una direccion. Si hubiesen pedido simular muchos turnos no solo estarias calculando muchas celdas que nunca se van a activar, si no que lo estarias repitiendo cada vez.

2 respuestas
BeheritSp

#818 Si a esto me refería.

spoiler
JonaN

#818 pues para eso creas el array final vacio, pero en vez de iterar de principio a fin en cada turno, iteras de A a B en cada dimensión, y en cada turno expandes el rango en 1.

Entiendo que es más eficiente hacer allocate 1 vez y luego ir variando el rango de iteración en cada dimensión, que tener que hacer un slice cada turno y meterlo en un array más grande.

1 respuesta
S

#820 Aun mejor que eso es hacer una matriz dispersa y guardarte solamente los activos en un map, no es necesario el array entero.

MartiONE

Una pregunta que estoy un poco estancado visualizando el problema.

si z=0 empieza asi

.#.
..#
###

con la normas del enunciado, porque acaba en en primer ciclo asi?

#.#
.##
.#.

si por ejemplo la coordenada [0, 0] no tiene 3 activos adyacentes?

1 respuesta
juanmaroni

#822
Porque han cambiado la visualización sin decir nada.

Yo lo he entendido con esto:

1 1 respuesta
MartiONE

#823 Virgen santisima ya lo entiendo, muchas gracias macho menuda mierda de output se han marcado

1 respuesta
BeheritSp

#824 A mi me pasó lo mismo que a ti, pero siendo justos , el enunciado pone claramente:

Simulating a few cycles from this initial state produces the following configurations, where the result of each cycle is shown layer-by-layer at each given z coordinate (and the frame of view follows the active cells in each cycle)

Nada intuitivo, pero lo dicen xD

1
R

Día 17. Había pensando en usar itertools, pero he acabo anidando bucles. Al principio habia representado los valores en un dict, pero he visto que con un set era suficiente. Aun asi la parte 2 se va a 5 segundos mas o menos.

https://github.com/NovelleP/AdventOfCode2020/tree/main/day17

MartiONE

La verdad que hoy bastante sencillo, de los mas sencillos en dias diria yo

sergioRG

Mi parte 2 del dia 18, la parte 1 era algo asi pero haciendo cambios de nada, imagino que todos hemos hecho esto o un equivalente.

spoiler

Yo he estado un rato intentando hacerlo poniendo parentesis adicionales, por ejemplo, convertir

1 + 2 * 3 + 4

en

(1 + 2) * (3 + 4)

pero no conseguia cerrar bien la expresion, una pena porque de conseguirlo haces un eval() y ya funciona todo jaja

S

Yo viendo que los ultimos problemas no escalaba mucho de la parte 1 a la parte 2, he hecho el primero a lo bruto, pero al final me ha tocado rehacerlo bien para la parte 2, con la pereza que me daba :joy:

Parte 1

spoiler

Parte 2

spoiler
sergioRG

Vale, ya he conseguido hacer la parte 2 en un oneliner usando la idea de #828 , no se como me he podido liar tanto

spoiler
1 1 respuesta
JonaN

#830 qué cabrón, ahora me da vergüenza postear mi parte 2 con todos los loops

QuitCat

Intentaré ponerme esta tarde. ¿Podéis resumir de que va la parte 2? Y así ahorro tiempo en la parte 1

1 respuesta
sergioRG

#832 Evaluar la expresión de tal forma que la suma tenga prioridad sobre la multiplicación (al revés lo habitual).

1 respuesta
QuitCat

#833 ¿Esa no es ya la parte 1?

2 respuestas
sergioRG

#834 La 1 es evaluar la expresión con ambos operadores al mismo nivel de prioridad

1
MartiONE

#834 la 2 es igual, pero cambiando que las sumas van antes que las multiplicaciones

1
R

Día 18. He empezado pensando en hacer un algoritmo para evaluar las expresion, pero al final he visto una forma para usar eval.

explicacion
Parte 1
parte 2
2 1 respuesta
sergioRG

#837 Muy buena también! No se me había pasado por la cabeza, la verdad.

BeheritSp

Yo he ido a lo bruto como de costumbre y he implementado un evaluate_string():

spoiler
Main
Funciones
eZpit

Bueno, resuelto primero copy-pasteando, pero luego he combinado ambas soluciones en un único método:

Day 18 combined

Usuarios habituales

  • Traber
  • sergioRG
  • QuitCat
  • BeheritSp
  • ciza
  • Fyn4r
  • AikonCWD