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

Ranthas
#476NeV3rKilL:

¿No necesitas el número de personas de cada grupo para nada?

No, para nada.

LLoid

día 6, parte 2 en kotlin:

spoiler
bornex

Dia 4 terminao: https://github.com/soasada/advent-of-code-2020/blob/master/crates/day4/src/day4.rs

Entre que es finde y que me tiro la vida para aprender rust voy bastante lento. Todavía me cuesta hacer funciones que devuelvan algo y no me salte el borrow checker de los huevos... Supongo que no estoy entendiendo bien el ownership y to la movida de move semantics... Alguien me recomienda algo?

1 respuesta
Lecherito

#483 Este me ayudo a empezar a entenderlo:

3
R

Día 6. Este lo he hecho casi cuando ha salido, me pillo despierto xD

parte 1:

spoiler

parte 2

spoiler

Al final he usado set, imagino que muchos otros de por aquí. Para la parte 1 con hacer un set de todo el grupo y ver su longitud vale; para la parte 2 la intersección de todos los (set de los) miembros de un grupo.

JuAn4k4

El uno me costó literalmente 2 segundos usando el read input del dia 4, llego a estar para cuando lo abren y me llevo los 100 puntos esos.

Rust:

spoiler
r2d2rigo

#459 solo hago comentarios del codigo de #471 porque es el unico que usa C# aparte de mi, y como usa el mejor lenguaje del mundo y no las cosas esas hipsters que elegis los demas no soy muy duro con el 🌚

Pero vamos, mi intencion es ayudarle un poco a ver las cosas con otra perspectiva, si le incomoda pues que se queje y paro.

1 respuesta
B

#487 python hipster en 2020, estás de coña no? lo pregunto en serio, que no se cuando se dicen estas cosas en serio y cuando en broma jaja

test3y

Dejo el de hoy:

día 6
JuAn4k4

#452 Qué versión usas de C# ? Puedes usar "var x = ... " para no especificar el código siempre. Las convenciones de casing que usas junto con las dobles barras bajas hacen el código dificil de leer, al menos en C#. En C# suele usarse camel para variables, pascal para metodos, "_" para fields privados.
El alineado horizontal me parece muy SQL old school, tiene muchas pegas en mi opinión.

Te pongo un ejemplo de sintaxis que suele usarse en C#: (Además de los {} se suelen poner siempre en nuevas lineas).

spoiler
1 respuesta
Traber

#490 #490 No se por defecto cual te marca Visual Studio 2019, pero diría que 7.1 no es porque en muchos proyectos he tenido que ponerle a posta el 7.1, así que diría 7.0 o inferior.

Pero te diré una cosa: A mi lo de poner las llaves en nuevas líneas me ha parecido de gente que quiere engordar los code metrics por fardar, porque vamos a ver, no creo que haya que ser tan subnormal para necesitar tanto el indentado como la llave para saber que lo que hay entre medias es un nuevo bloque de código, con el indentado debería ser más que suficiente.

Y lo de usar "var" en C# para todo es para coger al que hace el código y reventarle la puta cabeza contra un bordillo, lo siento pero por ahí no paso, eso está hecho para los subnormales que vienen de javascript, supongo que pensar el nombre de una variable y su tipo a la vez hace difícil que no se tengan que cambiar los pañales menos de 3 veces al día.

Por cierto, lo de la alineación horizontal, mira a ver el Linter de Go, que tiene 2 cosas que decirte xd.

2 respuestas
B

.

1 respuesta
Traber

#492 var es para lazy typing, dynamic es para tipos mutables, se diferenciarlos macho, no soy @desu xD.

Es más, var y dynamic no son nada hasta que usas por primera vez ExpandoObject.

eondev

Pues yo lo siento mucho. Ayer me puse con el día 2, vi que se podía hacer todo con regex aunque la solución tirando de Python fuese mucho más sencilla y aquí me tenéis, empapándome un libro de introducción a la computación, automatas finitos y máquinas de estado para entender bien como funcionan las regex xDDDDDD (el autor dice expresar toda la teoría con notación matemática en lenguaje Ruby para quienes se nos atraganta leer algo así. De hecho dice no profundizar y que el objetivo es solo conocer de que va el tema). Espero que de algo me sirva, pinta interesante.

Siempre le he tenido tirria a las regex porque nunca las uso. Pero me apetecía aprender de una vez y conforme tiraba del hilo iba viendo más y más chicha detrás. Creo que el problema está en que multitud de webs de sueltan el cheatsheet roñoso o te dicen lo de siempre y no explican de ningún modo como realmente interpreta una cadena una expresión regular.

Aquí dejo 2 enlaces que me han ayudado un poco a hacer click, aunque siga sin saber crear un regex de 0 sin darme contra una pared.

