Advent of Code 2019 (24 ejercicios de programación por adviento!)

eZpit

Abro hilo para los que participamos en el "Advent of Code 2019":
https://adventofcode.com/

¿En que consiste?

Es un calendario de adviento en el que cada día se desbloquea un nuevo ejercicio de programación. Cada ejercicio cuenta de 2 partes, y lo único que piden es el resultado, así que se puede hacer en cualquier lenguaje de programación y lo único que importa es el output.

Participantes:

Os podeis unir al leaderboard privado para media vida con code

763988-5da3ea0a

Avisar si sois anons y os puedo ir listado aquí.

Listado de anons & links de github (para la lista completa mirar el leaderboard!)

3
B

Dentro.

Fyn4r

Listo

B

Listo. Soy #745007

Petricor

¿Cualquier lenguaje?

1 respuesta
B

#5 Puedes usar el lenguaje que quieras, sepas controlarlo o no. Cada día te dan una serie de datos (problemas diferentes o extensiones de alguno ya hecho), y según las instrucciones tienes que llegar a un resultado. Así practicas el tema de parsear inputs, elegir la mejor estructura de datos para el problema, etc. No te lo tomes muy en serio, practica y saca adelante todo lo que puedas.

2 1 respuesta
Petricor

#6 Pues genial, para practicar cosas puede venir muy bien. Gracias.

y34hl0ve

Estaría guay que subieseis el código de los ejercicios cuando acabe el evento, así seguro que algunos aprendemos mucho ^^

Yo llevo unos 3 meses aprendiendo a programar en java y no sé ni resolver el primero jajaja (de una forma eficiente, si me mato a poner los números de uno en uno si lo saco, pero supongo que pedirán un array y todavía no los he dado :()

1 respuesta
B

#8 Yo lo hago en Python y viendo el código de estos cabrones no ibas a entenderlo ni de coña. Para noobs como nosotros: https://github.com/kazulu/Advent-of-Code-2019/blob/master/01/app/Part_One.py

En Java lo resolvería igual, solo cambiaría la forma de leer el archivo.
https://geekytheory.com/como-leer-un-fichero-en-java

@Wei-Yu porque no quieres que comente el código?? La verdad que pensándolo es bastante redundante porque el propio código se auto explica bien.

@eZpit subís el código a repositorios o algo? Podemos apuntarlo en #1 https://github.com/kazulu/Advent-of-Code-2019

1 1 respuesta
R

Por aquí otro que de momento lo va haciendo. Ya se van poniendo interesantes, grafos, camino más corto, ...

De momento todos en python, el año pasado los que hice fueron en C y Java, ahora tengo menos líneas de código xD

Wei-Yu

#9 En el código que pusiste en feda dev (aquí) básicamente estás escribiendo lo que haces dos veces. No necesitas decir que abres un fichero etc etc si la línea de código que tienes debajo es open("nombre_fichero"). Los profesores lo suelen pedir mucho cuando estás estudiando (a un colega incluso le pedían comentario por línea), pero fuera de que te suspendan por ello es una muy mala práctica.

Por norma general si metes comentarios es para explicar el porqué, no el qué. El qué ya lo dice el código, aunque al principio cuando estás algo verde te pueda costar leerlo con naturalidad. A veces si es una lógica algo tediosa que puedes sintetizar en pocas palabras tampoco está mal añadir un comentario.

1 respuesta
B

#11 Ya, ya. Me doy cuenta de ello, además yo creo que el código es lo bastante limpio y fácil como para auto explicarse.

Por manía lo pongo de clase por tema profesores tienes razón, está guay el toque de atención porque si no yo sigo así toda la vida.

Unrack

He empezado también. Mi código en python para el día 1 y 2:

spoiler
spoiler
1 respuesta
desu

Yo lo estoy haciendo en Haskell de momento. Me uni al grupo tambien. Pondré aqui mis soluciones:

NSFW
NSFW

El dia dos voy por la segunda parte, estoy pensando en como hacer la parte de ir comprovando recursivamente.

edit: acabo de ver que tambien hay una segunda parte en el ejercicio 1 xddddddd

1
eZpit

Día 7 done. La segunda parte de hoy se ha puesto bastante más complicado de golpe y ha tocado refactor del "Intcode computer" de los días 2 y 5 :)

Ranthas

#1

https://github.com/ranthas90/advent-of-code

Problema uno hecho, gran chorrada, sería interesante hacerlo en otro lenguaje; quizás me anime y los haga también en C

1 respuesta
B

Llevo haciendo el reto del Intcode usando Golang, y hoy ha sido una bendición con el tema de los channels. No es el programa completo puesto que tengo todo dividido entre los 3 días, pero esto lo de hoy:

NSFW

También dejo las soluciones de los días 1 y 4, en JS:

NSFW
NSFW
2 1 respuesta
Lecherito

#16

    private static Long calculateFuelRequirement(long mass) {
        return (mass / 3L) - 2;
    }
                            .mapToLong(Long::longValue)

Vas sin autoboxing xdddd

2 respuestas
Ranthas

#18 a full

B

Sinceramente me calenté con que el primero fuera tan fácil pero a partir de ahí me está superando esta mierda.

1 1 respuesta
desu

#20 Yo he empezado el 3 y he estado 15 minutos intentando leer el input y no he podido... mañana más xd lo que más me esta costando es el leer el input xd

1 respuesta
B

#21 Yo el 2 me lo salté porque no me salía de ninguna manera y salté al 5, estuve pensandolo pero no sé ni por dónde empezar xD

Es divertido aunque no salga, total solo me juego mi orgullo cibernético.

Fyn4r

Yo acabo de hacer el 6, si hubiese hecho el árbol al revés posiblemente no tuviese que inventarme juanqueadas pero bueno, ahora no lo cambio xD

1 1 respuesta
CarlosML27

Me mola la idea, me apunto. Por lo pronto aquí va el primero (en Python).

spoiler
1
eZpit

#23 En el 6 la clave es que cada objeto solo orbita directamente alrededor de otro objeto. Buscar las orbitas indirectas al final es buscar recursivamente orbitas directas, así que la clave es poder hacer busquedas de orbitas directas rápido. Guardando en un diccionario/hashmap las orbitas directas, siendo la key el objecto que orbita y el value el target, se pueden hacer queries y resolver el ejercicio fácil.

Mi solucion en Swift

#17 El refactor para el 7 parte 2 me ha costado un rato, ya que mi IntcodeComputer era una función con array de inputs que devolvía array de outputs y he tenido que cambiar bastantes cosas para hacer el feedback loop. ¿Como estructuras el proyecto? Yo estaba intentando separar cada día en un archivo, pero con esta cadena de ejercicios está gracioso extraer y compartir el código de la IntcodeComputer, que así se puede seguir mejorando por separado y se debería poder usar esta última version para resolver los ejercicios 2 y 5 sin problema!

2 respuestas
Fyn4r

#25 claro yo hice el árbol desde COM hacia abajo, luego hacer los caminos es más coñazo. Pero ya me daba pereza y para sumar con ir yendo por niveles tiras. Para la segunda parte ya hay que guarrear un poco xd

P.D mi computer para el 2 y 5 es el mismo (ampliado claro). El 7 aún no lo hice pero espero que me sirva xd

wolfie6949

Me he animado yo también y he hecho la primera parte del 1 en un pis pas. Lo que estoy dudando es si hacerlo en C# o en ADA95 que es más exótico y con lo que trabajo ahora, por si alguien quiere curiosearlo luego por el github.

CarlosML27

Aquí va el segundo. Estoy haciendo un código de puta mierda, pero igual hago repo en GitHub y lo dejo bien limpito y refactorizado.

spoiler
R

Yo el 6 lo he tomado como un grafo (dirigido para la parte 1, y no dirigido para la 2), me puse a hacerlo con matriz de adyacencia, pero como tenia pocas aristas al final cambie a lista de adyacencia.

La parte 1 se va a cerca de 1 segundo en python. La 2 tarda la mitad. Pero vamos, seguro que se puede optimizar más para ambas partes.

Unrack

Pues no sé que he liado en el 3. A ver si alguno se da cuenta.

spoiler
1 respuesta