https://jex.im/regulex/
https://cyberzhg.github.io/toolbox/nfa2dfa

2 respuestas
Fyn4r

#494 https://regex101.com/

Me la enseño @lecherito en su día

1 respuesta
eondev

#495 si la conozco también. Está muy guay
Y esto https://regexcrossword.com/ para practicar

B

.

JuAn4k4

#491 Lo de las llaves en C# tiene sentido por los ctores, la verdad es que es muy opinionated, pero también facilita leerlo, sobre todo por los ctores de c#.
Inferir el tipo no es malo, facilita la lectura muchisimo. Tener ahí todo súper verboso repitiendo el tipo constantemente hace que se vean más los tipos que lo que hace el codigo

La alineación horizontal a mi personalmente me hace la lectura una pesadez, del estilo a justificar el texto, ni aunque me pagaran lo usaba yo.

De todas formas, todo es opinionated, me parece que te has tomado todo muy a pecho.

1 respuesta
Traber

#498 Joder, no sabía que eras la cuenta clon de @desu, perdona.

Lecherito

> "\r\n\r\n" o parecida
> Regex

PIck one

1 respuesta
B

#494 Si quieres hacer algún proyecto sencillo para aprender te recomiendo que hagas un parser de regexs reducido, que por ejemplo soporte rangos, asteriscos, ors, y at least one (+), que genere el NFA y luego lo pases a determinista, yo lo hice y me lo pasé teta haciéndolo, y luego hace mucha gracia matchear cosas con tu propio motor de regex. Puedes poner más cosas como inicios y fin de palabras y demás. Y ya si te quieres poner con grupos y lookaheads eres el jesucristo de las expresiones regulares.

#500 Bueno, esa regex me la se de memoria y sirve para casos en los que hay varias líneas vacías entre diferentes bloques de contenido (no necesariamente una), pero gracias por ridiculizarme.

1 2 respuestas
r2d2rigo

Vuelan los cuchillos esta noche en este hilo.

Vamos a intentar mantenerlo civilizado copon, que para una iniciativa interesante que tiene el foro en los ultimos 2 a;os, dejad las rencillas y memes para fedadev.

5
Lecherito

#501 No intento ridiculizar a nadie, pero es como pensar que 1+1 es "algebra". Ya he dicho que si alguien necesita ayuda que estoy disponible para hacerlas y explicarlas. https://www.mediavida.com/foro/dev/expresiones-regulares-ahora-modo-facil-468635 de hace unos a;os.

1 respuesta
B

#503 Es que 1+1 es una expresión algebraica válida. Sigo sin entender la finalidad de tu post más allá de inflarte el ego porque una regex para partir líneas vacías es trivial (que lo es, pero sigue siendo una regex).

eondev

#501 intuyo que el parser de regex, lo hiciste con regex, no? xDDDDDDDDD

1 respuesta
HeXaN

Pero cabrones dejad estas mierdas para la taberna...

LLoid

ah, pero que hay otra forma que no sea \r\n\r\n xdd

1 respuesta
B

#505 Nope, el parser de string a "nodos" lo hice bastante a mano, me quedó parecido al código que autogenera ANTLR. Montar el autómata una vez has representado bien la frase no es del todo complicado, por ejemplo (aab)*|(bc)+ se consigue:

  • Construyendo un DFA para aab, que es bastante fácil, vacío -> a -> aa -> aab (aceptar) y rechazar cualquier otra transicion, lo llamas A
  • A* se consigue haciendo que el estado inicial de A acepte y añadiendo transiciones extra, las transiciones extras las puedes sacar con una prefix table, en este caso se consigue añadiendo una transición del estado final a la primera a
  • Construyendo un DFA para bc, lo llamas B
  • B+ se construye como B* pero sin aceptar el estado vacío
  • A|B se consigue creando un nuevo estado inicial y poniendo dos transiciones vacías, una hacia A y otra hacia B

En este punto tienes un autómata no determinista, hay un algoritmo para determinizarlo. Algunos motores no determinizan los ors y corren ambas ramas en paralelo, otros no... aquí ya es ponerse con lo que te apetezca.

Otras operaciones como negar un DFA A se conseguían cambiando los estados de aceptador a no aceptador y viceversa, etc

O sea, los pasos eran representar la regex en forma arbórea por decirlo de alguna forma, montar autómatas para las hojas e ir uniéndolas de abajo a arriba.

Lo hice cuando hice teoría de la computación en la carrera, el profe que teníamos era muy bueno y te enganchaba a hacer estas mierdas si te dejabas.

1 1 respuesta
eondev

#508 Releyéndote varias veces he entendido (un poco) lo que has dicho. Hay conceptos que no tengo interiorizados pero ya sabría mejor por donde tirar.
Esas mierdas están guapas xD

R

#507 (\r\n){2} xD

1